【入坑ORB-SLAM3系列2】未标定的realsense D435i试运行ORB-SLAM3(手把手教学,含realsense d435i一些错误的解决)

2023-05-16

文章目录

  • 前言
  • 一、前奏
    • 1. Error 1
    • 2. Error 2
  • 二、正文
    • 1. 查看自己相机的可用的分辨率与频率
    • 2. 配置rs_camera.launch(realsense-ros文件夹中)
    • 3. 修改.yaml配置文件
    • 4. 修改源文件(只修改订阅的相机话题即可)
  • 三、尾声
  • 总结
  • Reference


前言

我之前刚编译成功ORB-SLAM3的时候试跑了一下demo(数据集),但是效果其实很一般,甚至想说拉垮,在ROS环境下跑双目imu更拉垮,跑论文里的几个数据集,我就没跑成过,跑例程的总结如下:

  1. ROS与非ROS下相比,ROS下跑数据集很容易翻车,尤其是双目imu,适当降低播放数据集的速度鲁棒性会相对好一点,但是还是拉垮;

  2. 非ROS系统下的双目imu效果还是很不错的;

  3. ROS下跑rgbd模式,我用的是rgbd_dataset_freiburg2_pioneer_slam数据集,在可视化窗口上完全没有运动轨迹,而且也老是出现跟丢的情况,也几乎没完整跑成功过一次;

    注:
    1)有dalao指出可视化窗口上没有运动轨迹可能是DepthMapFactor没设置好;
    2)下载TUM-rgbd数据集的.bag文件时,打开乱码就换个浏览器,别瞎搞。

  4. 整体而言,鲁棒性好像就一般,没有论文说的那么上天,常出现直接崩的情况。

自己个人认为:并没有一下载编译安装就能跑出理想数据的源码,软件环境、硬件配置及应用场景等都是影响因素,所以还是需要根据自己需求去修改优化,整体而言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
// 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直接上:“调源文件中的话题,改成什么什么就可以了!”,嗯,我不行。
根本走不通,然后现在梳理一下,记录下来。

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"/>		// 加速度计更新频率
  
// 让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保存就好。

3. 修改.yaml配置文件

将配置文件中的图像尺寸和更新频率设置为与上述选定的参数一致。

因为没有标定什么的,我就只改了这个,目前只求能运行。

4. 修改源文件(只修改订阅的相机话题即可)

单目+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,其它两个顺序随便。


三、尾声

后面好像就没什么了,但是有挺多乱七八糟的东西也记录一下吧。

  1. 运行时,出现:
Asic Temperature value is not valid!
// or
incomplete frame received:overflow video frame detected.

这个好像github上也没什么好办法,即使是相机在合理运行的温度范围内,它也会出现第一行错误,第二个是输入的图像与配置不匹配的时候会出现,偶尔运行过程中也会出现,暂无解决方案,但也不影响运行。

  1. 在运行ORB-SLAM3时发现没有图像但相机节点中发布了所需要的话题时,可以用rqt_image_view或者rviz查看一下是否能订阅到所需要的话题。

  2. realsense-viewer中“未接收到帧”:
    https://github.com/IntelRealSense/librealsense/issues/6992
    https://github.com/IntelRealSense/librealsense/issues/9740(这个比较有信息)

  3. 关于D435i IMU问题的链接:
    https://github.com/IntelRealSense/realsense-ros/issues/1224

  4. ORB-SLAM3实时下跑易丢失:
    https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/346

  5. ORB-SLAM3是否支持全局快门或滚动快门:
    https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/94

  6. usb线
    在这里插入图片描述


总结

程序启动后,需要一定速度的移动才能正常的运行功能(如IMU的正常运行,跟踪节点),由于没有调过其他任何东西,所以精度什么并没有管,稳定性还是那样,一般般吧,还是存在疯狂反复初始化的问题,运行demo的时候也会这样,尤其是双目,双目还会出现RESETING FRAME!的错误。应该需要对程序优化配置后才能得到自己想要的效果吧。

还是那句话:没有直接下载完就能用的开源代码,具体问题具体分析。


Reference

  1. https://blog.csdn.net/weixin_44436677/article/details/106442240(解决RLException问题)
  2. https://blog.csdn.net/qq_18276949/article/details/114967537(实时运行ORB-SLAM3)
  3. https://blog.csdn.net/sinat_16643223/article/details/114273753(修改配置)
  4. https://blog.csdn.net/Hanghang_/article/details/103612300(关闭IR结构光点阵)
  5. https://blog.csdn.net/weixin_44350238/article/details/107641849(d435i跑ORB-SLAM3)
  6. https://blog.csdn.net/qq_41839222/article/details/86552367(获取IMU同步数据)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【入坑ORB-SLAM3系列2】未标定的realsense D435i试运行ORB-SLAM3(手把手教学,含realsense d435i一些错误的解决) 的相关文章

