Turtlebot 2e 導航之 `move_base` 參數詳解:`move_base`概述

Turtlebot 2e 導航之move_base 參數詳解:move_base概述

引言

ROS的move_base正如其名,是用於基座移動的功能包,用於實現基座的移動。爲把握move_base對於costmap2Dglobal plannerlocal planner的調用關係。
這裏採用turtlebot_navigation的package 爲例進行說明。

move_base的啓動

啓動move_base的launch文件內容通常爲(以Turtlebot 2e爲例):

  • turtlebot_apps/turtlebot_navigation/launch/amcl_demo.launch的啓動代碼爲:
  <!-- Move base -->
  <arg name="custom_param_file" default="$(find turtlebot_navigation)/param/$(arg 3d_sensor)_costmap_params.yaml"/>
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml">
    <arg name="custom_param_file" value="$(arg custom_param_file)"/>
  </include>
  • turtlebot_apps/turtlebot_navigation/launch/gmapping_demo.launch中的啓動代碼爲:
  <!-- Move base -->
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>

可見建圖的過程中採用的是默認參數,而導航過程考慮了3D sensor的傳感器特徵。以下看看各種傳感器的costmap_param.yaml定義:

$ ls -al                               
total 48
lrwxrwxrwx 1 teddyluo teddyluo   10 5月  15 20:43 astra_costmap_params.yaml -> dummy.yaml
lrwxrwxrwx 1 teddyluo teddyluo   10 5月  15 20:43 asus_xtion_pro_costmap_params.yaml -> dummy.yaml
lrwxrwxrwx 1 teddyluo teddyluo   10 5月  15 20:43 asus_xtion_pro_offset_costmap_params.yaml -> dummy.yaml
-rw-rw-r-- 1 teddyluo teddyluo 1621 5月  15 20:43 costmap_common_params.yaml
-rw-rw-r-- 1 teddyluo teddyluo   57 5月  15 20:43 dummy.yaml
-rw-rw-r-- 1 teddyluo teddyluo 2262 5月  15 20:43 dwa_local_planner_params.yaml
-rw-rw-r-- 1 teddyluo teddyluo  405 5月  15 20:43 global_costmap_params.yaml
-rw-rw-r-- 1 teddyluo teddyluo 1730 5月  15 20:43 global_planner_params.yaml
lrwxrwxrwx 1 teddyluo teddyluo   10 5月  15 20:43 kinect_costmap_params.yaml -> dummy.yaml
-rw-rw-r-- 1 teddyluo teddyluo  394 5月  15 20:43 local_costmap_params.yaml
-rw-rw-r-- 1 teddyluo teddyluo  695 5月  15 20:43 lsxxx_costmap_params.yaml
-rw-rw-r-- 1 teddyluo teddyluo 1764 5月  15 20:43 move_base_params.yaml

其中 dummy.yaml是個空文件。

可以看到,最常用的傳感器的$(arg 3d_sensor)_costmap_params.yaml並沒有定義。可以認爲這兩條指令是等價的。

move_base.launch.xml的內容

<!-- 
    ROS navigation stack with velocity smoother and safety (reactive) controller
-->
<launch>
  <include file="$(find turtlebot_navigation)/launch/includes/velocity_smoother.launch.xml"/>
  <include file="$(find turtlebot_navigation)/launch/includes/safety_controller.launch.xml"/>
  
  <arg name="odom_frame_id"   default="odom"/>
  <arg name="base_frame_id"   default="base_footprint"/>
  <arg name="global_frame_id" default="map"/>
  <arg name="odom_topic" default="odom" />
  <arg name="laser_topic" default="scan" />
  <arg name="custom_param_file" default="$(find turtlebot_navigation)/param/dummy.yaml"/>

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />   
    <rosparam file="$(find turtlebot_navigation)/param/local_costmap_params.yaml" command="load" />   
    <rosparam file="$(find turtlebot_navigation)/param/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/dwa_local_planner_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/move_base_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/global_planner_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/navfn_global_planner_params.yaml" command="load" />
    <!-- external params file that could be loaded into the move_base namespace -->
    <rosparam file="$(arg custom_param_file)" command="load" />
    
    <!-- reset frame_id parameters using user input data -->
    <param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>
    <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>
    <param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>

    <remap from="cmd_vel" to="navigation_velocity_smoother/raw_cmd_vel"/>
    <remap from="odom" to="$(arg odom_topic)"/>
    <remap from="scan" to="$(arg laser_topic)"/>
  </node>
