1. 程式人生 > 實用技巧 >ROS 八叉樹地圖構建 - 安裝 octomap 和 octomap_server 建圖包!

ROS 八叉樹地圖構建 - 安裝 octomap 和 octomap_server 建圖包!

專案要用到八叉樹庫 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 地圖構建實驗