34 #include <sl/Camera.hpp>
42 static cv::Mat slMat2cvMat(sl::Mat& input) {
43 #if ZED_SDK_MAJOR_VERSION < 3
46 switch (input.getDataType()) {
47 case sl::MAT_TYPE_32F_C1: cv_type = CV_32FC1;
break;
48 case sl::MAT_TYPE_32F_C2: cv_type = CV_32FC2;
break;
49 case sl::MAT_TYPE_32F_C3: cv_type = CV_32FC3;
break;
50 case sl::MAT_TYPE_32F_C4: cv_type = CV_32FC4;
break;
51 case sl::MAT_TYPE_8U_C1: cv_type = CV_8UC1;
break;
52 case sl::MAT_TYPE_8U_C2: cv_type = CV_8UC2;
break;
53 case sl::MAT_TYPE_8U_C3: cv_type = CV_8UC3;
break;
54 case sl::MAT_TYPE_8U_C4: cv_type = CV_8UC4;
break;
59 return cv::Mat(input.getHeight(), input.getWidth(), cv_type, input.getPtr<sl::uchar1>(sl::MEM_CPU));
63 switch (input.getDataType()) {
64 case sl::MAT_TYPE::F32_C1: cv_type = CV_32FC1;
break;
65 case sl::MAT_TYPE::F32_C2: cv_type = CV_32FC2;
break;
66 case sl::MAT_TYPE::F32_C3: cv_type = CV_32FC3;
break;
67 case sl::MAT_TYPE::F32_C4: cv_type = CV_32FC4;
break;
68 case sl::MAT_TYPE::U8_C1: cv_type = CV_8UC1;
break;
69 case sl::MAT_TYPE::U8_C2: cv_type = CV_8UC2;
break;
70 case sl::MAT_TYPE::U8_C3: cv_type = CV_8UC3;
break;
71 case sl::MAT_TYPE::U8_C4: cv_type = CV_8UC4;
break;
76 return cv::Mat(input.getHeight(), input.getWidth(), cv_type, input.getPtr<sl::uchar1>(sl::MEM::CPU));
80 Transform zedPoseToTransform(
const sl::Pose & pose)
83 pose.pose_data.m[0], pose.pose_data.m[1], pose.pose_data.m[2], pose.pose_data.m[3],
84 pose.pose_data.m[4], pose.pose_data.m[5], pose.pose_data.m[6], pose.pose_data.m[7],
85 pose.pose_data.m[8], pose.pose_data.m[9], pose.pose_data.m[10], pose.pose_data.m[11]);
88 #if ZED_SDK_MAJOR_VERSION < 3
89 IMU zedIMUtoIMU(
const sl::IMUData & imuData,
const Transform & imuLocalTransform)
91 sl::Orientation
orientation = imuData.pose_data.getOrientation();
94 Transform opticalTransform(0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 0);
96 orientationT = opticalTransform * orientationT;
98 static double deg2rad = 0.017453293;
99 Eigen::Vector4d accT = Eigen::Vector4d(imuData.linear_acceleration.v[0], imuData.linear_acceleration.v[1], imuData.linear_acceleration.v[2], 1);
100 Eigen::Vector4d gyrT = Eigen::Vector4d(imuData.angular_velocity.v[0]*deg2rad, imuData.angular_velocity.v[1]*deg2rad, imuData.angular_velocity.v[2]*deg2rad, 1);
102 cv::Mat orientationCov = (cv::Mat_<double>(3,3)<<
103 imuData.pose_covariance[21], imuData.pose_covariance[22], imuData.pose_covariance[23],
104 imuData.pose_covariance[27], imuData.pose_covariance[28], imuData.pose_covariance[29],
105 imuData.pose_covariance[33], imuData.pose_covariance[34], imuData.pose_covariance[35]);
106 cv::Mat angCov = (cv::Mat_<double>(3,3)<<
107 imuData.angular_velocity_convariance.r[0], imuData.angular_velocity_convariance.r[1], imuData.angular_velocity_convariance.r[2],
108 imuData.angular_velocity_convariance.r[3], imuData.angular_velocity_convariance.r[4], imuData.angular_velocity_convariance.r[5],
109 imuData.angular_velocity_convariance.r[6], imuData.angular_velocity_convariance.r[7], imuData.angular_velocity_convariance.r[8]);
110 cv::Mat accCov = (cv::Mat_<double>(3,3)<<
111 imuData.linear_acceleration_convariance.r[0], imuData.linear_acceleration_convariance.r[1], imuData.linear_acceleration_convariance.r[2],
112 imuData.linear_acceleration_convariance.r[3], imuData.linear_acceleration_convariance.r[4], imuData.linear_acceleration_convariance.r[5],
113 imuData.linear_acceleration_convariance.r[6], imuData.linear_acceleration_convariance.r[7], imuData.linear_acceleration_convariance.r[8]);
120 cv::Vec3d(gyrT[0], gyrT[1], gyrT[2]),
122 cv::Vec3d(accT[0], accT[1], accT[2]),
127 IMU zedIMUtoIMU(
const sl::SensorsData & sensorData,
const Transform & imuLocalTransform)
129 sl::Orientation
orientation = sensorData.imu.pose.getOrientation();
132 Transform opticalTransform(0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 0);
134 orientationT = opticalTransform * orientationT;
136 static double deg2rad = 0.017453293;
137 Eigen::Vector4d accT = Eigen::Vector4d(sensorData.imu.linear_acceleration.v[0], sensorData.imu.linear_acceleration.v[1], sensorData.imu.linear_acceleration.v[2], 1);
138 Eigen::Vector4d gyrT = Eigen::Vector4d(sensorData.imu.angular_velocity.v[0]*deg2rad, sensorData.imu.angular_velocity.v[1]*deg2rad, sensorData.imu.angular_velocity.v[2]*deg2rad, 1);
140 cv::Mat orientationCov = (cv::Mat_<double>(3,3)<<
141 sensorData.imu.pose_covariance.r[0], sensorData.imu.pose_covariance.r[1], sensorData.imu.pose_covariance.r[2],
142 sensorData.imu.pose_covariance.r[3], sensorData.imu.pose_covariance.r[4], sensorData.imu.pose_covariance.r[5],
143 sensorData.imu.pose_covariance.r[6], sensorData.imu.pose_covariance.r[7], sensorData.imu.pose_covariance.r[8]);
144 cv::Mat angCov = (cv::Mat_<double>(3,3)<<
145 sensorData.imu.angular_velocity_covariance.r[0], sensorData.imu.angular_velocity_covariance.r[1], sensorData.imu.angular_velocity_covariance.r[2],
146 sensorData.imu.angular_velocity_covariance.r[3], sensorData.imu.angular_velocity_covariance.r[4], sensorData.imu.angular_velocity_covariance.r[5],
147 sensorData.imu.angular_velocity_covariance.r[6], sensorData.imu.angular_velocity_covariance.r[7], sensorData.imu.angular_velocity_covariance.r[8]);
148 cv::Mat accCov = (cv::Mat_<double>(3,3)<<
149 sensorData.imu.linear_acceleration_covariance.r[0], sensorData.imu.linear_acceleration_covariance.r[1], sensorData.imu.linear_acceleration_covariance.r[2],
150 sensorData.imu.linear_acceleration_covariance.r[3], sensorData.imu.linear_acceleration_covariance.r[4], sensorData.imu.linear_acceleration_covariance.r[5],
151 sensorData.imu.linear_acceleration_covariance.r[6], sensorData.imu.linear_acceleration_covariance.r[7], sensorData.imu.linear_acceleration_covariance.r[8]);
158 cv::Vec3d(gyrT[0], gyrT[1], gyrT[2]),
160 cv::Vec3d(accT[0], accT[1], accT[2]),
166 class ZedIMUThread:
public UThread
169 ZedIMUThread(
float rate, sl::Camera * zed, CameraStereoZed * camera,
const Transform & imuLocalTransform,
bool accurate)
172 UASSERT(zed != 0 && camera != 0);
176 accurate_ = accurate;
177 imuLocalTransform_ = imuLocalTransform;
180 virtual void mainLoopBegin()
182 frameRateTimer_.start();
184 virtual void mainLoop()
186 double delay = 1000.0/double(rate_);
187 int sleepTime = delay - 1000.0f*frameRateTimer_.getElapsedTime();
198 while(frameRateTimer_.getElapsedTime() < delay-0.000001)
208 frameRateTimer_.start();
210 #if ZED_SDK_MAJOR_VERSION < 3
212 bool res = zed_->getIMUData(imudata, sl::TIME_REFERENCE_IMAGE);
213 if(res == sl::SUCCESS && imudata.valid)
215 this->postInterIMU(zedIMUtoIMU(imudata, imuLocalTransform_),
UTimer::now());
218 sl::SensorsData sensordata;
219 sl::ERROR_CODE
res = zed_->getSensorsData(sensordata, sl::TIME_REFERENCE::CURRENT);
220 if(res == sl::ERROR_CODE::SUCCESS && sensordata.imu.is_available)
222 camera_->postInterIMUPublic(zedIMUtoIMU(sensordata, imuLocalTransform_),
double(sensordata.imu.timestamp.getNanoseconds())/10e8);
228 CameraStereoZed * camera_;
230 Transform imuLocalTransform_;
248 return ZED_SDK_MAJOR_VERSION;
261 bool computeOdometry,
264 bool selfCalibration,
266 int texturenessConfidenceThr) :
267 Camera(imageRate, localTransform)
272 usbDevice_(deviceId),
274 resolution_(resolution),
276 selfCalibration_(selfCalibration),
277 sensingMode_(sensingMode),
278 confidenceThr_(confidenceThr),
279 texturenessConfidenceThr_(texturenessConfidenceThr),
280 computeOdometry_(computeOdometry),
282 force3DoF_(odomForce3DoF),
283 imuPublishingThread_(0)
288 #if ZED_SDK_MAJOR_VERSION < 4
289 if(resolution_ == 1 || resolution_ == 2)
297 if(resolution_ == 4 || resolution_ == -1)
301 else if(resolution_ == 5 || resolution_ == 6)
306 if(resolution_ == -1)
308 resolution_ =
int(sl::RESOLUTION::AUTO);
312 #if ZED_SDK_MAJOR_VERSION < 3
313 UASSERT(resolution_ >= sl::RESOLUTION_HD2K && resolution_ <sl::RESOLUTION_LAST);
314 UASSERT(quality_ >= sl::DEPTH_MODE_NONE && quality_ <sl::DEPTH_MODE_LAST);
315 UASSERT(sensingMode_ >= sl::SENSING_MODE_STANDARD && sensingMode_ <sl::SENSING_MODE_LAST);
316 UASSERT(confidenceThr_ >= 0 && confidenceThr_ <=100);
318 sl::RESOLUTION
res =
static_cast<sl::RESOLUTION
>(resolution_);
319 sl::DEPTH_MODE qual =
static_cast<sl::DEPTH_MODE
>(quality_);
321 UASSERT(qual >= sl::DEPTH_MODE::NONE && qual < sl::DEPTH_MODE::LAST);
322 #if ZED_SDK_MAJOR_VERSION < 4
323 UASSERT(
res >= sl::RESOLUTION::HD2K &&
res < sl::RESOLUTION::LAST);
324 sl::SENSING_MODE sens =
static_cast<sl::SENSING_MODE
>(sensingMode_);
325 UASSERT(sens >= sl::SENSING_MODE::STANDARD && sens < sl::SENSING_MODE::LAST);
327 UASSERT(
res >= sl::RESOLUTION::HD4K &&
res < sl::RESOLUTION::LAST);
328 UASSERT(sensingMode_ >= 0 && sensingMode_ < 2);
330 UASSERT(confidenceThr_ >= 0 && confidenceThr_ <=100);
331 UASSERT(texturenessConfidenceThr_ >= 0 && texturenessConfidenceThr_ <=100);
337 const std::string & filePath,
341 bool computeOdometry,
344 bool selfCalibration,
346 int texturenessConfidenceThr) :
347 Camera(imageRate, localTransform)
353 svoFilePath_(filePath),
354 #
if ZED_SDK_MAJOR_VERSION < 3
355 resolution_(
sl::RESOLUTION_HD720),
356 #elif ZED_SDK_MAJOR_VERSION < 4
357 resolution_(
sl::RESOLUTION::HD720),
359 resolution_(
int(
sl::RESOLUTION::AUTO)),
362 selfCalibration_(selfCalibration),
363 sensingMode_(sensingMode),
364 confidenceThr_(confidenceThr),
365 texturenessConfidenceThr_(texturenessConfidenceThr),
366 computeOdometry_(computeOdometry),
368 force3DoF_(odomForce3DoF),
369 imuPublishingThread_(0)
374 #if ZED_SDK_MAJOR_VERSION < 3
375 UASSERT(resolution_ >= sl::RESOLUTION_HD2K && resolution_ <sl::RESOLUTION_LAST);
376 UASSERT(quality_ >= sl::DEPTH_MODE_NONE && quality_ <sl::DEPTH_MODE_LAST);
377 UASSERT(sensingMode_ >= sl::SENSING_MODE_STANDARD && sensingMode_ <sl::SENSING_MODE_LAST);
378 UASSERT(confidenceThr_ >= 0 && confidenceThr_ <=100);
380 sl::RESOLUTION
res =
static_cast<sl::RESOLUTION
>(resolution_);
381 sl::DEPTH_MODE qual =
static_cast<sl::DEPTH_MODE
>(quality_);
383 UASSERT(
res >= sl::RESOLUTION::HD2K &&
res < sl::RESOLUTION::LAST);
384 UASSERT(qual >= sl::DEPTH_MODE::NONE && qual < sl::DEPTH_MODE::LAST);
385 #if ZED_SDK_MAJOR_VERSION < 4
386 sl::SENSING_MODE sens =
static_cast<sl::SENSING_MODE
>(sensingMode_);
387 UASSERT(sens >= sl::SENSING_MODE::STANDARD && sens < sl::SENSING_MODE::LAST);
389 UASSERT(sensingMode_ >= 0 && sensingMode_ < 2);
391 UASSERT(confidenceThr_ >= 0 && confidenceThr_ <=100);
392 UASSERT(texturenessConfidenceThr_ >= 0 && texturenessConfidenceThr_ <=100);
400 if(imuPublishingThread_)
402 imuPublishingThread_->join(
true);
404 delete imuPublishingThread_;
413 if(imuPublishingThread_)
415 imuPublishingThread_->join(
true);
416 delete imuPublishingThread_;
417 imuPublishingThread_=0;
427 sl::InitParameters param;
428 param.camera_resolution=
static_cast<sl::RESOLUTION
>(resolution_);
430 param.depth_mode=(sl::DEPTH_MODE)quality_;
431 #if ZED_SDK_MAJOR_VERSION < 3
432 param.camera_linux_id=usbDevice_;
433 param.coordinate_units=sl::UNIT_METER;
434 param.coordinate_system=(sl::COORDINATE_SYSTEM)sl::COORDINATE_SYSTEM_IMAGE ;
436 param.coordinate_units=sl::UNIT::METER;
437 param.coordinate_system=sl::COORDINATE_SYSTEM::IMAGE ;
439 param.sdk_verbose=
true;
441 param.depth_minimum_distance=-1;
442 param.camera_disable_self_calib=!selfCalibration_;
444 sl::ERROR_CODE r = sl::ERROR_CODE::SUCCESS;
447 UINFO(
"svo file = %s", svoFilePath_.c_str());
448 zed_ =
new sl::Camera();
449 #if ZED_SDK_MAJOR_VERSION < 3
450 param.svo_input_filename=svoFilePath_.c_str();
452 param.input.setFromSVOFile(svoFilePath_.c_str());
454 r = zed_->open(param);
458 #if ZED_SDK_MAJOR_VERSION >= 3
459 param.input.setFromCameraID(usbDevice_);
461 UINFO(
"Resolution=%d imagerate=%f device=%d", resolution_,
getImageRate(), usbDevice_);
462 zed_ =
new sl::Camera();
463 r = zed_->open(param);
466 if(r!=sl::ERROR_CODE::SUCCESS)
468 UERROR(
"Camera initialization failed: \"%s\"", toString(r).
c_str());
474 #if ZED_SDK_MAJOR_VERSION < 3
475 UINFO(
"Init ZED: Mode=%d Unit=%d CoordinateSystem=%d Verbose=false device=-1 minDist=-1 self-calibration=%s vflip=false",
476 quality_, sl::UNIT_METER, sl::COORDINATE_SYSTEM_IMAGE , selfCalibration_?
"true":
"false");
478 if(quality_!=sl::DEPTH_MODE_NONE)
480 zed_->setConfidenceThreshold(confidenceThr_);
483 UINFO(
"Init ZED: Mode=%d Unit=%d CoordinateSystem=%d Verbose=false device=-1 minDist=-1 self-calibration=%s vflip=false",
484 quality_, sl::UNIT::METER, sl::COORDINATE_SYSTEM::IMAGE , selfCalibration_?
"true":
"false");
492 if (computeOdometry_)
494 #if ZED_SDK_MAJOR_VERSION < 3
495 sl::TrackingParameters tparam;
496 tparam.enable_spatial_memory=
false;
497 r = zed_->enableTracking(tparam);
499 sl::PositionalTrackingParameters tparam;
500 tparam.enable_area_memory=
false;
501 r = zed_->enablePositionalTracking(tparam);
503 if(r!=sl::ERROR_CODE::SUCCESS)
505 UERROR(
"Camera tracking initialization failed: \"%s\"", toString(r).
c_str());
509 sl::CameraInformation infos = zed_->getCameraInformation();
510 #if ZED_SDK_MAJOR_VERSION < 4
511 sl::CalibrationParameters *stereoParams = &(infos.calibration_parameters );
513 sl::CalibrationParameters *stereoParams = &(infos.camera_configuration.calibration_parameters );
515 sl::Resolution
res = stereoParams->left_cam.image_size;
517 #if ZED_SDK_MAJOR_VERSION < 4
519 stereoParams->left_cam.fx,
520 stereoParams->left_cam.fy,
521 stereoParams->left_cam.cx,
522 stereoParams->left_cam.cy,
524 this->getLocalTransform(),
525 cv::Size(
res.width,
res.height));
528 stereoParams->left_cam.fx,
529 stereoParams->left_cam.fy,
530 stereoParams->left_cam.cx,
531 stereoParams->left_cam.cy,
532 stereoParams->getCameraBaseline(),
533 this->getLocalTransform(),
534 cv::Size(
res.width,
res.height));
537 #if ZED_SDK_MAJOR_VERSION < 4
538 UINFO(
"Calibration: fx=%f, fy=%f, cx=%f, cy=%f, baseline=%f, width=%d, height=%d, transform=%s",
539 stereoParams->left_cam.fx,
540 stereoParams->left_cam.fy,
541 stereoParams->left_cam.cx,
542 stereoParams->left_cam.cy,
546 this->getLocalTransform().prettyPrint().c_str());
548 UINFO(
"Calibration: fx=%f, fy=%f, cx=%f, cy=%f, baseline=%f, width=%d, height=%d, transform=%s",
549 stereoParams->left_cam.fx,
550 stereoParams->left_cam.fy,
551 stereoParams->left_cam.cx,
552 stereoParams->left_cam.cy,
553 stereoParams->getCameraBaseline(),
556 this->getLocalTransform().prettyPrint().c_str());
559 #if ZED_SDK_MAJOR_VERSION < 3
560 if(infos.camera_model == sl::MODEL_ZED_M)
562 if(infos.camera_model != sl::MODEL::ZED)
565 #if ZED_SDK_MAJOR_VERSION < 4
568 imuLocalTransform_ = this->
getLocalTransform() * zedPoseToTransform(infos.sensors_configuration.camera_imu_transform).
inverse();
571 #if ZED_SDK_MAJOR_VERSION < 4
572 UINFO(
"IMU local transform: %s (imu2cam=%s))",
573 imuLocalTransform_.prettyPrint().c_str(),
574 zedPoseToTransform(infos.camera_imu_transform).prettyPrint().c_str());
576 UINFO(
"IMU local transform: %s (imu2cam=%s))",
577 imuLocalTransform_.prettyPrint().c_str(),
578 zedPoseToTransform(infos.sensors_configuration.camera_imu_transform).prettyPrint().c_str());
582 imuPublishingThread_ =
new ZedIMUThread(200, zed_,
this, imuLocalTransform_,
true);
583 imuPublishingThread_->start();
589 UERROR(
"CameraStereoZED: RTAB-Map is not built with ZED sdk support!");
597 return stereoModel_.isValidForProjection();
608 return uFormat(
"%x", zed_->getCameraInformation ().serial_number);
617 return computeOdometry_;
627 if (computeOdometry_ && zed_)
631 #if ZED_SDK_MAJOR_VERSION < 3
636 sl::TRACKING_STATE tracking_state = zed_->getPosition(
p);
637 if (tracking_state == sl::TRACKING_STATE_OK)
639 if(zed_->grab()!=sl::ERROR_CODE::SUCCESS)
643 sl::POSITIONAL_TRACKING_STATE tracking_state = zed_->getPosition(
p);
644 if (tracking_state == sl::POSITIONAL_TRACKING_STATE::OK)
647 int trackingConfidence =
p.pose_confidence;
649 if (trackingConfidence>0)
651 pose = zedPoseToTransform(
p);
665 covariance = cv::Mat::eye(6, 6, CV_64FC1) * 9999.0f;
671 covariance = cv::Mat::eye(6, 6, CV_64FC1) * 1.0f /
float(trackingConfidence);
672 UDEBUG(
"Run %s (var=%f)", pose.
prettyPrint().c_str(), 1.0f /
float(trackingConfidence));
678 covariance = cv::Mat::eye(6, 6, CV_64FC1) * 9999.0f;
680 UWARN(
"ZED lost! (trackingConfidence=%d)", trackingConfidence);
685 covariance = cv::Mat::eye(6, 6, CV_64FC1) * 9999.0f;
687 UWARN(
"ZED lost! (trackingConfidence=%d)", trackingConfidence);
692 UWARN(
"Tracking not ok: state=\"%s\"", toString(tracking_state).
c_str());
703 #if ZED_SDK_MAJOR_VERSION < 3
704 sl::RuntimeParameters rparam((sl::SENSING_MODE)sensingMode_, quality_ > 0, quality_ > 0, sl::REFERENCE_FRAME_CAMERA);
705 #elif ZED_SDK_MAJOR_VERSION < 4
706 sl::RuntimeParameters rparam((sl::SENSING_MODE)sensingMode_, quality_ > 0, confidenceThr_, texturenessConfidenceThr_, sl::REFERENCE_FRAME::CAMERA);
708 sl::RuntimeParameters rparam(quality_ > 0, sensingMode_ == 1, confidenceThr_, texturenessConfidenceThr_, sl::REFERENCE_FRAME::CAMERA);
714 #if ZED_SDK_MAJOR_VERSION < 3
715 bool res = zed_->grab(rparam);
720 res = zed_->grab(rparam);
727 sl::Timestamp timestamp;
728 bool imuReceived =
true;
731 res = zed_->grab(rparam);
732 timestamp = zed_->getTimestamp(sl::TIME_REFERENCE::IMAGE);
735 if(imuPublishingThread_ == 0 && !imuLocalTransform_.isNull())
737 sl::SensorsData imudatatmp;
738 res = zed_->getSensorsData(imudatatmp, sl::TIME_REFERENCE::IMAGE);
739 imuReceived =
res == sl::ERROR_CODE::SUCCESS && imudatatmp.imu.is_available && imudatatmp.imu.timestamp.getNanoseconds() != 0;
744 if(
res==sl::ERROR_CODE::SUCCESS)
749 #if ZED_SDK_MAJOR_VERSION < 3
750 zed_->retrieveImage(tmp,sl::VIEW_LEFT);
752 zed_->retrieveImage(tmp,sl::VIEW::LEFT);
754 cv::Mat rgbaLeft = slMat2cvMat(tmp);
757 cv::cvtColor(rgbaLeft, left, cv::COLOR_BGRA2BGR);
764 #if ZED_SDK_MAJOR_VERSION < 3
765 zed_->retrieveMeasure(tmp,sl::MEASURE_DEPTH);
767 zed_->retrieveMeasure(tmp,sl::MEASURE::DEPTH);
769 slMat2cvMat(tmp).copyTo(depth);
770 #if ZED_SDK_MAJOR_VERSION < 3
773 data =
SensorData(left, depth, stereoModel_.left(),
this->getNextSeqID(),
double(timestamp.getNanoseconds())/10e8);
779 #if ZED_SDK_MAJOR_VERSION < 3
780 sl::Mat tmp;zed_->retrieveImage(tmp,sl::VIEW_RIGHT );
782 sl::Mat tmp;zed_->retrieveImage(tmp,sl::VIEW::RIGHT );
784 cv::Mat rgbaRight = slMat2cvMat(tmp);
786 cv::cvtColor(rgbaRight, right, cv::COLOR_BGRA2GRAY);
787 #if ZED_SDK_MAJOR_VERSION < 3
790 data =
SensorData(left, right, stereoModel_, this->
getNextSeqID(),
double(timestamp.getNanoseconds())/10e8);
794 if(imuPublishingThread_ == 0)
796 #if ZED_SDK_MAJOR_VERSION < 3
798 res = zed_->getIMUData(imudata, sl::TIME_REFERENCE_IMAGE);
799 if(
res == sl::SUCCESS && imudata.valid)
801 sl::SensorsData imudata;
802 res = zed_->getSensorsData(imudata, sl::TIME_REFERENCE::IMAGE);
803 if(
res == sl::ERROR_CODE::SUCCESS && imudata.imu.is_available)
807 data.setIMU(zedIMUtoIMU(imudata, imuLocalTransform_));
811 if (computeOdometry_ &&
info)
814 #if ZED_SDK_MAJOR_VERSION < 3
815 sl::TRACKING_STATE tracking_state = zed_->getPosition(pose);
816 if (tracking_state == sl::TRACKING_STATE_OK)
818 sl::POSITIONAL_TRACKING_STATE tracking_state = zed_->getPosition(pose);
819 if (tracking_state == sl::POSITIONAL_TRACKING_STATE::OK)
822 int trackingConfidence = pose.pose_confidence;
824 info->odomPose = zedPoseToTransform(pose);
825 if (!
info->odomPose.isNull())
827 #if ZED_SDK_MAJOR_VERSION >=3
828 if(pose.timestamp != timestamp)
830 UWARN(
"Pose retrieve doesn't have same stamp (%ld) than grabbed image (%ld)", pose.timestamp, timestamp);
841 info->odomPose =
info->odomPose.to3DoF();
845 info->odomCovariance = cv::Mat::eye(6, 6, CV_64FC1) * 9999.0f;
847 UDEBUG(
"Init %s (var=%f)",
info->odomPose.prettyPrint().c_str(), 9999.0f);
849 else if(trackingConfidence==0)
851 info->odomCovariance = cv::Mat::eye(6, 6, CV_64FC1) * 9999.0f;
853 UWARN(
"ZED lost! (trackingConfidence=%d)", trackingConfidence);
857 info->odomCovariance = cv::Mat::eye(6, 6, CV_64FC1) * 1.0f /
float(trackingConfidence);
858 UDEBUG(
"Run %s (var=%f)",
info->odomPose.prettyPrint().c_str(), 1.0f /
float(trackingConfidence));
863 info->odomCovariance = cv::Mat::eye(6, 6, CV_64FC1) * 9999.0f;
865 UWARN(
"ZED lost! (trackingConfidence=%d)", trackingConfidence);
870 UWARN(
"Tracking not ok: state=\"%s\"", toString(tracking_state).
c_str());
876 UERROR(
"CameraStereoZed: Failed to grab images after 2 seconds!");
880 UWARN(
"CameraStereoZed: end of stream is reached!");
884 UERROR(
"CameraStereoZED: RTAB-Map is not built with ZED sdk support!");