小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
ROS2-一台电脑建图一台机载电脑收集点云,建不了图
-
ROS2-边缘计算建图,机载电脑发送激光雷达,建不了图
背景:
我想实现边缘计算slam,所以采用了边缘电脑进行建图,小车上的机载电脑只用于发送小车消息以及雷达消息。
问题描述:
环境:边缘服务器 ros2 foxy 机载电脑 ros2 humble
建图算法采用:slam_toolbox
雷达: 速腾16p
小车:松灵 tracer
启动建图(online_async_launch.py),在rviz2中globe options中fixed frame选择好map后,TF中,base_link和rslidar会出现 no transform from [base_link] to [map]的status:warn,但能建图,建图效果非常差。没有TF坐标的显示。具体细节和上下文:
rviz2会出现报错:
[rviz2-2] [INFO] [1248559.29384] [rviz2.rviz2_node]: Message Filter dropping message: frame 'rslidar' at time 1248559.29384 for reason 'Unknown'[async_slam_toolbox_node-1] [INFO] [1787434.1213] [slam_toolbox]: Message Filter dropping message: frame 'rslidar' at time 1787434.1213 for reason 'Unknown'
尝试过的解决方法:
- 不用边缘建图的话,只用机载电脑建图是可以建图的
- 换过其他的电脑代替建图(环境:humble),也会出现这种问题,但提示的错误是队列满了,tf坐标的关系只有 odom->base_link->rslidar,缺少了map,而 边缘电脑的tf显示有map->odom->base_link->rslidar
- 我使用ros2 topic echo /tf ,transforms中 map -> odom 的sec为1
而odom -> base_link的sec为18394745(因该是系统时间) - 也尝试过系统时间同步,ntp等,统一了两个系统时间,还是会出现这个问题
- 用gmapping算法建图,也是有这个问题
找到的原因
我认为极大可能的原因是边缘电脑运行建图算法,产生的tf,map的时间戳对不上。
希望各位大佬能够提供一下解决的思路,谢谢!
-
@hjwdaxia 16p雷达,用的有线还是无线连接,考虑下网络延迟问题
-
@小鱼 你好,有线,接到开发板,开发板无线发到边缘服务器
-
@hjwdaxia 在 ROS2-一台电脑建图一台机载电脑收集点云,建不了图 中说:
[rviz2-2] [INFO] [1248559.29384] [rviz2.rviz2_node]: Message Filter dropping message: frame 'rslidar' at time 1248559.29384 for reason 'Unknown'
[async_slam_toolbox_node-1] [INFO] [1787434.1213] [slam_toolbox]: Message Filter dropping message: frame 'rslidar' at time 1787434.1213 for reason 'Unknown'
tf 是否完整,上个图
-
@小鱼 你好,我查出原因了,是因为系统和仿真时间不匹配。
/rivz /tracer都是用的系统时间,而/slam_toolbox是用的仿真时间,我看了你的《【ROS2机器人入门到实战】使用SLAM_TOOLBOX完成建图》文章中有提到“这些数据都是有时间戳的,所以在上面的命令中将 use_sim_time 参数的值设置为 True 表示使用仿真的时间,以防止因时间戳造成数据不合法。”
我想把这个变为系统的时间,如何实现呢?我试着把online_async_launch.py中的use_sim_time 改为false却报错。start_async_slam_toolbox_node = Node( parameters=[ actual_params_file, {'use_sim_time': false} ], package='slam_toolbox', executable='async_slam_toolbox_node', name='slam_toolbox', output='screen')
能否指导一下!谢谢