</launch>

move_base節點定義

<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
   <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="global_costmap" /> #通用的costmap參數定義(全局空間)
   <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="local_costmap" /> #通用的costmap參數定義(局部空間)
   <rosparam file="$(find turtlebot_navigation)/param/local_costmap_params.yaml" command="load" /> #本地的costmap參數定義 
   <rosparam file="$(find turtlebot_navigation)/param/global_costmap_params.yaml" command="load" /> #全局costmap參數定義
   <rosparam file="$(find turtlebot_navigation)/param/dwa_local_planner_params.yaml" command="load" /> #dwa本地規劃參數定義
   <rosparam file="$(find turtlebot_navigation)/param/move_base_params.yaml" command="load" /> #底盤移動啓動文件
   <rosparam file="$(find turtlebot_navigation)/param/global_planner_params.yaml" command="load" /> #全局規劃參數定義
   <rosparam file="$(find turtlebot_navigation)/param/navfn_global_planner_params.yaml" command="load" /> #navfn全局規劃參數定義
   <!-- external params file that could be loaded into the move_base namespace -->
   <rosparam file="$(arg custom_param_file)" command="load" />
   
   <!-- reset frame_id parameters using user input data -->
   <param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>
   <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
   <param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>
   <param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
   <param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>

   <remap from="cmd_vel" to="navigation_velocity_smoother/raw_cmd_vel"/>
   <remap from="odom" to="$(arg odom_topic)"/>
   <remap from="scan" to="$(arg laser_topic)"/>
 </node>

注:由於手上沒有編輯器,所以簡要在上面用符號#表示註釋。

首先,代價地圖的定義,包含全局代價地圖和局部代價地圖:

/param/costmap_common_params.yaml" command="load" ns="global_costmap"   
/param/costmap_common_params.yaml" command="load" ns="local_costmap" 
/param/local_costmap_params.yaml" command="load" 
/param/global_costmap_params.yaml" command="load"  #全局costmap參數定義

其次,加載了規劃器的參數,

  • DWA局部規劃器的參數dwa_local_planner_params.yaml
  • 全局規劃器global_planner的參數global_planner_params.yaml navfn_global_planner_params.yaml
  • 自定義參數$(arg custom_param_file),由前面可知是一個空文件

最後,定義了座標系:

  • global_costmap/global_frame --> map 全局代價地圖中全局座標系爲map
  • global_costmap/robot_base_frame --> base_footprint 全局代價地圖中機器人本體座標系爲base_footprint
  • local_costmap/global_frame --> odom 局部代價的全局座標系爲odom
  • local_costmap/robot_base_frame --> base_footprint 局部代價機器人本體座標系爲base_footprint
  • DWAPlannerROS/global_frame_id --> odom DWA局部規劃器中全局座標系爲odom

三個topic的remap:

  • cmd_vel --> navigation_velocity_smoother/raw_cmd_vel 將速度話題cmd_velremap爲navigation_velocity_smoother/raw_cmd_vel
  • odom --> odom odom remap爲 odom (寫得能通用,因爲可以在前面改變topic的name)
  • scan --> scan scan remap爲 scan

注:變量名稱

  <arg name="odom_frame_id"   default="odom"/>
  <arg name="base_frame_id"   default="base_footprint"/>
  <arg name="global_frame_id" default="map"/>
  <arg name="odom_topic" default="odom" />
  <arg name="laser_topic" default="scan" />
  <arg name="custom_param_file" default="$(find turtlebot_navigation)/param/dummy.yaml"/>

理解爲

  • 參數名odom_frame_id的默認值爲odom (odom座標系)
  • 參數名base_frame_id的默認值爲base_footprint (base_footprint座標系)
  • 參數名global_frame_id的默認值爲map (map座標系)
  • 參數名odom_topic的默認值爲odom (odom topic)
  • 參數名laser_topic的默認值爲scan (scan topic)
  • 參數名custom_param_file的默認值爲$(find turtlebot_navigation)/param/dummy.yaml

turtlebot_ws/src/turtlebot_apps/turtlebot_navigation目錄的文件樹結構

