# 9.1 地圖
## 9.1.1 直觀印象
ROS中的地圖很好理解,就是一張普通的灰度圖像,通常為pgm格式。這張圖像上的黑色像素表示障礙物,白色像素表示可行區域,灰色是未探索的區域。如下圖所示,

在SLAM建圖的過程中,你可以在RViz里看到一張地圖被逐漸建立起來的過程,類似于一塊塊拼圖被拼接成一張完整的地圖。這張地圖對于我們定位、路徑規劃都是不可缺少的信息。事實上,地圖在ROS中是以Topic的形式維護和呈現的,這個Topic名稱就叫做`/map`,它的消息類型是`nav_msgs/OccupancyGrid`。
## 9.1.2 鎖存
由于`/map`中實際上存儲的是一張圖片,為了減少不必要的開銷,這個Topic往往采用鎖存(latched)的方式來發布。什么是鎖存?其實就是:地圖如果沒有更新,就維持著上次發布的內容不變,此時如果有新的訂閱者訂閱消息,這時只會收到一個`/map`的消息,也就是上次發布的消息;只有地圖更新了(比如SLAM又建出來新的地圖),這時`/map`才會發布新的內容。
鎖存器的作用就是,將發布者最后一次發布的消息保存下來,然后把它自動發送給后來的訂閱者。這種方式非常適合變動較慢、相對固定的數據(例如地圖),然后只發布一次,相比于同樣的消息不定的發布,鎖存的方式既可以減少通信中對帶寬的占用,也可以減少消息資源維護的開銷。
## 9.1.3 nav_msgs/OccupancyGrid
然后我們來看一下地圖的OccupancyGrid類型是如何定義的,你可以通過`rosmsg show nav_msgs/OccupancyGrid`來查看消息,或者直接`rosed nav_msgs OccupancyGrid.msg`來查看srv文件。
```
std_msgs/Header header #消息的報頭
uint32 seq
time stamp
string frame_id #地圖消息綁定在TF的哪個frame上,一般為map
nav_msgs/MapMetaData info #地圖相關信息
time map_load_time #加載時間
float32 resolution #分辨率 單位:m/pixel
uint32 width #寬 單位:pixel
uint32 height #高 單位:pixel
geometry_msgs/Pose origin #原點
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
int8[] data #地圖具體信息
```
這個srv文件定義了/map話題的數據結構,包含了三個主要的部分:header, info和data。header是消息的報頭,保存了序號、時間戳、frame等通用信息,info是地圖的配置信息,它反映了地圖的屬性,data是真正存儲這張地圖數據的部分,它是一個可變長數組,`int8`后面加了`[]`,你可以理解為一個類似于vector的容器,它存儲的內容有width*height個int8型的數據,也就是這張地圖上每個像素。
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery