利用普通双目摄像头和rtabmap做立体建图

本文分享了使用ROS和rtabmap_ros进行手持立体摄像头建图的详细步骤,包括环境搭建、相机标定、图像数据处理及建图程序启动等关键环节,提供了实测效果与常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手头有一个淘宝够的普通双目摄像头,尝试用其做了手持建图的测试,现记录步骤及注意事项如下,供以后参考。
摄像头长这样
运行环境为基于Ubuntu16.04的ROS kinetic;
建图使用rtabmap_ros,有官方提供的参考文档:rtabmap_ros手持建图
主要步骤有一下几项:
1、通过ROS提供的标定程序对相机进行标定,得到一组标定参数,标定过程参见标定过程
2、创建一个能够读取摄像头数据的节点,并切分出左右图像;然后将图像数据和标定参数分别发布到如下几个话题(括号内为话题的消息类型):

	left/image_raw (sensor_msgs/Image)
	right/image_raw (sensor_msgs/Image)
	left/camera_info (sensor_msgs/CameraInfo)
	right/camera_info (sensor_msgs/CameraInfo) 

3、以上话题发布之后可以启动stereo_image_proc节点,该节点会接收以上几个话题的消息,并进行标定,标定完成后再发布如下几个话题:

	left/image_rect_color (sensor_msgs/Image)
	right/image_rect_color (sensor_msgs/Image)
	left/image_rect (sensor_msgs/Image)
	right/image_rect (sensor_msgs/Image)
	points2 (sensor_msgs/PointCloud2)

4、之后启动建图程序即可。
有两种启动方式,分别为ratbmap自带的查看工具和rviz方式的工具。
rtabmapviz方式启动:

	roslaunch rtabmap_ros stereo_mapping.launch stereo_namespace:="/stereo_camera" rtabmap_args:="--delete_db_on_start"

rviz方式启动:

	roslaunch rtabmap_ros stereo_mapping.launch stereo_namespace:="/stereo_camera" rtabmap_args:="--delete_db_on_start" rviz:=true rtabmapviz:=false

启动会后应该能看到建图效果,我测试时的效果如下:
原图
立体图1
立体图2
可以看到,其建立的图像应该是特征点地图,属于稀疏图,局限性较大。

测试时遇到了一些坑,现记录如下;
注意事项:
1、注意各交接的模块之间话题一定要匹配,比如命名空间、话题名称等等;
2、相机标定时,要根据自己标定时实际的方格大小设置标定参数,比如我的是棋盘格式9x7的,角点数是8x6,则size参数应该为8*6,方格边长为0.0234m,则square参数应该填0.0234;
另外,启动了相机左右图发布程序之后,若直接按官方文档里的指令进行校正启动,则会报如下错误:

('Waiting for service', '/my_stereo/left/set_camera_info', '...')
Service not found
('Waiting for service', '/my_stereo/right/set_camera_info', '...')
Service not found

我们现在的校准不关心这个服务,所以可以加一个参数“–no-service-check”,忽略这个检查。
我的实际标定命令如下:

rosrun camera_calibration cameracalibrator.py --approximate 0.1 --size 8x6 --square 0.0234 right:=/my_stereo/right/image_raw left:=/my_stereo/left/image_raw right_camera:=/my_stereo/right left_camera:=/my_stereo/left --no-service-check

3、标定的数据存放在/tmp/calibrationdata.tar.gz中,注意另存一下,/tmp下的数据会被定期的清理。
4、标定结果样例:

Left:
('D = ', [0.15700041597711392, -0.5816125132681096, 0.009177113974845021, 0.005776352945253162, 0.0])
('K = ', [822.8451233408556, 0.0, 370.08821607444503, 0.0, 825.808578427481, 250.51637252807234, 0.0, 0.0, 1.0])
('R = ', [0.9836573919866463, -0.021172332581402865, 0.17880119553037635, 0.019478031858069712, 0.9997472565724339, 0.011226275020146684, -0.17899369113174196, -0.0075601130252407, 0.983821174414375])
('P = ', [912.7466605309611, 0.0, 187.60241508483887, 0.0, 0.0, 912.7466605309611, 247.2319736480713, 0.0, 0.0, 0.0, 1.0, 0.0])

Right:
('D = ', [0.1354083371969516, -0.29786559274219837, 0.0037615861459039377, 0.011028808525337682, 0.0])
('K = ', [814.6806768195991, 0.0, 361.07143461165, 0.0, 815.3846497136162, 241.12566679257992, 0.0, 0.0, 1.0])
('R = ', [0.9787886987615322, -0.018091906982014988, 0.20407196298967845, 0.020026149786696177, 0.9997719452110938, -0.007416932893486832, -0.20389123694123637, 0.011346385793714001, 0.9789277925506011])
('P = ', [912.7466605309611, 0.0, 187.60241508483887, -54.26348966505485, 0.0, 912.7466605309611, 247.2319736480713, 0.0, 0.0, 0.0, 1.0, 0.0])
('self.T ', [-0.058189739536951474, 0.001075577758858753, -0.012132234861507028])
('self.R ', [0.9996780538028401, 0.000839289247992199, -0.025359107605041616, -0.0003535797125895043, 0.9998165273355033, 0.01915167481348713, 0.025370528696752066, -0.01913654253863317, 0.9994949369623212])
None
# oST version 5.0 parameters


