27 #include <OgreSceneNode.h>
28 #include <OgreSceneManager.h>
29 #include <OgreManualObject.h>
30 #include <OgreBillboardSet.h>
31 #include <OgreMaterialManager.h>
32 #include <OgreTechnique.h>
34 #include "rviz_common/display_context.hpp"
35 #include "rviz_common/transformation/transformation_manager.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"
42 #include "rviz_common/properties/parse_color.hpp"
54 "Time (in s) until objects disappear",
this);
56 bb_scale_ =
new rviz_common::properties::FloatProperty(
58 "Scale of objects",
this);
61 "Color", QColor(25, 0, 255),
62 "Object color",
this);
63 show_meta_ =
new rviz_common::properties::BoolProperty(
"Metadata",
true,
64 "Show metadata as text next to objects",
this);
66 "Color", QColor(25, 0, 255),
69 show_station_id_ =
new rviz_common::properties::BoolProperty(
"StationID",
true,
71 show_speed_ =
new rviz_common::properties::BoolProperty(
"Speed",
true,
85 RTDClass::onInitialize();
87 auto nodeAbstraction = context_->getRosNodeAbstraction().lock();
105 uint64_t nanosecs = now.nanoseconds();
108 rviz_common::properties::StatusProperty::Warn,
"Topic",
109 "Message received before clock got a valid time");
113 CAMRenderObject cam(*msg, now, getLeapSecondInsertionsSince2004(
static_cast<uint64_t
>(now.seconds())));
116 rviz_common::properties::StatusProperty::Error,
"Topic",
117 "Message contained invalid floating point values (nans or infs)");
123 if (it !=
cams_.end()) it->second = cam;
132 for (
auto it =
cams_.begin(); it !=
cams_.end(); ) {
134 it =
cams_.erase(it);
144 for(
auto it =
cams_.begin(); it !=
cams_.end(); ++it) {
147 Ogre::Vector3 sn_position;
148 Ogre::Quaternion sn_orientation;
149 if (!context_->getFrameManager()->getTransform(cam.
getHeader(), sn_position, sn_orientation)) {
151 setMissingTransformToFixedFrame(cam.
getHeader().frame_id);
156 std::string fixed_frame = fixed_frame_.toStdString();
157 geometry_msgs::msg::PoseStamped pose_origin;
159 pose_origin.pose.position.x = 0;
160 pose_origin.pose.position.y = 0;
161 pose_origin.pose.position.z = 0;
162 pose_origin.pose.orientation.w = 1;
163 pose_origin.pose.orientation.x = 0;
164 pose_origin.pose.orientation.y = 0;
165 pose_origin.pose.orientation.z = 0;
166 geometry_msgs::msg::PoseStamped pose_fixed_frame = context_->getTransformationManager()->getCurrentTransformer()->transform(pose_origin, fixed_frame);
167 geometry_msgs::msg::TransformStamped transform_to_fixed_frame;
168 transform_to_fixed_frame.header = pose_fixed_frame.header;
169 transform_to_fixed_frame.transform.translation.x = pose_fixed_frame.pose.position.x;
170 transform_to_fixed_frame.transform.translation.y = pose_fixed_frame.pose.position.y;
171 transform_to_fixed_frame.transform.translation.z = pose_fixed_frame.pose.position.z;
172 transform_to_fixed_frame.transform.rotation = pose_fixed_frame.pose.orientation;
177 scene_node_->setPosition(Ogre::Vector3{0.0f, 0.0f, 0.0f});
178 scene_node_->setOrientation(Ogre::Quaternion{1.0f, 0.0f, 0.0f, 0.0f});
180 auto child_scene_node = scene_node_->createChildSceneNode();
182 geometry_msgs::msg::Pose pose = cam.
getPose();
183 geometry_msgs::msg::Vector3 dimensions = cam.
getDimensions();
184 tf2::doTransform(pose, pose, transform_to_fixed_frame);
185 Ogre::Vector3 position(pose.position.x, pose.position.y, pose.position.z);
186 Ogre::Quaternion orientation(pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z);
195 tf2::fromMsg(pose.orientation, q);
197 tf2::Vector3 v(-dimensions.x/2.0, 0.0, dimensions.z/2.0);
205 child_scene_node->setPosition(position);
206 child_scene_node->setOrientation(orientation);
209 std::shared_ptr<rviz_rendering::Shape> bbox = std::make_shared<rviz_rendering::Shape>(rviz_rendering::Shape::Cube, scene_manager_, child_scene_node);
214 dims.x = dimensions.x*scale;
215 dims.y = dimensions.y*scale;
216 dims.z = dimensions.z*scale;
217 bbox->setScale(dims);
219 Ogre::ColourValue bb_color = rviz_common::properties::qtToOgre(
color_property_->getColor());
220 bbox->setColor(bb_color);
227 text+=
"StationID: " + std::to_string(cam.
getStationID());
231 text+=
"Speed: " + std::to_string((
int)(cam.
getSpeed()*3.6)) +
" km/h";
233 if(!text.size())
return;
234 std::shared_ptr<rviz_rendering::MovableText> text_render = std::make_shared<rviz_rendering::MovableText>(text,
"Liberation Sans",
char_height_->getFloat());
235 double height = dims.z;
236 height+=text_render->getBoundingRadius();
237 Ogre::Vector3 offs(0.0, 0.0, height);
239 text_render->setGlobalTranslation(offs);
240 Ogre::ColourValue text_color = rviz_common::properties::qtToOgre(
text_color_property_->getColor());
241 text_render->setColor(text_color);
242 child_scene_node->attachObject(text_render.get());
243 texts_.push_back(text_render);
251 #include <pluginlib/class_list_macros.hpp>