intersection_render_object.cpp
Go to the documentation of this file.
1 
26 #include <etsi_its_msgs_utils/mapem_ts_access.hpp>
27 
28 namespace etsi_its_msgs
29 {
30 namespace displays
31 {
32 
33  IntersectionRenderObject::IntersectionRenderObject(etsi_its_mapem_ts_msgs::msg::IntersectionGeometry intersection, bool timestamp_is_present, etsi_its_mapem_ts_msgs::msg::MinuteOfTheYear mapem_stamp, rclcpp::Time receive_time) {
34 
35  intersection_id = etsi_its_mapem_ts_msgs::access::getIntersectionID(intersection);
36 
37  int zone;
38  bool northp;
39  ref_point = etsi_its_mapem_ts_msgs::access::getRefPointUTMPositionWithConvergenceAngle(intersection, zone, northp, grid_convergence_angle);
40 
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);
44  }
45  else {
46  header.stamp = receive_time;
47  }
48  header.frame_id = ref_point.header.frame_id;
49 
50  // Parse the lanes
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];
53  IntersectionLane intsct_lane;
54  intsct_lane.lane_id = gen_lane.lane_id.value;
55  // LaneDirection
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;
62  // LaneType
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;
71  else intsct_lane.type = LaneType::unknown_type;
72  // Nodes
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);
80  break;
81 
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);
84  break;
85 
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);
88  break;
89 
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);
92  break;
93 
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);
96  break;
97 
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);
100  break;
101 
102  default:
103  break;
104  }
105 
106  if(intsct_lane.nodes.size()) {
107  geometry_msgs::msg::Point p_back = intsct_lane.nodes.back();
108  p.x += p_back.x;
109  p.y += p_back.y;
110  p.z += p_back.z;
111  }
112  intsct_lane.nodes.push_back(p);
113  }
114  }
115  // Signal Groups
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);
120  }
121  }
122  }
123  // Store lane in vector
124  lanes.push_back(intsct_lane);
125  }
126 
127  }
128 
130  bool valid = true;
131  valid = valid && rviz_common::validateFloats(ref_point);
132  return valid;
133  }
134 
135  double IntersectionRenderObject::getAge(rclcpp::Time now) {
136  return (now-header.stamp).seconds();
137  }
138 
139  void IntersectionRenderObject::removeOutdatedMovemenStates(rclcpp::Time now, double timeout) {
140  for (auto it = movement_states.begin(); it != movement_states.end(); ) {
141  if ((now-it->second.header.stamp).seconds() > timeout) it = movement_states.erase(it);
142  else ++it;
143  }
144  }
145 
147  return intersection_id;
148  }
149 
150  std_msgs::msg::Header IntersectionRenderObject::getHeader() {
151  return header;
152  }
153 
154  geometry_msgs::msg::Point IntersectionRenderObject::getRefPosition() {
155  return ref_point.point;
156  }
157 
159  tf2::Quaternion q;
160  // yaw offset due to grid-convergence
161  q.setRPY(0, 0, grid_convergence_angle * M_PI / 180.0);
162  return q;
163  }
164 
165 
166 } // namespace displays
167 } // namespace etsi_its_msgs
etsi_its_msgs::displays::parking
@ parking
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::crosswalk
@ crosswalk
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::bidirectional
@ bidirectional
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::IntersectionRenderObject::getIntersectionID
unsigned int getIntersectionID()
Get the IntersectionID.
Definition: intersection_render_object.cpp:146
etsi_its_msgs::displays::IntersectionRenderObject::validateFloats
bool validateFloats()
This function validates all float variables that are part of a IntersectionRenderObject.
Definition: intersection_render_object.cpp:129
intersection_render_object.hpp
etsi_its_msgs::displays::IntersectionRenderObject::IntersectionRenderObject
IntersectionRenderObject(etsi_its_mapem_ts_msgs::msg::IntersectionGeometry intersection, bool timestamp_is_present, etsi_its_mapem_ts_msgs::msg::MinuteOfTheYear mapem_stamp, rclcpp::Time receive_time)
Definition: intersection_render_object.cpp:33
etsi_its_msgs::displays::IntersectionRenderObject::lanes
std::vector< IntersectionLane > lanes
Definition: intersection_render_object.hpp:120
etsi_its_msgs::displays::unknown_direction
@ unknown_direction
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::egress
@ egress
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::IntersectionLane::nodes
std::vector< geometry_msgs::msg::Point > nodes
Definition: intersection_render_object.hpp:48
etsi_its_msgs::displays::IntersectionRenderObject::getGridConvergenceQuaternion
tf2::Quaternion getGridConvergenceQuaternion()
Return a tf2::Quaternion describing the rotation offset between true-north and grid-north in the UTM ...
Definition: intersection_render_object.cpp:158
etsi_its_msgs::displays::IntersectionRenderObject::movement_states
std::unordered_map< int, IntersectionMovementState > movement_states
Definition: intersection_render_object.hpp:121
etsi_its_msgs::displays::striping
@ striping
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::IntersectionLane::signal_group_ids
std::vector< uint8_t > signal_group_ids
Definition: intersection_render_object.hpp:49
etsi_its_msgs::displays::ingress
@ ingress
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::IntersectionLane::direction
LaneDirection direction
Definition: intersection_render_object.hpp:47
etsi_its_msgs::displays::vehicle
@ vehicle
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::IntersectionRenderObject::getAge
double getAge(rclcpp::Time now)
Get age of corresponding MAPEM.
Definition: intersection_render_object.cpp:135
etsi_its_msgs::displays::IntersectionRenderObject::getRefPosition
geometry_msgs::msg::Point getRefPosition()
Get the ref_position object.
Definition: intersection_render_object.cpp:154
etsi_its_msgs::displays::IntersectionRenderObject::removeOutdatedMovemenStates
void removeOutdatedMovemenStates(rclcpp::Time now, double timeout)
Remove outdated MovementStates.
Definition: intersection_render_object.cpp:139
etsi_its_msgs::displays::IntersectionLane::lane_id
uint8_t lane_id
Definition: intersection_render_object.hpp:45
etsi_its_msgs::displays::IntersectionRenderObject::grid_convergence_angle
double grid_convergence_angle
Definition: intersection_render_object.hpp:129
etsi_its_msgs::displays::IntersectionRenderObject::header
std_msgs::msg::Header header
Definition: intersection_render_object.hpp:125
etsi_its_msgs::displays::bike_lane
@ bike_lane
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::no_travel
@ no_travel
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::IntersectionRenderObject::getHeader
std_msgs::msg::Header getHeader()
Get the header.
Definition: intersection_render_object.cpp:150
etsi_its_msgs::displays::sidewalk
@ sidewalk
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::IntersectionRenderObject::ref_point
geometry_msgs::msg::PointStamped ref_point
Definition: intersection_render_object.hpp:128
etsi_its_msgs::displays::IntersectionLane::type
LaneType type
Definition: intersection_render_object.hpp:46
etsi_its_msgs::displays::median
@ median
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::unknown_type
@ unknown_type
Definition: intersection_render_object.hpp:42
etsi_its_msgs
Definition: cam_display.hpp:51
etsi_its_msgs::displays::tracked_vehicle
@ tracked_vehicle
Definition: intersection_render_object.hpp:42
etsi_its_msgs::displays::IntersectionRenderObject::intersection_id
unsigned int intersection_id
Definition: intersection_render_object.hpp:126
etsi_its_msgs::displays::IntersectionLane
Definition: intersection_render_object.hpp:44


etsi_its_rviz_plugins
Author(s): Jean-Pierre Busch , Guido Küppers , Lennart Reiher
autogenerated on Sun May 18 2025 02:29:25