27 #include <OgreBillboardSet.h>
28 #include <OgreManualObject.h>
29 #include <OgreMaterialManager.h>
30 #include <OgreSceneManager.h>
31 #include <OgreSceneNode.h>
32 #include <OgreTechnique.h>
34 #include "rviz_common/display_context.hpp"
35 #include "rviz_common/frame_manager_iface.hpp"
36 #include "rviz_common/logging.hpp"
37 #include "rviz_common/properties/bool_property.hpp"
38 #include "rviz_common/properties/color_property.hpp"
39 #include "rviz_common/properties/float_property.hpp"
40 #include "rviz_common/transformation/transformation_manager.hpp"
42 #include "rviz_common/properties/parse_color.hpp"
50 new rviz_common::properties::FloatProperty(
"Timeout", 1.0f,
"Time period (in s) in which CPM are valid and should be displayed (now - reference_time of CPM)",
this);
52 bb_scale_ =
new rviz_common::properties::FloatProperty(
"Scale", 1.0f,
"Scale of objects",
this);
54 color_property_ =
new rviz_common::properties::ColorProperty(
"Color", QColor(25, 0, 255),
"Object color",
this);
56 new rviz_common::properties::BoolProperty(
"Metadata",
true,
"Show metadata as text next to objects",
this);
58 new rviz_common::properties::ColorProperty(
"Color", QColor(25, 0, 255),
"Text color",
show_meta_);
71 RTDClass::onInitialize();
73 auto nodeAbstraction = context_->getRosNodeAbstraction().lock();
88 uint64_t nanosecs = now.nanoseconds();
90 setStatus(rviz_common::properties::StatusProperty::Warn,
"Topic",
"Message received before clock got a valid time");
97 setStatus(rviz_common::properties::StatusProperty::Error,
"Topic",
98 "Message contained invalid floating point values (nans or infs)");
104 if (it !=
cpms_.end()) {
115 for (
auto it =
cpms_.begin(); it !=
cpms_.end();) {
117 it =
cpms_.erase(it);
124 for (
auto it =
cpms_.begin(); it !=
cpms_.end(); ++it) {
127 Ogre::Vector3 sn_position;
128 Ogre::Quaternion sn_orientation;
129 if (!context_->getFrameManager()->getTransform(cpm.
getHeader(), sn_position, sn_orientation)) {
131 setMissingTransformToFixedFrame(cpm.
getHeader().frame_id);
136 std::string fixed_frame = fixed_frame_.toStdString();
137 geometry_msgs::msg::PoseStamped pose_origin;
139 pose_origin.pose.position.x = 0;
140 pose_origin.pose.position.y = 0;
141 pose_origin.pose.position.z = 0;
142 pose_origin.pose.orientation.w = 1;
143 pose_origin.pose.orientation.x = 0;
144 pose_origin.pose.orientation.y = 0;
145 pose_origin.pose.orientation.z = 0;
146 geometry_msgs::msg::PoseStamped pose_fixed_frame =
147 context_->getTransformationManager()->getCurrentTransformer()->transform(pose_origin, fixed_frame);
148 geometry_msgs::msg::TransformStamped transform_to_fixed_frame;
149 transform_to_fixed_frame.header = pose_fixed_frame.header;
150 transform_to_fixed_frame.transform.translation.x = pose_fixed_frame.pose.position.x;
151 transform_to_fixed_frame.transform.translation.y = pose_fixed_frame.pose.position.y;
152 transform_to_fixed_frame.transform.translation.z = pose_fixed_frame.pose.position.z;
153 transform_to_fixed_frame.transform.rotation = pose_fixed_frame.pose.orientation;
158 scene_node_->setPosition(Ogre::Vector3{0.0f, 0.0f, 0.0f});
159 scene_node_->setOrientation(Ogre::Quaternion{1.0f, 0.0f, 0.0f, 0.0f});
161 auto child_scene_node = scene_node_->createChildSceneNode();
166 tf2::doTransform(pose, pose, transform_to_fixed_frame);
167 Ogre::Vector3 position(pose.position.x, pose.position.y, pose.position.z);
168 Ogre::Quaternion orientation(pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z);
171 child_scene_node->setPosition(position);
172 child_scene_node->setOrientation(orientation);
175 std::shared_ptr<rviz_rendering::Shape> bbox =
176 std::make_shared<rviz_rendering::Shape>(rviz_rendering::Shape::Cube, scene_manager_, child_scene_node);
181 dims.x = dimensions.x * scale;
182 dims.y = dimensions.y * scale;
183 dims.z = dimensions.z * scale;
184 bbox->setScale(dims);
186 Ogre::ColourValue bb_color = rviz_common::properties::qtToOgre(
color_property_->getColor());
187 bbox->setColor(bb_color);
194 text +=
"StationID: " + std::to_string(cpm.
getStationID());
200 double speed = sqrt(pow(velocity.x, 2) + pow(velocity.y, 2) + pow(velocity.z, 2));
201 text +=
"Speed: " + std::to_string((
int)(speed * 3.6)) +
" km/h";
203 if (!text.size())
return;
204 std::shared_ptr<rviz_rendering::MovableText> text_render =
205 std::make_shared<rviz_rendering::MovableText>(text,
"Liberation Sans",
char_height_->getFloat());
206 double height = dims.z;
207 height += text_render->getBoundingRadius();
208 Ogre::Vector3 offs(0.0, 0.0, height);
210 text_render->setGlobalTranslation(offs);
211 Ogre::ColourValue text_color = rviz_common::properties::qtToOgre(
text_color_property_->getColor());
212 text_render->setColor(text_color);
213 child_scene_node->attachObject(text_render.get());
214 texts_.push_back(text_render);
223 #include <pluginlib/class_list_macros.hpp>