octomap是一種空間概率地圖,可以使用方格來表示周圍的環境,就像“我的世界”遊戲裏表示的那樣,優點是地圖計算速度快,內存佔用少,可以調整地圖的分辨率等等,與平面二維地圖相比,octomap所記錄的環境信息是三維的,是實現vSlam的一種方式,這裏展示一個小小的示例例程:在gazebo仿真環境下,使用turtlebot仿真機器人,通過機器人身上的kinect傳感器採集點雲數據,建立octomap地圖,最終在rviz環境下觀察地圖的效果。
操作系統:ubuntu16.04
ROS版本:kinetic
Gazebo版本:7.14
需要安裝的軟件
1、gazebo7.x
2、turtlebot在ros下的仿真功能包
sudo apt-get install ros-kinetic-turtlebot-simulator
3、octomap在ros下的功能包
sudo apt-get install ros-kinetic-octomap*
啓動步驟
1、啓動turtlebot在gazebo下的仿真程序
roslaunch turtlebot_gazebo turtlebot_world.launch
2、啓動octomap_server的launch文件
roslaunch ~/catkin_oct/src/launch/display.launch //這個路徑自己制定,只要能找到display.launch文件
該launch文件的內容如下
<launch>
<node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
<!-- resolution in meters per pixel -->
<param name="resolution" value="0.1" />
<!-- name of the fixed frame, needs to be "/map" for SLAM -->
<param name="frame_id" type="string" value="odom" />
<!-- max range / depth resolution of the kinect in meter -->
<param name="sensor_model/max_range" value="10.0" />
<param name="latch" value="false" />
<!-- max/min height for occupancy map, should be in meters -->
<param name="pointcloud_max_z" value="500" />
<param name="pointcloud_min_z" value="0" />
<!-- topic from where pointcloud2 messages are subscribed -->
<remap from="cloud_in" to="/camera/depth/points" />
</node>
</launch>
紅色部分需要特別注意,octomap之所以能夠建立octomap地圖是通過點雲數據,而此處的點雲數據是有turtlebot仿真中的kinect提供的/camera/depth/points點雲。
爲了能夠得到正確的地圖,固定座標系要設置爲map、odom這類全局座標系,而這個座標系也是與turtlebot仿真程序裏對應的。
3、啓動turtlebot的鍵盤遙控節點
roslaunch turtlebot_telop keyboard_teleop.launch
此時你可以使用鍵盤控制gazebo環境下的turtlebot四處轉一轉。
4、啓動rviz並顯示機器人模型和occupancygrid視圖
rosrun rviz rviz
此時rviz下應該是一個默認的啓動畫面,還看不到你建立的地圖。
調整Displays面板的幾個選項即可:
1、Fixed frame 選擇 odom;
2、點擊Add按鈕,添加OccupancyGrid視圖,這個選項之所以存在是因爲之前安裝了octomap的相關組件,其中包括一個octomap在rviz下的插件。視圖出現後在話題一欄選擇octomap_binary話題即可。
配置好rviz的視圖後,應該就能看的建立的octomap地圖了,對比一下gazebo下的仿真環境,建立的地圖與仿真環境下的模型世界是吻合的。