對于差分式機(jī)器人的slam問題,我們可以按步驟分開講淤袜。為了去實現(xiàn)這個問題痒谴,我們首先需要知道我們在環(huán)境中的位置,即機(jī)器人實現(xiàn)定位;其次,我們還需要知道我們周圍的環(huán)境卸亮,是否有障礙物在我們周圍萍启,哪條道路可以行走。對于這個的研究,可以總結(jié)歸納為三個點:地圖的精確建模,機(jī)器人的準(zhǔn)確定位,路徑實時規(guī)劃教翩。
在turtlebot上使用相機(jī)進(jìn)行定位建圖,我使用的是華碩的相機(jī)贪壳,xtion相機(jī)是深度相機(jī)饱亿,攜帶多個攝像頭,能讀出每個像素離相機(jī)的距離,是比較好的選擇之一彪笼。具體的流程按照創(chuàng)客網(wǎng)上的配置是沒有任何的問題的钻注,根據(jù)Turtlebot入門-目錄 - 創(chuàng)客智造。但是相機(jī)局限性有時會比較大配猫,我們也可以采用激光雷達(dá)進(jìn)行turtlebot的slam操作幅恋。我采用的是hokuyo的北洋激光雷達(dá),雷達(dá)的基本配置啟動文件和地圖建立gmapping文件的配置在上面鏈接的教程里是有提到的泵肄,但是對于定位的amcl.launch文件我們需要自己去寫捆交。
? ? ? ? 對于操作的基本流程,我們首先要啟動turtlebot的基本驅(qū)動(因為我們需要待會用到turtlebot的里程計數(shù)據(jù)腐巢,在rviz上顯示實時位置品追。),再啟動gmapping的定位建圖冯丙,將周圍環(huán)境的障礙物以地圖形式建立并保存肉瓦。這是重要的步驟,只有有了正確的地圖胃惜,在接下來定位導(dǎo)航時機(jī)器人才能準(zhǔn)確的進(jìn)行實時的路徑規(guī)劃泞莉,成功避開障礙物。最后船殉,我們就可以采用先前建立的地圖鲫趁,使用amcl.launch來進(jìn)行定位導(dǎo)航了,amcl還調(diào)用了move_base.yaml文件利虫,他能夠為機(jī)器人計算發(fā)送速度挨厚。local_planning.yaml文件可以為機(jī)器人實時規(guī)劃出路徑。
? ? ? ? 這是turtlebot采用gmapping slam的基本步驟列吼。
? ? ? ? 對于navigation的配置幽崩,我們需要使用到tf苦始。因為我們需要自己去放置相機(jī)或者激光雷達(dá)寞钥,所以在不同地方我們的設(shè)備和機(jī)器人的中心之間的坐標(biāo)是不同的。我們將機(jī)器人的坐標(biāo)設(shè)為base_laser陌选,將機(jī)器人的移動基座標(biāo)設(shè)為base_link理郑,
假設(shè)我們知道激光器在移動基座的中心點之上10厘米和向前20厘米處安裝。這給了我們一個將“base_link”坐標(biāo)系與“base_laser”坐標(biāo)系相關(guān)聯(lián)的平移值和偏移值咨油。我們可以實現(xiàn)轉(zhuǎn)換您炉,從“base_link”坐標(biāo)系到“base_laser”坐標(biāo)系的數(shù)據(jù),我們必須應(yīng)用(x:0.1m役电,y:0.0m赚爵,z:0.2m)的轉(zhuǎn)換,并從“ base_laser“坐標(biāo)系到”base_link“坐標(biāo)系,我們必須應(yīng)用相反的變換(x:-0.1m冀膝,y:0.0m唁奢,z:-0.20m)。在轉(zhuǎn)換好坐標(biāo)后窝剖,對于后面的機(jī)器人判斷障礙物信息是必須的麻掸。
? ? ?? navigation中 move_base 的配置,將全局路徑和局部路徑規(guī)劃程序連接在一起赐纱,以完成全局導(dǎo)航任務(wù)脊奋。還維護(hù)兩個costmap,一個用于全局路徑規(guī)劃疙描,一個用于局部路徑規(guī)劃诚隙。
? ? ? ? 對于機(jī)器人的運動,我們將要配置base_local_planner(本地規(guī)劃配置)淫痰,它將根據(jù)規(guī)劃的全局路徑計算發(fā)布給機(jī)器人的速度控制指令最楷。我們有三個通用配置文件:
1 ? ? ?? costmap_commn_params.yaml(代價地圖):用來存儲周圍環(huán)境的障礙物信息。里面有幾個參數(shù)我們將能在運行終端看到待错。如obstacle_range(檢測到的最大范圍值)籽孙,raytace_range(檢測到的自由空間的最大范圍)。
2 ? ? ?? global_costmap_params.yanl(全局規(guī)劃配置文件):用來存儲配置全局代價地圖的參數(shù)火俄。
3 ? ? ?? local_costmap_params.yaml(本地規(guī)劃配置文件):存儲本地代價地圖的配置參數(shù)犯建。
? ? ? ? 在turtlebot中,還有dwa_local_planner的文件瓜客,也用來局部規(guī)劃适瓦,這個路徑規(guī)劃文件對于具有合理加速度機(jī)器人是較好的∑滓牵總體的流程圖我們可認(rèn)為是:
??導(dǎo)航包使用TF來確定機(jī)器人在地圖中的位置玻熙,并將傳感器數(shù)據(jù)與靜態(tài)地圖相關(guān)聯(lián)。然而疯攒,TF不提供關(guān)于機(jī)器人的速度的任何信息嗦随。因此,導(dǎo)航包要求任何里程源都通過ROS發(fā)布TF變換和nav_msgs/Odometry消息敬尺。
? ? ? ? 關(guān)于global_planner和local_planner的關(guān)系圖枚尼,如下: