引言
之前一直想寫一篇關于ROS機器人建圖與導航仿真全過程的教程,終于有時間來做這個事啦,本人也拿過吉林省高校機器人大賽—ROS競速組的冠軍,第十六屆全國智能車比賽—訊飛餐廳組線上賽二等獎,我想這個教程對接下來的一些參賽者多多少少也會有一些貢獻。
當然我覺得你已經會ROS的一些基本操作了,本文章只是簡單扼要的介紹這個過程,其中細節部分難免可能不會太詳細還請見諒,當人后續也會有更多這方面的文章,也會傳授一些ROS機器人建圖與導航方面的經驗,當然我也在學習的過程,難免一些不足之處,話不多說啦,讓我先把這個全過程的思維導圖放在下面。
文章所用的代碼已經開源:https://gitee.com/xiaolong_ROS/Map_construction-Navigation_simulation.git
一、環境
1.機器人建模
我個人習慣把機器人本體放在單獨的一個package下,讓我們先看看里面的所有東西。
可以看到這個機器人的URDF模型還有它所擁有的傳感器,相機、慣性測量單元、激光雷達。
我們對URDF文件進行檢查,check_urdf命令會解析URDF文件,并且顯示解析過程中發現的錯誤,如果一切正常,就會顯示如下信息:
當然我們也可以在rviz中查看這個模型:
也可以看看機器人的TF關系:
2.運動控制器配置
接下來我們主要在gazebo環境下操作,我們再創建一個單獨的package,同樣我們先看看完整的內容:
我們在config下可以看到一個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
這個文件便定義了機器人所有的運動控制器以及參數,我們通過launch文件添加以下內容便可以加載這些控制器:
3.world創建
world的創建方法有很多了,你可以自己畫一個世界,也可以導入,這里可以給大家安利另外一個仿真神器:Webots,你會發現不一樣的東西。
給大家看看比賽的官方賽道吧,使用gazebo racecar_runway_original.world 打開:
4.launch文件啟動并測試
我們先通過roslaunch racecar_gazebo racecar.launch 來打開小車所在的仿真環境:
我們可以看到racecar_gazebo/scripts下有一個XL_keyboard_remote.py的,我們可以通過rosrun racecar_gazebo XL_keyboard_remote.py運行它,然后我們的機器人就可以前后左右移動并且轉向啦(注意運行之后彈出來的窗口需要鼠標點擊一下再控制機器人)。
二、建圖
建圖的話我們以Gmapping算法功能包為例子進行地圖構建,當然可以用其它的算法,比如:hector,cartographer等。
1.參數配置
首先我們創建一個gmapping.launch,這個主要是負責配置參數的:
然后我們需要創建一個gmapping_demo.launch用來打開gazebo,rviz等并建圖:
代碼第一塊就是建圖參數的配置,第二塊就是打開之前的gazebo環境等,第三塊是打開鍵盤控制,第四塊是打開一個已經配置好的rviz(配置的方法很簡單的,就是添加一些東西)。
2.launch文件啟動并建圖
之所以創建一個gmapping_demo.launch是想直接啟動一個launch就可以開始建圖,我們直接在終端輸入roslaunch racecar_gazebo racecar.launch就可以開始建圖啦:
建圖過程需要有耐心,最好速度不要太快,當然不同的算法適應性也不太一樣,我們可以看看建圖效果還是可以的:
最后建成的地圖我們需要及時保存。保存的地圖一共有兩個文件,map.pgm和map.yaml。
讓我們看一下建好的地圖效果還是蠻不錯的:
三、導航
我們先來看一下導航的launch啟動文件,第4行就是啟動之前的launch文件;第6~8行是加載配置好的rviz;第10行是加載地圖;注意第13行,我們加載了一個amcl.xml文件,這個是我們配置的定位方法參數。
自主定位即機器人在任意狀態下都可以推算出自己在地圖中所處的位置,ROS為開發者提供了一種自適應(或kld采樣)的蒙特卡羅定位方法(amcl),這是一種概率統計方法,針對已有地圖使用粒子濾波器跟蹤一個機器人的姿態;第16~32行是導航需要的配置文件;第34行是一個導航腳本(自定義的一個ROS節點),初學者可以不用深究其內容。
1.代價地圖的配置
導航功能包使用兩種代價地圖存儲周圍環境中的障礙信息:一種用于全局路徑規劃(global_costmap),一種用于本地路徑規劃和實時避障(local_costmap)。
兩種代價地圖需要使用一些共用的或獨立的配置文件:通用配置文件、全局規劃配置文件和本地規劃配置文件。config/navigation下這三個文件分別與之對應。
代價地圖用來存儲周圍環境的障礙信息,其中需要聲明地圖關注的機器人傳感器消息,以便于地圖信息的更新。
針對兩種代價地圖通用的配置選項,創建名為costmap_common_params.yaml的配置文件。全局規劃配置文件用于存儲配置全局代價地圖的參數,命名為global_costmap_params.yaml,本地規劃配置文件用來存儲本地代價地圖的配置參數,命名為local_costmap_params.yaml。
2.本地規劃器的配置
比賽一般都需要實時避障的,我們導航所用的地圖都是加上錐桶的,當然我們在建圖的時候是不允許掃描錐桶的信息的,所以我們需要配置本地規劃器,我們通過gazebo racecar_runway.world 打開環境如下:
常用的本地規劃算法有TEB算法和DWA算法,這篇教程主要用的TEB算法,本地規劃器當然也是用的TEB算法的參數,具體可以查看最后一個配置文件teb_local_planner_params.yaml。
3.launch文件啟動并導航
我們通過roslaunch racecar_gazebo racecar_navigation.launch來開始導航前所有準備工作:
通過rviz上2D Nav Goal來給機器人發布導航終點信息,可以看出機器人已經開始實時掃描信息并規劃路徑向著終點出發啦:
我們可以通過rosrun rqt_tf_tree rqt_tf_tree來查看導航過程中的TF樹:
也可以通過rosrun rqt_graph rqt_graph來查看導航過程中的各節點:
審核編輯:湯梓紅
-
傳感器
+關注
關注
2552文章
51217瀏覽量
754609 -
機器人
+關注
關注
211文章
28501瀏覽量
207484 -
仿真
+關注
關注
50文章
4099瀏覽量
133718 -
導航
+關注
關注
7文章
530瀏覽量
42449 -
ROS
+關注
關注
1文章
278瀏覽量
17032
原文標題:基于ROS的機器人建圖與導航仿真全過程
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論