使用octomap将pcd点云地图转化为八叉树地图和占据栅格地图
首先跑LIO-SAM或者LVI-SAM跑包完成按Ctrl+c结束进程后会自动保存为如cloudGlobal.pcd的文件。
1.rviz中显示pcd文件
安装pcl_ros后执行下面命令在rviz中显示
rosrun pcl_ros pcd_to_pointcloud /home/qian/Downloads/LOAM/cloudGlobal.pcd _frame_id:=map _rate:=1.0 _topic:=/cloud_pcd _latch:=true
注意_latch:=true 保持最后一次发布,适用于 RViz 启动较晚的情况,确保 RViz 能收到点云数据。
_topic指导发布点云topic为/cloud_pcd
加载建的全局地图如图
2.安装octomap
sudo apt-get update
sudo apt-get install ros-noetic-octomap ros-noetic-octomap-mapping ros-noetic-octomap-ros ros-noetic-octomap-rviz-plugins
3.加载pcd并使用rviz显示
(1)由于默认订阅 /cloud_in 话题,需要更改话题,可以修改参数为上文中的发布点云话题:
roslaunch octomap_server octomap_mapping.launch cloud_in:=/cloud_pcd
注意 :
1)输入的点云要一直发布,保证/cloud_pcd话题有数据
2)由于默认的文件octomap_mapping.launch参数不会适配,需要修改
octomap_mapping.launch文件适配。
修改后的文件如下
<launch><node pkg="octomap_server" type="octomap_server_node" name="octomap_server"><param name="resolution" value="0.05" /><!-- fixed map frame (set to 'map' if SLAM or localization running!) --><param name="frame_id" type="string" value="map" /><!-- maximum range to integrate (speedup!) --><param name="sensor_model/max_range" value="50.0" /><!-- data source to integrate (PointCloud2) --><remap from="cloud_in" to="/cloud_pcd" /></node>
</launch>
~
其中,max_range参数会调整截取的点云范围.
(2)OccupancyGrid(2D 平面地图rviz显示):
在rviz中
Add → By Topic → /projected_map
显示如下
其中黑色为障碍物,将地面也当成障碍物了,因此需要修改配置参数
修改octomap_server的octomap_mapping.launch文件配置参数,设置点云z轴范围(-0.5,-0.8)
cd /opt/ros/noetic/share/octomap_server/launch/
sudo vim octomap_mapping.launch
最后octomap_mapping.launch文件如下
<launch><node pkg="octomap_server" type="octomap_server_node" name="octomap_server"><param name="resolution" value="0.05" /><!-- fixed map frame (set to 'map' if SLAM or localization running!) --><param name="frame_id" type="string" value="map" /><!-- maximum range to integrate (speedup!) --><param name="sensor_model/max_range" value="50.0" /><!-- data source to integrate (PointCloud2) --><remap from="cloud_in" to="/cloud_pcd" /><param name="pointcloud_max_z" value="0.8" /><param name="pointcloud_min_z" value="-0.5" /></node>
</launch>
~
修改后再次启动如图
(3)OctoMap(3D 八叉树地图rviz)
Add → By Topic → MarkerArray 选/occupied_cells_vis_array
如图
4.保存地图
(1)保存2d地图
rosrun map_server map_saver map:=/projected_map -f /home/qian/mymap
输出
[INFO] [1752116581.968634035]: Writing map occupancy data to /home/qian/mymap.pgm
[INFO] [1752116581.988410154]: Writing map occupancy data to /home/qian/mymap.yaml
保存的文件有两个地图图片文件mymap.pgm和配置文件mymap.yaml
(2)保存3d八叉树地图
以上都启动好后调用
rosrun octomap_server octomap_saver -f mapfile.ot
参考文献
使用octomap_server将点云地图转化为八叉树地图和占据栅格地图
使用Octomap生成二维占据栅格导航地图