39 #include <sensor_msgs/Image.h>
47 #include <rtabmap_msgs/RGBDImages.h>
107 bool approxSync =
false;
108 bool subscribeRGBD =
false;
109 double approxSyncMaxInterval = 0.0;
111 pnh.
param(
"approx_sync", approxSync, approxSync);
112 pnh.
param(
"approx_sync_max_interval", approxSyncMaxInterval, approxSyncMaxInterval);
113 pnh.
param(
"topic_queue_size", topicQueueSize_, topicQueueSize_);
116 pnh.
param(
"queue_size", syncQueueSize_, syncQueueSize_);
117 ROS_WARN(
"Parameter \"queue_size\" has been renamed "
118 "to \"sync_queue_size\" and will be removed "
119 "in future versions! The value (%d) is still copied to "
120 "\"sync_queue_size\".", syncQueueSize_);
124 pnh.
param(
"sync_queue_size", syncQueueSize_, syncQueueSize_);
126 pnh.
param(
"subscribe_rgbd", subscribeRGBD, subscribeRGBD);
127 pnh.
param(
"rgbd_cameras", rgbdCameras, rgbdCameras);
128 pnh.
param(
"keep_color", keepColor_, keepColor_);
130 NODELET_INFO(
"StereoOdometry: approx_sync = %s", approxSync?
"true":
"false");
132 NODELET_INFO(
"StereoOdometry: approx_sync_max_interval = %f", approxSyncMaxInterval);
133 NODELET_INFO(
"StereoOdometry: topic_queue_size = %d", topicQueueSize_);
134 NODELET_INFO(
"StereoOdometry: sync_queue_size = %d", syncQueueSize_);
135 NODELET_INFO(
"StereoOdometry: subscribe_rgbd = %s", subscribeRGBD?
"true":
"false");
136 NODELET_INFO(
"StereoOdometry: keep_color = %s", keepColor_?
"true":
"false");
138 std::string subscribedTopic;
139 std::string subscribedTopicsMsg;
144 rgbd_image1_sub_.subscribe(nh,
"rgbd_image0", topicQueueSize_);
145 rgbd_image2_sub_.subscribe(nh,
"rgbd_image1", topicQueueSize_);
148 rgbd_image3_sub_.subscribe(nh,
"rgbd_image2", topicQueueSize_);
152 rgbd_image4_sub_.subscribe(nh,
"rgbd_image3", topicQueueSize_);
156 rgbd_image5_sub_.subscribe(nh,
"rgbd_image4", topicQueueSize_);
160 rgbd_image6_sub_.subscribe(nh,
"rgbd_image5", topicQueueSize_);
171 if(approxSyncMaxInterval > 0.0)
172 approxSync2_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
173 approxSync2_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
181 exactSync2_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
183 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s",
185 approxSync?
"approx":
"exact",
186 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).
c_str():
"",
187 rgbd_image1_sub_.getTopic().c_str(),
188 rgbd_image2_sub_.getTopic().c_str());
190 else if(rgbdCameras == 3)
199 if(approxSyncMaxInterval > 0.0)
200 approxSync3_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
201 approxSync3_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
210 exactSync3_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
212 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s",
214 approxSync?
"approx":
"exact",
215 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).
c_str():
"",
216 rgbd_image1_sub_.getTopic().c_str(),
217 rgbd_image2_sub_.getTopic().c_str(),
218 rgbd_image3_sub_.getTopic().c_str());
220 else if(rgbdCameras == 4)
230 if(approxSyncMaxInterval > 0.0)
231 approxSync4_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
232 approxSync4_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
242 exactSync4_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
244 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s \\\n %s",
246 approxSync?
"approx":
"exact",
247 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).
c_str():
"",
248 rgbd_image1_sub_.getTopic().c_str(),
249 rgbd_image2_sub_.getTopic().c_str(),
250 rgbd_image3_sub_.getTopic().c_str(),
251 rgbd_image4_sub_.getTopic().c_str());
253 else if(rgbdCameras == 5)
264 if(approxSyncMaxInterval > 0.0)
265 approxSync5_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
266 approxSync5_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
277 exactSync5_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
279 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s \\\n %s \\\n %s",
281 approxSync?
"approx":
"exact",
282 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).
c_str():
"",
283 rgbd_image1_sub_.getTopic().c_str(),
284 rgbd_image2_sub_.getTopic().c_str(),
285 rgbd_image3_sub_.getTopic().c_str(),
286 rgbd_image4_sub_.getTopic().c_str(),
287 rgbd_image5_sub_.getTopic().c_str());
289 else if(rgbdCameras == 6)
301 if(approxSyncMaxInterval > 0.0)
302 approxSync6_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
303 approxSync6_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD6,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5, boost::placeholders::_6));
315 exactSync6_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD6,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5, boost::placeholders::_6));
317 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s \\\n %s \\\n %s \\\n %s",
319 approxSync?
"approx":
"exact",
320 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).
c_str():
"",
321 rgbd_image1_sub_.getTopic().c_str(),
322 rgbd_image2_sub_.getTopic().c_str(),
323 rgbd_image3_sub_.getTopic().c_str(),
324 rgbd_image4_sub_.getTopic().c_str(),
325 rgbd_image5_sub_.getTopic().c_str(),
326 rgbd_image6_sub_.getTopic().c_str());
330 NODELET_FATAL(
"%s doesn't support more than 6 cameras (rgbd_cameras=%d) with "
331 "internal synchronization interface, set rgbd_cameras=0 and use "
332 "rgbd_images input topic instead for more cameras (for which "
333 "rgbdx_sync node can sync up to 8 cameras).",
338 else if(rgbdCameras == 0)
340 rgbdxSub_ = nh.
subscribe(
"rgbd_images", topicQueueSize_, &StereoOdometry::callbackRGBDX,
this);
342 subscribedTopicsMsg =
343 uFormat(
"\n%s subscribed to:\n %s",
345 rgbdxSub_.getTopic().c_str());
349 rgbdSub_ = nh.
subscribe(
"rgbd_image", topicQueueSize_, &StereoOdometry::callbackRGBD,
this);
351 subscribedTopicsMsg =
352 uFormat(
"\n%s subscribed to:\n %s",
354 rgbdSub_.getTopic().c_str());
368 imageRectLeft_.subscribe(left_it, left_nh.
resolveName(
"image_rect"), topicQueueSize_, hintsLeft);
369 imageRectRight_.subscribe(right_it, right_nh.
resolveName(
"image_rect"), topicQueueSize_, hintsRight);
370 cameraInfoLeft_.subscribe(left_nh,
"camera_info", topicQueueSize_);
371 cameraInfoRight_.subscribe(right_nh,
"camera_info", topicQueueSize_);
376 if(approxSyncMaxInterval>0.0)
377 approxSync_->setMaxIntervalDuration(
ros::Duration(approxSyncMaxInterval));
378 approxSync_->registerCallback(boost::bind(&StereoOdometry::callback,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
383 exactSync_->registerCallback(boost::bind(&StereoOdometry::callback,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
386 subscribedTopic = left_nh.
resolveName(
"image_rect");
387 subscribedTopicsMsg =
uFormat(
"\n%s subscribed to (%s sync%s):\n %s \\\n %s \\\n %s \\\n %s",
389 approxSync?
"approx":
"exact",
390 approxSync&&approxSyncMaxInterval!=0.0?
uFormat(
", max interval=%fs", approxSyncMaxInterval).
c_str():
"",
391 imageRectLeft_.getTopic().c_str(),
392 imageRectRight_.getTopic().c_str(),
393 cameraInfoLeft_.getTopic().c_str(),
394 cameraInfoRight_.getTopic().c_str());
397 initDiagnosticMsg(subscribedTopicsMsg, approxSync, subscribedTopic);
403 ParametersMap::iterator
iter = parameters.find(Parameters::kRegStrategy());
404 if(
iter != parameters.end() &&
iter->second.compare(
"0") != 0)
406 ROS_WARN(
"Stereo odometry works only with \"Reg/Strategy\"=0. Ignoring value %s.",
iter->second.c_str());
412 const std::vector<cv_bridge::CvImageConstPtr> & leftImages,
413 const std::vector<cv_bridge::CvImageConstPtr> & rightImages,
414 const std::vector<sensor_msgs::CameraInfo>& leftCameraInfos,
415 const std::vector<sensor_msgs::CameraInfo>& rightCameraInfos)
417 UASSERT(leftImages.size() > 0 &&
418 leftImages.size() == rightImages.size() &&
419 leftImages.size() == leftCameraInfos.size() &&
420 rightImages.size() == rightCameraInfos.size());
422 int leftWidth = leftImages[0]->image.cols;
423 int leftHeight = leftImages[0]->image.rows;
424 int rightWidth = rightImages[0]->image.cols;
425 int rightHeight = rightImages[0]->image.rows;
428 leftWidth == rightWidth && leftHeight == rightHeight,
429 uFormat(
"left=%dx%d right=%dx%d", leftWidth, leftHeight, rightWidth, rightHeight).
c_str());
431 int cameraCount = leftImages.size();
434 std::vector<rtabmap::StereoCameraModel> cameraModels;
435 for(
unsigned int i=0;
i<leftImages.size(); ++
i)
452 NODELET_ERROR(
"Input type must be image=mono8,mono16,rgb8,bgr8,rgba8,bgra8 (mono8 recommended), received types are %s (left) and %s (right)",
453 leftImages[
i]->
encoding.c_str(), rightImages[
i]->encoding.c_str());
457 ros::Time stamp = leftImages[
i]->header.stamp>rightImages[
i]->header.stamp?leftImages[
i]->header.stamp:rightImages[
i]->header.stamp;
463 else if(stamp > higherStamp)
469 if(localTransform.
isNull())
476 double stampDiff =
fabs(leftImages[
i]->
header.stamp.toSec() - leftImages[
i-1]->header.stamp.toSec());
477 if(stampDiff > 1.0/60.0)
479 static bool warningShown =
false;
482 NODELET_WARN(
"The time difference between cameras %d and %d is "
483 "high (diff=%fs, cam%d=%fs, cam%d=%fs). You may want "
484 "to set approx_sync_max_interval to reject bad synchronizations or use "
485 "approx_sync=false if streams have all the exact same timestamp. This "
486 "message is only printed once.",
489 i-1, leftImages[
i-1]->
header.stamp.toSec(),
490 i, leftImages[
i]->header.stamp.toSec());
497 if(!leftImages[
i]->image.empty() && !rightImages[
i]->image.empty())
499 bool alreadyRectified =
true;
500 Parameters::parse(parameters(), Parameters::kRtabmapImagesAlreadyRectified(), alreadyRectified);
502 if(!alreadyRectified)
504 if(rightCameraInfos[
i].
header.frame_id.empty() || leftCameraInfos[
i].header.frame_id.empty())
506 if(rightCameraInfos[
i].
P[3] == 0.0 && leftCameraInfos[
i].
P[3] == 0)
508 NODELET_ERROR(
"Parameter %s is false but the frame_id in one of the camera_info "
509 "topic is empty, so TF between the cameras cannot be computed!",
510 Parameters::kRtabmapImagesAlreadyRectified().
c_str());
515 static bool warned =
false;
518 NODELET_WARN(
"Parameter %s is false but the frame_id in one of the "
519 "camera_info topic is empty, so TF between the cameras cannot be "
520 "computed! However, the baseline can be computed from the calibration, "
521 "we will use this one instead of TF. This message is only printed once...",
522 Parameters::kRtabmapImagesAlreadyRectified().
c_str());
530 rightCameraInfos[
i].
header.frame_id,
531 leftCameraInfos[
i].header.frame_id,
532 leftCameraInfos[
i].header.stamp,
534 this->waitForTransformDuration());
535 if(stereoTransform.
isNull())
537 NODELET_ERROR(
"Parameter %s is false but we cannot get TF between the two cameras! (between frames %s and %s)",
538 Parameters::kRtabmapImagesAlreadyRectified().
c_str(),
539 rightCameraInfos[
i].
header.frame_id.c_str(),
540 leftCameraInfos[
i].header.frame_id.c_str());
545 NODELET_ERROR(
"Parameter %s is false but we cannot get a valid TF between the two cameras! "
546 "Identity transform returned between left and right cameras. Verify that if TF between "
547 "the cameras is valid: \"rosrun tf tf_echo %s %s\".",
548 Parameters::kRtabmapImagesAlreadyRectified().
c_str(),
549 rightCameraInfos[
i].
header.frame_id.c_str(),
550 leftCameraInfos[
i].header.frame_id.c_str());
560 !rightCameraInfos[
i].header.frame_id.empty() &&
561 !leftCameraInfos[
i].header.frame_id.empty())
564 leftCameraInfos[
i].
header.frame_id,
565 rightCameraInfos[
i].header.frame_id,
566 leftCameraInfos[
i].header.stamp,
568 this->waitForTransformDuration());
570 if(!stereoTransform.
isNull() && stereoTransform.
x()>0)
572 static bool warned =
false;
575 ROS_WARN(
"Right camera info doesn't have Tx set but we are assuming that stereo images are already rectified (see %s parameter). While not "
576 "recommended, we used TF to get the baseline (%s->%s = %fm) for convenience (e.g., D400 ir stereo issue). It is preferred to feed "
577 "a valid right camera info if stereo images are already rectified. This message is only printed once...",
578 rtabmap::Parameters::kRtabmapImagesAlreadyRectified().
c_str(),
579 rightCameraInfos[
i].
header.frame_id.c_str(), leftCameraInfos[
i].header.frame_id.c_str(), stereoTransform.
x());
593 if(alreadyRectified && stereoModel.
baseline() <= 0)
595 NODELET_ERROR(
"The stereo baseline (%f) should be positive (baseline=-Tx/fx). We assume a horizontal left/right stereo "
596 "setup where the Tx (or P(0,3)) is negative in the right camera info msg.", stereoModel.
baseline());
602 static bool shown =
false;
605 NODELET_WARN(
"Detected baseline (%f m) is quite large! Is your "
606 "right camera_info P(0,3) correctly set? Note that "
607 "baseline=-P(0,3)/P(0,0). This warning is printed only once.",
637 left = cv::Mat(leftHeight, leftWidth*cameraCount, ptrLeft->image.type());
641 right = cv::Mat(rightHeight, rightWidth*cameraCount, ptrRight->image.type());
644 if(ptrLeft->image.type() == left.type())
646 ptrLeft->image.copyTo(cv::Mat(left, cv::Rect(
i*leftWidth, 0, leftWidth, leftHeight)));
650 NODELET_ERROR(
"Some left images are not the same type! %d vs %d", ptrLeft->image.type(), left.type());
654 if(ptrRight->image.type() == right.type())
656 ptrRight->image.copyTo(cv::Mat(right, cv::Rect(
i*rightWidth, 0, rightWidth, rightHeight)));
660 NODELET_ERROR(
"Some right images are not the same type! %d vs %d", ptrRight->image.type(), right.type());
664 cameraModels.push_back(stereoModel);
682 header.stamp = higherStamp;
683 header.frame_id = leftImages.size()==1?leftImages[0]->header.frame_id:
"";
688 const sensor_msgs::ImageConstPtr& imageLeft,
689 const sensor_msgs::ImageConstPtr& imageRight,
690 const sensor_msgs::CameraInfoConstPtr& cameraInfoLeft,
691 const sensor_msgs::CameraInfoConstPtr& cameraInfoRight)
693 if(!this->isPaused())
695 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(1);
696 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(1);
697 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
698 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
701 leftInfoMsgs.push_back(*cameraInfoLeft);
702 rightInfoMsgs.push_back(*cameraInfoRight);
704 double stampDiff =
fabs(imageLeft->header.stamp.toSec() - imageRight->header.stamp.toSec());
705 if(stampDiff > 0.010)
707 NODELET_WARN(
"The time difference between left and right frames is "
708 "high (diff=%fs, left=%fs, right=%fs). If your left and right cameras are hardware "
709 "synchronized, use approx_sync:=false. Otherwise, you may want "
710 "to set approx_sync_max_interval lower than 0.01s to reject spurious bad synchronizations.",
712 imageLeft->header.stamp.toSec(),
713 imageRight->header.stamp.toSec());
716 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
721 const rtabmap_msgs::RGBDImageConstPtr& image)
723 if(!this->isPaused())
725 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(1);
726 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(1);
727 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
728 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
730 leftInfoMsgs.push_back(image->rgb_camera_info);
731 rightInfoMsgs.push_back(image->depth_camera_info);
733 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
738 const rtabmap_msgs::RGBDImagesConstPtr& images)
740 if(!this->isPaused())
742 if(images->rgbd_images.empty())
744 NODELET_ERROR(
"Input topic \"%s\" doesn't contain any image(s)!", rgbdxSub_.getTopic().c_str());
747 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(images->rgbd_images.size());
748 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(images->rgbd_images.size());
749 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
750 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
751 for(
size_t i=0;
i<images->rgbd_images.size(); ++
i)
754 leftInfoMsgs.push_back(images->rgbd_images[
i].rgb_camera_info);
755 rightInfoMsgs.push_back(images->rgbd_images[
i].depth_camera_info);
758 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
763 const rtabmap_msgs::RGBDImageConstPtr& image,
764 const rtabmap_msgs::RGBDImageConstPtr& image2)
766 if(!this->isPaused())
768 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(2);
769 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(2);
770 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
771 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
774 leftInfoMsgs.push_back(image->rgb_camera_info);
775 leftInfoMsgs.push_back(image2->rgb_camera_info);
776 rightInfoMsgs.push_back(image->depth_camera_info);
777 rightInfoMsgs.push_back(image2->depth_camera_info);
779 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
784 const rtabmap_msgs::RGBDImageConstPtr& image,
785 const rtabmap_msgs::RGBDImageConstPtr& image2,
786 const rtabmap_msgs::RGBDImageConstPtr& image3)
788 if(!this->isPaused())
790 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(3);
791 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(3);
792 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
793 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
797 leftInfoMsgs.push_back(image->rgb_camera_info);
798 leftInfoMsgs.push_back(image2->rgb_camera_info);
799 leftInfoMsgs.push_back(image3->rgb_camera_info);
800 rightInfoMsgs.push_back(image->depth_camera_info);
801 rightInfoMsgs.push_back(image2->depth_camera_info);
802 rightInfoMsgs.push_back(image3->depth_camera_info);
804 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
809 const rtabmap_msgs::RGBDImageConstPtr& image,
810 const rtabmap_msgs::RGBDImageConstPtr& image2,
811 const rtabmap_msgs::RGBDImageConstPtr& image3,
812 const rtabmap_msgs::RGBDImageConstPtr& image4)
814 if(!this->isPaused())
816 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(4);
817 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(4);
818 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
819 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
824 leftInfoMsgs.push_back(image->rgb_camera_info);
825 leftInfoMsgs.push_back(image2->rgb_camera_info);
826 leftInfoMsgs.push_back(image3->rgb_camera_info);
827 leftInfoMsgs.push_back(image4->rgb_camera_info);
828 rightInfoMsgs.push_back(image->depth_camera_info);
829 rightInfoMsgs.push_back(image2->depth_camera_info);
830 rightInfoMsgs.push_back(image3->depth_camera_info);
831 rightInfoMsgs.push_back(image4->depth_camera_info);
833 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
838 const rtabmap_msgs::RGBDImageConstPtr& image,
839 const rtabmap_msgs::RGBDImageConstPtr& image2,
840 const rtabmap_msgs::RGBDImageConstPtr& image3,
841 const rtabmap_msgs::RGBDImageConstPtr& image4,
842 const rtabmap_msgs::RGBDImageConstPtr& image5)
844 if(!this->isPaused())
846 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(5);
847 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(5);
848 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
849 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
855 leftInfoMsgs.push_back(image->rgb_camera_info);
856 leftInfoMsgs.push_back(image2->rgb_camera_info);
857 leftInfoMsgs.push_back(image3->rgb_camera_info);
858 leftInfoMsgs.push_back(image4->rgb_camera_info);
859 leftInfoMsgs.push_back(image5->rgb_camera_info);
860 rightInfoMsgs.push_back(image->depth_camera_info);
861 rightInfoMsgs.push_back(image2->depth_camera_info);
862 rightInfoMsgs.push_back(image3->depth_camera_info);
863 rightInfoMsgs.push_back(image4->depth_camera_info);
864 rightInfoMsgs.push_back(image5->depth_camera_info);
866 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
871 const rtabmap_msgs::RGBDImageConstPtr& image,
872 const rtabmap_msgs::RGBDImageConstPtr& image2,
873 const rtabmap_msgs::RGBDImageConstPtr& image3,
874 const rtabmap_msgs::RGBDImageConstPtr& image4,
875 const rtabmap_msgs::RGBDImageConstPtr& image5,
876 const rtabmap_msgs::RGBDImageConstPtr& image6)
878 if(!this->isPaused())
880 std::vector<cv_bridge::CvImageConstPtr> leftMsgs(6);
881 std::vector<cv_bridge::CvImageConstPtr> rightMsgs(6);
882 std::vector<sensor_msgs::CameraInfo> leftInfoMsgs;
883 std::vector<sensor_msgs::CameraInfo> rightInfoMsgs;
890 leftInfoMsgs.push_back(image->rgb_camera_info);
891 leftInfoMsgs.push_back(image2->rgb_camera_info);
892 leftInfoMsgs.push_back(image3->rgb_camera_info);
893 leftInfoMsgs.push_back(image4->rgb_camera_info);
894 leftInfoMsgs.push_back(image5->rgb_camera_info);
895 leftInfoMsgs.push_back(image6->rgb_camera_info);
896 rightInfoMsgs.push_back(image->depth_camera_info);
897 rightInfoMsgs.push_back(image2->depth_camera_info);
898 rightInfoMsgs.push_back(image3->depth_camera_info);
899 rightInfoMsgs.push_back(image4->depth_camera_info);
900 rightInfoMsgs.push_back(image5->depth_camera_info);
901 rightInfoMsgs.push_back(image6->depth_camera_info);
903 this->commonCallback(leftMsgs, rightMsgs, leftInfoMsgs, rightInfoMsgs);
915 approxSync_->registerCallback(boost::bind(&StereoOdometry::callback,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
921 exactSync_->registerCallback(boost::bind(&StereoOdometry::callback,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
930 approxSync2_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
939 exactSync2_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD2,
this, boost::placeholders::_1, boost::placeholders::_2));
949 approxSync3_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
959 exactSync3_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD3,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3));
970 approxSync4_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
981 exactSync4_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD4,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4));
993 approxSync5_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
1005 exactSync5_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD5,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5));
1009 delete approxSync6_;
1018 approxSync6_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD6,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5, boost::placeholders::_6));
1031 exactSync6_->registerCallback(boost::bind(&StereoOdometry::callbackRGBD6,
this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5, boost::placeholders::_6));