標籤:ros 導航 機器人 map server
http://wiki.ros.org/map_server
概述
map_server提供map_server ROS節點,它提供地圖資料作為一個ROS伺服器。也提供map_saver命令列功能,能動態產生儲存到檔案中的地圖。
地圖格式
包中通過工具操作的地圖是以成堆的檔案儲存體的。YAML檔案描述地圖的中繼資料,並命名image檔案。Image檔案編碼佔用資料。
Image 格式
Image 以對應單元的顏色描述世界中每個單元的佔用狀態。白色單元格表示自由,黑色單元格表示佔用,兩種顏色之間的單元表示未知。彩色和灰階映像都採用,但是大部分地圖都是灰階映像(儘管它們儲存的好像是以彩色的形式)。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((255-(14*16+14))/255.0=0.07),完全沒佔用。
通過ROS訊息通訊時,佔用表示為區間[0,100]的一個整數,0表示完全自由,100表示完全佔用,特殊值-1表示完全未知。
映像資料經由SDL_Image讀取;依靠SDL_Image提供的一個特殊平台,支援格式改變。一般來說,大部分流行的映像格式都廣泛支援。一個需要注意的例外是PNG在OS X上不支援。
YAML格式
YAML格式最好用一個簡單而完全的例子來解釋:
image: testmap.pngresolution: 0.1origin: [0.0, 0.0, 0.0]occupied_thresh: 0.65free_thresh: 0.196negate: 0
必填的位元組:
image: 到包含佔用資訊的image檔案的路徑;可以是絕對路徑,也可以是到YAML檔案的相對路徑。
resolution:地圖的解析度,meters/pixel
origin: 地圖左下角單元(像素)的2維位姿,(x,y,yaw),yaw逆時針旋轉(yaw=0表示沒有旋轉)。系統的很多部分現在忽略yaw。
occupied_thresh:單元佔用的機率大於這個閾值則認為完全佔用。
free_thresh: 單元佔用的機率小於這個閾值則認為完全自由。
negate: 不論白色/黑色,自由/佔用,semantics(語義/符號)應該被反轉(閾值的解釋不受影響)。
命令列工具
Map_server
Map_server是一個ROS節點,從磁碟讀取一個地圖,並通過ROS服務提供地圖。
Map_server的當前實現是轉換地圖映像資料中的色彩值為三元佔用值:free(0), occupied(100), unknown(-1)。這個工具的未來版本是使用0到100之間的值來與佔用的更精細層次交流。
Usage
map_server <map.yaml>
Example
rosrun map_server map_server mymap.yaml
注意,地圖資料可能通過任一個鎖存話題(意味著只發送給每個訂閱者一次)或者服務來檢索。服務最終可能會被淘汰。
發布話題
map_metadata (nav_msgs/MapMetaData)
通過這個鎖存話題來接受地圖中繼資料(map metadata).
map (nav_msgs/OccupancyGrid)
通過這個鎖存話題接收地圖。
服務
static_map (nav_msgs/GetMap)
由該服務擷取地圖。
參數
~frame_id (string, default: "map")
設定在發行地圖的頭(header)的座標系。
Map_saver
Map_saver 儲存地圖到磁碟,例如從SLAM mapping 服務中儲存。
Usage
map_saver [-f mapname]
Map_saver擷取地圖資料,並把它寫到map.pgm和map.yaml。使用-f選項為輸出檔案提供一個不同的base name(基礎名字)。
Example
rosrun map_server map_saver -f mymap
訂閱話題
map (nav_msgs/OccupancyGrid)
通過這個鎖存話題擷取地圖。
(ros/navigation/slam_gmapping) map_server地圖伺服器