随机推荐

  • 区块链技术及应用---区块链技术(一)

    文章目录 第一章 疯狂的比特币及其原理机制1 1 比特币诞生1 2 疯狂的比特币1 2 1 疯狂的价格1 2 2 疯狂的矿机和芯片 1 3 通俗地讲比特币机制1 4比特币交易1 5 比特币挖矿1 5 1 数学难题1 5 2 矿池原理 1 6
  • OpenFlow协议是什么

    为什么学习OpenFlow xff1f 实践SDN的首选主流南向接口协议P4和PISA的前身 OpenFlow起源 Ethane项目是OpenFlow的前身 集中式 主动式 xff0c 基于Flow控制2008年的Open Flow论文最初
  • OpenDaylight(ODL)学习笔记

    什么是OpenDaylight xff1f OpenDaylight是SDN开发及运行的一个平台 OpenDaylight架构特点 基于OSGi的模块化设计多南向协议 OpenFlow xff0c Netconf xff0c OVSDB 模
  • Vue / axios / props 调用后端接口数据并渲染到页面

    情景介绍 给了一个可视化大屏的代码 xff0c 代码上写的是假数据 现在要调用后端接口获取数据 xff0c 并将其渲染到页面上 分析问题 给的代码是一个 vue 组件嵌套一个子组件 xff0c 要把数据渲染到子组件上 要调用后端接口 xff
  • Element-ui关于el-icon无法正常显示的问题(已解决)

    在使用element ui组件库的时候 xff0c 使用自带的图标不显示 xff0c 查了好多篇博客 xff0c 都说是element ui的版本老了 xff0c 在package json中修改版本重新安装就行 xff0c 但是我的情况不
  • el-dialog关闭后表单数据缓存没清空【已解决】

    情景介绍 系统中有 新增 和 修改 两个功能 xff0c 共用一个对话框 要求新增时对话框内容为空 xff0c 修改时内容默认填充旧数据 遇到的问题是 xff0c 点击新增后内容填充了 xff0c 关闭对话框再点击新增或者其他条目的修改 x
  • Vue中父组件向子组件传值,子组件没有接收到

    情景介绍 父组件调用接口获取数据 xff0c 然后通过props传值给子组件 xff0c 子组件拿到数据后渲染到 el table 表格组件中 结果子组件没有将数据渲染到表格中 xff0c 但是控制台打印是获取到数据的 问题分析 先看父组件
  • 数字通信系统的性能及可靠性

    目录 1 数字通信系统的性能 2 数字通信系统的可靠性 1 数字通信系统的性能 数字通信系统的性能由码元速率 信息速率 频带利用率表示 每个码元所携带的信息量I定义如下 xff1a 这里 P 是每个码元的概率 xff0c M 是码元的个数
  • 前端学习资源分享

    学习资源 编程导航 xff08 包含以下所有资源 xff0c 强烈推荐 x1f44d xff09 xff1a https www code nav cn freeCodecamp 在线编程 xff1a https learn freecod
  • 嵌入式方向分析

    很多计算机 电子信息类专业的学生都想把嵌入式开发作为自己的职业目标 xff0c 但是因为嵌入式涉及的知识太多 xff0c 太杂 xff0c 太广 xff0c 很多嵌入式初学者陷入嵌入式知识的海洋中 xff0c 东学一点 xff0c 西学一点
  • UWB-DW1000初始化、发送和接收详解(一)

    DWM1000简介 DWM1000板子上的DW1000芯片 xff0c 是基于CMOS的 低功耗的无线收发集成电路 xff0c 遵循IEEE 802 15 4 2011协议中的UWB标准芯片 DWM1000不需要用户去设计电路 xff0c
  • 云计算-弹性存储

    云盘 挂载到ECS上的磁盘 NAS 文件存储 OSS 对象存储 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 1NMdcten 1653882562436 https files mdnice com user
  • computers & security投稿教程

    在computers amp security上投稿了一篇论文 xff0c 中间还是遇到一些不太懂的东西 xff0c 在此记录下来 1 首先打开官网 xff0c 链接 https www editorialmanager com cose
  • 【SDN测试题】

    SDN测试题 一 判断题 NFV与SDN的基础都是通用服务器 云计算以及虚拟化技术 正确答案 xff1a 对 安装OpenvSwitch时必须根据系统内核版本选择相应的Open vSwitch版本 正确答案 xff1a 对 执行命令ovs
  • 【阅读论文】基于VAE-LSTM混合模型的时间序列异常检测

    Anomaly Detection for Time Series Using VAE LSTM Hybrid Model CCFB Shuyu LinRonald ClarkRobert BirkeSandro Sch nbornNiki
  • Python调用adb shell

    在Android开发中 xff0c ADB xff08 Android Debug Bridge xff09 是一个非常重要的工具 它可以让我们通过命令行或者其他的客户端与安装了ADB驱动的Android设备进行通信 xff0c 并进行一些
  • stm32F103C8T6基于FreeRTOS操作系统的多任务

    目录 一 FreeRTOS简介1 什么是FreeRTOS 2 FreeRTOS特点 二 创建项目三 编写代码四 编译烧录五 总结参考链接 一 FreeRTOS简介 1 什么是FreeRTOS 我们看一下FreeRTOS的名字 xff0c 可
  • 通信系统是如何收发复数信号的:IQ 调制原理

    目录 1 IQ 调制过程 2 IQ 调制原理 3 IQ 调制解调系统框图 通信信号处理的过程中大多使用的都是复值信号 xff0c 但是我们应该清楚 xff0c 复值信号在自然界中是不存在的 xff0c 那么在理论中的复数信号是如何通过现实中
  • 【NVIDIA Xavier NX 安装ROS-melodic + Realsense D435i环境搭建】

    文章目录 背景一 软硬件信息二 过程1 盒子到手 xff0c 悔无调研2 死马当活医 xff0c 但仍有隐患3 安装ROS4 下载编译Realsense ros 三 正片 xff08 装Librealsense和ROS Wrapper看这里
  • 【入坑ORB-SLAM3系列2】未标定的realsense D435i试运行ORB-SLAM3(手把手教学,含realsense d435i一些错误的解决)

    文章目录 前言一 前奏1 Error 12 Error 2 二 正文1 查看自己相机的可用的分辨率与频率2 配置rs camera launch xff08 realsense ros文件夹中 xff09 3 修改 yaml配置文件4 修改