Display submap poses in Submaps plugin (#416)
- simplify code around toggling submap visibility - pass DisplayContext to DrawableSubmap - add parent scene node for both submap and axes - remove unnecessary const Fixes #405.master
parent
1358f719a5
commit
bd28ec1a58
|
@ -64,15 +64,21 @@ Ogre::Quaternion ToOgre(const Eigen::Quaterniond& q) {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
DrawableSubmap::DrawableSubmap(const ::cartographer::mapping::SubmapId& id,
|
DrawableSubmap::DrawableSubmap(
|
||||||
Ogre::SceneManager* const scene_manager,
|
const ::cartographer::mapping::SubmapId& id,
|
||||||
::rviz::Property* submap_category,
|
::rviz::DisplayContext* const display_context,
|
||||||
const bool visible)
|
::rviz::Property* const submap_category, const bool visible,
|
||||||
|
const float pose_axes_length, const float pose_axes_radius)
|
||||||
: id_(id),
|
: id_(id),
|
||||||
scene_manager_(scene_manager),
|
display_context_(display_context),
|
||||||
scene_node_(scene_manager->getRootSceneNode()->createChildSceneNode()),
|
scene_node_(display_context->getSceneManager()
|
||||||
manual_object_(scene_manager->createManualObject(
|
->getRootSceneNode()
|
||||||
|
->createChildSceneNode()),
|
||||||
|
submap_node_(scene_node_->createChildSceneNode()),
|
||||||
|
manual_object_(display_context->getSceneManager()->createManualObject(
|
||||||
kManualObjectPrefix + GetSubmapIdentifier(id))),
|
kManualObjectPrefix + GetSubmapIdentifier(id))),
|
||||||
|
pose_axes_(display_context->getSceneManager(), scene_node_,
|
||||||
|
pose_axes_length, pose_axes_radius),
|
||||||
last_query_timestamp_(0) {
|
last_query_timestamp_(0) {
|
||||||
material_ = Ogre::MaterialManager::getSingleton().getByName(
|
material_ = Ogre::MaterialManager::getSingleton().getByName(
|
||||||
kSubmapSourceMaterialName);
|
kSubmapSourceMaterialName);
|
||||||
|
@ -90,9 +96,8 @@ DrawableSubmap::DrawableSubmap(const ::cartographer::mapping::SubmapId& id,
|
||||||
visibility_ = ::cartographer::common::make_unique<::rviz::BoolProperty>(
|
visibility_ = ::cartographer::common::make_unique<::rviz::BoolProperty>(
|
||||||
"" /* title */, visible, "" /* description */, submap_category,
|
"" /* title */, visible, "" /* description */, submap_category,
|
||||||
SLOT(ToggleVisibility()), this);
|
SLOT(ToggleVisibility()), this);
|
||||||
if (visible) {
|
submap_node_->attachObject(manual_object_);
|
||||||
scene_node_->attachObject(manual_object_);
|
scene_node_->setVisible(visible);
|
||||||
}
|
|
||||||
connect(this, SIGNAL(RequestSucceeded()), this, SLOT(UpdateSceneNode()));
|
connect(this, SIGNAL(RequestSucceeded()), this, SLOT(UpdateSceneNode()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,8 +112,9 @@ DrawableSubmap::~DrawableSubmap() {
|
||||||
Ogre::TextureManager::getSingleton().remove(texture_->getHandle());
|
Ogre::TextureManager::getSingleton().remove(texture_->getHandle());
|
||||||
texture_.setNull();
|
texture_.setNull();
|
||||||
}
|
}
|
||||||
scene_manager_->destroySceneNode(scene_node_);
|
display_context_->getSceneManager()->destroySceneNode(submap_node_);
|
||||||
scene_manager_->destroyManualObject(manual_object_);
|
display_context_->getSceneManager()->destroySceneNode(scene_node_);
|
||||||
|
display_context_->getSceneManager()->destroyManualObject(manual_object_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawableSubmap::Update(
|
void DrawableSubmap::Update(
|
||||||
|
@ -250,8 +256,11 @@ void DrawableSubmap::UpdateTransform() {
|
||||||
CHECK(submap_texture_ != nullptr);
|
CHECK(submap_texture_ != nullptr);
|
||||||
const ::cartographer::transform::Rigid3d pose =
|
const ::cartographer::transform::Rigid3d pose =
|
||||||
pose_ * submap_texture_->slice_pose;
|
pose_ * submap_texture_->slice_pose;
|
||||||
scene_node_->setPosition(ToOgre(pose.translation()));
|
submap_node_->setPosition(ToOgre(pose.translation()));
|
||||||
scene_node_->setOrientation(ToOgre(pose.rotation()));
|
submap_node_->setOrientation(ToOgre(pose.rotation()));
|
||||||
|
pose_axes_.setPosition(ToOgre(pose_.translation()));
|
||||||
|
pose_axes_.setOrientation(ToOgre(pose_.rotation()));
|
||||||
|
display_context_->queueRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
float DrawableSubmap::UpdateAlpha(const float target_alpha) {
|
float DrawableSubmap::UpdateAlpha(const float target_alpha) {
|
||||||
|
@ -263,15 +272,7 @@ float DrawableSubmap::UpdateAlpha(const float target_alpha) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawableSubmap::ToggleVisibility() {
|
void DrawableSubmap::ToggleVisibility() {
|
||||||
if (visibility_->getBool()) {
|
scene_node_->setVisible(visibility_->getBool());
|
||||||
if (scene_node_->numAttachedObjects() == 0) {
|
|
||||||
scene_node_->attachObject(manual_object_);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (scene_node_->numAttachedObjects() > 0) {
|
|
||||||
scene_node_->detachObject(manual_object_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace cartographer_rviz
|
} // namespace cartographer_rviz
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "ros/ros.h"
|
#include "ros/ros.h"
|
||||||
#include "rviz/display_context.h"
|
#include "rviz/display_context.h"
|
||||||
#include "rviz/frame_manager.h"
|
#include "rviz/frame_manager.h"
|
||||||
|
#include "rviz/ogre_helpers/axes.h"
|
||||||
#include "rviz/properties/bool_property.h"
|
#include "rviz/properties/bool_property.h"
|
||||||
|
|
||||||
namespace cartographer_rviz {
|
namespace cartographer_rviz {
|
||||||
|
@ -48,10 +49,10 @@ class DrawableSubmap : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// The 'scene_manager' is the Ogre scene manager to which to add a node.
|
|
||||||
DrawableSubmap(const ::cartographer::mapping::SubmapId& submap_id,
|
DrawableSubmap(const ::cartographer::mapping::SubmapId& submap_id,
|
||||||
Ogre::SceneManager* scene_manager,
|
::rviz::DisplayContext* display_context,
|
||||||
::rviz::Property* submap_category, const bool visible);
|
::rviz::Property* submap_category, bool visible,
|
||||||
|
float pose_axes_length, float pose_axes_radius);
|
||||||
~DrawableSubmap() override;
|
~DrawableSubmap() override;
|
||||||
DrawableSubmap(const DrawableSubmap&) = delete;
|
DrawableSubmap(const DrawableSubmap&) = delete;
|
||||||
DrawableSubmap& operator=(const DrawableSubmap&) = delete;
|
DrawableSubmap& operator=(const DrawableSubmap&) = delete;
|
||||||
|
@ -96,12 +97,14 @@ class DrawableSubmap : public QObject {
|
||||||
const ::cartographer::mapping::SubmapId id_;
|
const ::cartographer::mapping::SubmapId id_;
|
||||||
|
|
||||||
::cartographer::common::Mutex mutex_;
|
::cartographer::common::Mutex mutex_;
|
||||||
Ogre::SceneManager* const scene_manager_;
|
::rviz::DisplayContext* const display_context_;
|
||||||
Ogre::SceneNode* const scene_node_;
|
Ogre::SceneNode* const scene_node_;
|
||||||
Ogre::ManualObject* manual_object_;
|
Ogre::SceneNode* const submap_node_;
|
||||||
|
Ogre::ManualObject* const manual_object_;
|
||||||
Ogre::TexturePtr texture_;
|
Ogre::TexturePtr texture_;
|
||||||
Ogre::MaterialPtr material_;
|
Ogre::MaterialPtr material_;
|
||||||
::cartographer::transform::Rigid3d pose_ GUARDED_BY(mutex_);
|
::cartographer::transform::Rigid3d pose_ GUARDED_BY(mutex_);
|
||||||
|
::rviz::Axes pose_axes_;
|
||||||
std::chrono::milliseconds last_query_timestamp_ GUARDED_BY(mutex_);
|
std::chrono::milliseconds last_query_timestamp_ GUARDED_BY(mutex_);
|
||||||
bool query_in_progress_ = false GUARDED_BY(mutex_);
|
bool query_in_progress_ = false GUARDED_BY(mutex_);
|
||||||
int metadata_version_ = -1 GUARDED_BY(mutex_);
|
int metadata_version_ = -1 GUARDED_BY(mutex_);
|
||||||
|
|
|
@ -133,11 +133,14 @@ void SubmapsDisplay::processMessage(
|
||||||
auto& trajectory_category = trajectories_[id.trajectory_id].first;
|
auto& trajectory_category = trajectories_[id.trajectory_id].first;
|
||||||
auto& trajectory = trajectories_[id.trajectory_id].second;
|
auto& trajectory = trajectories_[id.trajectory_id].second;
|
||||||
if (trajectory.count(id.submap_index) == 0) {
|
if (trajectory.count(id.submap_index) == 0) {
|
||||||
trajectory.emplace(
|
// TODO(ojura): Add RViz properties for adjusting submap pose axes
|
||||||
id.submap_index,
|
constexpr float kSubmapPoseAxesLength = 0.3f;
|
||||||
|
constexpr float kSubmapPoseAxesRadius = 0.06f;
|
||||||
|
trajectory.emplace(id.submap_index,
|
||||||
::cartographer::common::make_unique<DrawableSubmap>(
|
::cartographer::common::make_unique<DrawableSubmap>(
|
||||||
id, context_->getSceneManager(), trajectory_category.get(),
|
id, context_, trajectory_category.get(),
|
||||||
visibility_all_enabled_->getBool()));
|
visibility_all_enabled_->getBool(),
|
||||||
|
kSubmapPoseAxesLength, kSubmapPoseAxesRadius));
|
||||||
}
|
}
|
||||||
trajectory.at(id.submap_index)
|
trajectory.at(id.submap_index)
|
||||||
->Update(msg->header, submap_entry, context_->getFrameManager());
|
->Update(msg->header, submap_entry, context_->getFrameManager());
|
||||||
|
|
Loading…
Reference in New Issue