diff --git a/corelib/include/rtabmap/core/camera/CameraRealSense2.h b/corelib/include/rtabmap/core/camera/CameraRealSense2.h index ed7b333f..4e8cfec9 100644 --- a/corelib/include/rtabmap/core/camera/CameraRealSense2.h +++ b/corelib/include/rtabmap/core/camera/CameraRealSense2.h @@ -114,6 +114,8 @@ private: std::map > poseBuffer_; // > UMutex poseMutex_; UMutex imuMutex_; + double hostStartStamp_; + double cameraStartStamp_; bool emitterEnabled_; bool irDepth_; diff --git a/corelib/src/camera/CameraRealSense2.cpp b/corelib/src/camera/CameraRealSense2.cpp index 94078dc3..84a97185 100644 --- a/corelib/src/camera/CameraRealSense2.cpp +++ b/corelib/src/camera/CameraRealSense2.cpp @@ -64,6 +64,8 @@ CameraRealSense2::CameraRealSense2( depthIntrinsics_(new rs2_intrinsics), rgbIntrinsics_(new rs2_intrinsics), depthToRGBExtrinsics_(new rs2_extrinsics), + hostStartStamp_(0.0), + cameraStartStamp_(0.0), emitterEnabled_(true), irDepth_(false), rectifyImages_(true), @@ -79,26 +81,50 @@ CameraRealSense2::CameraRealSense2( CameraRealSense2::~CameraRealSense2() { #ifdef RTABMAP_REALSENSE2 - for(rs2::sensor _sensor : dev_->query_sensors()) + try { - try + for(rs2::sensor _sensor : dev_->query_sensors()) { - _sensor.stop(); - _sensor.close(); - } - catch(const rs2::wrong_api_call_sequence_error & error) - { - UINFO("%s", error.what()); + try + { + _sensor.stop(); + _sensor.close(); + } + catch(const rs2::error & error) + { + UWARN("%s", error.what()); + } } } - delete ctx_; - delete dev_; - delete syncer_; + catch(const rs2::error & error) + { + UINFO("%s", error.what()); + } + try { + delete ctx_; + } + catch(const rs2::error & error) + { + UWARN("%s", error.what()); + } + try { + delete dev_; + } + catch(const rs2::error & error) + { + UWARN("%s", error.what()); + } + try { + delete syncer_; + } + catch(const rs2::error & error) + { + UWARN("%s", error.what()); + } delete depthIntrinsics_; delete rgbIntrinsics_; delete depthToRGBExtrinsics_; #endif - UDEBUG(""); } #ifdef RTABMAP_REALSENSE2 @@ -186,7 +212,7 @@ void CameraRealSense2::imu_callback(rs2::frame frame) if(stream == RS2_STREAM_GYRO) { gyroBuffer_.insert(gyroBuffer_.end(), std::make_pair(frame.get_timestamp(), crnt_reading)); - if(gyroBuffer_.size() > 10) + if(gyroBuffer_.size() > 100) { gyroBuffer_.erase(gyroBuffer_.begin()); } @@ -194,7 +220,7 @@ void CameraRealSense2::imu_callback(rs2::frame frame) else { accBuffer_.insert(accBuffer_.end(), std::make_pair(frame.get_timestamp(), crnt_reading)); - if(accBuffer_.size() > 10) + if(accBuffer_.size() > 100) { accBuffer_.erase(accBuffer_.begin()); } @@ -210,20 +236,21 @@ Transform CameraRealSense2::realsense2PoseRotationInv_ = realsense2PoseRotation_ void CameraRealSense2::pose_callback(rs2::frame frame) { rs2_pose pose = frame.as().get_pose_data(); - Transform poseT( - pose.translation.x, - pose.translation.y, - pose.translation.z, - pose.rotation.x, - pose.rotation.y, - pose.rotation.z, - pose.rotation.w); + Transform poseT = Transform( + pose.translation.x, + pose.translation.y, + pose.translation.z, + pose.rotation.x, + pose.rotation.y, + pose.rotation.z, + pose.rotation.w); poseT = realsense2PoseRotation_ * poseT * realsense2PoseRotationInv_; + UDEBUG("POSE callback! %f %s (confidence=%d)", frame.get_timestamp(), poseT.prettyPrint().c_str(), (int)pose.tracker_confidence); UScopeMutex sm(poseMutex_); poseBuffer_.insert(poseBuffer_.end(), std::make_pair(frame.get_timestamp(), std::make_pair(poseT, pose.tracker_confidence))); - if(poseBuffer_.size() > 10) + if(poseBuffer_.size() > 100) { poseBuffer_.erase(poseBuffer_.begin()); } @@ -236,6 +263,14 @@ void CameraRealSense2::frame_callback(rs2::frame frame) } void CameraRealSense2::multiple_message_callback(rs2::frame frame) { + if(hostStartStamp_ == 0 && cameraStartStamp_ == 0) + { + hostStartStamp_ = UTimer::now(); + } + if(cameraStartStamp_ == 0) + { + cameraStartStamp_ = frame.get_timestamp(); + } auto stream = frame.get_profile().stream_type(); switch (stream) { @@ -870,7 +905,7 @@ SensorData CameraRealSense2::captureImage(CameraInfo * info) } if (frameset.size() == 2) { - double stamp = UTimer::now(); + double stamp = (frameset.get_timestamp() - cameraStartStamp_) / 1000.0 + hostStartStamp_; UDEBUG("Frameset arrived."); bool is_rgb_arrived = false; bool is_depth_arrived = false; diff --git a/corelib/src/odometry/OdometryF2M.cpp b/corelib/src/odometry/OdometryF2M.cpp index fa370675..64b2e3b2 100644 --- a/corelib/src/odometry/OdometryF2M.cpp +++ b/corelib/src/odometry/OdometryF2M.cpp @@ -204,7 +204,7 @@ Transform OdometryF2M::computeTransform( { if(data.imu().orientation()[0] == 0.0 && data.imu().orientation()[1] == 0.0 && data.imu().orientation()[2] == 0.0) { - UERROR("IMU received doesn't have orientation set, it is ignored."); + UERROR("IMU received doesn't have orientation set, it is ignored. If you are using RTAB-Map standalone, enable IMU filtering in Preferences->Source panel. On ROS, use \"imu_filter_madgwick\" or \"imu_complementary_filter\" packages to compute the orientation."); } else { diff --git a/guilib/src/PreferencesDialog.cpp b/guilib/src/PreferencesDialog.cpp index 16cba80d..03fc1c08 100644 --- a/guilib/src/PreferencesDialog.cpp +++ b/guilib/src/PreferencesDialog.cpp @@ -1772,9 +1772,9 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox) _ui->comboBox_realsenseRGBSource->setCurrentIndex(0); _ui->checkbox_rs2_emitter->setChecked(true); _ui->checkbox_rs2_irDepth->setChecked(false); - _ui->spinBox_rs2_width->setValue(640); + _ui->spinBox_rs2_width->setValue(848); _ui->spinBox_rs2_height->setValue(480); - _ui->spinBox_rs2_rate->setValue(30); + _ui->spinBox_rs2_rate->setValue(60); _ui->lineEdit_openniOniPath->clear(); _ui->lineEdit_openni2OniPath->clear(); _ui->lineEdit_cameraRGBDImages_path_rgb->setText(""); diff --git a/guilib/src/ui/preferencesDialog.ui b/guilib/src/ui/preferencesDialog.ui index 245d003e..ab8244dc 100644 --- a/guilib/src/ui/preferencesDialog.ui +++ b/guilib/src/ui/preferencesDialog.ui @@ -95,7 +95,7 @@ QFrame::Raised - 12 + 5 @@ -4100,7 +4100,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki - Emitter enabled + IR emitter enabled true @@ -4120,7 +4120,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki - Use IR for RGB image. + Use IR for RGB image. Tracking will be more accurate (field-of-view of the IR camera is larger with less motion blur). Make sure to disable IR emitter. true