Turtlebot 2e 導航之move_base
參數詳解:move_base
概述
文章目錄
引言
ROS的move_base
正如其名,是用於基座移動的功能包,用於實現基座的移動。爲把握move_base
對於costmap2D
,global planner
,local 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
全局代價地圖中全局座標系爲mapglobal_costmap/robot_base_frame
-->base_footprint
全局代價地圖中機器人本體座標系爲base_footprint
local_costmap/global_frame
-->odom
局部代價的全局座標系爲odomlocal_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_vel
remap爲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啓動本身。