博客轉自:https://blog.csdn.net/hcx25909/article/details/9334231
導航與定位是機器人研究中的重要部分。 一般機器人在陌生的環境下需要使用激光傳感器(或者深度傳感器轉換成激光數據),先進行地圖建模,然后在根據建立的地圖進行導航、定位。在ROS中也有很多完善的包可以直接使用。 在ROS中,進行導航需要使用到的三個包是:
- move_base:根據參照的消息進行路徑規划,使移動機器人到達指定的位置
- gmapping:根據激光數據(或者深度數據模擬的激光數據)建立地圖
- amcl:根據已經有的地圖進行定位
參考鏈接:http://www.ros.org/wiki/navigation/Tutorials/RobotSetup 和 http://www.ros.org/wiki/navigation/Tutorials
整體導航包的格局如下圖所示:
其中白色框內的是ROS已經為我們准備好的必須使用的組件,灰色框內的是ROS中可選的組件,藍色的是用戶需要提供的機器人平台上的組件。
1、sensor transforms
其中涉及到使用tf進行傳感器坐標的轉換,因為我們使用的機器人的控制中心不一定是在傳感器上,所以要把傳感器的數據轉換成在控制中心上的坐標信息。如下圖所示,傳感器獲取的數據是在base_laser的坐標系統中的,但是我們控制的時候是以base_link為中心,所以要根據兩者的位置關心進行坐標的變換,其實就是傳感器相對於控制中心的標定。
變換的過程不需要我們自己處理,只需要將base_laser和base_link兩者之間的位置關系告訴tf,就可以自動轉換了。具體的實現可以參見:http://blog.csdn.net/hcx25909/article/details/9255001。
2、sensor sources
這里是機器人導航傳感器數據輸入,一般只有兩種:
- 激光傳感器數據
- 點雲數據
具體實現見:sensors
3、odometry source
機器人的導航需要輸入里程計的數據(tf,nav_msgs/Odometry_message),具體實現見:odom
4、base controller
在導航過程中,該部分負責將之前得出來的數據轉封裝成具體的線速度和轉向角度信息(Twist),並且發布給硬件平台。
5、map_server
在導航過程中,地圖並不是必須的,此時相當於是在一個無限大的空地上進行導航,並沒有任何障礙物。但是考慮到實際情況,在我們使用導航的過程中還是要一個地圖的。具體實現見:map_server。在ROS的導航中,costmap_2d這個包主要負責根據傳感器的信息建立和更新二維或三維的地圖。ROS的地圖(costmap)采用網格(grid)的形式,每個網格的值從0~255,分為三種狀態:占用(有障礙物)、無用(空閑的)、未知。具體狀態和值的對應關系如下:
上圖共分為五個部分:(下面的紅色框圖是機器人的輪廓,旁邊的黑框是上圖的映射位置)
- Lethal(致命的):機器人的中心與該網格的中心重合,此時機器人必然與障礙物沖突。
- Inscribed(內切):網格的外切圓與機器人的輪廓內切,此時機器人也必然與障礙物沖突。
- Possibly circumscribed(外切):網格的外切圓與機器人的輪廓外切,此時機器人相當於靠在障礙物附近,所以不一定沖突。
- Freespace(自由空間):沒有障礙物的空間。
- Unknown(未知):未知的空間。
具體可見:costmap_2d