View on GitHub

ROSを使用した移動ロボットのナビゲーション

日本ロボット学会 第131回 ロボットの作り方セミナー

ROSを用いたマップ取得

SLAM(Simultaneous Localization and Mapping)は、任意の空間の現在位置を推定して地図を描く手法です。 SLAMは、TurtleBotの前身からよく知られている機能です。

TurtleBot3を起動

roscoreを実行します。

1
$ roscore

TurtleBot3のアプリケーションを起動するための基本的なパッケージを起動します。

新しいターミナルウィンドウを開き、TurtleBotと接続します。

1
  ssh pi@192.168.xxx.xxx (The IP 192.168.xxx.xxx is your Raspberry Pi’s IP or hostname)

パスワードはturtlebotです。

接続ができましたら下記のコマンドでTurtleBot3を起動します。

1
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch

TurtleBot3のモデルがburgerの場合は、以下のようなメッセージが表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.13
 * /turtlebot3_core/baud: 115200
 * /turtlebot3_core/port: /dev/ttyACM0
 * /turtlebot3_core/tf_prefix:
 * /turtlebot3_lds/frame_id: base_scan
 * /turtlebot3_lds/port: /dev/ttyUSB0

NODES
  /
    turtlebot3_core (rosserial_python/serial_node.py)
    turtlebot3_diagnostics (turtlebot3_bringup/turtlebot3_diagnostics)
    turtlebot3_lds (hls_lfcd_lds_driver/hlds_laser_publisher)

ROS_MASTER_URI=http://192.168.1.2:11311

process[turtlebot3_core-1]: started with pid [14198]
process[turtlebot3_lds-2]: started with pid [14199]
process[turtlebot3_diagnostics-3]: started with pid [14200]
[INFO] [1531306690.947198]: ROS Serial Python Node
[INFO] [1531306691.000143]: Connecting to /dev/ttyACM0 at 115200 baud
[INFO] [1531306693.522019]: Note: publish buffer size is 1024 bytes
[INFO] [1531306693.525615]: Setup publisher on sensor_state [turtlebot3_msgs/SensorState]
[INFO] [1531306693.544159]: Setup publisher on version_info [turtlebot3_msgs/VersionInfo]
[INFO] [1531306693.620722]: Setup publisher on imu [sensor_msgs/Imu]
[INFO] [1531306693.642319]: Setup publisher on cmd_vel_rc100 [geometry_msgs/Twist]
[INFO] [1531306693.687786]: Setup publisher on odom [nav_msgs/Odometry]
[INFO] [1531306693.706260]: Setup publisher on joint_states [sensor_msgs/JointState]
[INFO] [1531306693.722754]: Setup publisher on battery_state [sensor_msgs/BatteryState]
[INFO] [1531306693.759059]: Setup publisher on magnetic_field [sensor_msgs/MagneticField]
[INFO] [1531306695.979057]: Setup publisher on /tf [tf/tfMessage]
[INFO] [1531306696.007135]: Note: subscribe buffer size is 1024 bytes
[INFO] [1531306696.009083]: Setup subscriber on cmd_vel [geometry_msgs/Twist]
[INFO] [1531306696.040047]: Setup subscriber on sound [turtlebot3_msgs/Sound]
[INFO] [1531306696.069571]: Setup subscriber on motor_power [std_msgs/Bool]
[INFO] [1531306696.096364]: Setup subscriber on reset [std_msgs/Empty]
[INFO] [1531306696.390979]: Setup TF on Odometry [odom]
[INFO] [1531306696.394314]: Setup TF on IMU [imu_link]
[INFO] [1531306696.397498]: Setup TF on MagneticField [mag_link]
[INFO] [1531306696.400537]: Setup TF on JointState [base_link]
[INFO] [1531306696.407813]: --------------------------
[INFO] [1531306696.411412]: Connected to OpenCR board!
[INFO] [1531306696.415140]: This core(v1.2.1) is compatible with TB3 Burger
[INFO] [1531306696.418398]: --------------------------
[INFO] [1531306696.421749]: Start Calibration of Gyro
[INFO] [1531306698.953226]: Calibration End

SLAMノードの実行

新しいターミナルを開き、SLAMファイルを起動します。

1
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping

ヒント: 上記のコマンドを実行すると、視覚化ツールRVizも実行されます。 RVizを個別に実行する場合は、次のいずれかのコマンドを使用します。

  • $ rviz -d `rospack find turtlebot3_slam`/rviz/turtlebot3_gmapping.rviz
  • $ rviz -d `rospack find turtlebot3_slam`/rviz/turtlebot3_cartographer.rviz
  • $ rviz -d `rospack find turtlebot3_slam`/rviz/turtlebot3_hector.rviz
  • $ rviz -d `rospack find turtlebot3_slam`/rviz/turtlebot3_karto.rviz
  • $ rviz -d `rospack find turtlebot3_slam`/rviz/turtlebot3_frontier_exploration.rviz

