ROS導航軟件包的主要目的是將機器人從初始位置移動到目標位置,在移動的過程中不會與周圍環境發生任何碰撞。
ROS導航軟件包附帶了幾種導航相關的算法實現,它們可以幫助我們輕松實現移動機器人的自主導航。
用戶只需要提供機器人的目標位置和來自輪子編碼器、IMU、GPS等傳感器獲得的測量數據,激光掃描器的數據流,
以及其他傳感器的數據流,例如激光雷達數據或者來自Kinect等傳感器的3D點雲數據,導航軟件包的輸出是控制移動的
速度命令,這些命令將控制機器人移動到目標位置。導航軟件包集包含了一些標准算法的實現,例如SLAM、A*(star)、
Dijkstra、amcl等,可以直接用於我們的應用程序。
安裝ROS導航軟件包集使用以下命令安裝:
$sudo apt install ros-melodic-navigation
ROS導航硬件的要求
ROS導航軟件包集被設計成一個通用的軟件包集,機器人需要滿足一些基本的硬件要求,如下:
*導航軟件包在差速驅動和完整約束(即機器人的總DOF等於機器人可控的DOF)方面表現更好,此外,
應通過以下形式的速度命令控制移動機器人:x:velocity(線速度)、y:velocity(線速度)和theta:velocity(角速度)。
*機器人需要配備視覺(RGB-D)或激光傳感器,用來構建周圍環境的地圖。
*導航軟件包集在方形或圓形的移動平台上工作將表現更好,當然它也可以在任意形狀的平台上工作,但性能無法得到保證。
如下圖是從ROS網站(http://wiki.ros.org/navigation/Tutorials/RobotSetup)上獲取的導航軟件包集的基本組成框圖,我們可以看到
每個功能塊的用途以及如何為自定義機器人配置導航軟件包集:
導航軟件包集的框圖
下面對作為導航軟件包集輸入功能模塊的說明:
*里程計數據源(odometry source): 機器人的測距數據給出了機器人相對與起始位置的距離,主要的測試數據源於來自輪子編碼器、
IMU、2D/3D相機(視覺測距)。里程計數據需要以nav_msgs/Odometry的消息形式發送到導航軟件包集。里程計信息主要用於
控制機器人的位置和移動速度,里程計數據是導航軟件包集必須的輸入數據。
*傳感器數據源:我們必須給導航軟件包集提供激光掃描數據或點雲數據來掃描機器人周圍的環境,這些數據與里程計數據一起構建機器人的全局和局部代價地圖。
這里使用的主要傳感器是激光雷達或者Kinect3D傳感器,數據需要封裝成sensor_msgs/LaserScan或者sensor_msgs/PointCloud的形式。
*傳感器坐標變換/tf:機器人需要使用ROStf來發布機器人坐標系的變換關系。
*底盤控制器:底盤控制器的主要功能是轉換導航軟件包集的輸出數據,該消息是geometry_msgs/Twist類型的消息,它將會被轉換成機器人相應的馬達速度。
導航軟件包集的可選節點有amcl和地圖服務器,它們可以幫助機器人定位以及保存/加載機器人的地圖。
使用導航軟件包 在使用導航軟件包集之前,我們已經討論了MoveIt!和move_group節點,在導航軟件包集中也有一個類似move_group的節點,它被稱為move_base節點,
上圖中我們清楚地看到move_base節點從傳感器、tf和里程計中獲得輸入數據,這與我們在MoveIt!中看到的move_group節點很類似。
理解move_base節點move_base節點來自名為move_base的軟件包,該軟件包的主要功能是在其他導航節點的幫助下將機器人從當前位置移動到目標位置。
該軟件包中的move_base節點將全局規划和局部規划連接在一起進行路徑規划,如果機器人在移動時被某些障礙困住動不了,那么它將
開始調用rotate-recovery軟件包,此時需要將全局代價地圖和局部代價地圖結合起來。
move_base節點基本上實現了SimpleActionServer。它以geometry_msgs/PoseStamped消息的形式發送目標位置信息,
我們可以使用SimpleActionClient節點向此節點發送目標位置信息。
move_base節點從名為move_base_simple/goal的話題訂閱目標位置信息,如上圖所示,該話題是導航軟件包集的一個輸入數據。
當此節點接收到一個目標位置后,它將連接到如global_planner、local_planner、recovery_behavior、global_costmap和local_costmap之類的組件,
以生成輸出結果(geometry_msgs/Twist類型的速度指令),並將其發送給底盤控制器,從而控制機器人移動到目標位置。
下面是move_base節點連接的所有軟件包列表:
*global_planner: 該軟件包提供了函數庫和節點,用來在地圖上從機器人的當前位置到目標位置規划一條最優化路徑。
該軟件包實現的路徑查找算法有A*、Dijkstra等,這些算法用於查找從機器人當前位置到目標位置的最短路徑。
*local_planner: 該軟件包的主要功能是使用全局規划路徑中的部分局部路徑為機器人提供導航,局部規划將獲取里程計數據、傳感器數據、
然后給機器人控制器發送合適的速度命令來完成全局規划路徑的一部分,局部規划軟件包是軌跡滑出(Trajectory Rollout)算法和動態窗口算法(Dynamic Window Algorithms,DWA)的具體表現。
*rotate-recovery: 該軟件包通過執行360度旋轉來幫助機器人從本地障礙中恢復。
*clear-costmap-recovery: 該軟件包也是用來幫助機器人從本地障礙中恢復,但它是通過將當前導航包集使用的代價地圖轉換為靜態地圖后清除代價地圖來達到擺脫障礙的目的。
*costmap-2D: 該軟件包的主要用途是建立機器人周圍環境地圖,機器人只能通過地圖來規划路徑,在ROS中,我們創建2D或3D的柵格地圖,用柵格單元表示周圍的環境,
每個柵格都有一個概率值,表示該區域是否被占據。costmap-2D軟件包可以通過訂閱激光掃描或者點雲的傳感器來建立周圍環境的柵格地圖,這里的全局代價地圖用於全局
路徑規划,局部代價地圖用於局部路徑規划。
下面是與move_base節點交互的其他軟件包:
*mao-server: 該軟件包保存和加載costmap-2D軟件包生成的地圖。
*AMCL: AMCL是一種在地圖上定位機器人位置的方法,這種方法使用粒子濾波器在概率論的幫助下跟蹤機器人相對於地圖的位置。
在ROS系統中,AMCL是通過接收sensor_msgs/LaserScan消息來建立地圖的。
*gmapping : 該軟件包是Fast SLAM算法的一種實現,它使用激光掃描數據和里程計數據構建一個2D占據柵格地圖。
使用導航軟件包集 我們認識ROS導航軟件包集中每個模塊的功能,接下來我們來看整個系統是如何工作,機器人需要發布一個合適的里程計數據、tf信息和激光傳感器的數據,
並且需要一個底盤控制器和周圍環境的地圖。
如果所有的需要都滿足,我們就可以開始使用導航軟件包了。
在地圖上定位
機器人將要執行的第一步就是在地圖上進行定位,AMCL就是機器人用來在地圖上定位的軟件包。
發送目標和路徑規划
獲取了機器人的當前位置后,我們就可以向move_base節點發送一個目標位置,然后move_base節點將此目標位置發送給全局規划器。
該規划器將規划一條從當前機器人位置到目標機器人位置的路徑。
這個規划是根據地圖服務器提供的全局代價地圖進行規划的,全局規划器將此路徑發送給局部規划器,
然后局部規划器將執行全局規划的每段路徑。
局部規划器從move_base節點獲取里程計信息和傳感器數據,並為機器人找出一個無碰撞的局部規划,局部規划器從局部代價地圖
獲取信息,局部代價地圖用來監視機器人周圍的障礙物。
碰撞恢復行為
全局代價地圖和局部代價地圖與激光掃描數據關聯在一起,如果機器人在某一處卡主了,那么導航軟件包
將觸發恢復行為節點,,例如通過清除代價地圖恢復或者通過原地旋轉恢復。
發送速度命令
局部規划器以包含線速度和角速度的twist消息(geometry_msgs/Twist)的形式向機器人底盤控制器發送
生成的控制移動命令,機器人底盤控制器負責將twist消息轉換為相應的馬達速度。