Fix flickering submaps. (#440)
The 'slice_pose' must be updated together with the texture. Right now it is updated before the texture so the submap will be shown in the wrong pose for a short time. The fix is to move the handling of poses over to Ogre: The 'scene_node_' now transforms both the shown submap and the axes into the submap frame. The 'submap_node_' applies the 'slice_pose' so that the textured rectangle is shown in the correct pose in the submap frame.master
parent
3dceac9a46
commit
e6d214c51d
|
@ -255,9 +255,9 @@ visualization_msgs::MarkerArray MapBuilderBridge::GetConstraintList() {
|
|||
// Color mapping for submaps of various trajectories - add trajectory id
|
||||
// to ensure different starting colors. Also add a fixed offset of 25
|
||||
// to avoid having identical colors as trajectories.
|
||||
color_constraint = ToMessage(cartographer::io::GetColor(
|
||||
constraint.submap_id.submap_index +
|
||||
constraint.submap_id.trajectory_id + 25));
|
||||
color_constraint = ToMessage(
|
||||
cartographer::io::GetColor(constraint.submap_id.submap_index +
|
||||
constraint.submap_id.trajectory_id + 25));
|
||||
color_residual.a = 1.0;
|
||||
color_residual.r = 1.0;
|
||||
} else {
|
||||
|
|
|
@ -71,9 +71,8 @@ class Node {
|
|||
bool HandleFinishTrajectory(
|
||||
cartographer_ros_msgs::FinishTrajectory::Request& request,
|
||||
cartographer_ros_msgs::FinishTrajectory::Response& response);
|
||||
bool HandleWriteState(
|
||||
cartographer_ros_msgs::WriteState::Request& request,
|
||||
cartographer_ros_msgs::WriteState::Response& response);
|
||||
bool HandleWriteState(cartographer_ros_msgs::WriteState::Request& request,
|
||||
cartographer_ros_msgs::WriteState::Response& response);
|
||||
// Returns the set of topic names we want to subscribe to.
|
||||
std::unordered_set<string> ComputeExpectedTopics(
|
||||
const TrajectoryOptions& options,
|
||||
|
|
|
@ -273,7 +273,8 @@ void Run(const std::vector<string>& bag_filenames) {
|
|||
<< (cpu_timespec.tv_sec + 1e-9 * cpu_timespec.tv_nsec) << " s";
|
||||
#endif
|
||||
|
||||
node.map_builder_bridge()->SerializeState(bag_filenames.front() + ".pbstream");
|
||||
node.map_builder_bridge()->SerializeState(bag_filenames.front() +
|
||||
".pbstream");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -130,10 +130,10 @@ void DrawableSubmap::Update(
|
|||
::cartographer::common::MutexLocker locker(&mutex_);
|
||||
metadata_version_ = metadata.submap_version;
|
||||
pose_ = ::cartographer_ros::ToRigid3d(metadata.pose);
|
||||
scene_node_->setPosition(ToOgre(pose_.translation()));
|
||||
scene_node_->setOrientation(ToOgre(pose_.rotation()));
|
||||
if (submap_texture_ != nullptr) {
|
||||
// We have to update the transform since we are already displaying a texture
|
||||
// for this submap.
|
||||
UpdateTransform();
|
||||
display_context_->queueRender();
|
||||
}
|
||||
visibility_->setName(
|
||||
QString("%1.%2").arg(id_.submap_index).arg(metadata_version_));
|
||||
|
@ -197,7 +197,8 @@ void DrawableSubmap::SetAlpha(const double current_tracking_z) {
|
|||
|
||||
void DrawableSubmap::UpdateSceneNode() {
|
||||
::cartographer::common::MutexLocker locker(&mutex_);
|
||||
UpdateTransform();
|
||||
submap_node_->setPosition(ToOgre(submap_texture_->slice_pose.translation()));
|
||||
submap_node_->setOrientation(ToOgre(submap_texture_->slice_pose.rotation()));
|
||||
// The call to Ogre's loadRawData below does not work with an RG texture,
|
||||
// therefore we create an RGB one whose blue channel is always 0.
|
||||
std::vector<char> rgb;
|
||||
|
@ -250,16 +251,7 @@ void DrawableSubmap::UpdateSceneNode() {
|
|||
|
||||
texture_unit->setTextureName(texture_->getName());
|
||||
texture_unit->setTextureFiltering(Ogre::TFO_NONE);
|
||||
}
|
||||
|
||||
void DrawableSubmap::UpdateTransform() {
|
||||
CHECK(submap_texture_ != nullptr);
|
||||
const ::cartographer::transform::Rigid3d pose =
|
||||
pose_ * submap_texture_->slice_pose;
|
||||
submap_node_->setPosition(ToOgre(pose.translation()));
|
||||
submap_node_->setOrientation(ToOgre(pose.rotation()));
|
||||
pose_axes_.setPosition(ToOgre(pose_.translation()));
|
||||
pose_axes_.setOrientation(ToOgre(pose_.rotation()));
|
||||
display_context_->queueRender();
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,6 @@ class DrawableSubmap : public QObject {
|
|||
void ToggleVisibility();
|
||||
|
||||
private:
|
||||
void UpdateTransform();
|
||||
float UpdateAlpha(float target_alpha);
|
||||
|
||||
const ::cartographer::mapping::SubmapId id_;
|
||||
|
|
Loading…
Reference in New Issue