我之前刚编译成功ORB-SLAM3的时候试跑了一下demo(数据集),但是效果其实很一般,甚至想说拉垮,在ROS环境下跑双目imu更拉垮,跑论文里的几个数据集,我就没跑成过,跑例程的总结如下:
自己个人认为:并没有一下载编译安装就能跑出理想数据的源码,软件环境、硬件配置及应用场景等都是影响因素,所以还是需要根据自己需求去修改优化,整体而言ORB-SLAM3还是值得深耕。
然后用realsense d435i分别跑了下单双目及其imu模式,没跑rgbd,应该都差不多的。
本文仅做记录,若有什么不妥之处请多指教。
1. Error 1
太久没实际跑硬件了,一上来就给我报了个错误:
RLException: [rs_camera.launch] is neither a launch file in package......
原因:未添加ROS工作空间的环境变量
解决方法:写进.bashrc文件中,并在添加的环境变量后加上source,顺序不能错。
2. Error 2
接入相机后,开启 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
02/06 18:14:04,834 WARNING [546903667072] (uvc-device.cpp:644) interrupt event received: 1, 3, 0, 7, 0, 0
02/06 15:30:00,403 WARNING [5479364444192] (types.cpp:49) hwmon command 0x4f failed. Error type: No data to return (-21)
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直接上:”调源文件中的话题,改成什么什么就可以了!”,嗯,我不行。
根本走不通,然后现在梳理一下,记录下来。
1. 查看自己相机的可用的分辨率与频率
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
2. 配置rs_camera.launch(realsense-ros文件夹中)
将开关打开(设置为 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"/>
<arg name="unite_imu_method" default="copy"/>
<arg name="unite_imu_method" default="linear_interpolation"/>
<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.
即,
线性插值是指,将所有的陀螺仪值融合到一个与陀螺仪时间戳线性插值的加速度计值中。
复制是指,将所有陀螺仪值融合到最后一个加速度计值上。
算了,我放弃了,至少从官方的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
保存就好。
3. 修改.yaml配置文件
将配置文件中的图像尺寸和更新频率设置为与上述选定的参数一致。
因为没有标定什么的,我就只改了这个,目前只求能运行。
4. 修改源文件(只修改订阅的相机话题即可)
单目+imu:
> ORB_SLAM3/Examples/ROS/ORB_SLAM3/src/ros_mono_inertial.cc 文件
> 修改节点(绿色字体)
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 文件
> 修改节点(绿色字体)
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!
incomplete frame received:overflow video frame detected.
这个好像github上也没什么好办法,即使是相机在合理运行的温度范围内,它也会出现第一行错误,第二个是输入的图像与配置不匹配的时候会出现,偶尔运行过程中也会出现,暂无解决方案,但也不影响运行。
程序启动后,需要一定速度的移动才能正常的运行功能(如IMU的正常运行,跟踪节点),由于没有调过其他任何东西,所以精度什么并没有管,稳定性还是那样,一般般吧,还是存在疯狂反复初始化的问题,运行demo的时候也会这样,尤其是双目,双目还会出现 RESETING FRAME!
的错误。应该需要对程序优化配置后才能得到自己想要的效果吧。
还是那句话:没有直接下载完就能用的开源代码,具体问题具体分析。
Original: https://blog.csdn.net/weixin_46135347/article/details/121771922
Author: Jay_z在造梦
Title: 【入坑ORB-SLAM3系列2】未标定的realsense D435i试运行ORB-SLAM3(手把手教学,含realsense d435i一些错误的解决)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/559204/
转载文章受原作者版权保护。转载请注明原作者出处!