├── CHANGELOG.rst
├── CMakeLists.txt
├── env-hooks                                                          #鉤子
│   └── 25.turtlebot-navigation.sh.em                                  #設置一些穩定的默認值,目前是導出TURTLEBOT_MAP_FILE,使用默認的地圖。
├── laser                                                              #雷達相關設置
│   ├── costmap_common_params.yaml                                     #costmap的通用參數
│   ├── laser_amcl_demo.launch                                         #激光amcl啓動文件
│   ├── laser_gmapping_demo.launch                                     #激光gmapping啓動文件
│   └── move_base_laser.launch                                         #帶激光底盤移動啓動文件
├── launch                                                             #啓動目錄
│   ├── amcl_demo.launch                                               #amcl啓動文件     
│   ├── gmapping_demo.launch                                           #gmapping啓動文件
│   ├── graveyard
│   │   └── graveyard_bump_navi_demo.launch                            #
│   └── includes                                                       #啓動文件的子模塊
│       ├── amcl                                                       #即時定位
│       │   ├── amcl.launch.xml                                        #即時定位核心啓動文件
│       │   ├── astra_amcl.launch.xml -> amcl.launch.xml               #使用astra進行定位
│       │   ├── asus_xtion_pro_amcl.launch.xml -> amcl.launch.xml      #使用asus_xtion_pro進行定位
│       │   ├── asus_xtion_pro_offset_amcl.launch.xml -> amcl.launch.xml #使用asus_xtion_pro_live進行定位
│       │   ├── kinect_amcl.launch.xml -> amcl.launch.xml                #使用kinect進行定位
│       │   └── r200_amcl.launch.xml                                     #使用r200進行定位
│       ├── gmapping                                                             #實時建圖
│       │   ├── astra_gmapping.launch.xml -> gmapping.launch.xml                 #使用astra建圖 
│       │   ├── asus_xtion_pro_gmapping.launch.xml -> gmapping.launch.xml        #使用asus_xtion_pro建圖
│       │   ├── asus_xtion_pro_offset_gmapping.launch.xml -> gmapping.launch.xml #使用asus_xtion_pro_live建圖
│       │   ├── gmapping.launch.xml                                              #實際建圖核心啓動文件
│       │   ├── kinect_gmapping.launch.xml -> gmapping.launch.xml                #使用kinect建圖 
│       │   └── r200_gmapping.launch.xml                                         #使用r200建圖
│       ├── move_base.launch.xml                                                 #底盤移動啓動文件
│       ├── safety_controller.launch.xml                                         #安全控制啓動文件
│       └── velocity_smoother.launch.xml                                         #速度平滑啓動文件
├── maps                                                                         #地圖目錄
│   ├── willow-2010-02-18-0.10.pgm
│   └── willow-2010-02-18-0.10.yaml
├── package.xml
├── param                                                                        #參數目錄
│   ├── astra_costmap_params.yaml -> dummy.yaml                                  #astra的costmap參數定義,指向空文件
│   ├── asus_xtion_pro_costmap_params.yaml -> dummy.yaml                         #asus_xtion_pro的costmap參數定義,指向空文件
│   ├── asus_xtion_pro_offset_costmap_params.yaml -> dummy.yaml                  #asus_xtion_pro_live的costmap參數定義,指向空文件
│   ├── costmap_common_params.yaml                                               #通用的costmap參數定義
│   ├── dummy.yaml                                                               #空文件,沒有自定義的參數設置
│   ├── dwa_local_planner_params.yaml                                            #dwa本地規劃參數定義
│   ├── global_costmap_params.yaml                                               #全局costmap參數定義
│   ├── global_planner_params.yaml                                               #全局規劃參數定義
│   ├── kinect_costmap_params.yaml -> dummy.yaml                                 #kinect的costmap參數定義,指向空文件
│   ├── local_costmap_params.yaml                                                #本地的costmap參數定義
│   ├── move_base_params.yaml                                                    #底盤移動參數定義
│   ├── navfn_global_planner_params.yaml                                         #navfn全局規劃參數定義
│   └── r200_costmap_params.yaml                                                 #r200的costmap參數定義
└── src                                                                          #源碼目錄
    └── laser_footprint_filter.cpp                                               #激光過濾footprint源碼, 訂閱/scan話題,過濾後,重發布/scan_filtered話題

下面我們先來學習速度平滑、安全駕駛,再看看環境代價地圖的定義,再理解規劃器的設置,最後看看move_base啓動本身。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章