Skip to content

Commit a75eedc

Browse files
Added Cache to camera display for TimeExact (#1138) (#1143)
Signed-off-by: Alejandro Hernández Cordero <[email protected]> (cherry picked from commit fdf1957) Co-authored-by: Alejandro Hernández Cordero <[email protected]>
1 parent adaa5ea commit a75eedc

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

rviz_default_plugins/include/rviz_default_plugins/displays/camera/camera_display.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
# include <OgreRenderTargetListener.h>
4747
# include <OgreSharedPtr.h>
4848

49+
#include <message_filters/cache.h>
50+
4951
# include "sensor_msgs/msg/camera_info.hpp"
5052
# include "tf2_ros/message_filter.h"
5153

@@ -191,6 +193,8 @@ private Q_SLOTS:
191193
std::unique_ptr<ROSImageTextureIface> texture_;
192194
std::unique_ptr<rviz_common::RenderPanel> render_panel_;
193195

196+
std::shared_ptr<message_filters::Cache<sensor_msgs::msg::Image>> cache_images_;
197+
194198
rviz_common::properties::FloatProperty * alpha_property_;
195199
rviz_common::properties::EnumProperty * image_position_property_;
196200
rviz_common::properties::FloatProperty * zoom_property_;

rviz_default_plugins/src/rviz_default_plugins/displays/camera/camera_display.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -471,13 +471,28 @@ bool CameraDisplay::updateCamera()
471471
return false;
472472
}
473473

474-
rclcpp::Time rviz_time = context_->getFrameManager()->getTime();
475-
if (timeDifferenceInExactSyncMode(image, rviz_time)) {
476-
setStatus(
477-
StatusLevel::Warn, TIME_STATUS,
478-
QString("Time-syncing active and no image at timestamp ") +
479-
QString::number(rviz_time.nanoseconds()) + ".");
480-
return false;
474+
if (context_->getFrameManager()->getSyncMode() == rviz_common::FrameManagerIface::SyncExact) {
475+
if (cache_images_ == nullptr) {
476+
cache_images_ = std::make_shared<message_filters::Cache<sensor_msgs::msg::Image>>(
477+
*subscription_, 20);
478+
}
479+
rclcpp::Time rviz_time = context_->getFrameManager()->getTime();
480+
std::vector<sensor_msgs::msg::Image::ConstSharedPtr> interval_data = cache_images_->getInterval(
481+
rviz_time, rviz_time);
482+
if (!interval_data.empty()) {
483+
image = interval_data[0];
484+
if (timeDifferenceInExactSyncMode(image, rviz_time)) {
485+
setStatus(
486+
StatusLevel::Warn, TIME_STATUS,
487+
QString("Time-syncing active and no image at timestamp ") +
488+
QString::number(rviz_time.nanoseconds()) + ".");
489+
return false;
490+
}
491+
}
492+
} else {
493+
if (cache_images_ != nullptr) {
494+
cache_images_.reset();
495+
}
481496
}
482497

483498
Ogre::Vector3 position;

0 commit comments

Comments
 (0)