我之前刚编译成功ORB-SLAM3的时候试跑了一下demo(数据集),但是效果其实很一般,甚至想说拉垮,在ROS环境下跑双目imu更拉垮,跑论文里的几个数据集,我就没跑成过,跑例程的总结如下:
ROS与非ROS下相比,ROS下跑数据集很容易翻车,尤其是双目imu,适当降低播放数据集的速度鲁棒性会相对好一点,但是还是拉垮;
非ROS系统下的双目imu效果还是很不错的;
ROS下跑rgbd模式,我用的是rgbd_dataset_freiburg2_pioneer_slam
数据集,在可视化窗口上完全没有运动轨迹,而且也老是出现跟丢的情况,也几乎没完整跑成功过一次;
注:
1)有dalao指出可视化窗口上没有运动轨迹可能是DepthMapFactor
没设置好;
2)下载TUM-rgbd数据集的.bag
文件时,打开乱码就换个浏览器,别瞎搞。
整体而言,鲁棒性好像就一般,没有论文说的那么上天,常出现直接崩的情况。
自己个人认为:并没有一下载编译安装就能跑出理想数据的源码,软件环境、硬件配置及应用场景等都是影响因素,所以还是需要根据自己需求去修改优化,整体而言ORB-SLAM3还是值得深耕。
然后用realsense d435i分别跑了下单双目及其imu模式,没跑rgbd,应该都差不多的。
本文仅做记录,若有什么不妥之处请多指教。
太久没实际跑硬件了,一上来就给我报了个错误:
RLException: [rs_camera.launch] is neither a launch file in package......
原因:未添加ROS工作空间的环境变量
解决方法:写进.bashrc文件中,并在添加的环境变量后加上source,顺序不能错。
接入相机后,开启realsense-viewer
,开启运动模块时,会有一条报错
notifications.cpp:514-Motion Module failure......
realsense 官方人员解释:
刚开始运行或者运行过程中偶尔出现,不影响后续正常工作,刚开始的话运行一段时间就正常了,而运行过程中偶尔出现也可能只是短暂的中断,相机继续运动就会立即恢复。可能是imu的误差产生的。
github原链接:
https://github.com/IntelRealSense/librealsense/issues/6008
https://github.com/IntelRealSense/librealsense/issues/6860
类似的,realsense-viewer
中出现“无可用数据”等问题:
27/04 09:29:56,572 WARNING [139988041905920] (messenger-libusb.cpp:42) control_transfer returned error, index: 768, error: No data available, number: 61
// or
02/06 18:14:04,834 WARNING [546903667072] (uvc-device.cpp:644) interrupt event received: 1, 3, 0, 7, 0, 0
// or
02/06 15:30:00,403 WARNING [5479364444192] (types.cpp:49) hwmon command 0x4f failed. Error type: No data to return (-21)
// or
01/06 23:37:56,009 WARNING [548128411424] (messenger-libusb.cpp:42)control_transfer returned error, index: 768, error: Resource temporarily unavailable; number: 11
诸如此类的警告时,如果只是刚开启时跳出这些警告,不是频繁的弹出,那倒问题不大,可以不必理会,这个相机或者是版本的一个bug,目前没有处理办法;如果是频繁弹出,从如下角度考虑:
① 数据线是否为原装线;
② 固件版本、包的版本是否相匹配;
③ 设备之间的通信问题,其实也与①②相关。
我之前遇到过的问题就是固件和包版本的关系,有时候系统并不会提示你,你装完后很多东西都是正常的,但是确实不对的,故会报出上述警告提示,过于频繁的弹出警告,则说明有问题,忽略不管的话后续肯定会有很多不知名错误等着的。
github原链接:
https://github.com/IntelRealSense/librealsense/issues/9985
https://github.com/IntelRealSense/realsense-ros/issues/1950
在CSDN中找的文章,很多dalao直接上:“调源文件中的话题,改成什么什么就可以了!”,嗯,我不行。
根本走不通,然后现在梳理一下,记录下来。
rs-enumerate-devices
自己选定一个配置,我选的是:color、infra都是848*480,30fps
。
如果配置文件中与相机可用配置不匹配的话,运行相机节点时会出现以下错误:
[ WARN] [1607424395.748719191]: Given stream configuration is not supported by the device!Stream:Infrared,Stream Index:1, Width: 848, Height: 640, FPS: 30, Format: Y8
别看它只是个WARNING,实际上出现了这个,此数据流就根本没了。
如果匹配后还无法获取数据,那就可能是驱动程序的问题了,
github原链接:https://github.com/IntelRealSense/librealsense/issues/9158
将开关打开(设置为true
),将可用配置的信息输入相机节点中。
// 设置图像的尺寸及颜色信息
<arg name="color_width" default="848"/> // 彩色图的宽
<arg name="color_height" default="480"/> // 彩色图的高
<arg name="enable_color" default="true"/> // 打开使能端
// 设置红外视野的尺寸与信息
<arg name="infra_width" default="848"/>
<arg name="infra_height" default="480"/>
<arg name="enable_infra1" default="true"/> // 打开左相机红外
<arg name="enable_infra2" default="true"/> // 打开右相机红外
// 开启陀螺仪和加速度计的输出
<arg name="enable_gyro" default="true"/>
<arg name="enable_accel" default="true"/>
// 设置各种帧率
<arg name="infra_fps" default="30"/> // 红外帧率
<arg name="color_fps" default="30"/> // 彩图帧率
<arg name="gyro_fps" default="200"/> // 陀螺仪更新频率
<arg name="accel_fps" default="200"/> // 加速度计更新频率
// 让IMU的角速度和加速度作为一个topic输出
<arg name="unite_imu_method" default="copy"/>
// 让IMU的角速度和加速度线性插值输出(不知道哪个效果好,得试试)
<arg name="unite_imu_method" default="linear_interpolation"/>
// 开启相机和IMU的同步
<arg name="enable_sync" default="true"/>
关于unite_imu_method变量,官方说明:
linear_interpolation: Every gyro message is attached by the an accel message interpolated to the gyro’s timestamp.
copy: Every gyro message is attached by the last accel message.
即,
线性插值是指,将所有的陀螺仪值融合到一个与陀螺仪时间戳线性插值的加速度计值中。
复制是指,将所有陀螺仪值融合到最后一个加速度计值上。
说实话,没怎么理解,我翻到了issue#729,但是最后realsense的工作人员又说:从 2.2.14 版开始,关于插值方法的解释不跟这个相关。
算了,我放弃了,至少从官方的ReadMe文档中得知:
设置unite_imu_method,会创建一个新话题——imu,它会替换默认的gyro和accel主题。
imu主题以陀螺仪的速度发布。
由于我不用rgb模式,所以直接将IR结构光点阵光源关了,不然会对采集图像时对图像质量有所影响。
在上述配置文件中加入如下语句:
<arg name="emitter_enable" default="0"/>
<!-- rosparam set /camera/stereo_module/emitter_enabled false -->
<rosparam>
/camera/stereo_module/emitter_enabled: 0
</rosparam>
<rosparam if="$(arg emitter_enable)">
/camera/stereo_module/emitter_enabled: 1
</rosparam>
需要打开时,直接在运行的时候加参数开启:
roslaunch realsense2_camera rs_camera_copy.launch emitter_enable:=1
修改好配置文件直接ctrl + s
保存就好。
将配置文件中的图像尺寸和更新频率设置为与上述选定的参数一致。
因为没有标定什么的,我就只改了这个,目前只求能运行。
单目+imu:
> ORB_SLAM3/Examples/ROS/ORB_SLAM3/src/ros_mono_inertial.cc 文件
> 修改节点(绿色字体)
// Maximum delay, 5 seconds
//ros::Subscriber sub_imu = n.subscribe("/imu", 1000, &ImuGrabber::GrabImu, &imugb);
//ros::Subscriber sub_img0 = n.subscribe("/camera/image_raw", 100, &ImageGrabber::GrabImage,&igb);
ros::Subscriber sub_imu = n.subscribe("/camera/imu", 1000, &ImuGrabber::GrabImu, &imugb);
ros::Subscriber sub_img0 = n.subscribe("/camera/color/image_raw", 100, &ImageGrabber::GrabImage,&igb);
如果是纯单目模式,也是同样的用这个话题:/camera/color/image_raw
双目+imu:
> ORB_SLAM3/Examples/ROS/ORB_SLAM3/src/ros_stereo_inertial.cc 文件
> 修改节点(绿色字体)
// Maximum delay, 5 seconds
ros::Subscriber sub_imu = n.subscribe("/camera/imu", 1000, &ImuGrabber::GrabImu, &imugb);
ros::Subscriber sub_img_left = n.subscribe("/camera/infra1/image_rect_raw", 100, &ImageGrabber::GrabImageLeft,&igb);
ros::Subscriber sub_img_right = n.subscribe("/camera/infra2/image_rect_raw", 100, &ImageGrabber::GrabImageRight,&igb);
改完之后,ROS下ORB_SLAM3的build
文件中进行编译:
make
编译完就可以成功运行了。
第一个终端:
roscore
第二个终端(打开相机节点):
roslaunch realsense2_camera rs_camera.launch
第三个终端(运行ORB-SLAM3):
rosrun ORB_SLAM3 Stereo_Inertial .../Vocabulary/ORBvoc.txt .../Examples/Stereo-Inertial/XXX.yaml 1
除了roscore
,其它两个顺序随便。
后面好像就没什么了,但是有挺多乱七八糟的东西也记录一下吧。
Asic Temperature value is not valid!
// or
incomplete frame received:overflow video frame detected.
这个好像github上也没什么好办法,即使是相机在合理运行的温度范围内,它也会出现第一行错误,第二个是输入的图像与配置不匹配的时候会出现,偶尔运行过程中也会出现,暂无解决方案,但也不影响运行。
在运行ORB-SLAM3时发现没有图像但相机节点中发布了所需要的话题时,可以用rqt_image_view或者rviz查看一下是否能订阅到所需要的话题。
realsense-viewer中“未接收到帧”:
https://github.com/IntelRealSense/librealsense/issues/6992
https://github.com/IntelRealSense/librealsense/issues/9740(这个比较有信息)
关于D435i IMU问题的链接:
https://github.com/IntelRealSense/realsense-ros/issues/1224
ORB-SLAM3实时下跑易丢失:
https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/346
ORB-SLAM3是否支持全局快门或滚动快门:
https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/94
程序启动后,需要一定速度的移动才能正常的运行功能(如IMU的正常运行,跟踪节点),由于没有调过其他任何东西,所以精度什么并没有管,稳定性还是那样,一般般吧,还是存在疯狂反复初始化的问题,运行demo的时候也会这样,尤其是双目,双目还会出现RESETING FRAME!
的错误。应该需要对程序优化配置后才能得到自己想要的效果吧。
还是那句话:没有直接下载完就能用的开源代码,具体问题具体分析。