小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
【机器人实操】Cartographer做SLAM来创造地图时,地图莫名其妙旋转问题求助【急急急急急】
-
我在实验室的机器人平台上使用Cartographer 做SLAM来创造地图时,当我旋转机器人的时候地图没有固定不动,而是发生了奇怪的偏转,我需要做什么来保持的地图的稳定?
背景:
实验室的一个具体的机器人项目,需要在实际场景中使用机器人,第一步是构建地图,我们使用Cartographer框架来构建2d地图
问题描述:
使用Catographer时初始化无问题,使用前后两个“RPLIDAR S2”光电测距传感器来融合机器人前端和后端的距离信息,在使用cartographer算法进行建图时红色线为前向180度扫描信息,黄色线为后向180度扫描信息,融合后输入cartographer构建地图,当机器人沿直线移动时,光电测距传感器传感器返回的边界信息和地图一致,当机器人旋转后,地图出现了偏移,光电测距传感器的边界红色线和黄色线与地图出现了夹角。
具体细节:
硬件平台:ScoutV2
系统版本 :Ubuntu 20.04
ros版本: humbletf输出如下:
rviz2 画面如下:
初始化时如下图:
红色线为前向180度扫描信息,黄色线为后向180度扫描信息,融合后输入cartographer构建地图,当机器人沿直线移动时,光电测距传感器传感器返回的边界信息和地图一致
正常前后行驶如下图:
可见此时地图构建的边界和光电测距传感器的边界一致
机器人逆时针旋转90度后:
可见机器人旋转后,构建的地图没有移动,但现实的光电传感器边界和地图出现了偏移,且夹角小于90度,此时红色线与黄色线 方向不再稳定
机器人180度旋转后,直行:
重新构建地图时,按照传感器边界构建,红色线在前黄色线在后,但此时构建的地图沿着传感器继续进行就出现了偏移,不再是实际的环境,而是偏移后沿着红色线和黄色线的输出。
Cartographer的 lua文件Config
include "map_builder.lua" include "trajectory_builder.lua" options = { map_builder = MAP_BUILDER, trajectory_builder = TRAJECTORY_BUILDER, map_frame = "map", tracking_frame = "imu_link", published_frame = "odom", odom_frame = "odom", provide_odom_frame = false, publish_frame_projected_to_2d = false, use_odometry = false, use_nav_sat = false, use_landmarks = false, num_laser_scans = 1, num_multi_echo_laser_scans = 0, num_subdivisions_per_laser_scan = 1, num_point_clouds = 0, lookup_transform_timeout_sec = 0.2, submap_publish_period_sec = 0.3, pose_publish_period_sec = 5e-3, trajectory_publish_period_sec = 30e-3, rangefinder_sampling_ratio = 1., odometry_sampling_ratio = 1., fixed_frame_pose_sampling_ratio = 1., imu_sampling_ratio = 1., landmarks_sampling_ratio = 1., } MAP_BUILDER.use_trajectory_builder_2d = true TRAJECTORY_BUILDER_2D.min_range = 0.1 TRAJECTORY_BUILDER_2D.max_range = 3.5 TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. TRAJECTORY_BUILDER_2D.use_imu_data = false TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) POSE_GRAPH.constraint_builder.min_score = 0.65 POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 return options
-
针对您在使用Cartographer进行SLAM建图时遇到的地图旋转问题,这里有几个可能的解决方案和检查点:
1. 确认TF(坐标变换)树的一致性
确保您的TF树在机器人旋转时保持正确。检查
imu_link
(或其他用作tracking_frame
的帧)是否相对于机器人基座的旋转是正确的。您可以使用rosrun tf2_viewer tf2_viewer.py
来可视化TF树,并观察在机器人旋转时各个帧之间的关系是否如预期那样变化。2. 检查传感器配置
确认您的激光雷达(RPLIDAR S2)的配置和安装是否正确。特别是检查两个激光雷达的安装角度和位置,确保它们的扫描平面与机器人的移动方向一致,并且两个雷达之间的相对位置固定不变。
3. 修正IMU(如果有的话)
虽然您的配置中
use_imu_data = false
,但如果将来考虑使用IMU,请确保IMU的校准和配置正确。IMU的偏差和噪声可能会对旋转估计产生显著影响。4. 调整Cartographer参数
- 运动滤波:您已经设置了
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1)
,这个值限制了连续两次位姿估计之间允许的最大角度变化。您可以尝试增加这个值,看看是否有助于减少旋转时的误差。 - 扫描匹配:调整
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching
相关的参数,可能有助于改善扫描与地图的匹配质量。
5. 验证传感器数据
在机器人旋转时,观察激光雷达数据是否准确反映了环境。您可以在RVIZ中查看原始激光雷达数据,确保在旋转时数据的连续性和准确性。
6. 检查地图构建和位姿估计的实时性
如果处理速度不够快,可能会导致在机器人快速移动或旋转时,地图更新滞后,从而产生误差。确保您的系统资源(CPU、内存)足够,且ROS和Cartographer的配置能够高效地处理数据。
7. 记录和回放数据
使用
rosbag
记录旋转时的所有数据(包括激光雷达数据、TF变换等),然后尝试在另一台计算机或同一台计算机的不同时间回放这些数据。这有助于隔离问题是否由实时性引起。8. 查阅文档和社区
查阅Cartographer的官方文档和GitHub仓库,看看是否有其他人遇到并解决了类似的问题。此外,ROS社区和相关的论坛也是获取帮助的好地方。
通过上述步骤,您应该能够更接近问题的根源,并找到解决地图旋转问题的方法。如果问题仍然存在,可能需要更深入地分析传感器数据和Cartographer的内部工作原理。
以上为生成回答,仅供参考~
- 运动滤波:您已经设置了
-
手动@小鱼 大佬,求助!!!感激不尽!!!!
-
@1143271883 您好,请问您解决了这个问题吗,我最近也有遇到类似的问题,可以交流下吗
-
@1143271883 大概率是tf外参不对