[image]

width
640

height
480

[narrow_stereo/left]

camera matrix
822.845123 0.000000 370.088216
0.000000 825.808578 250.516373
0.000000 0.000000 1.000000

distortion
0.157000 -0.581613 0.009177 0.005776 0.000000

rectification
0.983657 -0.021172 0.178801
0.019478 0.999747 0.011226
-0.178994 -0.007560 0.983821

projection
912.746661 0.000000 187.602415 0.000000
0.000000 912.746661 247.231974 0.000000
0.000000 0.000000 1.000000 0.000000

# oST version 5.0 parameters


[image]

width
640

height
480

[narrow_stereo/right]

camera matrix
814.680677 0.000000 361.071435
0.000000 815.384650 241.125667
0.000000 0.000000 1.000000

distortion
0.135408 -0.297866 0.003762 0.011029 0.000000

rectification
0.978789 -0.018092 0.204072
0.020026 0.999772 -0.007417
-0.203891 0.011346 0.978928

projection
912.746661 0.000000 187.602415 -54.263490
0.000000 912.746661 247.231974 0.000000
0.000000 0.000000 1.000000 0.000000

最后,提供部分参考源码:相机数据发布及标定结果样例

<think>我们正在处理用户关于rtabmap使用双目相机后,在导航过程中无法重定位的问题。根据用户描述,问题发生在导航阶段,机器人无法重定位,即无法确定自身在地中的位置。首先,我们需要理解rtabmap的重定位机制。rtabmap是一个基于外观的SLAM方法,它使用视觉词袋(Bag-of-Words)进行场景识别,从而实现回环检测重定位。重定位失败可能由以下原因引起:1.**环境变化**:当前环境与时环境有较大变化(如光照变化、物体移动等),导致视觉特征匹配失败。2. **相机参数问题**:双目相机参数(如基线、焦距、畸变参数)设置不正确,导致特征点提取匹配不准确。3. **特征点不足**:当前视野中特征点不足,无法进行有效的场景匹配。4.**地问题**:构的地质量不高,例如特征点太少或分布不均匀。5. **运动问题**:机器人在重定位时运动过快,导致像模糊。6. **参数配置问题**:rtabmap或导航相关的参数配置不当。接下来,我们参考引用内容。引用[1]中提到ORB-SLAM2在室内环境中对瓷砖、海报铝材等表面提取ORB特征点有较好的鲁棒性。rtabmap同样可以使用ORB特征,因此我们可以借鉴这一思路,检查特征点提取情况。根据用户的问题,我们给出以下排查步骤解决方案: ###1.检查环境变化-确保当前环境与时环境尽量一致。如果环境光照变化大,尝试调整相机曝光或使用自适应阈值算法。###2.验证相机标定-双目相机需要精确标定。使用标定工具(如ROS的`camera_calibration`包)重新标定相机,确保内参(焦距、主点)外参(基线)准确。将标定参数正确写入启动文件。###3.检查特征点提取-在重定位时,查看当前像的特征点数量质量。可以通过rtabmap的界面查看特征点。-如果特征点过少,尝试调整特征点提取参数(如ORB特征点的数量、尺度等)。在rtabmap中,可以通过参数`Odom/FeatureType`(设置为ORB)`Odom/FeaturePerFrame`(每帧提取的特征点数,默认1000)来调整。 ###4.评估地质量-打开rtabmap的地,检查地中的特征点分布。如果某些区域特征点稀疏,则在这些区域重定位会困难。-解决方案:重新,确保时机器人运动缓慢,覆盖所有区域,并尽量在光照稳定的情况下进行。同时,可以尝试增加特征点数量(时设置`Mem/FeaturePerFrame`为更大的值,如2000)。 ###5.运动控制-在重定位时,让机器人缓慢移动或静止,以获取清晰的像。 ###6.参数配置- **重定位参数**:rtabmap中,重定位的参数设置可能影响性能。检查以下参数:-`Reg/Strategy`:设置为0(使用特征匹配)或1(使用光流),通常0适用于重定位。- `Kp/IncrementalFloodFill`:设置为false,以避免在回环检测时忽略之前的节点。- `Mem/IncrementalMemory`:设置为true(默认),允许增量式内存管理。- **导航参数**:在导航中,`amcl`(自适应蒙特卡洛定位)通常用于定位,但rtabmap也可以提供定位。如果使用rtabmap进行定位,确保在导航启动时加载了rtabmap的地,并且`rtabmap`节点发布了正确的`map`到`odom`的变换。 ###7.使用其他传感器辅助-如果机器人有IMU或里程计,确保这些传感器数据正确输入到rtabmap。在启动rtabmap时,通过`imu_topic``odom_topic`参数指定话题。-在特征不足的环境中,可以尝试融合IMU数据来提高位姿估计的稳定性。 ###8.日志调试-查看rtabmap的输出日志,是否有警告或错误信息。-使用rviz查看当前传感器数据(像、点云)匹配情况。###9.测试重定位功能-在已知位置(即时经过的位置)尝试重定位。如果仍然失败,可以尝试在启动rtabmap时使用`-d`参数进行调试,查看特征匹配情况。###10.更新rtabmap版本-确保使用的rtabmap是最新版本,因为新版本可能修复了已知问题。如果以上步骤仍不能解决问题,可以考虑在rtabmap中启用更高级的回环检测方法,例如使用CNN特征(需要GPU支持)代替手工特征。最后,引用[2][3]提到了移动机器人的类型嵌入式主板的选择,虽然与问题不直接相关,但提醒我们硬件性能也可能影响实时处理能力。如果嵌入式主板计算能力不足,可能导致特征提取匹配延迟,从而影响重定位。因此,确保硬件性能满足要求。希望以上排查步骤能帮助您解决问题。</think>### rtabmap使用双目相机后无法重定位的故障排查与解决方案 #### 问题原因分析 1. **环境特征变化** 后环境光照、物体移动或视角变化导致视觉特征不匹配[^1]。 $$ \text{特征匹配度} < \text{阈值} \quad \Rightarrow \quad \text{重定位失败} $$ 2. **相机参数问题** - 双目相机基线参数错误(如`stereo_baseline`未正确设置) - 未更新时的相机标定参数 - 像畸变矫正失效 3. **地质量问题** - 特征点稀疏区域(如白墙、空旷走廊)导致关键帧匹配不足 - 回环检测阈值过高(`Rtabmap/LoopRatio`参数) 4. **传感器数据同步问题** 双目像与IMU/里程计数据时间戳不同步,导致位姿估计漂移。 5. **算法参数配置不当** - 特征提取类型(如SURF/ORB)与场景不匹配 - 重定位最小匹配点数(`Vis/MinInliers`)设置过高 --- #### 解决方案与排查步骤 ##### 1. 验证环境一致性 ```bash # 启动rtabmap测试重定位 roslaunch rtabmap_ros rtabmap.launch localization:=true ``` - 确保当前环境光照/物体布局与时一致 - 在特征丰富区域(如海报、纹理墙面)测试重定位[^1] ##### 2. 检查相机参数 - **标定验证**: ```bash rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 right:=/right/image_raw left:=/left/image_raw ``` - **参数配置**: ```xml <!-- launch文件示例 --> <param name="stereo_baseline" value="0.12"/> <!-- 实测基线值 --> <param name="camera_fps" value="15"/> <!-- 降低帧率保证同步 --> ``` ##### 3. 优化地与参数 | 参数 | 议值 | 作用 | |-----------------------|---------|------------------------------| | `Mem/FeaturePerFrame` | 1000 | 增加每帧特征点数量 | | `Vis/MinInliers` | 15→10 | 降低重定位最小匹配点数 | | `Kp/MaxFeatures` | 400→800 | 提升ORB特征点数量[^1] | | `RGBD/LinearUpdate` | 0.5 | 降低线性运动约束 | ##### 4. 传感器同步处理 ```python # 使用message_filters同步 message_filters.ApproximateTimeSynchronizer( [sub_left, sub_right, sub_imu], queue_size=10, slop=0.01) ``` ##### 5. 高级调试技巧 - **可视化诊断**: ```bash rviz -d $(rospack find rtabmap_ros)/launch/config/rgbd.rviz ``` 检查`/rtabmap/map_cloud`中的特征点分布是否均匀[^1]。 - **强制重定位**: 通过`2D Pose Estimate`手动指定初始位置,观察匹配轨迹。 - **日志分析**: ```bash roscore & rtabmap --console true ``` 查看输出日志中的`"Relocalization..."`匹配分数。 --- #### 预防性措施 1. **阶段优化** - 采用"∞"字形运动路径覆盖环境 - 在特征稀疏区域主动添加标记物 ```cpp // 添加人工标记 aruco_detect.detectMarkers(image); ``` 2. **硬件改进** - 增加IMU减少位姿漂移 - 使用全局快门相机避免运动模糊 3. **多传感器融合** 在`rtabmap.yaml`中启用里程计融合: ```yaml use_odometry: true odom_topic: /odom ``` > **关键提示**:若在瓷砖/玻璃等低纹理区域失败,议结合激光雷达进行混合定位[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值