libcarla/include/carla/client/Waypoint.h
2024-10-18 13:19:59 +08:00

123 lines
3.3 KiB
C++

// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include "carla/Memory.h"
#include "carla/NonCopyable.h"
#include "carla/geom/Transform.h"
#include "carla/road/element/LaneMarking.h"
#include "carla/road/element/RoadInfoMarkRecord.h"
#include "carla/road/element/Waypoint.h"
#include "carla/road/Lane.h"
#include "carla/road/RoadTypes.h"
#include <boost/optional.hpp>
namespace carla {
namespace client {
class Map;
class Junction;
class Landmark;
class Waypoint
: public EnableSharedFromThis<Waypoint>,
private NonCopyable {
public:
~Waypoint();
/// Returns an unique Id identifying this waypoint.
///
/// The Id takes into account OpenDrive's road Id, lane Id, and s distance
/// on its road segment up to half-centimetre precision.
uint64_t GetId() const {
return std::hash<road::element::Waypoint>()(_waypoint);
}
auto GetRoadId() const {
return _waypoint.road_id;
}
auto GetSectionId() const {
return _waypoint.section_id;
}
auto GetLaneId() const {
return _waypoint.lane_id;
}
auto GetDistance() const {
return _waypoint.s;
}
const geom::Transform &GetTransform() const {
return _transform;
}
road::JuncId GetJunctionId() const;
bool IsJunction() const;
SharedPtr<Junction> GetJunction() const;
double GetLaneWidth() const;
road::Lane::LaneType GetType() const;
std::vector<SharedPtr<Waypoint>> GetNext(double distance) const;
std::vector<SharedPtr<Waypoint>> GetPrevious(double distance) const;
/// Returns a list of waypoints separated by distance from the current waypoint
/// to the end of the lane
std::vector<SharedPtr<Waypoint>> GetNextUntilLaneEnd(double distance) const;
/// Returns a list of waypoints separated by distance from the current waypoint
/// to the start of the lane
std::vector<SharedPtr<Waypoint>> GetPreviousUntilLaneStart(double distance) const;
SharedPtr<Waypoint> GetRight() const;
SharedPtr<Waypoint> GetLeft() const;
boost::optional<road::element::LaneMarking> GetRightLaneMarking() const;
boost::optional<road::element::LaneMarking> GetLeftLaneMarking() const;
road::element::LaneMarking::LaneChange GetLaneChange() const;
/// Returns a list of landmarks from the current position to a certain distance
std::vector<SharedPtr<Landmark>> GetAllLandmarksInDistance(
double distance, bool stop_at_junction = false) const;
/// Returns a list of landmarks from the current position to a certain distance
/// Filters by specified type
std::vector<SharedPtr<Landmark>> GetLandmarksOfTypeInDistance(
double distance, std::string filter_type, bool stop_at_junction = false) const;
private:
friend class Map;
Waypoint(SharedPtr<const Map> parent, road::element::Waypoint waypoint);
SharedPtr<const Map> _parent;
road::element::Waypoint _waypoint;
geom::Transform _transform;
// Mark record right and left respectively.
std::pair<
const road::element::RoadInfoMarkRecord *,
const road::element::RoadInfoMarkRecord *> _mark_record;
};
} // namespace client
} // namespace carla