denm_display.cpp
Go to the documentation of this file.
2 
3 #include <OgreSceneNode.h>
4 #include <OgreSceneManager.h>
5 #include <OgreManualObject.h>
6 #include <OgreBillboardSet.h>
7 #include <OgreMaterialManager.h>
8 #include <OgreTechnique.h>
9 
10 #include "rviz_common/display_context.hpp"
11 #include "rviz_common/frame_manager_iface.hpp"
12 #include "rviz_common/logging.hpp"
13 #include "rviz_common/properties/color_property.hpp"
14 #include "rviz_common/properties/float_property.hpp"
15 #include "rviz_common/properties/bool_property.hpp"
16 
17 #include "rviz_common/properties/parse_color.hpp"
18 
19 namespace etsi_its_msgs
20 {
21 namespace displays
22 {
23 
25 {
26  // General Properties
27  buffer_timeout_ = new rviz_common::properties::FloatProperty(
28  "Timeout", 0.1f,
29  "Time (in s) until visualizations disappear", this);
30  buffer_timeout_->setMin(0);
31  color_property_ = new rviz_common::properties::ColorProperty(
32  "Color", QColor(255, 0, 25),
33  "Color", this);
34  show_meta_ = new rviz_common::properties::BoolProperty("Metadata", true,
35  "Show metadata as text next to objects", this);
36  text_color_property_ = new rviz_common::properties::ColorProperty(
37  "Color", QColor(255, 0, 25),
38  "Text color", show_meta_);
39  char_height_ = new rviz_common::properties::FloatProperty("Scale", 4.0, "Scale of text", show_meta_);
40  show_station_id_ = new rviz_common::properties::BoolProperty("StationID", true,
41  "Show StationID", show_meta_);
42  show_cause_code_ = new rviz_common::properties::BoolProperty("CauseCode", true, "Show CauseCode", show_meta_);
43  show_sub_cause_code_ = new rviz_common::properties::BoolProperty("SubCauseCode", true, "Show SubCauseCode", show_meta_);
44 }
45 
47 {
48  if (initialized() ) {
49  scene_manager_->destroyManualObject(manual_object_);
50  }
51 }
52 
54 {
55  RTDClass::onInitialize();
56 
57  auto nodeAbstraction = context_->getRosNodeAbstraction().lock();
58  rviz_node_ = nodeAbstraction->get_raw_node();
59 
60  manual_object_ = scene_manager_->createManualObject();
61  manual_object_->setDynamic(true);
62  scene_node_->attachObject(manual_object_);
63 }
64 
66 {
67  RTDClass::reset();
68  manual_object_->clear();
69 }
70 
71 void DENMDisplay::processMessage(etsi_its_denm_msgs::msg::DENM::ConstSharedPtr msg)
72 {
73  // Generate DENM render object from message
74  rclcpp::Time now = rviz_node_->now();
75  DENMRenderObject denm(*msg);
76  if (!denm.validateFloats()) {
77  setStatus(
78  rviz_common::properties::StatusProperty::Error, "Topic",
79  "Message contained invalid floating point values (nans or infs)");
80  return;
81  }
82 
83  // Check if Station ID is already present in list
84  auto it = denms_.find(denm.getStationID());
85  if (it != denms_.end()) it->second = denm; // Key exists, update the value
86  else denms_.insert(std::make_pair(denm.getStationID(), denm));
87 
88  return;
89 }
90 
91 void DENMDisplay::update(float, float)
92 {
93 
94  // Check for outdated DENMs
95  for (auto it = denms_.begin(); it != denms_.end(); ) {
96  if (it->second.getAge(rviz_node_->now()) > buffer_timeout_->getFloat()) it = denms_.erase(it);
97  else ++it;
98  }
99 
100  // Render all valid denms
101  arrows_.clear();
102  texts_.clear();
103  for(auto it = denms_.begin(); it != denms_.end(); ++it) {
104 
105  DENMRenderObject denm = it->second;
106  Ogre::Vector3 sn_position;
107  Ogre::Quaternion sn_orientation;
108  if (!context_->getFrameManager()->getTransform(denm.getHeader(), sn_position, sn_orientation)) {
109  setMissingTransformToFixedFrame(denm.getHeader().frame_id);
110  return;
111  }
112  setTransformOk();
113 
114  // set pose of scene node
115  scene_node_->setPosition(sn_position);
116  scene_node_->setOrientation(sn_orientation);
117 
118  auto child_scene_node = scene_node_->createChildSceneNode();
119  // Set position of scene node
120  geometry_msgs::msg::Pose pose = denm.getPose();
121  Ogre::Vector3 position(pose.position.x, pose.position.y, pose.position.z);
122  Ogre::Quaternion orientation(pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z);
123 
124  //set size parameters for arrow
125  int shaft_length = 5;
126  int shaft_diameter = 1;
127  int head_length = 2;
128  int head_diameter = 3;
129  position.z += (shaft_length+head_length);
130 
131  // set pose of child scene node arrow
132  child_scene_node->setPosition(position);
133  child_scene_node->setOrientation(orientation);
134 
135  // create arrow object
136  std::shared_ptr<rviz_rendering::Arrow> arrow = std::make_shared<rviz_rendering::Arrow>(scene_manager_, child_scene_node, shaft_length, shaft_diameter, head_length, head_diameter);
137 
138  // set the color of arrow
139  Ogre::ColourValue bb_color = rviz_common::properties::qtToOgre(color_property_->getColor());
140  arrow->setColor(bb_color);
141  arrow->setOrientation(orientation);
142  arrows_.push_back(arrow);
143 
144  // Visualize meta-information as text
145  if(show_meta_->getBool()) {
146  std::string text;
147  if(show_station_id_->getBool()) {
148  text+="StationID: " + std::to_string(denm.getStationID());
149  text+="\n";
150  }
151  if(show_cause_code_->getBool()) {
152  text+="Cause: " + denm.getCauseCode();
153  text+="\n";
154  }
155  if(show_sub_cause_code_->getBool()) {
156  text+="SubCause: " + denm.getSubCauseCode();
157  }
158 
159  if(!text.size()) return;
160  std::shared_ptr<rviz_rendering::MovableText> text_render = std::make_shared<rviz_rendering::MovableText>(text, "Liberation Sans", char_height_->getFloat());
161  double height = text_render->getBoundingRadius();
162  Ogre::Vector3 offs(0.0, 0.0, height);
163  // There is a bug in rviz_rendering::MovableText::setGlobalTranslation https://github.com/ros2/rviz/issues/974
164  text_render->setGlobalTranslation(offs);
165  Ogre::ColourValue text_color = rviz_common::properties::qtToOgre(text_color_property_->getColor());
166  text_render->setColor(text_color);
167  child_scene_node->attachObject(text_render.get());
168  texts_.push_back(text_render);
169  }
170  }
171 }
172 
173 } // namespace displays
174 } // namespace etsi_its_msgs
175 
176 #include <pluginlib/class_list_macros.hpp> // NOLINT
177 PLUGINLIB_EXPORT_CLASS(etsi_its_msgs::displays::DENMDisplay, rviz_common::Display)
etsi_its_msgs::displays::DENMDisplay::reset
void reset() override
Definition: denm_display.cpp:65
etsi_its_msgs::displays::DENMDisplay::show_cause_code_
rviz_common::properties::BoolProperty * show_cause_code_
Definition: denm_display.hpp:58
etsi_its_msgs::displays::DENMRenderObject::getPose
geometry_msgs::msg::Pose getPose()
Get pose of DENM-object.
Definition: denm_render_object.cpp:66
etsi_its_msgs::displays::DENMDisplay::~DENMDisplay
~DENMDisplay() override
Definition: denm_display.cpp:46
etsi_its_msgs::displays::DENMRenderObject::getStationID
int getStationID()
Get the StationID of DENM-object.
Definition: denm_render_object.cpp:62
etsi_its_msgs::displays::DENMDisplay::rviz_node_
rclcpp::Node::SharedPtr rviz_node_
Definition: denm_display.hpp:55
etsi_its_msgs::displays::DENMRenderObject::validateFloats
bool validateFloats()
This function validates all float variables that are part of a DENMRenderObject.
Definition: denm_render_object.cpp:47
etsi_its_msgs::displays::DENMDisplay::onInitialize
void onInitialize() override
Definition: denm_display.cpp:53
etsi_its_msgs::displays::DENMDisplay::arrows_
std::vector< std::shared_ptr< rviz_rendering::Arrow > > arrows_
Definition: denm_display.hpp:63
etsi_its_msgs::displays::DENMDisplay::text_color_property_
rviz_common::properties::ColorProperty * text_color_property_
Definition: denm_display.hpp:60
etsi_its_msgs::displays::DENMDisplay::denms_
std::unordered_map< int, DENMRenderObject > denms_
Definition: denm_display.hpp:62
etsi_its_msgs::displays::DENMRenderObject::getCauseCode
std::string getCauseCode()
Get the Cause Code object.
Definition: denm_render_object.cpp:74
etsi_its_msgs::displays::DENMDisplay::show_station_id_
rviz_common::properties::BoolProperty * show_station_id_
Definition: denm_display.hpp:58
etsi_its_msgs::displays::DENMDisplay::buffer_timeout_
rviz_common::properties::FloatProperty * buffer_timeout_
Definition: denm_display.hpp:59
etsi_its_msgs::displays::DENMDisplay::char_height_
rviz_common::properties::FloatProperty * char_height_
Definition: denm_display.hpp:59
etsi_its_msgs::displays::DENMDisplay::processMessage
void processMessage(etsi_its_denm_msgs::msg::DENM::ConstSharedPtr msg) override
Definition: denm_display.cpp:71
etsi_its_msgs::displays::DENMDisplay::show_meta_
rviz_common::properties::BoolProperty * show_meta_
Definition: denm_display.hpp:58
etsi_its_msgs::displays::DENMRenderObject::getHeader
std_msgs::msg::Header getHeader()
Get header of DENM-object.
Definition: denm_render_object.cpp:58
denm_display.hpp
etsi_its_msgs::displays::DENMRenderObject
Definition: denm_render_object.hpp:22
etsi_its_msgs::displays::DENMDisplay::color_property_
rviz_common::properties::ColorProperty * color_property_
Definition: denm_display.hpp:60
etsi_its_msgs::displays::DENMDisplay::manual_object_
Ogre::ManualObject * manual_object_
Definition: denm_display.hpp:53
etsi_its_msgs::displays::DENMDisplay::update
void update(float wall_dt, float ros_dt) override
Definition: denm_display.cpp:91
etsi_its_msgs::displays::DENMDisplay::show_sub_cause_code_
rviz_common::properties::BoolProperty * show_sub_cause_code_
Definition: denm_display.hpp:58
etsi_its_msgs::displays::DENMDisplay::texts_
std::vector< std::shared_ptr< rviz_rendering::MovableText > > texts_
Definition: denm_display.hpp:64
etsi_its_msgs::displays::DENMDisplay
Displays an etsi_its_denm_msgs::DENM.
Definition: denm_display.hpp:36
etsi_its_msgs::displays::DENMDisplay::DENMDisplay
DENMDisplay()
Definition: denm_display.cpp:24
etsi_its_msgs
Definition: cam_display.hpp:51
etsi_its_msgs::displays::DENMRenderObject::getSubCauseCode
std::string getSubCauseCode()
Get the Sub Cause Code object.
Definition: denm_render_object.cpp:78


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