ROS 八叉樹地圖構建 – 安裝 octomap 和 octomap_server 建圖包!
- 2020 年 8 月 9 日
- 筆記
項目要用到八叉樹庫 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 //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 地圖構建實驗