⼋叉树建⽴地图并实现路径规划导航
构建语义地图时,⽤的是 和 ,不过还是整理下之前的学习笔记。
⼀、Octomap 安装并使⽤Octomap_Server
1.1 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-oc
注意:上⾯没有安装 ros-kinetic-octomap-server,原因是我要使⽤这个包来建图,并且需要修改它,所以在下⼀步我直接通过编译源码来安装它!
1.2 编译安装 OctomapServer 建图包
因为我要启⽤⼋叉树体素栅格的 RGB 颜⾊⽀持,需要修改源码,所以必须使⽤源码编译安装,过程如下:
创建编译⽤的⼯作空间
cd你的⼀个⽬录/
# 创建⼯作空间
mkdir octomap_ws
cd octomap_ws/
# ROS 的⼯作空间必须包含 src ⽬录
mkdir src/
# 创建
catkin_make
# 记得 source 环境变量
source devel/setup.zsh
下载编译源码
cd src/
git clone github/OctoMap/octomap_mapping.git
返回你的⼯作空间主⽬录,安装下依赖,然后开始编译:
cd../
rosdep install octomap_mapping
catkin_make
编译过程基本没有报错,如果你遇到问题,直接复制错误信息浏览器搜索解决,然后启动测试的 launch:
roslaunch octomap_server octomap_mapping.launch
没问题的话应该可以⽤ rostopic list 看到⼀个 octomap_full 的话题:
有这个话题说明这个建图包可以正常⼯作啦:)
1.3 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」。
1.4 启⽤ 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,因为⽬前只是做了⼀个单帧的体素栅格构建,效果如下:
⼆、增量构建⼋叉树地图步骤

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。