map_server地圖包功能和使用


博客參考 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)

  • 通過指定話題來獲取地圖

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM