<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于ROS的機器人建圖與導(dǎo)航仿真全過程

          共 7113字,需瀏覽 15分鐘

           ·

          2023-03-08 07:46

          點擊下方卡片,關(guān)注“新機器視覺”公眾號

          重磅干貨,第一時間送達

          來源丨古月居

          引言


          之前一直想寫一篇關(guān)于ROS機器人建圖與導(dǎo)航仿真全過程的教程,終于有時間來做這個事啦,本人也拿過吉林省高校機器人大賽—ROS競速組的冠軍,第十六屆全國智能車比賽—訊飛餐廳組線上賽二等獎,我想這個教程對接下來的一些參賽者多多少少也會有一些貢獻。


          當(dāng)然我覺得你已經(jīng)會ROS的一些基本操作了,本文章只是簡單扼要的介紹這個過程,其中細節(jié)部分難免可能不會太詳細還請見諒,當(dāng)人后續(xù)也會有更多這方面的文章,也會傳授一些ROS機器人建圖與導(dǎo)航方面的經(jīng)驗,當(dāng)然我也在學(xué)習(xí)的過程,難免一些不足之處,話不多說啦,讓我先把這個全過程的思維導(dǎo)圖放在下面。



          文章所用的代碼已經(jīng)開源:https://gitee.com/xiaolong_ROS/Map_construction-Navigation_simulation.git



          一、環(huán)境


          1.機器人建模


          我個人習(xí)慣把機器人本體放在單獨的一個package下,讓我們先看看里面的所有東西。



          可以看到這個機器人的URDF模型還有它所擁有的傳感器,相機、慣性測量單元、激光雷達。


          我們對URDF文件進行檢查,check_urdf命令會解析URDF文件,并且顯示解析過程中發(fā)現(xiàn)的錯誤,如果一切正常,就會顯示如下信息:



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



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



          2.運動控制器配置


          接下來我們主要在gazebo環(huán)境下操作,我們再創(chuàng)建一個單獨的package,同樣我們先看看完整的內(nèi)容:



          我們在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


          這個文件便定義了機器人所有的運動控制器以及參數(shù),我們通過launch文件添加以下內(nèi)容便可以加載這些控制器:



          3.world創(chuàng)建


          world的創(chuàng)建方法有很多了,你可以自己畫一個世界,也可以導(dǎo)入,這里可以給大家安利另外一個仿真神器:Webots,你會發(fā)現(xiàn)不一樣的東西。


          給大家看看比賽的官方賽道吧,使用gazebo racecar_runway_original.world 打開:



          4.launch文件啟動并測試

          我們先通過roslaunch racecar_gazebo racecar.launch 來打開小車所在的仿真環(huán)境:



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




          二、建圖


          建圖的話我們以Gmapping算法功能包為例子進行地圖構(gòu)建,當(dāng)然可以用其它的算法,比如:hector,cartographer等。


          1.參數(shù)配置


          首先我們創(chuàng)建一個gmapping.launch,這個主要是負(fù)責(zé)配置參數(shù)的:


          <launch>    <arg name="scan_topic" default="scan" />
             <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">        <param name="odom_frame" value="odom"/>        <param name="map_update_interval" value="5.0"/>        <!-- Set maxUrange < actual maximum range of the Laser -->        <param name="maxRange" value="5.0"/>        <param name="maxUrange" value="4.5"/>        <param name="sigma" value="0.05"/>        <param name="kernelSize" value="1"/>        <param name="lstep" value="0.05"/>        <param name="astep" value="0.05"/>        <param name="iterations" value="5"/>        <param name="lsigma" value="0.075"/>        <param name="ogain" value="3.0"/>        <param name="lskip" value="0"/>        <param name="srr" value="0.01"/>        <param name="srt" value="0.02"/>        <param name="str" value="0.01"/>        <param name="stt" value="0.02"/>        <param name="linearUpdate" value="0.5"/>        <param name="angularUpdate" value="0.436"/>        <param name="temporalUpdate" value="-1.0"/>        <param name="resampleThreshold" value="0.5"/>        <param name="particles" value="80"/>        <param name="xmin" value="-1.0"/>        <param name="ymin" value="-1.0"/>        <param name="xmax" value="1.0"/>        <param name="ymax" value="1.0"/>        <param name="delta" value="0.05"/>        <param name="llsamplerange" value="0.01"/>        <param name="llsamplestep" value="0.01"/>        <param name="lasamplerange" value="0.005"/>        <param name="lasamplestep" value="0.005"/>        <remap from="scan" to="$(arg scan_topic)"/>    </node></launch>


          然后我們需要創(chuàng)建一個gmapping_demo.launch用來打開gazebo,rviz等并建圖:


          <launch>
             <include file="$(find racecar_gazebo)/launch/gmapping.launch"/>
             <include file="$(find racecar_gazebo)/launch/racecar.launch"/>      <!-- keyboard_remote node -->    <node name="XL_keyboard_remote" pkg="racecar_gazebo" type="XL_keyboard_remote.py" output="screen">    </node>
             <!-- 啟動rviz -->    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find racecar_gazebo)/rviz/gmapping.rviz"/>
          </launch>


          代碼第一塊就是建圖參數(shù)的配置,第二塊就是打開之前的gazebo環(huán)境等,第三塊是打開鍵盤控制,第四塊是打開一個已經(jīng)配置好的rviz(配置的方法很簡單的,就是添加一些東西)。


          2.launch文件啟動并建圖


          之所以創(chuàng)建一個gmapping_demo.launch是想直接啟動一個launch就可以開始建圖,我們直接在終端輸入roslaunch racecar_gazebo racecar.launch就可以開始建圖啦:



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



           最后建成的地圖我們需要及時保存。保存的地圖一共有兩個文件,map.pgm和map.yaml。


          讓我們看一下建好的地圖效果還是蠻不錯的:




          三、導(dǎo)航


          我們先來看一下導(dǎo)航的launch啟動文件,第4行就是啟動之前的launch文件;第6~8行是加載配置好的rviz;第10行是加載地圖;注意第13行,我們加載了一個amcl.xml文件,這個是我們配置的定位方法參數(shù)。


          自主定位即機器人在任意狀態(tài)下都可以推算出自己在地圖中所處的位置,ROS為開發(fā)者提供了一種自適應(yīng)(或kld采樣)的蒙特卡羅定位方法(amcl),這是一種概率統(tǒng)計方法,針對已有地圖使用粒子濾波器跟蹤一個機器人的姿態(tài);第16~32行是導(dǎo)航需要的配置文件;第34行是一個導(dǎo)航腳本(自定義的一個ROS節(jié)點),初學(xué)者可以不用深究其內(nèi)容。



          1.代價地圖的配置


          導(dǎo)航功能包使用兩種代價地圖存儲周圍環(huán)境中的障礙信息:一種用于全局路徑規(guī)劃(global_costmap),一種用于本地路徑規(guī)劃和實時避障(local_costmap)。


          兩種代價地圖需要使用一些共用的或獨立的配置文件:通用配置文件、全局規(guī)劃配置文件和本地規(guī)劃配置文件。config/navigation下這三個文件分別與之對應(yīng)。



          代價地圖用來存儲周圍環(huán)境的障礙信息,其中需要聲明地圖關(guān)注的機器人傳感器消息,以便于地圖信息的更新。


          針對兩種代價地圖通用的配置選項,創(chuàng)建名為costmap_common_params.yaml的配置文件。全局規(guī)劃配置文件用于存儲配置全局代價地圖的參數(shù),命名為global_costmap_params.yaml,本地規(guī)劃配置文件用來存儲本地代價地圖的配置參數(shù),命名為local_costmap_params.yaml。


          2.本地規(guī)劃器的配置


          比賽一般都需要實時避障的,我們導(dǎo)航所用的地圖都是加上錐桶的,當(dāng)然我們在建圖的時候是不允許掃描錐桶的信息的,所以我們需要配置本地規(guī)劃器,我們通過gazebo racecar_runway.world 打開環(huán)境如下:



          常用的本地規(guī)劃算法有TEB算法和DWA算法,這篇教程主要用的TEB算法,本地規(guī)劃器當(dāng)然也是用的TEB算法的參數(shù),具體可以查看最后一個配置文件teb_local_planner_params.yaml。


          3.launch文件啟動并導(dǎo)航


          我們通過roslaunch racecar_gazebo racecar_navigation.launch來開始導(dǎo)航前所有準(zhǔn)備工作:



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



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



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


          本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。

          —THE END—

          瀏覽 106
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费看欧美成人A片 | 亚洲瑟瑟| 香蕉视频性 | 日本暖暖视频 | 蜜桃视频网站免费观看 |