ROS講座92 move_baseで移動する

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

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.04 |
| ROS | Kinetic |
| Gazebo | 7.14.0 |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

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

move_baseと周りの物のパッケージの関係は以下のようになります。move_baseには位置推定のモジュールはありません。robot_localizetionやgmappingを使って位置を取得して、それとmapトピック、scanトピック、odomトピックの4つを使ってロボットへの指示であるcmd_velを生成します。
![nav_move_base.png](https://qiita-image-store.s3.amazonaws.com/0/254442/0603fe22-ea0f-884a-029f-140a0c837748.png)


またmove_baseの中は以下のように5つのパートに分かれます。
![overview_tf_small.png](https://qiita-image-store.s3.amazonaws.com/0/254442/54b5dafe-ff15-29c9-35c9-39a54d66346a.png)
[ros wikiより](http://wiki.ros.org/navigation/Tutorials/RobotSetup)

# install

```shell:move_baseのインストール
sudo apt-get install -y ros-kinetic-move-base
```

# ソースコード

## config

move_baseは上に書いたように5つの部分に分かれますが、今回はそのうちの3つ（global_costmap、local_costmap、local_planner）にパラメーターを設定します。
コンフィグファイルは[github](https://github.com/project-srs/ros_lecture/tree/master/nav_lecture/config/move_base)に置きます。

## launch

```xml: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/local_costmap_params_old.yaml" command="load" />
      <rosparam file="$(find nav_lecture)/config/move_base/global_costmap_params_old.yaml" command="load" />
      <rosparam file="$(find nav_lecture)/config/move_base/base_local_planner_params.yaml" command="load" />

      <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名の設定項目が多くなります。

# 実行

```shell:実行
roslaunch nav_lecture move_base.launch 
```

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

![nav_move_base.gif](https://qiita-image-store.s3.amazonaws.com/0/254442/af66aa56-322c-bd32-da73-b6227e774cb7.gif)

# 参考
[ROS wiki: move_base](http://wiki.ros.org/move_base)
[パラメーターの設定](http://wiki.ros.org/navigation/Tutorials/RobotSetup)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)