42 #include <sensor_msgs/Image.h> 47 #include <rtabmap_ros/RGBDImages.h> 134 bool approxSync =
true;
135 bool subscribeRGBD =
false;
136 double approxSyncMaxInterval = 0.0;
137 pnh.
param(
"approx_sync", approxSync, approxSync);
138 pnh.
param(
"approx_sync_max_interval", approxSyncMaxInterval, approxSyncMaxInterval);
139 pnh.
param(
"queue_size", queueSize_, queueSize_);
140 pnh.
param(
"subscribe_rgbd", subscribeRGBD, subscribeRGBD);
143 ROS_ERROR(
"\"depth_cameras\" parameter doesn't exist anymore. It is replaced by \"rgbd_cameras\" with the \"rgbd_image\" input topics. \"subscribe_rgbd\" should be also set to true.");
145 pnh.
param(
"rgbd_cameras", rgbdCameras, rgbdCameras);
152 NODELET_FATAL(
"Only 5 cameras maximum supported yet. Set 0 to use rgbd_images input (for which rgbdx_sync node can sync up to 8 cameras).");
154 pnh.
param(
"keep_color", keepColor_, keepColor_);
156 NODELET_INFO(
"RGBDOdometry: approx_sync = %s", approxSync?
"true":
"false");
158 NODELET_INFO(
"RGBDOdometry: approx_sync_max_interval = %f", approxSyncMaxInterval);
159 NODELET_INFO(
"RGBDOdometry: queue_size = %d", queueSize_);
160 NODELET_INFO(
"RGBDOdometry: subscribe_rgbd = %s", subscribeRGBD?
"true":
"false");
161 NODELET_INFO(
"RGBDOdometry: rgbd_cameras = %d", rgbdCameras);
162 NODELET_INFO(
"RGBDOdometry: keep_color = %s", keepColor_?
"true":
"false");
164 std::string subscribedTopicsMsg;
169 rgbd_image1_sub_.subscribe(nh,
"rgbd_image0", 1);
170 rgbd_image2_sub_.subscribe(nh,
"rgbd_image1", 1);
173 rgbd_image3_sub_.subscribe(nh,
"rgbd_image2", 1);
177 rgbd_image4_sub_.subscribe(nh,
"rgbd_image3", 1);
181 rgbd_image5_sub_.subscribe(nh,
"rgbd_image4", 1);
192 if(approxSyncMaxInterval > 0.0)
193 approxSync2_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
194 approxSync2_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
202 exactSync2_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
204 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s",
206 approxSync?
"approx":
"exact",
207 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).c_str():
"",
208 rgbd_image1_sub_.getTopic().c_str(),
209 rgbd_image2_sub_.getTopic().c_str());
211 else if(rgbdCameras == 3)
220 if(approxSyncMaxInterval > 0.0)
221 approxSync3_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
222 approxSync3_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
231 exactSync3_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
233 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s",
235 approxSync?
"approx":
"exact",
236 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).c_str():
"",
237 rgbd_image1_sub_.getTopic().c_str(),
238 rgbd_image2_sub_.getTopic().c_str(),
239 rgbd_image3_sub_.getTopic().c_str());
241 else if(rgbdCameras == 4)
251 if(approxSyncMaxInterval > 0.0)
252 approxSync4_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
253 approxSync4_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
263 exactSync4_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
265 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s \\\n %s",
267 approxSync?
"approx":
"exact",
268 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).c_str():
"",
269 rgbd_image1_sub_.getTopic().c_str(),
270 rgbd_image2_sub_.getTopic().c_str(),
271 rgbd_image3_sub_.getTopic().c_str(),
272 rgbd_image4_sub_.getTopic().c_str());
274 else if(rgbdCameras == 5)
285 if(approxSyncMaxInterval > 0.0)
286 approxSync5_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
287 approxSync5_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
298 exactSync5_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
300 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s \\\n %s \\\n %s",
302 approxSync?
"approx":
"exact",
303 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).c_str():
"",
304 rgbd_image1_sub_.getTopic().c_str(),
305 rgbd_image2_sub_.getTopic().c_str(),
306 rgbd_image3_sub_.getTopic().c_str(),
307 rgbd_image4_sub_.getTopic().c_str(),
308 rgbd_image5_sub_.getTopic().c_str());
312 else if(rgbdCameras == 0)
314 rgbdxSub_ = nh.
subscribe(
"rgbd_images", 1, &RGBDOdometry::callbackRGBDX,
this);
316 subscribedTopicsMsg =
317 uFormat(
"\n%s subscribed to:\n %s",
319 rgbdxSub_.getTopic().c_str());
323 rgbdSub_ = nh.
subscribe(
"rgbd_image", 1, &RGBDOdometry::callbackRGBD,
this);
325 subscribedTopicsMsg =
326 uFormat(
"\n%s subscribed to:\n %s",
328 rgbdSub_.getTopic().c_str());
342 image_mono_sub_.subscribe(rgb_it, rgb_nh.
resolveName(
"image"), 1, hintsRgb);
343 image_depth_sub_.subscribe(depth_it, depth_nh.
resolveName(
"image"), 1, hintsDepth);
344 info_sub_.subscribe(rgb_nh,
"camera_info", 1);
349 if(approxSyncMaxInterval > 0.0)
350 approxSync_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
359 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s",
361 approxSync?
"approx":
"exact",
362 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).c_str():
"",
363 image_mono_sub_.getTopic().c_str(),
364 image_depth_sub_.getTopic().c_str(),
365 info_sub_.getTopic().c_str());
367 this->startWarningThread(subscribedTopicsMsg, approxSync);
373 ParametersMap::iterator iter = parameters.find(Parameters::kRegStrategy());
374 if(iter != parameters.end() && iter->second.compare(
"0") != 0)
376 ROS_WARN(
"RGBD odometry works only with \"Reg/Strategy\"=0. Ignoring value %s.", iter->second.c_str());
380 int estimationType = Parameters::defaultVisEstimationType();
384 bool subscribeRGBD =
false;
385 pnh.
param(
"subscribe_rgbd", subscribeRGBD, subscribeRGBD);
386 pnh.
param(
"rgbd_cameras", rgbdCameras, rgbdCameras);
390 const std::vector<cv_bridge::CvImageConstPtr> & rgbImages,
391 const std::vector<cv_bridge::CvImageConstPtr> & depthImages,
392 const std::vector<sensor_msgs::CameraInfo>& cameraInfos)
394 ROS_ASSERT(rgbImages.size() > 0 && rgbImages.size() == depthImages.size() && rgbImages.size() == cameraInfos.size());
396 int imageWidth = rgbImages[0]->image.cols;
397 int imageHeight = rgbImages[0]->image.rows;
398 int depthWidth = depthImages[0]->image.cols;
399 int depthHeight = depthImages[0]->image.rows;
402 imageWidth/depthWidth == imageHeight/depthHeight,
403 uFormat(
"rgb=%dx%d depth=%dx%d", imageWidth, imageHeight, depthWidth, depthHeight).c_str());
405 int cameraCount = rgbImages.size();
408 std::vector<rtabmap::CameraModel> cameraModels;
409 for(
unsigned int i=0; i<rgbImages.size(); ++i)
423 NODELET_ERROR(
"Input type must be image=mono8,mono16,rgb8,bgr8,bgra8,rgba8 and " 424 "image_depth=32FC1,16UC1,mono16. Current rgb=%s and depth=%s",
425 rgbImages[i]->encoding.c_str(),
426 depthImages[i]->encoding.c_str());
429 UASSERT_MSG(rgbImages[i]->image.cols == imageWidth && rgbImages[i]->image.rows == imageHeight,
430 uFormat(
"imageWidth=%d vs %d imageHeight=%d vs %d",
432 rgbImages[i]->image.cols,
434 rgbImages[i]->image.rows).c_str());
435 UASSERT_MSG(depthImages[i]->image.cols == depthWidth && depthImages[i]->image.rows == depthHeight,
436 uFormat(
"depthWidth=%d vs %d depthHeight=%d vs %d",
438 depthImages[i]->image.cols,
440 depthImages[i]->image.rows).c_str());
442 ros::Time stamp = rgbImages[i]->header.stamp>depthImages[i]->header.stamp?rgbImages[i]->header.stamp:depthImages[i]->header.stamp;
448 else if(stamp > higherStamp)
454 if(localTransform.
isNull())
461 double stampDiff = fabs(rgbImages[i]->
header.stamp.toSec() - rgbImages[i-1]->header.stamp.toSec());
462 if(stampDiff > 1.0/60.0)
464 static bool warningShown =
false;
467 NODELET_WARN(
"The time difference between cameras %d and %d is " 468 "high (diff=%fs, cam%d=%fs, cam%d=%fs). You may want " 469 "to set approx_sync_max_interval to reject bad synchronizations or use " 470 "approx_sync=false if streams have all the exact same timestamp. This " 471 "message is only printed once.",
474 i-1, rgbImages[i-1]->
header.stamp.toSec(),
475 i, rgbImages[i]->header.stamp.toSec());
501 rgb = cv::Mat(imageHeight, imageWidth*cameraCount, ptrImage->image.type());
505 depth = cv::Mat(depthHeight, depthWidth*cameraCount, ptrDepth->image.type());
508 if(ptrImage->image.type() == rgb.type())
510 ptrImage->image.copyTo(cv::Mat(rgb, cv::Rect(i*imageWidth, 0, imageWidth, imageHeight)));
514 NODELET_ERROR(
"Some RGB images are not the same type! %d vs %d", ptrImage->image.type(), rgb.type());
518 if(ptrDepth->image.type() == depth.type())
520 ptrDepth->image.copyTo(cv::Mat(depth, cv::Rect(i*depthWidth, 0, depthWidth, depthHeight)));
524 NODELET_ERROR(
"Some Depth images are not the same type! %d vs %d", ptrDepth->image.type(), depth.type());
539 header.stamp = higherStamp;
540 header.frame_id = rgbImages.size()==1?rgbImages[0]->header.frame_id:
"";
541 this->processData(data, header);
545 const sensor_msgs::ImageConstPtr& image,
546 const sensor_msgs::ImageConstPtr& depth,
547 const sensor_msgs::CameraInfoConstPtr& cameraInfo)
550 if(!this->isPaused())
552 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(1);
553 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(1);
554 std::vector<sensor_msgs::CameraInfo> infoMsgs;
557 infoMsgs.push_back(*cameraInfo);
559 double stampDiff = fabs(image->header.stamp.toSec() - depth->header.stamp.toSec());
560 if(stampDiff > 0.020)
562 NODELET_WARN(
"The time difference between rgb and depth frames is " 563 "high (diff=%fs, rgb=%fs, depth=%fs). You may want " 564 "to set approx_sync_max_interval lower than 0.02s to reject spurious bad synchronizations or use " 565 "approx_sync=false if streams have all the exact same timestamp.",
567 image->header.stamp.toSec(),
568 depth->header.stamp.toSec());
571 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
576 const rtabmap_ros::RGBDImageConstPtr& image)
579 if(!this->isPaused())
581 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(1);
582 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(1);
583 std::vector<sensor_msgs::CameraInfo> infoMsgs;
585 infoMsgs.push_back(image->rgb_camera_info);
587 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
592 const rtabmap_ros::RGBDImagesConstPtr& images)
595 if(!this->isPaused())
597 if(images->rgbd_images.empty())
599 NODELET_ERROR(
"Input topic \"%s\" doesn't contain any image(s)!", rgbdxSub_.getTopic().c_str());
602 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(images->rgbd_images.size());
603 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(images->rgbd_images.size());
604 std::vector<sensor_msgs::CameraInfo> infoMsgs;
605 for(
size_t i=0; i<images->rgbd_images.size(); ++i)
608 infoMsgs.push_back(images->rgbd_images[i].rgb_camera_info);
611 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
616 const rtabmap_ros::RGBDImageConstPtr& image,
617 const rtabmap_ros::RGBDImageConstPtr& image2)
620 if(!this->isPaused())
622 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(2);
623 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(2);
624 std::vector<sensor_msgs::CameraInfo> infoMsgs;
627 infoMsgs.push_back(image->rgb_camera_info);
628 infoMsgs.push_back(image2->rgb_camera_info);
630 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
635 const rtabmap_ros::RGBDImageConstPtr& image,
636 const rtabmap_ros::RGBDImageConstPtr& image2,
637 const rtabmap_ros::RGBDImageConstPtr& image3)
640 if(!this->isPaused())
642 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(3);
643 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(3);
644 std::vector<sensor_msgs::CameraInfo> infoMsgs;
648 infoMsgs.push_back(image->rgb_camera_info);
649 infoMsgs.push_back(image2->rgb_camera_info);
650 infoMsgs.push_back(image3->rgb_camera_info);
652 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
657 const rtabmap_ros::RGBDImageConstPtr& image,
658 const rtabmap_ros::RGBDImageConstPtr& image2,
659 const rtabmap_ros::RGBDImageConstPtr& image3,
660 const rtabmap_ros::RGBDImageConstPtr& image4)
663 if(!this->isPaused())
665 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(4);
666 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(4);
667 std::vector<sensor_msgs::CameraInfo> infoMsgs;
672 infoMsgs.push_back(image->rgb_camera_info);
673 infoMsgs.push_back(image2->rgb_camera_info);
674 infoMsgs.push_back(image3->rgb_camera_info);
675 infoMsgs.push_back(image4->rgb_camera_info);
677 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
682 const rtabmap_ros::RGBDImageConstPtr& image,
683 const rtabmap_ros::RGBDImageConstPtr& image2,
684 const rtabmap_ros::RGBDImageConstPtr& image3,
685 const rtabmap_ros::RGBDImageConstPtr& image4,
686 const rtabmap_ros::RGBDImageConstPtr& image5)
689 if(!this->isPaused())
691 std::vector<cv_bridge::CvImageConstPtr> imageMsgs(5);
692 std::vector<cv_bridge::CvImageConstPtr> depthMsgs(5);
693 std::vector<sensor_msgs::CameraInfo> infoMsgs;
699 infoMsgs.push_back(image->rgb_camera_info);
700 infoMsgs.push_back(image2->rgb_camera_info);
701 infoMsgs.push_back(image3->rgb_camera_info);
702 infoMsgs.push_back(image4->rgb_camera_info);
703 infoMsgs.push_back(image5->rgb_camera_info);
705 this->commonCallback(imageMsgs, depthMsgs, infoMsgs);
732 approxSync2_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
741 exactSync2_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
751 approxSync3_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
761 exactSync3_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
772 approxSync4_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
783 exactSync4_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
795 approxSync5_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
807 exactSync5_->
registerCallback(boost::bind(&RGBDOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
CvImageConstPtr toCvShare(const sensor_msgs::ImageConstPtr &source, const std::string &encoding=std::string())
const std::string BAYER_GRBG8
message_filters::Subscriber< rtabmap_ros::RGBDImage > rgbd_image2_sub_
message_filters::Subscriber< sensor_msgs::CameraInfo > info_sub_
static bool parse(const ParametersMap ¶meters, const std::string &key, bool &value)
void callbackRGBD4(const rtabmap_ros::RGBDImageConstPtr &image, const rtabmap_ros::RGBDImageConstPtr &image2, const rtabmap_ros::RGBDImageConstPtr &image3, const rtabmap_ros::RGBDImageConstPtr &image4)
std::string uFormat(const char *fmt,...)
#define NODELET_ERROR(...)
message_filters::sync_policies::ExactTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyExactSync5Policy
#define NODELET_WARN(...)
message_filters::sync_policies::ApproximateTime< sensor_msgs::Image, sensor_msgs::Image, sensor_msgs::CameraInfo > MyApproxSyncPolicy
void commonCallback(const std::vector< cv_bridge::CvImageConstPtr > &rgbImages, const std::vector< cv_bridge::CvImageConstPtr > &depthImages, const std::vector< sensor_msgs::CameraInfo > &cameraInfos)
message_filters::Synchronizer< MyExactSync2Policy > * exactSync2_
message_filters::sync_policies::ExactTime< sensor_msgs::Image, sensor_msgs::Image, sensor_msgs::CameraInfo > MyExactSyncPolicy
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
message_filters::Subscriber< rtabmap_ros::RGBDImage > rgbd_image1_sub_
std::pair< std::string, std::string > ParametersPair
message_filters::sync_policies::ApproximateTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyApproxSync2Policy
message_filters::Subscriber< rtabmap_ros::RGBDImage > rgbd_image3_sub_
message_filters::Synchronizer< MyExactSyncPolicy > * exactSync_
message_filters::Synchronizer< MyExactSync5Policy > * exactSync5_
ROSCONSOLE_CONSOLE_IMPL_DECL std::string getName(void *handle)
message_filters::Synchronizer< MyApproxSync3Policy > * approxSync3_
const std::string TYPE_8UC1
message_filters::sync_policies::ExactTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyExactSync2Policy
message_filters::Synchronizer< MyApproxSync4Policy > * approxSync4_
virtual void onOdomInit()
rtabmap::Transform getTransform(const std::string &fromFrameId, const std::string &toFrameId, const ros::Time &stamp, tf::TransformListener &listener, double waitForTransform)
image_transport::SubscriberFilter image_depth_sub_
void callbackRGBD5(const rtabmap_ros::RGBDImageConstPtr &image, const rtabmap_ros::RGBDImageConstPtr &image2, const rtabmap_ros::RGBDImageConstPtr &image3, const rtabmap_ros::RGBDImageConstPtr &image4, const rtabmap_ros::RGBDImageConstPtr &image5)
void callbackRGBD(const rtabmap_ros::RGBDImageConstPtr &image)
void callbackRGBD2(const rtabmap_ros::RGBDImageConstPtr &image, const rtabmap_ros::RGBDImageConstPtr &image2)
message_filters::sync_policies::ApproximateTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyApproxSync3Policy
message_filters::Synchronizer< MyApproxSync5Policy > * approxSync5_
void callback(const sensor_msgs::ImageConstPtr &image, const sensor_msgs::ImageConstPtr &depth, const sensor_msgs::CameraInfoConstPtr &cameraInfo)
message_filters::Subscriber< rtabmap_ros::RGBDImage > rgbd_image5_sub_
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
message_filters::Synchronizer< MyApproxSync2Policy > * approxSync2_
Connection registerCallback(C &callback)
#define UASSERT_MSG(condition, msg_str)
CvImagePtr cvtColor(const CvImageConstPtr &source, const std::string &encoding)
message_filters::Synchronizer< MyApproxSyncPolicy > * approxSync_
const std::string TYPE_32FC1
rtabmap::CameraModel cameraModelFromROS(const sensor_msgs::CameraInfo &camInfo, const rtabmap::Transform &localTransform=rtabmap::Transform::getIdentity())
const std::string TYPE_16UC1
std::string resolveName(const std::string &name, bool remap=true) const
message_filters::sync_policies::ApproximateTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyApproxSync5Policy
QMap< QString, QVariant > ParametersMap
image_transport::SubscriberFilter image_mono_sub_
message_filters::sync_policies::ApproximateTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyApproxSync4Policy
bool hasParam(const std::string &key) const
void callback(rtabmap_ros::CameraConfig &config, uint32_t level)
message_filters::sync_policies::ExactTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyExactSync4Policy
message_filters::Subscriber< rtabmap_ros::RGBDImage > rgbd_image4_sub_
#define NODELET_INFO(...)
virtual void updateParameters(ParametersMap ¶meters)
message_filters::Synchronizer< MyExactSync4Policy > * exactSync4_
void callbackRGBDX(const rtabmap_ros::RGBDImagesConstPtr &images)
ros::Subscriber rgbdxSub_
void toCvShare(const rtabmap_ros::RGBDImageConstPtr &image, cv_bridge::CvImageConstPtr &rgb, cv_bridge::CvImageConstPtr &depth)
void callbackRGBD3(const rtabmap_ros::RGBDImageConstPtr &image, const rtabmap_ros::RGBDImageConstPtr &image2, const rtabmap_ros::RGBDImageConstPtr &image3)
double timestampFromROS(const ros::Time &stamp)
message_filters::sync_policies::ExactTime< rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage, rtabmap_ros::RGBDImage > MyExactSync3Policy
message_filters::Synchronizer< MyExactSync3Policy > * exactSync3_
#define NODELET_FATAL(...)
PLUGINLIB_EXPORT_CLASS(apriltag_ros::ContinuousDetector, nodelet::Nodelet)
virtual void flushCallbacks()
void uInsert(std::map< K, V > &map, const std::pair< K, V > &pair)