26 #include <etsi_its_msgs_utils/mapem_ts_access.hpp>
35 intersection_id = etsi_its_mapem_ts_msgs::access::getIntersectionID(intersection);
41 if(timestamp_is_present) {
42 uint64_t nanosecs = etsi_its_mapem_ts_msgs::access::getUnixNanosecondsFromMinuteOfTheYear(mapem_stamp, receive_time.nanoseconds());
43 header.stamp = rclcpp::Time(nanosecs);
46 header.stamp = receive_time;
51 for(
size_t i=0; i<intersection.lane_set.array.size(); i++) {
52 etsi_its_mapem_ts_msgs::msg::GenericLane gen_lane = intersection.lane_set.array[i];
54 intsct_lane.
lane_id = gen_lane.lane_id.value;
56 std::vector<bool> lane_dir = etsi_its_mapem_ts_msgs::access::getLaneDirection(gen_lane);
57 if(lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_INGRESS_PATH] && lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_EGRESS_PATH]) intsct_lane.
direction =
LaneDirection::bidirectional;
58 else if(!lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_INGRESS_PATH] && !lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_EGRESS_PATH]) intsct_lane.
direction =
LaneDirection::no_travel;
59 else if(lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_INGRESS_PATH] && !lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_EGRESS_PATH]) intsct_lane.
direction =
LaneDirection::ingress;
60 else if(!lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_INGRESS_PATH] && lane_dir[etsi_its_mapem_ts_msgs::msg::LaneDirection::BIT_INDEX_EGRESS_PATH]) intsct_lane.
direction =
LaneDirection::egress;
63 if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_VEHICLE) intsct_lane.
type =
LaneType::vehicle;
64 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_CROSSWALK) intsct_lane.
type =
LaneType::crosswalk;
65 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_BIKE_LANE) intsct_lane.
type =
LaneType::bike_lane;
66 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_SIDEWALK) intsct_lane.
type =
LaneType::sidewalk;
67 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_MEDIAN) intsct_lane.
type =
LaneType::median;
68 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_STRIPING) intsct_lane.
type =
LaneType::striping;
69 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_TRACKED_VEHICLE) intsct_lane.
type =
LaneType::tracked_vehicle;
70 else if(gen_lane.lane_attributes.lane_type.choice == etsi_its_mapem_ts_msgs::msg::LaneTypeAttributes::CHOICE_PARKING) intsct_lane.
type =
LaneType::parking;
73 if(gen_lane.node_list.choice == etsi_its_mapem_ts_msgs::msg::NodeListXY::CHOICE_NODES) {
74 etsi_its_mapem_ts_msgs::msg::NodeSetXY node_set = gen_lane.node_list.nodes;
75 for(
size_t j=0; j<node_set.array.size(); j++) {
76 geometry_msgs::msg::Point p;
77 switch (node_set.array[j].delta.choice) {
78 case etsi_its_mapem_ts_msgs::msg::NodeOffsetPointXY::CHOICE_NODE_XY1:
79 p = etsi_its_mapem_ts_msgs::access::getPointFromNodeXY(node_set.array[j].delta.node_xy1);
82 case etsi_its_mapem_ts_msgs::msg::NodeOffsetPointXY::CHOICE_NODE_XY2:
83 p = etsi_its_mapem_ts_msgs::access::getPointFromNodeXY(node_set.array[j].delta.node_xy2);
86 case etsi_its_mapem_ts_msgs::msg::NodeOffsetPointXY::CHOICE_NODE_XY3:
87 p = etsi_its_mapem_ts_msgs::access::getPointFromNodeXY(node_set.array[j].delta.node_xy3);
90 case etsi_its_mapem_ts_msgs::msg::NodeOffsetPointXY::CHOICE_NODE_XY4:
91 p = etsi_its_mapem_ts_msgs::access::getPointFromNodeXY(node_set.array[j].delta.node_xy4);
94 case etsi_its_mapem_ts_msgs::msg::NodeOffsetPointXY::CHOICE_NODE_XY5:
95 p = etsi_its_mapem_ts_msgs::access::getPointFromNodeXY(node_set.array[j].delta.node_xy5);
98 case etsi_its_mapem_ts_msgs::msg::NodeOffsetPointXY::CHOICE_NODE_XY6:
99 p = etsi_its_mapem_ts_msgs::access::getPointFromNodeXY(node_set.array[j].delta.node_xy6);
106 if(intsct_lane.
nodes.size()) {
107 geometry_msgs::msg::Point p_back = intsct_lane.
nodes.back();
112 intsct_lane.
nodes.push_back(p);
116 if(gen_lane.connects_to_is_present) {
117 for(
size_t i=0; i<gen_lane.connects_to.array.size(); i++) {
118 if(gen_lane.connects_to.array[i].signal_group_is_present) {
119 intsct_lane.
signal_group_ids.push_back(gen_lane.connects_to.array[i].signal_group.value);
124 lanes.push_back(intsct_lane);
131 valid = valid && rviz_common::validateFloats(
ref_point);
136 return (now-
header.stamp).seconds();
141 if ((now-it->second.header.stamp).seconds() > timeout) it =
movement_states.erase(it);