引言
之前一直想寫一篇關(guān)于ROS機(jī)器人建圖與導(dǎo)航仿真全過程的教程,終于有時(shí)間來做這個(gè)事啦,本人也拿過吉林省高校機(jī)器人大賽—ROS競速組的冠軍,第十六屆全國智能車比賽—訊飛餐廳組線上賽二等獎(jiǎng),我想這個(gè)教程對接下來的一些參賽者多多少少也會(huì)有一些貢獻(xiàn)。
當(dāng)然我覺得你已經(jīng)會(huì)ROS的一些基本操作了,本文章只是簡單扼要的介紹這個(gè)過程,其中細(xì)節(jié)部分難免可能不會(huì)太詳細(xì)還請見諒,當(dāng)人后續(xù)也會(huì)有更多這方面的文章,也會(huì)傳授一些ROS機(jī)器人建圖與導(dǎo)航方面的經(jīng)驗(yàn),當(dāng)然我也在學(xué)習(xí)的過程,難免一些不足之處,話不多說啦,讓我先把這個(gè)全過程的思維導(dǎo)圖放在下面。

文章所用的代碼已經(jīng)開源:https://gitee.com/xiaolong_ROS/Map_construction-Navigation_simulation.git
一、環(huán)境
1.機(jī)器人建模
我個(gè)人習(xí)慣把機(jī)器人本體放在單獨(dú)的一個(gè)package下,讓我們先看看里面的所有東西。

可以看到這個(gè)機(jī)器人的URDF模型還有它所擁有的傳感器,相機(jī)、慣性測量單元、激光雷達(dá)。
我們對URDF文件進(jìn)行檢查,check_urdf命令會(huì)解析URDF文件,并且顯示解析過程中發(fā)現(xiàn)的錯(cuò)誤,如果一切正常,就會(huì)顯示如下信息:

當(dāng)然我們也可以在rviz中查看這個(gè)模型:

也可以看看機(jī)器人的TF關(guān)系:

2.運(yùn)動(dòng)控制器配置
接下來我們主要在gazebo環(huán)境下操作,我們再創(chuàng)建一個(gè)單獨(dú)的package,同樣我們先看看完整的內(nèi)容:

我們在config下可以看到一個(gè)racecar_control.yaml文件:
racecar: left_rear_wheel_velocity_controller: type: effort_controllers/JointVelocityController joint: left_rear_axle pid: {p: 1000.0, i: 0.00, d: 0.0} right_rear_wheel_velocity_controller: type: effort_controllers/JointVelocityController joint: right_rear_axle pid: {p: 1000.0, i: 0.00, d: 0.0} left_front_wheel_velocity_controller: type: effort_controllers/JointVelocityController joint: left_front_axle pid: {p: 1000.0, i: 0.00, d: 0.0} right_front_wheel_velocity_controller: type: effort_controllers/JointVelocityController joint: right_front_axle pid: {p: 1000.0, i: 0.00, d: 0.0} left_steering_hinge_position_controller: type: effort_controllers/JointPositionController joint: left_steering_joint pid: {p: 10000.0, i: 0.1, d: 500.0} right_steering_hinge_position_controller: type: effort_controllers/JointPositionController joint: right_steering_joint pid: {p: 10000.0, i: 0.1, d: 500.0} joint_state_controller: type: joint_state_controller/JointStateController publish_rate: 50
這個(gè)文件便定義了機(jī)器人所有的運(yùn)動(dòng)控制器以及參數(shù),我們通過launch文件添加以下內(nèi)容便可以加載這些控制器:

3.world創(chuàng)建
world的創(chuàng)建方法有很多了,你可以自己畫一個(gè)世界,也可以導(dǎo)入,這里可以給大家安利另外一個(gè)仿真神器:Webots,你會(huì)發(fā)現(xiàn)不一樣的東西。
給大家看看比賽的官方賽道吧,使用gazebo racecar_runway_original.world 打開:

4.launch文件啟動(dòng)并測試
我們先通過roslaunch racecar_gazebo racecar.launch 來打開小車所在的仿真環(huán)境:

我們可以看到racecar_gazebo/scripts下有一個(gè)XL_keyboard_remote.py的,我們可以通過rosrun racecar_gazebo XL_keyboard_remote.py運(yùn)行它,然后我們的機(jī)器人就可以前后左右移動(dòng)并且轉(zhuǎn)向啦(注意運(yùn)行之后彈出來的窗口需要鼠標(biāo)點(diǎn)擊一下再控制機(jī)器人)。

二、建圖
建圖的話我們以Gmapping算法功能包為例子進(jìn)行地圖構(gòu)建,當(dāng)然可以用其它的算法,比如:hector,cartographer等。
1.參數(shù)配置
首先我們創(chuàng)建一個(gè)gmapping.launch,這個(gè)主要是負(fù)責(zé)配置參數(shù)的:
然后我們需要?jiǎng)?chuàng)建一個(gè)gmapping_demo.launch用來打開gazebo,rviz等并建圖:
代碼第一塊就是建圖參數(shù)的配置,第二塊就是打開之前的gazebo環(huán)境等,第三塊是打開鍵盤控制,第四塊是打開一個(gè)已經(jīng)配置好的rviz(配置的方法很簡單的,就是添加一些東西)。
2.launch文件啟動(dòng)并建圖
之所以創(chuàng)建一個(gè)gmapping_demo.launch是想直接啟動(dòng)一個(gè)launch就可以開始建圖,我們直接在終端輸入roslaunch racecar_gazebo racecar.launch就可以開始建圖啦:

建圖過程需要有耐心,最好速度不要太快,當(dāng)然不同的算法適應(yīng)性也不太一樣,我們可以看看建圖效果還是可以的:

最后建成的地圖我們需要及時(shí)保存。保存的地圖一共有兩個(gè)文件,map.pgm和map.yaml。
讓我們看一下建好的地圖效果還是蠻不錯(cuò)的:

三、導(dǎo)航
我們先來看一下導(dǎo)航的launch啟動(dòng)文件,第4行就是啟動(dòng)之前的launch文件;第6~8行是加載配置好的rviz;第10行是加載地圖;注意第13行,我們加載了一個(gè)amcl.xml文件,這個(gè)是我們配置的定位方法參數(shù)。
自主定位即機(jī)器人在任意狀態(tài)下都可以推算出自己在地圖中所處的位置,ROS為開發(fā)者提供了一種自適應(yīng)(或kld采樣)的蒙特卡羅定位方法(amcl),這是一種概率統(tǒng)計(jì)方法,針對已有地圖使用粒子濾波器跟蹤一個(gè)機(jī)器人的姿態(tài);第16~32行是導(dǎo)航需要的配置文件;第34行是一個(gè)導(dǎo)航腳本(自定義的一個(gè)ROS節(jié)點(diǎn)),初學(xué)者可以不用深究其內(nèi)容。

1.代價(jià)地圖的配置
導(dǎo)航功能包使用兩種代價(jià)地圖存儲(chǔ)周圍環(huán)境中的障礙信息:一種用于全局路徑規(guī)劃(global_costmap),一種用于本地路徑規(guī)劃和實(shí)時(shí)避障(local_costmap)。
兩種代價(jià)地圖需要使用一些共用的或獨(dú)立的配置文件:通用配置文件、全局規(guī)劃配置文件和本地規(guī)劃配置文件。config/navigation下這三個(gè)文件分別與之對應(yīng)。

代價(jià)地圖用來存儲(chǔ)周圍環(huán)境的障礙信息,其中需要聲明地圖關(guān)注的機(jī)器人傳感器消息,以便于地圖信息的更新。
針對兩種代價(jià)地圖通用的配置選項(xiàng),創(chuàng)建名為costmap_common_params.yaml的配置文件。全局規(guī)劃配置文件用于存儲(chǔ)配置全局代價(jià)地圖的參數(shù),命名為global_costmap_params.yaml,本地規(guī)劃配置文件用來存儲(chǔ)本地代價(jià)地圖的配置參數(shù),命名為local_costmap_params.yaml。
2.本地規(guī)劃器的配置
比賽一般都需要實(shí)時(shí)避障的,我們導(dǎo)航所用的地圖都是加上錐桶的,當(dāng)然我們在建圖的時(shí)候是不允許掃描錐桶的信息的,所以我們需要配置本地規(guī)劃器,我們通過gazebo racecar_runway.world 打開環(huán)境如下:

常用的本地規(guī)劃算法有TEB算法和DWA算法,這篇教程主要用的TEB算法,本地規(guī)劃器當(dāng)然也是用的TEB算法的參數(shù),具體可以查看最后一個(gè)配置文件teb_local_planner_params.yaml。
3.launch文件啟動(dòng)并導(dǎo)航
我們通過roslaunch racecar_gazebo racecar_navigation.launch來開始導(dǎo)航前所有準(zhǔn)備工作:

通過rviz上2D Nav Goal來給機(jī)器人發(fā)布導(dǎo)航終點(diǎn)信息,可以看出機(jī)器人已經(jīng)開始實(shí)時(shí)掃描信息并規(guī)劃路徑向著終點(diǎn)出發(fā)啦:

我們可以通過rosrun rqt_tf_tree rqt_tf_tree來查看導(dǎo)航過程中的TF樹:

也可以通過rosrun rqt_graph rqt_graph來查看導(dǎo)航過程中的各節(jié)點(diǎn):

審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2576文章
55067瀏覽量
791518 -
機(jī)器人
+關(guān)注
關(guān)注
213文章
31095瀏覽量
222360 -
仿真
+關(guān)注
關(guān)注
54文章
4487瀏覽量
138315 -
導(dǎo)航
+關(guān)注
關(guān)注
7文章
577瀏覽量
43941 -
ROS
+關(guān)注
關(guān)注
1文章
293瀏覽量
18748
原文標(biāo)題:基于ROS的機(jī)器人建圖與導(dǎo)航仿真全過程
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
ROS讓機(jī)器人開發(fā)更便捷,基于RK3568J+Debian系統(tǒng)發(fā)布!
名單公布!【書籍評測活動(dòng)NO.58】ROS 2智能機(jī)器人開發(fā)實(shí)踐
【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】+內(nèi)容初識
【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】+ROS2應(yīng)用案例
【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】視覺實(shí)現(xiàn)的基礎(chǔ)算法的應(yīng)用
激光導(dǎo)航AGV底盤定制 巡檢機(jī)器人,服務(wù)機(jī)器人,智慧物流搬運(yùn)AGV
走到哪都不會(huì)迷路,全自動(dòng)機(jī)器人是怎么導(dǎo)航的?
讓機(jī)器人完美建圖的SLAM 3.0到底是何方神圣?
如何保存機(jī)器人建圖,用于后續(xù)定位導(dǎo)航
棗陽市工程BIM軟件全過程建筑咨詢單位
基于ROS系統(tǒng)實(shí)現(xiàn)導(dǎo)航機(jī)器人的精確方向和距離控制
ROS機(jī)器人定位導(dǎo)航仿真
如何對ROS機(jī)器人的定位導(dǎo)航進(jìn)行仿真
如何搭建實(shí)體機(jī)器人ros底盤
朱老師出新書了??!《ROS機(jī)器人編程零基礎(chǔ)入門》
基于ROS的機(jī)器人建圖與導(dǎo)航仿真全過程
評論