注釈: さまざまなSLAMメソッドをサポートしています

  • TurtleBot3は、さまざまなSLAMメソッドの中で、Gmapping、Cartographer、Hector、およびKartoをサポートしています。 これを行うには、 slam_methods:= xxxxxオプションを変更します。
  • slam_methodsオプションには gmappingcartographer hectorkarto frontier_explorationが含まれ、それらの1つを選択できます。
  • たとえば、kartoを使用するには、次のようにします:
    1
    
    $ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=karto
    

注釈: SLAMパッケージの依存関係パッケージをインストールします

  • Gmappingの場合:
    Gmappingに関連するパッケージは、事前準備ページですでにインストールされています。
  • Cartographerの場合:
    1
    2
    
    $ sudo apt-get install ros-kinetic-cartographer ros-kinetic-cartographer-ros \
    ros-kinetic-cartographer-ros-msgs ros-kinetic-cartographer-rviz
    
  • Hector Mappingの場合:
    1
    
    $ sudo apt-get install ros-kinetic-hector-mapping
    
  • Kartoの場合:
    1
    
    $ sudo apt-get install ros-kinetic-slam-karto
    
  • Frontier Explorationの場合:
    Frontier Explorationはgmappingを使用しており、次のパッケージをインストールする必要があります。
    1
    
    $ sudo apt-get install ros-kinetic-frontier-exploration ros-kinetic-navigation-stage
    

今回はGmappingを使用します。

遠隔操作ノードの実行

新しいターミナルを開き、前回の実習で使用した遠隔操作ノードを実行します。 次のコマンドを使用すると、ユーザーはロボットを制御してSLAM操作を手動で実行できます。 速度の変更が速すぎたり、回転が速すぎたりするなどの激しい動きを避けることが重要です。 ロボットを使用して地図を作成する場合、ロボットは測定対象の環境の隅々までスキャンする必要があります。 きれいな地図を作成するにはある程度の経験が必要なので、SLAMを複数回練習してノウハウを作成しましょう。 マッピングプロセスを次の図に示します。

1
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
1
2
3
4
5
6
7
8
9
10
11
12
  Control Your TurtleBot3!
  ---------------------------
  Moving around:
          w
     a    s    d
          x

  w/x : increase/decrease linear velocity
  a/d : increase/decrease angular velocity
  space key, s : force stop

  CTRL-C to quit

チューニングガイド

Gmappingには、さまざまな環境のパフォーマンスを変更するための多くのパラメーターがあります。 パラメーター全体に関する情報は、ROS WiKiで入手するか、ROS Robot Programmingの第11章を参照してください。

このチューニングガイドでは、重要なパラメーターを設定するためのヒントをいくつか紹介します。 環境に応じてパフォーマンスを変更したい場合は、このヒントが役立つ可能性があり、時間を節約できます。

下記のパラメータのデフォルト値は/opt/ros/kinetic/share/turtlebot3_slam/config/gmapping_params.yamlのファイルに定義されています。rosparam setで変更することができます。

maxUrange

map_update_interval

minimumScore

linearUpdate

angularUpdate

パラメータの値を確認したい場合は:

1
$ rosparam get パラメータ名

どういうパラメータがあるかのとパラメータ名を調べるには:

1
$ rosparam list

マップの保存

すべての作業が完了したので、map_saverノードを実行してマップファイルを作成します。 マップは、ロボットのオドメトリ、tf情報、およびロボットが移動したときのセンサーのスキャン情報に基づいて描画されます。これらのデータは、前のサンプルビデオのRVizで見ることができます。作成されたマップは、map_saverが実行されているディレクトリに保存されます。ファイル名を指定しない限り、マップ情報を含むmap.pgmおよびmap.yamlファイルとして保存されます。

1
$ rosrun map_server map_saver -f ~/map

-fオプションは、マップファイルが保存されているフォルダーとファイル名を参照します。~/mapをオプションとして使用すると、map.pgmmap.yamlがユーザーのホームフォルダー~/($HOME:/home/<username>)のmapフォルダーに保存されます。

マップ

ROSコミュニティでよく使用されている2次元の Occupancy Grid Map(OGM)を使用します。 下の図に示すように、前のマップの保存セクションから取得したマップ。白色はロボットが移動可能な空き領域、黒色はロボットが動作できない占有領域です。灰色は未知の領域です。 このマップはナビゲーションで使用されます。

次の図は、TurtleBot3を使用して大きなマップを作成した結果を示しています。 移動距離が約350メートルの地図を作成するのに約1時間かかりました。

自分で作成したマップ(map.pgm)をダブルクリックで開けます。

全てのプログラムを終了

1
rosnode kill -a

roscoreを終了させるのにroscoreを起動しているターミナルでCtrl+cを押します。 下記のような表示があればroscoreが終了したことが確認できます。

1
2
3
4
5
6
^C[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor ...
... shutting down processing monitor complete
done
username@pcname:~/catkin_ws$

TurtleBot33のアプリケーションを起動するために開いたターミナルでexitを記入し、Enterキーを押すと接続を切断します。

1
2
turtlebot@turtlebot:~$ exit
username@pc_name:~$

参考文献