mapem_display.cpp
Go to the documentation of this file.
1 
26 
27 #include <etsi_its_msgs_utils/spatem_ts_access.hpp>
28 
29 #include <OgreSceneNode.h>
30 #include <OgreSceneManager.h>
31 #include <OgreBillboardSet.h>
32 #include <OgreMaterialManager.h>
33 #include <OgreTechnique.h>
34 
35 #include "rviz_common/display_context.hpp"
36 #include "rviz_common/frame_manager_iface.hpp"
37 #include "rviz_common/logging.hpp"
38 #include "rviz_common/properties/color_property.hpp"
39 #include "rviz_common/properties/float_property.hpp"
40 #include "rviz_common/properties/bool_property.hpp"
41 #include "rviz_common/properties/ros_topic_property.hpp"
42 #include "rviz_common/properties/qos_profile_property.hpp"
43 
44 #include "rviz_common/properties/parse_color.hpp"
45 
46 namespace etsi_its_msgs
47 {
48 namespace displays
49 {
50 
51 const Ogre::ColourValue color_grey(0.5, 0.5, 0.5, 1.0);
52 const Ogre::ColourValue color_green(0.18, 0.79, 0.21, 1.0);
53 const Ogre::ColourValue color_orange(0.9, 0.7, 0.09, 1.0);
54 const Ogre::ColourValue color_red(0.8, 0.2, 0.2, 1.0);
55 
57  // General Properties
58  spatem_topic_property_ = new rviz_common::properties::RosTopicProperty("SPATEM Topic", "/etsi_its_conversion/spatem_ts/out",
59  rosidl_generator_traits::data_type<etsi_its_spatem_ts_msgs::msg::SPATEM>(),
60  "Topic of corresponding SPATEMs", this, SLOT(changedSPATEMTopic()));
61  spatem_qos_property_ = new rviz_common::properties::QosProfileProperty(spatem_topic_property_, qos_profile);
62 
63  // MAPEM
64  viz_mapem_ = new rviz_common::properties::BoolProperty("Visualize MAPEMs", true,
65  "Show MAPEMs", this);
66 
67  mapem_timeout_ = new rviz_common::properties::FloatProperty(
68  "MAPEM Timeout", 120.0f,
69  "Time (in s) until MAP disappears", viz_mapem_);
70  mapem_timeout_->setMin(0);
71 
72  mapem_sphere_scale_property_ = new rviz_common::properties::FloatProperty(
73  "MAPEM Sphere Scale", 1.0f,
74  "Scaling factor to adjuste size of MAPEM spheres", viz_mapem_);
75  mapem_sphere_scale_property_->setMin(0.1);
76 
77  color_property_ingress_ = new rviz_common::properties::ColorProperty(
78  "Ingress Lane Color", QColor(85, 85, 255),
79  "Color to visualize Ingress-Lanes", viz_mapem_);
80  color_property_egress_ = new rviz_common::properties::ColorProperty(
81  "Egress Lane Color", QColor(255, 170, 0),
82  "Color to visualize Egress-Lanes", viz_mapem_);
83  lane_width_property_ = new rviz_common::properties::FloatProperty(
84  "MAPEM Lane Width", 1.0, "Width of MAPEM-Lanes", viz_mapem_);
85  lane_width_property_->setMin(0.1);
86  show_meta_mapem_ = new rviz_common::properties::BoolProperty("Metadata", true,
87  "Show metadata as text next to MAP reference point", viz_mapem_);
88  text_color_property_mapem_ = new rviz_common::properties::ColorProperty(
89  "Text Color", QColor(255, 255, 255),
90  "Text color", show_meta_mapem_);
91  char_height_mapem_ = new rviz_common::properties::FloatProperty("Scale", 4.0, "Scale of text", show_meta_mapem_);
92 
93  // SPATEM
94  viz_spatem_ = new rviz_common::properties::BoolProperty("Visualize SPATEMs", true,
95  "Show SPATEMs corresponding to received MAPEMs", this, SLOT(changedSPATEMViz()));
96 
97  spatem_timeout_ = new rviz_common::properties::FloatProperty(
98  "SPATEM Timeout", 0.1f,
99  "Time (in s) until SPAT disappears", viz_spatem_);
100  spatem_timeout_->setMin(0);
101 
102  spatem_sphere_scale_property_ = new rviz_common::properties::FloatProperty(
103  "SPATEM Sphere Scale", 1.0f,
104  "Scaling factor to adjuste size of SPATEM spheres", viz_spatem_);
105  spatem_sphere_scale_property_->setMin(0.1);
106 
107  show_meta_spatem_ = new rviz_common::properties::BoolProperty("Metadata", true,
108  "Show metadata as text next to SPATEM reference point", viz_spatem_);
109 
110  text_color_property_spatem_ = new rviz_common::properties::ColorProperty(
111  "Text Color", QColor(255, 255, 255),
112  "Text color", show_meta_spatem_);
113  char_height_spatem_ = new rviz_common::properties::FloatProperty("Scale", 1.0, "Scale of text", show_meta_spatem_);
114 
115  show_spatem_start_time = new rviz_common::properties::BoolProperty("Start time", false,
116  "Show SPATEM start time", show_meta_spatem_);
117 
118  show_spatem_min_end_time = new rviz_common::properties::BoolProperty("Min end time", true,
119  "Show SPATEM min end time", show_meta_spatem_);
120 
121  show_spatem_max_end_time = new rviz_common::properties::BoolProperty("Max end time", true,
122  "Show SPATEM max end time", show_meta_spatem_);
123 
124  show_spatem_likely_time = new rviz_common::properties::BoolProperty("Likely time", false,
125  "Show SPATEM likely time", show_meta_spatem_);
126 
127  show_spatem_confidence = new rviz_common::properties::BoolProperty("Confidence", false,
128  "Show SPATEM confidence", show_meta_spatem_);
129 
130  show_spatem_next_time = new rviz_common::properties::BoolProperty("Next time", false,
131  "Show SPATEM next time", show_meta_spatem_);
132 
133 }
134 
136 }
137 
139  RTDClass::onInitialize();
140 
141  auto nodeAbstraction = context_->getRosNodeAbstraction().lock();
142  rviz_node_ = nodeAbstraction->get_raw_node();
143  spatem_topic_property_->initialize(nodeAbstraction);
144  spatem_qos_property_->initialize(
145  [this](rclcpp::QoS profile) {
146  spatem_qos_profile_ = profile;
148  });
150 }
151 
153  RTDClass::reset();
154  intersections_.clear();
155  intsct_ref_points_.clear();
156  lane_lines_.clear();
157  signal_groups_.clear();
158  texts_.clear();
159 }
160 
162  if(!viz_spatem_->getBool()) {
163  deleteStatus("SPATEM Topic");
164  spatem_subscriber_.reset();
165  }
166  else changedSPATEMTopic();
167 }
168 
170  spatem_subscriber_.reset();
171  received_spats_=0;
172  if(spatem_topic_property_->isEmpty()) {
173  setStatus(
174  rviz_common::properties::StatusProperty::Warn,
175  "SPATEM Topic",
176  QString("Error subscribing: Empty topic name"));
177  return;
178  }
179 
180  std::map<std::string, std::vector<std::string>> published_topics = rviz_node_->get_topic_names_and_types();
181  bool topic_available = false;
182  std::string topic_message_type;
183  for (const auto & topic : published_topics) {
184  // Only add topics whose type matches.
185  if(topic.first == spatem_topic_property_->getTopicStd()) {
186  topic_available = true;
187  for (const auto & type : topic.second) {
188  topic_message_type = type;
189  if (type == "etsi_its_spatem_ts_msgs/msg/SPATEM") {
190  spatem_subscriber_ = rviz_node_->create_subscription<etsi_its_spatem_ts_msgs::msg::SPATEM>(spatem_topic_property_->getTopicStd(), spatem_qos_profile_, std::bind(&MAPEMDisplay::SPATEMCallback, this, std::placeholders::_1));
191  return;
192  }
193  }
194  }
195  }
196  if(!topic_available) {
197  setStatus(
198  rviz_common::properties::StatusProperty::Warn, "SPATEM Topic",
199  QString("Error subscribing to ") + QString::fromStdString(spatem_topic_property_->getTopicStd())
200  + QString(": Topic is not available!"));
201  }
202  else {
203  setStatus(
204  rviz_common::properties::StatusProperty::Warn, "SPATEM Topic",
205  QString("Error subscribing to ") + QString::fromStdString(spatem_topic_property_->getTopicStd())
206  + QString(": Message type ") + QString::fromStdString(topic_message_type) + QString::fromStdString(" does not equal etsi_its_spatem_ts_msgs::msg::SPATEM!"));
207  }
208 }
209 
210 void MAPEMDisplay::SPATEMCallback(etsi_its_spatem_ts_msgs::msg::SPATEM::ConstSharedPtr msg) {
211  rclcpp::Time now = rviz_node_->now();
212  // iterate over all IntersectionStates
213  for(size_t i = 0; i<msg->spat.intersections.array.size(); i++) {
214  etsi_its_spatem_ts_msgs::msg::IntersectionState intersection_state = msg->spat.intersections.array[i];
215  unsigned int intersection_id = etsi_its_spatem_ts_msgs::access::getIntersectionID(intersection_state);
216  // Check if IntersectionID is already present in intersections-list
217  auto it = intersections_.find(intersection_id);
218  if (it == intersections_.end()) continue; // intersection is not available, continue loop
219  // derive stamp from Intersection State
220  std_msgs::msg::Header header;
221  if(intersection_state.moy_is_present) {
222  etsi_its_spatem_ts_msgs::msg::MinuteOfTheYear moy = etsi_its_spatem_ts_msgs::access::getMinuteOfTheYear(intersection_state);
223  uint64_t nanosecs = etsi_its_spatem_ts_msgs::access::getUnixNanosecondsFromMinuteOfTheYear(moy, now.nanoseconds());
224  if(intersection_state.time_stamp_is_present) {
225  double secs_in_minute = etsi_its_spatem_ts_msgs::access::getDSecondValue(intersection_state);
226  nanosecs += (uint64_t)(secs_in_minute*1e9);
227  }
228  header.stamp = rclcpp::Time(nanosecs);
229  }
230  else {
231  header.stamp = now;
232  }
233  // iterate over all MovemenStates
234  for(size_t j=0; j<intersection_state.states.array.size(); j++) {
235  etsi_its_spatem_ts_msgs::msg::MovementState spat_mvmt_state = intersection_state.states.array[j];
236  IntersectionMovementState mvmt_state;
237  // Fill the IntersectionMovementState
238  mvmt_state.signal_group_id = etsi_its_spatem_ts_msgs::access::getSignalGroupID(spat_mvmt_state);
239  mvmt_state.header = header;
240  if(spat_mvmt_state.state_time_speed.array.size()) {
241  mvmt_state.phase_state = etsi_its_spatem_ts_msgs::access::getCurrentMovementPhaseState(spat_mvmt_state);
242 
243  auto movement_event = etsi_its_spatem_ts_msgs::access::getCurrentMovementEvent(spat_mvmt_state);
244  if (movement_event.timing_is_present) {
245  mvmt_state.time_change_details = std::make_shared<etsi_its_spatem_ts_msgs::msg::TimeChangeDetails>(movement_event.timing);
246  }
247  }
248  // Check if SignalGroup is already present in IntersectionMovementState of Intersection
249  auto mvmnt_it = it->second.movement_states.find(mvmt_state.signal_group_id);
250  if (mvmnt_it != it->second.movement_states.end()) mvmnt_it->second = mvmt_state; // SignalGroup exists, update the value
251  else it->second.movement_states.insert(std::make_pair(mvmt_state.signal_group_id, mvmt_state));
252  }
253  }
254 
255  ++received_spats_;
256  setStatus(
257  rviz_common::properties::StatusProperty::Ok, "SPATEM Topic", QString::number(received_spats_) + " messages received");
258 }
259 
260 void MAPEMDisplay::processMessage(etsi_its_mapem_ts_msgs::msg::MAPEM::ConstSharedPtr msg) {
261  // Process MAPEM message
262  rclcpp::Time now = rviz_node_->now();
263  // Intersections
264  if(!msg->map.intersections_is_present) return;
265  etsi_its_mapem_ts_msgs::msg::MinuteOfTheYear moy = msg->map.time_stamp;
266  for(size_t i = 0; i<msg->map.intersections.array.size(); i++)
267  {
268  IntersectionRenderObject intsct(msg->map.intersections.array[i], msg->map.time_stamp_is_present, moy, now);
269  if(!intsct.validateFloats())
270  {
271  setStatus(
272  rviz_common::properties::StatusProperty::Error, "Topic",
273  "Message contained invalid floating point values (nans or infs)");
274  return;
275  }
276  // Check if IntersectionID is already present in list
277  auto it = intersections_.find(intsct.getIntersectionID());
278  if (it != intersections_.end()) {
279  // Intersection exists, update the intersection but keep the MovementStates
280  intsct.movement_states = it->second.movement_states;
281  it->second = intsct;
282  }
283  else intersections_.insert(std::make_pair(intsct.getIntersectionID(), intsct));
284  }
285 
286  return;
287 }
288 
289 void MAPEMDisplay::RenderMapemShapes(Ogre::SceneNode *child_scene_node) {
290  // create sphere object
291  std::shared_ptr<rviz_rendering::Shape> sphere = std::make_shared<rviz_rendering::Shape>(rviz_rendering::Shape::Sphere, scene_manager_, child_scene_node);
292 
293  // set the dimensions of sphere
294  double scale = mapem_sphere_scale_property_->getFloat();
295  Ogre::Vector3 dims;
296  dims.x = 1.0 * scale;
297  dims.y = 1.0 * scale;
298  dims.z = 1.0 * scale;
299  sphere->setScale(dims);
300 
301  // set the color of sphere
302  sphere->setColor(color_grey);
303  intsct_ref_points_.push_back(sphere);
304 }
305 
306 void MAPEMDisplay::RenderMapemShapesLane(Ogre::SceneNode *child_scene_node, IntersectionLane& lane) {
307  // visualize the lanes
308  std::shared_ptr<rviz_rendering::BillboardLine> line = std::make_shared<rviz_rendering::BillboardLine>(scene_manager_, child_scene_node);
309  Ogre::ColourValue lane_color;
310  if(lane.direction == LaneDirection::ingress) lane_color = rviz_common::properties::qtToOgre(color_property_ingress_->getColor());
311  else if(lane.direction == LaneDirection::egress) lane_color = rviz_common::properties::qtToOgre(color_property_egress_->getColor());
312  else lane_color = color_grey;
313  line->setColor(lane_color.r, lane_color.g, lane_color.b, lane_color.a);
314  double line_width = lane_width_property_->getFloat();
315  line->setLineWidth(line_width);
316  for(size_t j = 0; j<lane.nodes.size(); j++) {
317  Ogre::Vector3 p;
318  p.x = lane.nodes[j].x;
319  p.y = lane.nodes[j].y;
320  p.z = lane.nodes[j].z;
321  line->addPoint(p);
322  }
323  lane_lines_.push_back(line);
324 }
325 
326 void MAPEMDisplay::RenderMapemTexts(Ogre::SceneNode *child_scene_node, IntersectionRenderObject& intsctn) {
327  std::string text;
328  text+="IntersectionID: " + std::to_string(intsctn.getIntersectionID());
329  std::shared_ptr<rviz_rendering::MovableText> text_render = std::make_shared<rviz_rendering::MovableText>(text, "Liberation Sans", char_height_mapem_->getFloat());
330  double height = mapem_sphere_scale_property_->getFloat();
331  height+=text_render->getBoundingRadius();
332 
333  Ogre::Vector3 offs(0.0, 0.0, height);
334  text_render->setGlobalTranslation(offs);
335  Ogre::ColourValue text_color = rviz_common::properties::qtToOgre(text_color_property_mapem_->getColor());
336  text_render->setColor(text_color);
337  child_scene_node->attachObject(text_render.get());
338  texts_.push_back(text_render);
339 }
340 
341 void MAPEMDisplay::RenderSpatemShapes(Ogre::SceneNode *child_scene_node, IntersectionLane& lane, IntersectionMovementState* intersection_movement_state) {
342  // Signal Groups
343  if(viz_spatem_->getBool() && lane.signal_group_ids.size() && lane.direction != LaneDirection::egress) {
344 
345  // create graphical circle to display current movement state phase
346  std::shared_ptr<rviz_rendering::Shape> sg = std::make_shared<rviz_rendering::Shape>(rviz_rendering::Shape::Sphere, scene_manager_, child_scene_node);
347 
348  // set the dimensions of sphere
349  double scale = spatem_sphere_scale_property_->getFloat();
350  Ogre::Vector3 dims;
351  dims.x = 1.0 * scale;
352  dims.y = 1.0 * scale;
353  dims.z = 1.0 * scale;
354 
355  sg->setScale(dims);
356 
357  // Set color according to state
358  if(intersection_movement_state != nullptr) {
359  std::array<float, 4> color = etsi_its_spatem_ts_msgs::access::interpretMovementPhaseStateAsColor(intersection_movement_state->phase_state.value);
360  sg->setColor(color.at(0), color.at(1), color.at(2), color.at(3));
361  }
362  else {
363  sg->setColor(color_grey);
364  }
365 
366  Ogre::Vector3 p;
367  p.x = lane.nodes.front().x;
368  p.y = lane.nodes.front().y;
369  p.z = lane.nodes.front().z;
370  sg->setPosition(p);
371  signal_groups_.push_back(sg);
372  }
373 }
374 
375 void MAPEMDisplay::RenderSpatemTexts(Ogre::SceneNode *child_scene_node, IntersectionLane& lane, IntersectionMovementState* intersection_movement_state) {
376  std::string text_content;
377 
378  if (intersection_movement_state != nullptr) {
379  if (intersection_movement_state->time_change_details != nullptr) {
380  etsi_its_spatem_ts_msgs::msg::TimeChangeDetails::SharedPtr time_change_details = intersection_movement_state->time_change_details;
381  std_msgs::msg::Header& header = intersection_movement_state->header;
382 
383  if (show_spatem_start_time->getBool()) {
384  text_content = "Start time: "
385  + (time_change_details->start_time_is_present
386  ? etsi_its_spatem_ts_msgs::access::parseTimeMarkValueToString(time_change_details->start_time.value, header.stamp.sec, header.stamp.nanosec)
387  : "-")
388  + "\n";
389  }
390 
391  // 'Min end time' is the only required field
392  if (show_spatem_min_end_time->getBool()) {
393  text_content += "Min end time: "
394  + etsi_its_spatem_ts_msgs::access::parseTimeMarkValueToString(time_change_details->min_end_time.value, header.stamp.sec, header.stamp.nanosec)
395  + "\n";
396  }
397 
398  if (show_spatem_max_end_time->getBool()) {
399  text_content += "Max end time: "
400  + (time_change_details->max_end_time_is_present
401  ? etsi_its_spatem_ts_msgs::access::parseTimeMarkValueToString(time_change_details->max_end_time.value, header.stamp.sec, header.stamp.nanosec)
402  : "-")
403  + "\n";
404  }
405  if (show_spatem_likely_time->getBool()) {
406  text_content += "Likely time: "
407  + (time_change_details->likely_time_is_present
408  ? etsi_its_spatem_ts_msgs::access::parseTimeMarkValueToString(time_change_details->likely_time.value, header.stamp.sec, header.stamp.nanosec)
409  : "-")
410  + "\n";
411  }
412  if (show_spatem_confidence->getBool()) {
413  text_content += "Confidence: "
414  + (time_change_details->confidence_is_present
415  ? std::to_string((int)(etsi_its_spatem_ts_msgs::access::interpretTimeIntervalConfidenceAsFloat(time_change_details->confidence.value) * 100)) + "%"
416  : "-")
417  + "\n";
418  }
419  if (show_spatem_next_time->getBool()) {
420  text_content += "Next time: "
421  + (time_change_details->next_time_is_present
422  ? etsi_its_spatem_ts_msgs::access::parseTimeMarkValueToString(time_change_details->next_time.value, header.stamp.sec, header.stamp.nanosec)
423  : "-");
424  }
425  } else {
426  text_content = "no time info";
427  }
428  } else {
429  text_content = "-";
430  }
431 
432  std::shared_ptr<rviz_rendering::MovableText> text_render = std::make_shared<rviz_rendering::MovableText>(text_content, "Liberation Sans", char_height_spatem_->getFloat());
433  Ogre::Vector3 halfSize = text_render->getBoundingBox().getHalfSize();
434  Ogre::Vector3 offset(
435  offset.x = lane.nodes.front().x - halfSize.x * 0.5,
436  offset.y = lane.nodes.front().y + halfSize.y,
437  offset.z = lane.nodes.front().z + 2);
438 
439  text_render->setGlobalTranslation(offset);
440  Ogre::ColourValue text_color = rviz_common::properties::qtToOgre(text_color_property_spatem_->getColor());
441  text_render->setColor(text_color);
442  child_scene_node->attachObject(text_render.get());
443  texts_.push_back(text_render);
444 }
445 
446 void MAPEMDisplay::update(float, float) {
447  // Check for outdated intersections and movement states
448  rclcpp::Time now = rviz_node_->now();
449  for (auto it = intersections_.begin(); it != intersections_.end(); ) {
450  if (it->second.getAge(now) > mapem_timeout_->getFloat()) it = intersections_.erase(it);
451  else {
452  it->second.removeOutdatedMovemenStates(now, spatem_timeout_->getFloat());
453  ++it;
454  }
455  }
456  // Render all valid intersections
457  intsct_ref_points_.clear();
458  lane_lines_.clear();
459  signal_groups_.clear();
460  texts_.clear();
461  for(auto it = intersections_.begin(); it != intersections_.end(); ++it) {
462  IntersectionRenderObject intsctn = it->second;
463  std::string utm_frame_key = intsctn.getHeader().frame_id;
464  Ogre::Vector3 sn_position;
465  Ogre::Quaternion sn_orientation;
466  if (!context_->getFrameManager()->getTransform(intsctn.getHeader(), sn_position, sn_orientation)) {
467  setMissingTransformToFixedFrame(utm_frame_key);
468  return;
469  }
470  setTransformOk();
471 
472  // set pose of the corresponding utm scene node
473  if (scene_nodes_utm_.find(utm_frame_key) == scene_nodes_utm_.end()) {
474  Ogre::SceneNode* scene_node = scene_node_->createChildSceneNode(utm_frame_key);
475  scene_nodes_utm_.insert({utm_frame_key, scene_node});
476  }
477 
478  scene_nodes_utm_[utm_frame_key]->setPosition(sn_position);
479  scene_nodes_utm_[utm_frame_key]->setOrientation(sn_orientation);
480 
481  // Set position of scene node
482  uint intersection_id = intsctn.getIntersectionID();
483 
484  if (scene_nodes_junctions_.find(intersection_id) == scene_nodes_junctions_.end()) {
485  Ogre::SceneNode* scene_node = scene_nodes_utm_[utm_frame_key]->createChildSceneNode(std::string("Junction: ") + std::to_string(intersection_id));
486  scene_nodes_junctions_.insert({intersection_id, scene_node});
487  }
488 
489  auto child_scene_node = scene_nodes_junctions_[intersection_id];
490 
491  geometry_msgs::msg::Point ref_position = intsctn.getRefPosition();
492  Ogre::Vector3 position(ref_position.x, ref_position.y, ref_position.z);
493  tf2::Quaternion rot_offset = intsctn.getGridConvergenceQuaternion();
494  Ogre::Quaternion orientation(rot_offset.w(), rot_offset.x(), rot_offset.y(), rot_offset.z());
495 
496  // set pose of child scene node of intersection
497  child_scene_node->setPosition(position);
498  child_scene_node->setOrientation(orientation);
499 
500  // visualize intersection
501  if(viz_mapem_->getBool()) {
502  RenderMapemShapes(child_scene_node);
503  }
504 
505  // visualize the lanes
506  for(size_t i = 0; i<intsctn.lanes.size(); i++) {
507  if(viz_mapem_->getBool()) {
508  RenderMapemShapesLane(child_scene_node, intsctn.lanes[i]);
509  }
510 
511  // Signal Groups
512  if(viz_spatem_->getBool() && intsctn.lanes[i].signal_group_ids.size() && intsctn.lanes[i].direction != LaneDirection::egress) {
513 
514  // Check if SignalGroup is present in IntersectionMovementState of Intersection
515  std::unordered_map<int, IntersectionMovementState>::iterator mvmnt_it;
516  IntersectionMovementState* mvmnt_ptr = nullptr;
517 
518  for(size_t j=0; j<intsctn.lanes[i].signal_group_ids.size(); j++) {
519  mvmnt_it = intsctn.movement_states.find(intsctn.lanes[i].signal_group_ids[j]);
520  if (mvmnt_it != intsctn.movement_states.end())
521  {
522  mvmnt_ptr = &mvmnt_it->second;
523  break;
524  }
525  }
526 
527  // Visualize current traffic state
528  RenderSpatemShapes(child_scene_node, intsctn.lanes[i], mvmnt_ptr);
529 
530  // create graphical text to display time information for signal change (see TimeChangeDetail Etsi definition)
531  RenderSpatemTexts(child_scene_node, intsctn.lanes[i], mvmnt_ptr);
532  }
533 
534  }
535  // Visualize MAPEM meta-information as text
536  if(viz_mapem_->getBool() && show_meta_mapem_->getBool()) {
537  RenderMapemTexts(child_scene_node, intsctn);
538  }
539  }
540 }
541 
542 } // namespace displays
543 } // namespace etsi_its_msgs
544 
545 #include <pluginlib/class_list_macros.hpp> // NOLINT
546 PLUGINLIB_EXPORT_CLASS(etsi_its_msgs::displays::MAPEMDisplay, rviz_common::Display)
etsi_its_msgs::displays::MAPEMDisplay::spatem_qos_property_
rviz_common::properties::QosProfileProperty * spatem_qos_property_
Definition: mapem_display.hpp:105
etsi_its_msgs::displays::MAPEMDisplay::char_height_mapem_
rviz_common::properties::FloatProperty * char_height_mapem_
Definition: mapem_display.hpp:102
etsi_its_msgs::displays::MAPEMDisplay::spatem_qos_profile_
rclcpp::QoS spatem_qos_profile_
Definition: mapem_display.hpp:97
etsi_its_msgs::displays::MAPEMDisplay::rviz_node_
rclcpp::Node::SharedPtr rviz_node_
Definition: mapem_display.hpp:95
etsi_its_msgs::displays::MAPEMDisplay::show_spatem_max_end_time
rviz_common::properties::BoolProperty * show_spatem_max_end_time
Definition: mapem_display.hpp:101
etsi_its_msgs::displays::MAPEMDisplay::color_property_ingress_
rviz_common::properties::ColorProperty * color_property_ingress_
Definition: mapem_display.hpp:103
etsi_its_msgs::displays::MAPEMDisplay::mapem_sphere_scale_property_
rviz_common::properties::FloatProperty * mapem_sphere_scale_property_
Definition: mapem_display.hpp:102
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
etsi_its_msgs::displays::MAPEMDisplay::viz_mapem_
rviz_common::properties::BoolProperty * viz_mapem_
Definition: mapem_display.hpp:100
etsi_its_msgs::displays::MAPEMDisplay::spatem_sphere_scale_property_
rviz_common::properties::FloatProperty * spatem_sphere_scale_property_
Definition: mapem_display.hpp:102
etsi_its_msgs::displays::MAPEMDisplay::received_spats_
uint64_t received_spats_
Definition: mapem_display.hpp:118
etsi_its_msgs::displays::IntersectionRenderObject
Definition: intersection_render_object.hpp:64
etsi_its_msgs::displays::MAPEMDisplay::color_property_egress_
rviz_common::properties::ColorProperty * color_property_egress_
Definition: mapem_display.hpp:103
etsi_its_msgs::displays::IntersectionRenderObject::lanes
std::vector< IntersectionLane > lanes
Definition: intersection_render_object.hpp:120
etsi_its_msgs::displays::MAPEMDisplay::RenderMapemShapesLane
void RenderMapemShapesLane(Ogre::SceneNode *child_scene_node, IntersectionLane &lane)
Definition: mapem_display.cpp:306
etsi_its_msgs::displays::MAPEMDisplay::text_color_property_mapem_
rviz_common::properties::ColorProperty * text_color_property_mapem_
Definition: mapem_display.hpp:103
etsi_its_msgs::displays::MAPEMDisplay::intsct_ref_points_
std::vector< std::shared_ptr< rviz_rendering::Shape > > intsct_ref_points_
Definition: mapem_display.hpp:114
etsi_its_msgs::displays::egress
@ egress
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::MAPEMDisplay::MAPEMDisplay
MAPEMDisplay()
Definition: mapem_display.cpp:56
etsi_its_msgs::displays::MAPEMDisplay::~MAPEMDisplay
~MAPEMDisplay() override
Definition: mapem_display.cpp:135
etsi_its_msgs::displays::IntersectionLane::nodes
std::vector< geometry_msgs::msg::Point > nodes
Definition: intersection_render_object.hpp:48
etsi_its_msgs::displays::MAPEMDisplay::show_spatem_likely_time
rviz_common::properties::BoolProperty * show_spatem_likely_time
Definition: mapem_display.hpp:101
etsi_its_msgs::displays::MAPEMDisplay
Displays an etsi_its_mapem_ts_msgs::MAPEM.
Definition: mapem_display.hpp:64
etsi_its_msgs::displays::MAPEMDisplay::texts_
std::vector< std::shared_ptr< rviz_rendering::MovableText > > texts_
Definition: mapem_display.hpp:116
etsi_its_msgs::displays::MAPEMDisplay::SPATEMCallback
void SPATEMCallback(etsi_its_spatem_ts_msgs::msg::SPATEM::ConstSharedPtr msg)
Definition: mapem_display.cpp:210
etsi_its_msgs::displays::color_orange
const Ogre::ColourValue color_orange(0.9, 0.7, 0.09, 1.0)
etsi_its_msgs::displays::IntersectionMovementState::phase_state
etsi_its_spatem_ts_msgs::msg::MovementPhaseState phase_state
Definition: intersection_render_object.hpp:55
etsi_its_msgs::displays::MAPEMDisplay::update
void update(float wall_dt, float ros_dt) override
Definition: mapem_display.cpp:446
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::MAPEMDisplay::spatem_topic_property_
rviz_common::properties::RosTopicProperty * spatem_topic_property_
Definition: mapem_display.hpp:104
etsi_its_msgs::displays::color_red
const Ogre::ColourValue color_red(0.8, 0.2, 0.2, 1.0)
mapem_display.hpp
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::MAPEMDisplay::scene_nodes_junctions_
std::map< uint, Ogre::SceneNode * > scene_nodes_junctions_
Definition: mapem_display.hpp:111
etsi_its_msgs::displays::MAPEMDisplay::spatem_timeout_
rviz_common::properties::FloatProperty * spatem_timeout_
Definition: mapem_display.hpp:102
etsi_its_msgs::displays::ingress
@ ingress
Definition: intersection_render_object.hpp:41
etsi_its_msgs::displays::MAPEMDisplay::mapem_timeout_
rviz_common::properties::FloatProperty * mapem_timeout_
Definition: mapem_display.hpp:102
etsi_its_msgs::displays::MAPEMDisplay::signal_groups_
std::vector< std::shared_ptr< rviz_rendering::Shape > > signal_groups_
Definition: mapem_display.hpp:114
etsi_its_msgs::displays::IntersectionLane::direction
LaneDirection direction
Definition: intersection_render_object.hpp:47
etsi_its_msgs::displays::MAPEMDisplay::show_spatem_min_end_time
rviz_common::properties::BoolProperty * show_spatem_min_end_time
Definition: mapem_display.hpp:101
etsi_its_msgs::displays::color_grey
const Ogre::ColourValue color_grey(0.5, 0.5, 0.5, 1.0)
etsi_its_msgs::displays::MAPEMDisplay::RenderMapemShapes
void RenderMapemShapes(Ogre::SceneNode *child_scene_node)
Definition: mapem_display.cpp:289
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::MAPEMDisplay::lane_lines_
std::vector< std::shared_ptr< rviz_rendering::BillboardLine > > lane_lines_
Definition: mapem_display.hpp:115
etsi_its_msgs::displays::IntersectionMovementState::signal_group_id
uint8_t signal_group_id
Definition: intersection_render_object.hpp:54
etsi_its_msgs::displays::MAPEMDisplay::processMessage
void processMessage(etsi_its_mapem_ts_msgs::msg::MAPEM::ConstSharedPtr msg) override
Definition: mapem_display.cpp:260
etsi_its_msgs::displays::IntersectionMovementState::header
std_msgs::msg::Header header
Definition: intersection_render_object.hpp:53
etsi_its_msgs::displays::MAPEMDisplay::onInitialize
void onInitialize() override
Definition: mapem_display.cpp:138
etsi_its_msgs::displays::MAPEMDisplay::changedSPATEMViz
void changedSPATEMViz()
Definition: mapem_display.cpp:161
etsi_its_msgs::displays::MAPEMDisplay::show_spatem_start_time
rviz_common::properties::BoolProperty * show_spatem_start_time
Definition: mapem_display.hpp:101
etsi_its_msgs::displays::IntersectionMovementState::time_change_details
etsi_its_spatem_ts_msgs::msg::TimeChangeDetails::SharedPtr time_change_details
Definition: intersection_render_object.hpp:56
etsi_its_msgs::displays::IntersectionRenderObject::getHeader
std_msgs::msg::Header getHeader()
Get the header.
Definition: intersection_render_object.cpp:150
etsi_its_msgs::displays::MAPEMDisplay::scene_nodes_utm_
std::map< std::string, Ogre::SceneNode * > scene_nodes_utm_
Definition: mapem_display.hpp:108
etsi_its_msgs::displays::color_green
const Ogre::ColourValue color_green(0.18, 0.79, 0.21, 1.0)
etsi_its_msgs::displays::MAPEMDisplay::lane_width_property_
rviz_common::properties::FloatProperty * lane_width_property_
Definition: mapem_display.hpp:102
etsi_its_msgs::displays::MAPEMDisplay::RenderSpatemTexts
void RenderSpatemTexts(Ogre::SceneNode *child_scene_node, IntersectionLane &lane, IntersectionMovementState *intersection_movement_state)
Definition: mapem_display.cpp:375
etsi_its_msgs::displays::MAPEMDisplay::show_meta_spatem_
rviz_common::properties::BoolProperty * show_meta_spatem_
Definition: mapem_display.hpp:100
etsi_its_msgs::displays::MAPEMDisplay::show_spatem_next_time
rviz_common::properties::BoolProperty * show_spatem_next_time
Definition: mapem_display.hpp:101
etsi_its_msgs::displays::MAPEMDisplay::show_spatem_confidence
rviz_common::properties::BoolProperty * show_spatem_confidence
Definition: mapem_display.hpp:101
etsi_its_msgs::displays::IntersectionMovementState
Definition: intersection_render_object.hpp:52
etsi_its_msgs::displays::MAPEMDisplay::RenderSpatemShapes
void RenderSpatemShapes(Ogre::SceneNode *child_scene_node, IntersectionLane &lane, IntersectionMovementState *intersection_movement_state)
Definition: mapem_display.cpp:341
etsi_its_msgs::displays::MAPEMDisplay::viz_spatem_
rviz_common::properties::BoolProperty * viz_spatem_
Definition: mapem_display.hpp:100
etsi_its_msgs::displays::MAPEMDisplay::char_height_spatem_
rviz_common::properties::FloatProperty * char_height_spatem_
Definition: mapem_display.hpp:102
etsi_its_msgs::displays::MAPEMDisplay::intersections_
std::unordered_map< int, IntersectionRenderObject > intersections_
Definition: mapem_display.hpp:113
etsi_its_msgs::displays::MAPEMDisplay::changedSPATEMTopic
void changedSPATEMTopic()
Definition: mapem_display.cpp:169
etsi_its_msgs::displays::MAPEMDisplay::RenderMapemTexts
void RenderMapemTexts(Ogre::SceneNode *child_scene_node, IntersectionRenderObject &intsctn)
Definition: mapem_display.cpp:326
etsi_its_msgs
Definition: cam_display.hpp:51
etsi_its_msgs::displays::MAPEMDisplay::show_meta_mapem_
rviz_common::properties::BoolProperty * show_meta_mapem_
Definition: mapem_display.hpp:100
etsi_its_msgs::displays::MAPEMDisplay::reset
void reset() override
Definition: mapem_display.cpp:152
etsi_its_msgs::displays::IntersectionLane
Definition: intersection_render_object.hpp:44
etsi_its_msgs::displays::MAPEMDisplay::spatem_subscriber_
rclcpp::Subscription< etsi_its_spatem_ts_msgs::msg::SPATEM >::SharedPtr spatem_subscriber_
Definition: mapem_display.hpp:96
etsi_its_msgs::displays::MAPEMDisplay::text_color_property_spatem_
rviz_common::properties::ColorProperty * text_color_property_spatem_
Definition: mapem_display.hpp:103


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