我的项目要用到八叉树库 Octomap 来构建地图,这里记录下装置、可视化,并启用带色彩的 Octomap 的过程。
一、Apt 装置 Octomap 库
如果你不须要批改源码,能够间接装置编译好的 octomap 库,记得把 ROS 版本「kinetic」替换成你用的:
sudo apt-get install ros-kinetic-octomap*
下面这一行命令等价于装置以下的 octomap 组件:
sudo apt-get install ros-kinetic-octomap ros-kinetic-octomap-mapping ros-kinetic-octomap-msgs ros-kinetic-octomap-ros ros-kinetic-octomap-rviz-plugins
留神:下面没有装置 ros-kinetic-octomap-server
,起因是我要应用这个包来建图,并且须要批改它,所以在下一步我间接通过编译源码来装置它!
二、编译装置 OctomapServer 建图包
因为我要启用八叉树体素栅格的 RGB 色彩反对,须要批改源码,所以必须应用源码编译装置,过程如下:
2.1 创立编译用的工作空间
cd 你的一个目录 /
# 创立工作空间
mkdir octomap_ws
cd octomap_ws/
# ROS 的工作空间必须蕴含 src 目录
mkdir src/
# 创立
catkin_make
# 记得 source 环境变量
source devel/setup.zsh
2.2 下载编译源码
下载 octomap_server 源码到 src 文件夹中:
cd src/
git clone https://github.com/OctoMap/octomap_mapping.git
返回你的工作空间主目录,装置下依赖,而后开始编译:
cd ../
rosdep install octomap_mapping
catkin_make
编译过程根本没有报错,如果你遇到问题,间接复制错误信息浏览器搜寻解决,而后启动测试的 launch:
roslaunch octomap_server octomap_mapping.launch
没问题的话应该能够用 rostopic list
看到一个 octomap_full
的话题:
有这个话题阐明这个建图包能够失常工作啦:)
二、Rviz 可视化 Octomap
ROS 中提供了一个 Rviz 可视化 Octomap 的插件,如果没有装置应用上面的命令即可:
sudo apt-get install ros-kinetic-octomap-rviz-plugins
装置后启动 Rviz,间接增加一个八叉树占用网格的类型,第一个是带色彩的类型,第二个不带色彩:
建图节点启动后,抉择话题名称为 octomap_full
,即可显示出八叉树体素栅格,这是我的试验后果,我用的是第一个带色彩的类型:
我把点云和体素栅格一起显示了,所以会重叠。这里要留神的是,如果你的点云显示不进去,要查看下「Global Options」的「Fixed Frame」有没有设置正确,我是设置的是 Robosense 雷达的 frame_id:「rslidar」。
三、启用 ColorOctomap
默认编译的 octomap 不能显示色彩,要开启色彩的反对,须要 2 个步骤,第一步编辑 OctomapServer.h
文件:
vim octomap_mapping/octomap_server/include/octomap_server/OctomapServer.h
关上上面 COLOR_OCTOMAP_SERVER
宏的正文即可:
// switch color here - easier maintenance, only maintain OctomapServer.
// Two targets are defined in the cmake, octomap_server_color and octomap_server. One has this defined, and the other doesn't
// 关上这个正文
#define COLOR_OCTOMAP_SERVER
而后从新编译一遍源码:
cd octomap_ws/
catkin_make
第二步是在应用时,在 launch
文件中禁用 height_map
,启用 colored_map
,这个配置是我浏览源码查找的,因为官网文档很久没有更新了,一些参数配置办法须要通过浏览源码能力晓得:
<param name = "height_map" value = "false" />
<param name = "colored_map" value = "true" />
比方以下是我试验用的 launch 文件:
<launch>
<node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
<!-- resolution in meters per pixel -->
<param name="resolution" value="0.10" />
<!-- name of the fixed frame, needs to be "/map" for SLAM -->
<!--
增量式构建地图时,须要提供输出的点云帧和动态全局帧之间的 TF 变换
-->
<param name="frame_id" type="string" value="world" />
<param name = "height_map" value = "false" />
<param name = "colored_map" value = "true" />
<!-- topic from where pointcloud2 messages are subscribed -->
<!-- 要订阅的点云主题名称 /fusion_cloud -->
<remap from="/cloud_in" to="/fusion_cloud" />
</node>
</launch>
我设置了八叉树帧的 frame 为 rslidar
,并将交融的点云话题 /fusion_cloud
作为节点的输出,我没有提供 TF,因为目前只是做了一个单帧的体素栅格构建,成果如下:
我在 B 站录了个简短的视频,能够去看下初步的成果:ROS 单帧带色彩八叉树 Octomap 地图构建试验