Edited at

ROS講座92 move_baseで移動する


環境

この記事は以下の環境で動いています。

項目

CPU
Core i5-8250U

Ubuntu
16.04

ROS
Kinetic

Gazebo
7.14.0

インストールについてはROS講座02 インストールを参照してください。

またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。


概要

move baseはnavigation stackの中心になる移動のためのパッケージです。これでRvizから目標地点を入力して、ロボットがそこに移動するということを目指します。

move_baseと周りの物のパッケージの関係は以下のようになります。move_baseには位置推定のモジュールはありません。robot_localizetionやgmappingを使って位置を取得して、それとmapトピック、scanトピック、odomトピックの4つを使ってロボットへの指示であるcmd_velを生成します。

またmove_baseの中は以下のように5つのパートに分かれます。



ros wikiより


install


move_baseのインストール

sudo apt-get install -y ros-kinetic-move-base



ソースコード


config

move_baseは上に書いたように5つの部分に分かれますが、今回はそのうちの3つ(global_costmap、local_costmap、local_planner)にパラメーターを設定します。

コンフィグファイルはgithubに置きます。


launch


nav_lecture/launch/move_base.launch

<?xml version="1.0" encoding="UTF-8"?>

<launch>
<arg name="model" default="$(find nav_lecture)/xacro/dtw_robot.xacro" />
<arg name="rvizconfig" default="$(find nav_lecture)/rviz/move_base.rviz" />

<!-- gazebo world -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find nav_lecture)/worlds/test1.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/>
<arg name="debug" value="false"/>
</include>

<!-- dtw_robot -->
<include file="$(find nav_lecture)/launch/dtw_spawn.launch">
<arg name="robot_name" value="dtw_robot1"/>
</include>

<group ns="dtw_robot1">
<!-- to increase the wheel odometry error -->
<param name="/dtw_robot1/diff_drive_controller/wheel_radius" value="0.055" />
<!-- robot localization -->
<node pkg="robot_localization" type="ekf_localization_node" name="ekf_se" clear_params="true" output="screen">
<rosparam command="load" file="$(find nav_lecture)/config/ekf_localization/mode1.yaml" />
<param name="tf_prefix" value="dtw_robot1"/>
<remap from="/odometry/filtered" to="fusion/odom" />
<remap from="odom0" to="diff_drive_controller/odom" />
<remap from="imu0" to="imu/data" />
</node>

<!-- gmapping -->
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" clear_params="true">
<rosparam command="load" file="$(find nav_lecture)/config/gmapping.yaml" />
<remap from="scan" to="front_laser/scan" />
<param name="base_frame" value="dtw_robot1/base_link" />
<param name="odom_frame" value="dtw_robot1/odom" />
<param name="map_frame" value="dtw_robot1/map" />
</node>

<!-- move_base -->
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find nav_lecture)/config/move_base/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find nav_lecture)/config/move_base/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find nav_lecture)/config/move_base/local_costmap_params.yaml" command="load" />
<rosparam file="$(find nav_lecture)/config/move_base/global_costmap_params.yaml" command="load" />
<rosparam file="$(find nav_lecture)/config/move_base/base_local_planner_params.yaml" command="load" />

<param name="global_costmap/laser_scan_sensor/sensor_frame" value="dtw_robot1/front_laser_link" />
<param name="global_costmap/laser_scan_sensor/topic" value="/dtw_robot1/front_laser/scan" />
<param name="global_costmap/global_frame" value="dtw_robot1/map" />
<param name="global_costmap/robot_base_frame" value="dtw_robot1/base_link" />
<param name="local_costmap/laser_scan_sensor/sensor_frame" value="dtw_robot1/front_laser_link" />
<param name="local_costmap/laser_scan_sensor/topic" value="/dtw_robot1/front_laser/scan" />
<param name="local_costmap/global_frame" value="dtw_robot1/odom" />
<param name="local_costmap/robot_base_frame" value="dtw_robot1/base_link" />
<remap from="cmd_vel" to="diff_drive_controller/cmd_vel" />
<remap from="odom" to="diff_drive_controller/odom" />
</node>
</group>

<!-- rviz -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" >
<remap from="/move_base_simple/goal" to="/dtw_robot1/move_base_simple/goal"/>
</node>
</launch>


上に書いたようにmove_baseは外との接続が多いのでrosトピック名、tf_frame名の設定項目が多くなります。


実行


実行

roslaunch nav_lecture move_base.launch 


以下のようにrvizの上の「2D Nav Goal」のボタンを押した後にrviz上の位置をクリックするとROSトピックが飛んでmove_baseが起動します。

nav_move_base.gif


参考

ROS wiki: move_base

パラメーターの設定


目次ページへのリンク

ROS講座の目次へのリンク