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
オプションにはgmapping
、cartographer
、hector
、karto
、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
- デフォルト値:3.0
- このパラメーターは、LIDARセンサーの最大使用可能範囲を設定します。
x
は新しい値を意味しています。1
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping maxUrange:=x
map_update_interval
- デフォルト値:2.0
- マップの更新間の時間(秒単位)。 これを低く設定すると、マップがより頻繁に更新されます。 ただし、より大きな計算負荷が必要になります。 このパラメーターの設定は、環境によって異なります。
1
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping map_update_interval:=x
minimumScore
- デフォルト値:50
-
スキャンマッチングの結果を考慮するための最小スコア。 このパラメーターにより、ポーズ推定のジャンプを回避できます。 これが適切に設定されている場合は、(Slamのノードが起動しているターミナルで)以下の情報を見ることができます。
1 2 3 4 5 6
Average Scan Matching Score=278.965 neff= 100 Registering Scans:Done update frame 6 update ld=2.95935e-05 ad=0.000302522 Laser Pose= -0.0320253 -5.36882e-06 -3.14142
この設定が高すぎる場合は、以下の警告が表示されます。
1 2 3
Scan Matching Failed, using odometry. Likelihood=0 lp:-0.0306155 5.75314e-06 -3.14151 op:-0.0306156 5.90277e-06 -3.14151
1
$ rosparam set /turtlebot3_slam_gmapping/minimumScore X
linearUpdate
- デフォルト値:1.0
- ロボットが移動すると、毎回スキャン処理が行われます。
1
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping linearUpdate:=x
angularUpdate
- デフォルト値:0.2
- ロボットが回転すると、毎回スキャン処理が行われます。 これをlinearUpdateよりも小さく設定することを推奨します。
1
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping angularUpdate=x
パラメータの値を確認したい場合は:
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.pgm
と map.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:~$
参考文献
- gmapping
- cartographer
- hector
- karto
- frontier_exploration