正确的应该是怎么样的?
1.首先直观上能直接看到对应的octomap,例如如下图像。
2.tf关系必须将机械臂的坐标系和激光雷达点云的坐标系关联起来。例如下图是baselink坐标系和livox_frame直接关联起来,实际应用时可能两者之间有若干坐标系,但只有两者在同一棵tf树上就可以。注意此处的livox_frame这个名字要和ur16e_robot_moveit_sensor_manager.launch.xml中的octomap_frame的value值一致。
<!--//这个参数是octomap所在坐标系,可以自己指定-->
<param name="octomap_frame" type="string" value="livox_frame" />
<!--//octomap的分辨率,越小分辨率越高,越消耗系统资源。-->
<param name="octomap_resolution" type="double" value="0.05" />
<param name="max_range" type="double" value="15.0" />
<!--//将yaml文件里的参数传到ros参数服务器-->
3.有点云的话题送入move_group节点。类似与下图这样,此处是自己录了一个rosbag,自己写了一个cpp文件读取rosbag文件,并将其发布成/livox/lidar的点云话题。此处的点云话题名注意检查是否和
此处的点云话题名字要和配置的octomap的yaml中的参数一致。
sensors:
- sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater
point_cloud_topic: /livox/lidar
max_range: 25 # max_range控制octomap的范围,如果设置得过小,将看不到对应的octomap,此处单位是m
point_subsample: 2
padding_offset: 0.1 #此处不能设置过大,设置过大也看不到octomap
padding_scale: 1.0
max_update_rate: 0.05 #单位是Hz,注意不要和点云发布的频率差太多。
filtered_cloud_topic: filtered_cloud
ns: kinect
可能的错误原因
1.官方的ocotmap demo也会存在一定概率不出现octomap的问题;
2.自己在写launch文件的时候,不要将点云的发布的launch和机械臂官方的demo.launch文件放到同一个launch文件中启动,否则可能出现不成功。
分析原因可能是:demo.launch文件启动加载时间较长,发布点云的launch文件启动比较快;坐标转换关系还没有启动成功。
3.检查坐标关联起来没有,机械臂的坐标系要和点云的坐标系关联起来,并且这个转换要可靠,如果时间戳不一样也会有问题,例如实际Livox传感器发布的点云的话题,其时间戳使用的是传感器的时间戳,这时候即使使用static transformer将world坐标系和livox_frame关联起来了,但是livox传感器时间戳不是ROS时间戳,同样在rviz中无法找到octomap;如果是录制的点云包,不能直接rosbag play,因为时间戳是用的录制时的时间戳,必须写一个cpp文件,将其重新发布,并添加新的ROS时间戳。
4.参数设置得不合适,例如max_range设置过小,同时点云所在范围没在范围内,例如padding_offset修改为不合适的值。
3.解决方案:
1.先启动demo.launch,然后再启动点云发布的节点和坐标转换的节点(static_transform_publisher)