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

147 lines
3.2 KiB
C++

// Copyright (c) 2020 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/geom/Mesh.h"
#include "carla/geom/Transform.h"
#include "carla/road/InformationSet.h"
#include "carla/road/RoadTypes.h"
#include <vector>
#include <iostream>
#include <memory>
namespace carla {
namespace road {
class LaneSection;
class MapBuilder;
class Road;
class Lane : private MovableNonCopyable {
public:
/// Can be used as flags
enum class LaneType : int32_t {
None = 0x1,
Driving = 0x1 << 1,
Stop = 0x1 << 2,
Shoulder = 0x1 << 3,
Biking = 0x1 << 4,
Sidewalk = 0x1 << 5,
Border = 0x1 << 6,
Restricted = 0x1 << 7,
Parking = 0x1 << 8,
Bidirectional = 0x1 << 9,
Median = 0x1 << 10,
Special1 = 0x1 << 11,
Special2 = 0x1 << 12,
Special3 = 0x1 << 13,
RoadWorks = 0x1 << 14,
Tram = 0x1 << 15,
Rail = 0x1 << 16,
Entry = 0x1 << 17,
Exit = 0x1 << 18,
OffRamp = 0x1 << 19,
OnRamp = 0x1 << 20,
Any = -2 // 0xFFFFFFFE
};
public:
Lane() = default;
Lane(
LaneSection *lane_section,
LaneId id,
std::vector<std::unique_ptr<element::RoadInfo>> &&info)
: _lane_section(lane_section),
_id(id),
_info(std::move(info)) {
DEBUG_ASSERT(lane_section != nullptr);
}
const LaneSection *GetLaneSection() const;
Road *GetRoad() const;
LaneId GetId() const;
LaneType GetType() const;
bool GetLevel() const;
template <typename T>
const T *GetInfo(const double s) const {
DEBUG_ASSERT(_lane_section != nullptr);
return _info.GetInfo<T>(s);
}
template <typename T>
std::vector<const T*> GetInfos() const {
DEBUG_ASSERT(_lane_section != nullptr);
return _info.GetInfos<T>();
}
const std::vector<Lane *> &GetNextLanes() const {
return _next_lanes;
}
const std::vector<Lane *> &GetPreviousLanes() const {
return _prev_lanes;
}
LaneId GetSuccessor() const {
return _successor;
}
LaneId GetPredecessor() const {
return _predecessor;
}
double GetDistance() const;
double GetLength() const;
/// Returns the total lane width given a s
double GetWidth(const double s) const;
/// Checks whether the geometry is straight or not
bool IsStraight() const;
geom::Transform ComputeTransform(const double s) const;
/// Computes the location of the edges given a s
std::pair<geom::Vector3D, geom::Vector3D> GetCornerPositions(
const double s, const float extra_width = 0.f) const;
private:
friend MapBuilder;
LaneSection *_lane_section = nullptr;
LaneId _id = 0;
InformationSet _info;
LaneType _type = LaneType::None;
bool _level = false;
LaneId _successor = 0;
LaneId _predecessor = 0;
std::vector<Lane *> _next_lanes;
std::vector<Lane *> _prev_lanes;
};
} // road
} // carla