Use SubmapId in cartographer_rviz. (#419)
parent
35389d0adb
commit
6f171dc5a7
|
@ -47,30 +47,28 @@ constexpr double kFadeOutStartDistanceInMeters = 1.;
|
||||||
constexpr double kFadeOutDistanceInMeters = 2.;
|
constexpr double kFadeOutDistanceInMeters = 2.;
|
||||||
constexpr float kAlphaUpdateThreshold = 0.2f;
|
constexpr float kAlphaUpdateThreshold = 0.2f;
|
||||||
|
|
||||||
std::string GetSubmapIdentifier(const int trajectory_id,
|
std::string GetSubmapIdentifier(
|
||||||
const int submap_index) {
|
const ::cartographer::mapping::SubmapId& submap_id) {
|
||||||
return std::to_string(trajectory_id) + "-" + std::to_string(submap_index);
|
return std::to_string(submap_id.trajectory_id) + "-" +
|
||||||
|
std::to_string(submap_id.submap_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
DrawableSubmap::DrawableSubmap(const int trajectory_id, const int submap_index,
|
DrawableSubmap::DrawableSubmap(const ::cartographer::mapping::SubmapId& id,
|
||||||
Ogre::SceneManager* const scene_manager,
|
Ogre::SceneManager* const scene_manager,
|
||||||
::rviz::Property* submap_category,
|
::rviz::Property* submap_category,
|
||||||
const bool visible)
|
const bool visible)
|
||||||
: trajectory_id_(trajectory_id),
|
: id_(id),
|
||||||
submap_index_(submap_index),
|
|
||||||
scene_manager_(scene_manager),
|
scene_manager_(scene_manager),
|
||||||
scene_node_(scene_manager->getRootSceneNode()->createChildSceneNode()),
|
scene_node_(scene_manager->getRootSceneNode()->createChildSceneNode()),
|
||||||
manual_object_(scene_manager->createManualObject(
|
manual_object_(scene_manager->createManualObject(
|
||||||
kManualObjectPrefix +
|
kManualObjectPrefix + GetSubmapIdentifier(id))),
|
||||||
GetSubmapIdentifier(trajectory_id, submap_index))),
|
|
||||||
last_query_timestamp_(0) {
|
last_query_timestamp_(0) {
|
||||||
material_ = Ogre::MaterialManager::getSingleton().getByName(
|
material_ = Ogre::MaterialManager::getSingleton().getByName(
|
||||||
kSubmapSourceMaterialName);
|
kSubmapSourceMaterialName);
|
||||||
material_ =
|
material_ =
|
||||||
material_->clone(kSubmapMaterialPrefix +
|
material_->clone(kSubmapMaterialPrefix + GetSubmapIdentifier(id_));
|
||||||
GetSubmapIdentifier(trajectory_id_, submap_index));
|
|
||||||
material_->setReceiveShadows(false);
|
material_->setReceiveShadows(false);
|
||||||
material_->getTechnique(0)->setLightingEnabled(false);
|
material_->getTechnique(0)->setLightingEnabled(false);
|
||||||
material_->setCullingMode(Ogre::CULL_NONE);
|
material_->setCullingMode(Ogre::CULL_NONE);
|
||||||
|
@ -123,12 +121,12 @@ void DrawableSubmap::Update(
|
||||||
UpdateTransform();
|
UpdateTransform();
|
||||||
}
|
}
|
||||||
visibility_->setName(
|
visibility_->setName(
|
||||||
QString("%1.%2").arg(submap_index_).arg(metadata_version_));
|
QString("%1.%2").arg(id_.submap_index).arg(metadata_version_));
|
||||||
visibility_->setDescription(
|
visibility_->setDescription(
|
||||||
QString("Toggle visibility of this individual submap.<br><br>"
|
QString("Toggle visibility of this individual submap.<br><br>"
|
||||||
"Trajectory %1, submap %2, submap version %3")
|
"Trajectory %1, submap %2, submap version %3")
|
||||||
.arg(trajectory_id_)
|
.arg(id_.trajectory_id)
|
||||||
.arg(submap_index_)
|
.arg(id_.submap_index)
|
||||||
.arg(metadata_version_));
|
.arg(metadata_version_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,8 +146,8 @@ bool DrawableSubmap::MaybeFetchTexture(ros::ServiceClient* const client) {
|
||||||
last_query_timestamp_ = now;
|
last_query_timestamp_ = now;
|
||||||
rpc_request_future_ = std::async(std::launch::async, [this, client]() {
|
rpc_request_future_ = std::async(std::launch::async, [this, client]() {
|
||||||
::cartographer_ros_msgs::SubmapQuery srv;
|
::cartographer_ros_msgs::SubmapQuery srv;
|
||||||
srv.request.trajectory_id = trajectory_id_;
|
srv.request.trajectory_id = id_.trajectory_id;
|
||||||
srv.request.submap_index = submap_index_;
|
srv.request.submap_index = id_.submap_index;
|
||||||
if (client->call(srv)) {
|
if (client->call(srv)) {
|
||||||
// We emit a signal to update in the right thread, and pass via the
|
// We emit a signal to update in the right thread, and pass via the
|
||||||
// 'response_' member to simplify the signal-slot connection slightly.
|
// 'response_' member to simplify the signal-slot connection slightly.
|
||||||
|
@ -230,7 +228,7 @@ void DrawableSubmap::UpdateSceneNode() {
|
||||||
texture_.setNull();
|
texture_.setNull();
|
||||||
}
|
}
|
||||||
const std::string texture_name =
|
const std::string texture_name =
|
||||||
kSubmapTexturePrefix + GetSubmapIdentifier(trajectory_id_, submap_index_);
|
kSubmapTexturePrefix + GetSubmapIdentifier(id_);
|
||||||
texture_ = Ogre::TextureManager::getSingleton().loadRawData(
|
texture_ = Ogre::TextureManager::getSingleton().loadRawData(
|
||||||
texture_name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
texture_name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
||||||
pixel_stream, response_.width, response_.height, Ogre::PF_BYTE_RGB,
|
pixel_stream, response_.width, response_.height, Ogre::PF_BYTE_RGB,
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "OgreTexture.h"
|
#include "OgreTexture.h"
|
||||||
#include "OgreVector3.h"
|
#include "OgreVector3.h"
|
||||||
#include "cartographer/common/mutex.h"
|
#include "cartographer/common/mutex.h"
|
||||||
|
#include "cartographer/mapping/id.h"
|
||||||
#include "cartographer_ros_msgs/SubmapEntry.h"
|
#include "cartographer_ros_msgs/SubmapEntry.h"
|
||||||
#include "cartographer_ros_msgs/SubmapQuery.h"
|
#include "cartographer_ros_msgs/SubmapQuery.h"
|
||||||
#include "ros/ros.h"
|
#include "ros/ros.h"
|
||||||
|
@ -44,9 +45,8 @@ class DrawableSubmap : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Each submap is identified by a 'trajectory_id' plus a 'submap_index'.
|
// The 'scene_manager' is the Ogre scene manager to which to add a node.
|
||||||
// 'scene_manager' is the Ogre scene manager to which to add a node.
|
DrawableSubmap(const ::cartographer::mapping::SubmapId& submap_id,
|
||||||
DrawableSubmap(int trajectory_id, int submap_index,
|
|
||||||
Ogre::SceneManager* scene_manager,
|
Ogre::SceneManager* scene_manager,
|
||||||
::rviz::Property* submap_category, const bool visible);
|
::rviz::Property* submap_category, const bool visible);
|
||||||
~DrawableSubmap() override;
|
~DrawableSubmap() override;
|
||||||
|
@ -70,8 +70,7 @@ class DrawableSubmap : public QObject {
|
||||||
// 'current_tracking_z'.
|
// 'current_tracking_z'.
|
||||||
void SetAlpha(double current_tracking_z);
|
void SetAlpha(double current_tracking_z);
|
||||||
|
|
||||||
int submap_index() const { return submap_index_; }
|
::cartographer::mapping::SubmapId id() const { return id_; }
|
||||||
int trajectory_id() const { return trajectory_id_; }
|
|
||||||
int version() const { return metadata_version_; }
|
int version() const { return metadata_version_; }
|
||||||
bool visibility() const { return visibility_->getBool(); }
|
bool visibility() const { return visibility_->getBool(); }
|
||||||
void set_visibility(const bool visibility) {
|
void set_visibility(const bool visibility) {
|
||||||
|
@ -91,8 +90,7 @@ class DrawableSubmap : public QObject {
|
||||||
void UpdateTransform();
|
void UpdateTransform();
|
||||||
float UpdateAlpha(float target_alpha);
|
float UpdateAlpha(float target_alpha);
|
||||||
|
|
||||||
const int trajectory_id_;
|
const ::cartographer::mapping::SubmapId id_;
|
||||||
const int submap_index_;
|
|
||||||
|
|
||||||
::cartographer::common::Mutex mutex_;
|
::cartographer::common::Mutex mutex_;
|
||||||
Ogre::SceneManager* const scene_manager_;
|
Ogre::SceneManager* const scene_manager_;
|
||||||
|
|
|
@ -119,29 +119,27 @@ void SubmapsDisplay::processMessage(
|
||||||
using ::cartographer::mapping::SubmapId;
|
using ::cartographer::mapping::SubmapId;
|
||||||
std::set<SubmapId> listed_submaps;
|
std::set<SubmapId> listed_submaps;
|
||||||
for (const ::cartographer_ros_msgs::SubmapEntry& submap_entry : msg->submap) {
|
for (const ::cartographer_ros_msgs::SubmapEntry& submap_entry : msg->submap) {
|
||||||
listed_submaps.insert(
|
const SubmapId id{submap_entry.trajectory_id, submap_entry.submap_index};
|
||||||
SubmapId{submap_entry.trajectory_id, submap_entry.submap_index});
|
listed_submaps.insert(id);
|
||||||
const size_t trajectory_id = submap_entry.trajectory_id;
|
while (id.trajectory_id >= static_cast<int>(trajectories_.size())) {
|
||||||
while (trajectory_id >= trajectories_.size()) {
|
|
||||||
trajectories_.push_back(Trajectory(
|
trajectories_.push_back(Trajectory(
|
||||||
::cartographer::common::make_unique<::rviz::Property>(
|
::cartographer::common::make_unique<::rviz::Property>(
|
||||||
QString("Trajectory %1").arg(trajectory_id), QVariant(),
|
QString("Trajectory %1").arg(id.trajectory_id), QVariant(),
|
||||||
QString("List of all submaps in Trajectory %1.")
|
QString("List of all submaps in Trajectory %1.")
|
||||||
.arg(trajectory_id),
|
.arg(id.trajectory_id),
|
||||||
submaps_category_),
|
submaps_category_),
|
||||||
std::map<int, std::unique_ptr<DrawableSubmap>>()));
|
std::map<int, std::unique_ptr<DrawableSubmap>>()));
|
||||||
}
|
}
|
||||||
auto& trajectory_category = trajectories_[trajectory_id].first;
|
auto& trajectory_category = trajectories_[id.trajectory_id].first;
|
||||||
auto& trajectory = trajectories_[trajectory_id].second;
|
auto& trajectory = trajectories_[id.trajectory_id].second;
|
||||||
const int submap_index = submap_entry.submap_index;
|
if (trajectory.count(id.submap_index) == 0) {
|
||||||
if (trajectory.count(submap_index) == 0) {
|
|
||||||
trajectory.emplace(
|
trajectory.emplace(
|
||||||
submap_index,
|
id.submap_index,
|
||||||
::cartographer::common::make_unique<DrawableSubmap>(
|
::cartographer::common::make_unique<DrawableSubmap>(
|
||||||
trajectory_id, submap_index, context_->getSceneManager(),
|
id, context_->getSceneManager(), trajectory_category.get(),
|
||||||
trajectory_category.get(), visibility_all_enabled_->getBool()));
|
visibility_all_enabled_->getBool()));
|
||||||
}
|
}
|
||||||
trajectory.at(submap_index)
|
trajectory.at(id.submap_index)
|
||||||
->Update(msg->header, submap_entry, context_->getFrameManager());
|
->Update(msg->header, submap_entry, context_->getFrameManager());
|
||||||
}
|
}
|
||||||
// Remove all submaps not mentioned in the SubmapList.
|
// Remove all submaps not mentioned in the SubmapList.
|
||||||
|
|
Loading…
Reference in New Issue