前言
三维点云地图转二维栅格地图的实现需要1.地图转换工具——octomap;2.栅格地图保存工具——map_server;3.点云发布和转换工具启动launch文件。
一、安装octomap
安装octomap
sudo apt-get install ros-melodic-octomap-ros
sudo apt-get install ros-melodic-octomap-server
安装octomap在rviz中的插件
sudo apt-get install ros-melodic-octomap-rviz-plugins
再打开RViz,点击Add时可以看到增加了octomap-rviz-plugins相关的模块。
二、安装map_server
sudo apt-get install ros-melodic-map-server
或者直接
sudo apt-get install ros-melodic-navigation
三、发布、转换并保存
1.运行三维地图发布程序
如果是存为pcd文件的点云地图,需要自己写点云文件读取和发布的代码,通过ROS的publish以话题形式发布出来,所发布的点云地图topic在下一步中被使用。最好一定频率发布,方便octomap获取数据。
一般的SLAM系统具备地图发布功能,也可以获取到相应的地图topic,供octomap_server使用。
2.启动octomap_server
和一般的ROS工具包启动方式一样,rosrun或者roslaunch。由于地图转换涉及到一些参数的调整,最好配置成launch文件来启动。
进入octomap_server的launch文件夹(此步可选,也可以放在其他地方) cd /opt/ros/melodic/share/octomap_server/launch
创建launch文件 sudo touch octomap_server.launch
如果无权限,则给launch文件加可写权限(可选) sudo chmod a+w octomap_server.launch
填写文件内容
<launch>
<!--启动的节点-->
<node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
<!--栅格分辨率-->
<param name="resolution" value="0.1" />
<!--世界坐标系话题,一般为map-->
<param name="frame_id" type="string" value="/map" />
<param name="sensor_model/max_range" value="1000.0" />
<param name="latch" value="true" />
<!--截取的三维点云范围-->
<param name="pointcloud_max_z" value="0.8" />
<param name="pointcloud_min_z" value="-0.5" />
<param name="graound_filter_angle" value="3.14" />
<!--订阅的点云消息名称 PointClout2,即上一步发布出来的点云topic-->
<!-- cloud_in是octomap默认的输入话题,做一下映射-->
<remap from="cloud_in" to="your_map_topic" />
</node>
</launch>
3.RViz显示结果 启动RViz后,点击“add”,分别添加"Map"、“OccupancyGrid"与"OccupancyMap”,并把其话题名依次改为"/projected_map"、“octomap_full"与"octomap_binary”,结合点云发布程序就可以看了。
4.保存二维地图
rosrun map_server map_saver map:=/projected_map -f [PATH_TO_FILE]/mymap
/projected_map是octomap_server默认发布的名字; [PATH_TO_FILE]/mymap是转换后的栅格地图保存的路径。
over!
|