marker_visualization.cpp
Go to the documentation of this file.
3 
6 #include <rviz/display_context.h>
7 #include <rviz/frame_manager.h>
8 #include <OgreSceneManager.h>
9 #include <OgreSceneNode.h>
10 #include <tf2_msgs/TF2Error.h>
11 #include <ros/console.h>
12 
13 namespace moveit_rviz_plugin {
14 
15 // create MarkerData with nil marker_ pointer, just with a copy of message
16 MarkerVisualization::MarkerData::MarkerData(const visualization_msgs::Marker& marker) {
17  msg_.reset(new visualization_msgs::Marker(marker));
18  msg_->header.stamp = ros::Time();
19  msg_->frame_locked = false;
20 }
21 
22 MarkerVisualization::MarkerVisualization(const std::vector<visualization_msgs::Marker>& markers,
23  const planning_scene::PlanningScene& end_scene) {
24  planning_frame_ = end_scene.getPlanningFrame();
25  // remember marker message, postpone rviz::MarkerBase creation until later
26  for (const auto& marker : markers) {
27  if (!end_scene.knowsFrameTransform(marker.header.frame_id)) {
28  ROS_WARN_ONCE("unknown frame '%s' for solution marker in namespace '%s'", marker.header.frame_id.c_str(),
29  marker.ns.c_str());
30  continue; // ignore markers with unknown frame
31  }
32 
33  // remember marker message
34  markers_.emplace_back(marker);
35  // remember namespace name
36  namespaces_.insert(std::make_pair(marker.ns, NamespaceData()));
37  }
38 }
39 
41  for (const auto& pair : namespaces_) {
42  if (pair.second.ns_node_)
43  pair.second.ns_node_->getCreator()->destroySceneNode(pair.second.ns_node_);
44  }
45 }
46 
47 void setVisibility(Ogre::SceneNode* node, Ogre::SceneNode* parent, bool visible) {
48  if (visible && node->getParent() != parent)
49  parent->addChild(node);
50  else if (!visible && node->getParent())
51  node->getParent()->removeChild(node);
52 }
53 
54 void MarkerVisualization::setVisible(const QString& ns, Ogre::SceneNode* parent_scene_node, bool visible) {
55  auto it = namespaces_.find(ns.toStdString());
56  if (it == namespaces_.end())
57  return;
58  setVisibility(it->second.ns_node_, parent_scene_node, visible);
59 }
60 
61 bool MarkerVisualization::createMarkers(rviz::DisplayContext* context, Ogre::SceneNode* parent_scene_node) {
62  if (markers_created_)
63  return true; // already called before
64 
65  // fetch transform from planning_frame_ to rviz' fixed frame
66  const std::string& fixed_frame = context->getFrameManager()->getFixedFrame();
67  Ogre::Quaternion quat;
68  Ogre::Vector3 pos = Ogre::Vector3::ZERO;
69 
70  try {
71  std::shared_ptr<tf2_ros::Buffer> tf = context->getFrameManager()->getTF2BufferPtr();
72  geometry_msgs::TransformStamped tm;
73  tm = tf->lookupTransform(planning_frame_, fixed_frame, ros::Time());
74  auto q = tm.transform.rotation;
75  auto p = tm.transform.translation;
76  quat = Ogre::Quaternion(q.w, -q.x, -q.y, -q.z);
77  pos = Ogre::Vector3(p.x, p.y, p.z);
78  } catch (const tf2::TransformException& e) {
79  ROS_WARN_STREAM_NAMED("MarkerVisualization", e.what());
80  return false;
81  }
82 
83  for (MarkerData& data : markers_) {
84  if (data.marker_)
85  continue;
86 
87  auto ns_it = namespaces_.find(data.msg_->ns);
88  Q_ASSERT(ns_it != namespaces_.end()); // we have added all namespaces before!
89  if (ns_it->second.ns_node_ == nullptr) // create scene node for this namespace
90  ns_it->second.ns_node_ = parent_scene_node->getCreator()->createSceneNode();
91  Ogre::SceneNode* node = ns_it->second.ns_node_;
92 
93  // create a scene node for all markers with given frame name
94  auto frame_it = ns_it->second.frames_.insert(std::make_pair(data.msg_->header.frame_id, nullptr)).first;
95  if (frame_it->second == nullptr)
96  frame_it->second = node->createChildSceneNode();
97  node = frame_it->second;
98 
99  data.marker_.reset(rviz::createMarker(data.msg_->type, nullptr, context, node));
100  if (!data.marker_)
101  continue; // failed to create marker
102 
103  // setMessage() initializes the marker, placing it at the message-specified frame
104  // w.r.t. rviz' current fixed frame. However, we want to place the marker w.r.t.
105  // the planning frame of the planning scene!
106 
107  // Hence, temporarily modify the message-specified frame to planning_frame_
108  const std::string msg_frame = data.msg_->header.frame_id;
109  data.msg_->header.frame_id = planning_frame_;
110  data.marker_->setMessage(data.msg_);
111  data.msg_->header.frame_id = msg_frame;
112 
113  // ... and subsequently revert any transform between rviz' fixed frame and planning_frame_
114  data.marker_->setOrientation(quat * data.marker_->getOrientation());
115  data.marker_->setPosition(quat * data.marker_->getPosition() + pos);
116  }
117  markers_created_ = true;
118  return true;
119 }
120 
122  const moveit::core::RobotState& robot_state) const {
123  Q_ASSERT(scene.getPlanningFrame() == planning_frame_);
124 
125  const visualization_msgs::Marker& marker = *data.msg_;
126  if (marker.header.frame_id == scene.getPlanningFrame())
127  return; // no need to transform nodes placed at planning frame
128 
129  // fetch base pose from robot_state / scene
130  Eigen::Affine3d pose;
131  if (robot_state.knowsFrameTransform(marker.header.frame_id))
132  pose = robot_state.getFrameTransform(marker.header.frame_id);
133  else if (scene.knowsFrameTransform(marker.header.frame_id))
134  pose = scene.getFrameTransform(marker.header.frame_id);
135  else {
136  ROS_WARN_ONCE_NAMED("MarkerVisualization", "unknown frame '%s' for solution marker in namespace '%s'",
137  marker.header.frame_id.c_str(), marker.ns.c_str());
138  return; // ignore markers with unknown frame
139  }
140 
141  auto ns_it = namespaces_.find(marker.ns);
142  Q_ASSERT(ns_it != namespaces_.end()); // we have added all namespaces before
143  auto frame_it = ns_it->second.frames_.find(marker.header.frame_id);
144  Q_ASSERT(frame_it != ns_it->second.frames_.end()); // we have created all of them
145 
146  const Eigen::Quaterniond q{ pose.linear() };
147  const Eigen::Vector3d& p = pose.translation();
148  frame_it->second->setOrientation(Ogre::Quaternion(q.w(), q.x(), q.y(), q.z()));
149  frame_it->second->setPosition(Ogre::Vector3(p.x(), p.y(), p.z()));
150 }
151 
153  const moveit::core::RobotState& robot_state) {
154  for (MarkerData& data : markers_)
155  update(data, end_scene, robot_state);
156 }
157 
159  : rviz::BoolProperty(name, true, "Enable/disable markers", parent) {
161  new rviz::BoolProperty("All at once?", false, "Show all markers of multiple subsolutions at once?", this,
162  SLOT(onAllAtOnceChanged()), this);
163 
164  connect(this, SIGNAL(changed()), this, SLOT(onEnableChanged()));
165 }
166 
168  if (marker_scene_node_)
169  marker_scene_node_->getCreator()->destroySceneNode(marker_scene_node_);
170 }
171 
172 void MarkerVisualizationProperty::onInitialize(Ogre::SceneNode* scene_node, rviz::DisplayContext* context) {
173  context_ = context;
174  parent_scene_node_ = scene_node;
175  marker_scene_node_ = parent_scene_node_->createChildSceneNode();
176 }
177 
179  // detach all existing scene nodes
180  marker_scene_node_->removeAllChildren();
181  // clear list of hosted markers
182  hosted_markers_.clear();
183 }
184 
185 void MarkerVisualizationProperty::addMarkers(const MarkerVisualizationPtr& markers) {
186  if (!markers)
187  return;
188 
189  // remember that those markers are hosted
190  hosted_markers_.push_back(markers);
191  // create markers if not yet done
192  if (!markers->created() && !markers->createMarkers(context_, marker_scene_node_))
193  return; // if markers not created, nothing to do here
194 
195  // attach all scene nodes from markers
196  for (const auto& pair : markers->namespaces()) {
197  QString ns = QString::fromStdString(pair.first);
198  // create sub property for newly encountered namespace, enabling visibility by default
199  auto ns_it = namespaces_.insert(std::make_pair(ns, nullptr)).first;
200  if (ns_it->second == nullptr) {
201  ns_it->second = new rviz::BoolProperty(ns, true, "Show/hide markers of this namespace", this,
202  SLOT(onNSEnableChanged()), this);
203  }
204  Q_ASSERT(pair.second.ns_node_); // nodes should have been created in createMarkers()
205 
206  if (ns_it->second->getBool())
207  marker_scene_node_->addChild(pair.second.ns_node_);
208  }
209 }
210 
212  const moveit::core::RobotState& robot_state) {
213  for (const auto& markers : hosted_markers_) {
214  if (!markers->created())
215  if (!markers->createMarkers(context_, marker_scene_node_))
216  continue;
217  markers->update(scene, robot_state);
218  }
219 }
220 
222  return all_markers_at_once_->getBool();
223 }
224 
227 }
228 
230  rviz::BoolProperty* ns_property = static_cast<rviz::BoolProperty*>(sender());
231  const QString& ns = ns_property->getName();
232  bool visible = ns_property->getBool();
233  // for all hosted markers, set visibility of given namespace
234  for (const auto& markers : hosted_markers_)
235  markers->setVisible(ns, marker_scene_node_, visible);
236 }
237 
240 }
241 
242 } // namespace moveit_rviz_plugin
moveit_rviz_plugin::MarkerVisualization::namespaces_
std::map< std::string, NamespaceData > namespaces_
Definition: marker_visualization.h:59
moveit_rviz_plugin::MarkerVisualization::MarkerData
Definition: marker_visualization.h:42
rviz::FrameManager::getTF2BufferPtr
const std::shared_ptr< tf2_ros::Buffer > getTF2BufferPtr()
rviz::BoolProperty::getBool
virtual bool getBool() const
moveit_rviz_plugin::MarkerVisualizationProperty::parent_scene_node_
Ogre::SceneNode * parent_scene_node_
Definition: marker_visualization.h:96
moveit_rviz_plugin::MarkerVisualizationProperty::onInitialize
void onInitialize(Ogre::SceneNode *scene_node, rviz::DisplayContext *context)
Definition: marker_visualization.cpp:172
moveit_rviz_plugin::MarkerVisualizationProperty::~MarkerVisualizationProperty
~MarkerVisualizationProperty() override
Definition: marker_visualization.cpp:167
moveit_rviz_plugin::MarkerVisualizationProperty::all_markers_at_once_
rviz::BoolProperty * all_markers_at_once_
Definition: marker_visualization.h:100
marker_visualization.h
moveit_rviz_plugin::MarkerVisualizationProperty::allAtOnceChanged
void allAtOnceChanged(bool)
moveit_rviz_plugin::MarkerVisualization::markers_created_
bool markers_created_
Definition: marker_visualization.h:64
moveit_rviz_plugin::setVisibility
void setVisibility(Ogre::SceneNode *node, Ogre::SceneNode *parent, bool visible)
Definition: marker_visualization.cpp:47
quat
quat
moveit::core::RobotState::knowsFrameTransform
bool knowsFrameTransform(const std::string &frame_id) const
rviz::createMarker
MarkerBase * createMarker(int marker_type, MarkerDisplay *owner, DisplayContext *context, Ogre::SceneNode *parent_node)
moveit_rviz_plugin::MarkerVisualizationProperty::namespaces_
std::map< QString, rviz::BoolProperty * > namespaces_
Definition: marker_visualization.h:98
planning_scene::PlanningScene
rviz::BoolProperty
frame_manager.h
data
data
moveit_rviz_plugin::MarkerVisualizationProperty::clearMarkers
void clearMarkers()
remove all hosted markers from display
Definition: marker_visualization.cpp:178
moveit_rviz_plugin::MarkerVisualizationProperty::update
void update(const planning_scene::PlanningScene &scene, const moveit::core::RobotState &robot_state)
update pose of all markers
Definition: marker_visualization.cpp:211
moveit_rviz_plugin::MarkerVisualization::planning_frame_
std::string planning_frame_
Definition: marker_visualization.h:62
ROS_WARN_ONCE_NAMED
#define ROS_WARN_ONCE_NAMED(name,...)
ROS_WARN_ONCE
#define ROS_WARN_ONCE(...)
moveit::core::RobotState
moveit_rviz_plugin::MarkerVisualization::~MarkerVisualization
~MarkerVisualization()
Definition: marker_visualization.cpp:40
moveit_rviz_plugin::MarkerVisualizationProperty::context_
rviz::DisplayContext * context_
Definition: marker_visualization.h:95
rviz::Property
console.h
planning_scene::PlanningScene::knowsFrameTransform
bool knowsFrameTransform(const std::string &id) const
marker_utils.h
moveit_rviz_plugin::MarkerVisualization::update
void update(const planning_scene::PlanningScene &end_scene, const moveit::core::RobotState &robot_state)
update marker position/orientation based on frames of given scene + robot_state
Definition: marker_visualization.cpp:152
rviz::FrameManager::getFixedFrame
const std::string & getFixedFrame()
moveit_rviz_plugin::MarkerVisualizationProperty::addMarkers
void addMarkers(const MarkerVisualizationPtr &markers)
add markers in MarkerVisualization for display
Definition: marker_visualization.cpp:185
rviz
rviz::Property::connect
std::enable_if<!QtPrivate::FunctionPointer< Func >::IsPointerToMemberFunction, QMetaObject::Connection >::type connect(const QObject *context, Func &&slot, Qt::ConnectionType type=Qt::AutoConnection)
moveit_rviz_plugin::MarkerVisualization::NamespaceData
Definition: marker_visualization.h:49
moveit_rviz_plugin::MarkerVisualization::setVisible
void setVisible(const QString &ns, Ogre::SceneNode *parent_scene_node, bool visible)
Definition: marker_visualization.cpp:54
moveit_rviz_plugin::MarkerVisualizationProperty::onAllAtOnceChanged
void onAllAtOnceChanged()
Definition: marker_visualization.cpp:238
moveit_rviz_plugin::MarkerVisualization::MarkerVisualization
MarkerVisualization(const std::vector< visualization_msgs::Marker > &markers, const planning_scene::PlanningScene &end_scene)
Definition: marker_visualization.cpp:22
rviz::DisplayContext
rviz::DisplayContext::getFrameManager
virtual FrameManager * getFrameManager() const=0
name
name
q
q
ROS_WARN_STREAM_NAMED
#define ROS_WARN_STREAM_NAMED(name, args)
moveit_rviz_plugin::MarkerVisualizationProperty::onNSEnableChanged
void onNSEnableChanged()
Definition: marker_visualization.cpp:229
moveit_rviz_plugin
moveit_rviz_plugin::MarkerVisualizationProperty::hosted_markers_
std::list< MarkerVisualizationPtr > hosted_markers_
Definition: marker_visualization.h:99
moveit::core::RobotState::getFrameTransform
const Eigen::Isometry3d & getFrameTransform(const std::string &frame_id, bool *frame_found=nullptr)
moveit_rviz_plugin::MarkerVisualization::markers_
std::deque< MarkerData > markers_
Definition: marker_visualization.h:57
planning_scene::PlanningScene::getPlanningFrame
const std::string & getPlanningFrame() const
rviz::Property::getName
virtual QString getName() const
planning_scene.h
moveit_rviz_plugin::MarkerVisualization::createMarkers
bool createMarkers(rviz::DisplayContext *context, Ogre::SceneNode *scene_node)
create markers (placed at planning frame of scene)
Definition: marker_visualization.cpp:61
moveit_rviz_plugin::MarkerVisualization::MarkerData::MarkerData
MarkerData(const visualization_msgs::Marker &marker)
Definition: marker_visualization.cpp:16
ros::Time
moveit_rviz_plugin::MarkerVisualization::MarkerData::msg_
visualization_msgs::MarkerPtr msg_
Definition: marker_visualization.h:44
marker_base.h
planning_scene::PlanningScene::getFrameTransform
const Eigen::Isometry3d & getFrameTransform(const std::string &id) const
rviz::Property::changed
void changed()
tf
tf2::TransformException
moveit_rviz_plugin::MarkerVisualizationProperty::MarkerVisualizationProperty
MarkerVisualizationProperty(const QString &name, Property *parent=nullptr)
Definition: marker_visualization.cpp:158
moveit_rviz_plugin::MarkerVisualizationProperty::marker_scene_node_
Ogre::SceneNode * marker_scene_node_
Definition: marker_visualization.h:97
display_context.h
moveit_rviz_plugin::MarkerVisualizationProperty::onEnableChanged
void onEnableChanged()
Definition: marker_visualization.cpp:225
moveit_rviz_plugin::MarkerVisualizationProperty::allAtOnce
bool allAtOnce() const
Definition: marker_visualization.cpp:221


visualization
Author(s): Robert Haschke
autogenerated on Sat May 3 2025 02:40:38