博客參考 http://wiki.ros.org/map_server 和 https://www.ncnynl.com/archives/201708/1897.html
1. 安裝map_server
sudo apt-get install ros-kinetic-map-server
2. 具體使用說明
map_server使得地圖的數據變成 ros 的service 可以被調用。其中以兩種方式存儲。一個是yaml文件,他存儲了數據的元數據。一個是image file 他編碼了地圖的占據性情況。其中 image file 中白色像素是空的,黑色像素是被占據的。色彩或者灰色的是被接受的。
如上可以看到map_server是一個ROS 節點,可以從磁盤讀取地圖並使用ROS service提供地圖,此圖是rviz訂閱/map服務可視化之后的結果
map_server概要
- map_server包提供了一個map_server ROS 節點, 該節點通過ROS 服務器方式提供地圖數據。
- 該包還提供了map_saver命令行utility, 使用該工具可將動態創建的地圖保存成文件。
地圖格式
- 該包中的工具使用過的地圖會被存儲在兩個文件中。
- 一個是YAML格式的文件描述地圖meta-data並命名image文件。
- 另一個image文件用來編碼occupancy data。
Image 格式
-
Image 指定包含occupancy data的image文件路徑,可以是絕對路徑,也可以是相對於YAML文件的對象路徑
-
白色像素表示自由,黑色像素格表示占用,兩種顏色之間的單元表示未知。
-
彩色和灰度圖像都適合,但大多數地圖是灰度圖像(盡管它們存儲的好像是以彩色的形式),YAML文件的閾值划分為3類;閾值是在map_server內部完成的。
-
比較閾值參數時,圖像單元占用概率的計算如下:occ = (255 - color_avg) / 255.0 (color_avg是用8位數表示的來自於所有通道的平均值)。
-
如果圖像是24位顏色,一個單元的顏色0x0a0a0a有一個0.96的概率,這是一個完全占用((255-(0*16+10))/255.0=0.96)。
-
如果像素顏色是0xeeeeee,則占用概率是0.07, 這意味着幾乎沒有被占用。
-
當ROS消息通信時,占用度被表示為范圍為[0-100]的整數,0的意思完全是自由的,100的意思完全占用,特殊值-1完全未知。
-
Image data 通過 SDL_Image庫讀取,取決於sdl_image在特定平台上提供的內容,且支持多種格式。
-
一般來說,Image data 支持大多數流行的圖像格式。
-
一個必須要注意的例外是PNG格式在OS X平台上不能被支持。
YAML格式
image: testmap.png resolution: 0.1 origin: [0.0, 0.0, 0.0] occupied_thresh: 0.65 free_thresh: 0.196 negate: 0
需要的字段:
-
image:指定包含occupancy data的image文件路徑; 可以是絕對路徑,也可以是相對於YAML文件的對象路徑 。
-
resolution:地圖分辨率,單位是meters/pixel 。
-
origin:圖中左下角像素的二維位姿,如(x,y,yaw),yaw逆時針旋轉(yaw=0表示沒有旋轉)。系統的很多部分現在忽略yaw值。
-
occupied_thresh:像素占用率大於這個閾值則認為完全占用。
-
free_thresh:像素占用率比該閾值小被則認為完全自由。
-
negate:無論白色或黑色,占用或自由,語義應該是顛倒的(閾值的解釋不受影響)。
-
negate : Whether the white/black free/occupied semantics should be reversed (interpretation of thresholds is unaffected)
命令行工具
(1) Map_server
-
map_server是一個ROS 節點,可以從磁盤讀取地圖並使用ROS service提供地圖。
-
目前實現的map_server可將地圖中的顏色值轉化成三種占用值: 自由 (0), 占用 (100), 和 未知 (-1).
-
這個工具的未來版本可能會使用0和100之間的值來表達更細致的占用度。
-
命令語法
rosrun map_server map_server mymap.yaml
可視化需要,roscore 和 rviz的配合
- 注意:map data可以通過指定topic或者 service來提取。service的方式最后可能要被廢棄。
- 發布的主題
[map_metadata (nav_msgs/MapMetaData)][3]
- 通過指定話題獲取地圖的metadata
[map (nav_msgs/OccupancyGrid)][4]
-
通過指定話題獲取地圖
-
服務
static_map ([nav_msgs/GetMap][5])
-
通過該服務來獲取地圖
-
參數
~frame_id (string, default: "map")
- 設置已發布的地圖的坐標系(The frame to set in the header of the published map. )
(2) map_saver
-
map_saver可以把地圖保存到磁盤。 例如:從SLAM mapping 服務中保存.
-
命令語法
rosrun map_server map_saver [-f mapname]
-
Map_saver獲取地圖數據,並把它寫到map.pgm和map.yaml。
-
使用-f選項為指定地圖的存放目錄和名稱。
- 命令示例
rosrun map_server map_saver -f /home/xxx/map/mm
-
/home/xxx/map/為地圖目錄路徑,mm為地圖名稱,生成后得到mm.yaml和mm.pgm兩個文件
-
訂閱話題
map (nav_msgs/OccupancyGrid)
- 通過指定話題來獲取地圖
參考資料: