Go to the documentation of this file.
3 #include <lanelet2_core/geometry/Area.h>
4 #include <lanelet2_core/geometry/Lanelet.h>
5 #include <lanelet2_core/primitives/RegulatoryElement.h>
11 namespace traffic_rules {
17 template <
typename Map,
typename Key,
typename Value>
18 Value getMapOrDefault(
const Map& map, Key key,
Value defaultVal) {
19 auto elem = map.find(key);
20 if (elem == map.end()) {
26 bool startswith(
const std::string& str,
const std::string& substr) {
27 return str.compare(0, substr.size(), substr) == 0;
30 LaneChangeType getChangeType(
const std::string& type,
const std::string& subtype,
const std::string& participant) {
31 using LaneChangeMap = std::map<std::pair<std::string, std::string>,
LaneChangeType>;
32 const static LaneChangeMap VehicleChangeType{
39 const static LaneChangeMap PedestrianChangeType{
46 return getMapOrDefault(PedestrianChangeType, std::make_pair(type, subtype),
LaneChangeType::None);
49 auto asVehicle = getMapOrDefault(VehicleChangeType, std::make_pair(type, subtype),
LaneChangeType::None);
53 return getMapOrDefault(PedestrianChangeType, std::make_pair(type, subtype),
LaneChangeType::None);
82 bool hasOverride(
const AttributeMap& attrs,
const std::string& overridePrefix) {
83 return utils::anyOf(attrs, [&overridePrefix](
auto& attr) {
return startswith(attr.first, overridePrefix); });
87 T getOverride(
const AttributeMap& attrs,
const std::string& overridePrefix,
const std::string&
override, T defaultVal) {
88 auto overrideAttr =
utils::findIf(attrs, [&
override, &overridePrefix](
auto& attr) {
91 if (attr.first.size() < overridePrefix.size()) {
94 return startswith(
override, attr.first);
99 return overrideAttr->second.template as<T>().get_value_or(defaultVal);
117 template <
typename T>
118 T sort(
const T& toSort) {
119 auto sorted = toSort;
120 std::sort(sorted.begin(), sorted.end());
128 auto regelems =
lanelet.regulatoryElements();
130 return std::any_of(regelems.begin(), regelems.end(), isDynamic);
138 if (!!canPassByRule) {
139 return *canPassByRule;
146 .get_value_or(
false);
151 if (!!canPassByRule) {
152 return *canPassByRule;
158 .get_value_or(
false);
162 bool virtualIsPassable =
false)
const {
163 using namespace std::string_literals;
165 auto result = getHardcodedChangeType(boundary);
167 changeType = *result;
193 return (boundLs.back() == p1 && boundLs.front() == p2);
198 return !!utils::findIf(ar2.outerBound(),
199 [ar1Bound = ar1Bound.invert()](auto& ar2Bound) { return ar2Bound == ar1Bound; });
259 return isLeft ? canChangeToRight(type) : canChangeToLeft(type);
263 const std::string& participant) {
266 const static SpeedLimitMap SpeedLimitLookup{
282 if (startswith(participant, vehicle)) {
286 auto limit = SpeedLimitLookup.find(std::make_pair(location, type));
287 if (limit != SpeedLimitLookup.end()) {
288 return countryLimits.*(limit->second);
296 using namespace std::string_literals;
297 using namespace units::literals;
299 auto regelemSpeedLimit =
speedLimit(regelems);
300 if (!!regelemSpeedLimit) {
301 return *regelemSpeedLimit;
303 if (hasOverride(attributes,
Attr::SpeedLimit) || hasOverride(attributes, Attr::SpeedLimitMandatory)) {
309 getOverride(attributes, Attr::SpeedLimitMandatory, Attr::SpeedLimitMandatory +
":"s +
participant(),
true);
310 return {limit, mandatory};
328 using ParticantsMap = std::map<std::string, std::vector<std::string>>;
330 const static ParticantsMap ParticipantMap{
342 auto participants = ParticipantMap.find(type);
343 if (participants == ParticipantMap.end()) {
347 [
this](
auto&
participant) { return startswith(this->participant(), participant); });
356 <<
"km/h, mandatory: " << (obj.
isMandatory ?
"yes" :
"no");
SpeedLimitInformation bicycle
static constexpr const char BicycleLane[]
SpeedLimitInformation vehicleUrbanRoad
ConstLanelet invert() const
static constexpr const char LaneChange[]
T attributeOr(AttributeName name, T defaultVal) const
Class for inferring traffic rules for lanelets and areas.
const AttributeMap & attributes() const
static constexpr const char VehicleEmergency[]
SpeedLimitInformation playStreet
static constexpr const char Pedestrian[]
static constexpr const char Highway[]
Optional< ConstLineString3d > determineCommonLine(const ConstLanelet &ll, const ConstArea &ar)
static constexpr const char Low[]
bool follows(const ConstArea &prev, const ConstLanelet &next)
static constexpr const char LineThin[]
const ConstPointType & back() const noexcept
const std::string & location() const
the the location the rules are valid for
bool inverted() const noexcept
static std::string tag(const std::string &participant)
static constexpr const char PlayStreet[]
static constexpr const char Exit[]
static constexpr const char Walkway[]
static constexpr const char LaneChangeRight[]
SpeedLimitInformation pedestrian
boost::units::quantity< KmH > KmHQuantity
static constexpr const char Virtual[]
RegulatoryElementConstPtrs regulatoryElements() const
boost::optional< T > Optional
static constexpr const char Crosswalk[]
static constexpr const char OneWay[]
static constexpr const char EmergencyLane[]
static constexpr const char Participant[]
SpeedLimitInformation vehicleNonurbanRoad
static constexpr const char DashedSolid[]
virtual const CountrySpeedLimits & countrySpeedLimits() const =0
Overloads should return a descripton of their countrie's speed limit definition.
auto findIf(ContainerT &&c, Func f)
static constexpr const char LaneChangeLeft[]
static constexpr const char SharedWalkway[]
bool isOneWay(const ConstLanelet &lanelet) const override
returns whether a lanelet can be driven in one direction only
SpeedLimitInformation vehicleNonurbanHighway
static constexpr const char Curbstone[]
SpeedLimitInformation speedLimit(const ConstLanelet &lanelet) const override
returns speed limit on this lanelet.
static constexpr const char SolidDashed[]
static constexpr const char LineThick[]
static constexpr const char Stairs[]
std::ostream & operator<<(std::ostream &stream, const SpeedLimitInformation &obj)
const std::string & participant() const
the traffic participant the rules are valid for (e.g. vehicle, car, pedestrian, etc)
static constexpr const char Bicycle[]
static constexpr const char Vehicle[]
static constexpr const char Road[]
static constexpr const char Nonurban[]
bool anyOf(const Container &c, Predicate &&p)
SpeedLimitInformation vehicleUrbanHighway
bool leftOf(const ConstLanelet &right, const ConstArea &left)
static constexpr const char Urban[]
std::vector< RegulatoryElementConstPtr > RegulatoryElementConstPtrs
virtual LaneChangeType laneChangeType(const ConstLineString3d &boundary, bool virtualIsPassable) const
checks which types of lange changes are allowed along this boundary to make a lane switch from one la...
bool canPass(const ConstLanelet &lanelet) const override
returns whether it is allowed to pass/drive on this lanelet
ConstLineStrings3d outerBound() const
static constexpr const char Dashed[]
bool hasDynamicRules(const ConstLanelet &lanelet) const override
returns whether dynamic traffic rules apply to this lanelet.
ConstLineString3d leftBound() const
SpeedLimitInformation getSpeedLimitFromType(const AttributeMap &attributes, const CountrySpeedLimits &countryLimits, const std::string &participant)
bool rightOf(const ConstLanelet &left, const ConstArea &area)
ConstLineString3d rightBound() const
bool canChangeLane(const ConstLanelet &from, const ConstLanelet &to) const override
determines if a lane change can be made between two lanelets