Skip to content

ROSを用いたマップ取得#

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

TurtleBot3を起動#

roscore、sshはリモートPCで実行をお願いします.

roscoreを実行します.

roscore

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

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

ssh ubuntu@192.168.xxx.xxx

NOTE 1: The IP 192.168.xxx.xxx is your Raspberry Pi’s IP or hostname.
NOTE 2: パスワードはturtlebotです.

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

こちらのコマンドはsshしているターミナル上で実行お願いします.

roslaunch turtlebot3_bringup turtlebot3_robot.launch

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

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /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ノードはTB3搭載のボードではなくリモートPCで実行します.

Turtlebot3関連のパッケージが未インストールの場合は、こちらを参考にインストールしてください.

新しいターミナルを開き、SLAMを実行するlaunchファイルを起動します.

roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping

もし、実行時に以下のようなエラーが発生した場合、

RLException: Invalid <arg> tag: environment variable 'TURTLEBOT3_MODEL' is not set. 

Arg xml is <arg default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]" name="model"/>
The traceback for the exception was written to the log file

お持ちのTurtlebot3の名称に合わせてTURTLEBOT3_MODEL環境変数を以下の中から選択して設定してください.(burger, waffle, waffle_pi)

export TURTLEBOT3_MODEL=burger

その他にも以下のようなエラーが発生した場合、

ERROR: cannot launch node of type [gmapping/slam_gmapping]: gmapping
ROS path [0]=/opt/ros/melodic/share/ros
ROS path [1]=/opt/ros/melodic/share
このエラーはgmmpingがインストールされていないことで発生しています. ですので、このエラーは以下のコマンドでgmappingをインストールすることで解決します.

sudo apt update && sudo apt install 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オプションにはgmappingcartographerhectorkartofrontier_explorationが含まれ、それらの1つを選択できます. - たとえば、kartoを使用するには、次のようにします

roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=karto

注釈: SLAMパッケージの依存関係パッケージをインストールします - Gmappingの場合:
Gmappingに関連するパッケージは、事前準備ページですでにインストールされています.

  • Cartographerの場合:

    sudo apt-get install ros-melodic-cartographer ros-melodic-cartographer-ros \
      ros-melodic-cartographer-ros-msgs ros-melodic-cartographer-rviz
    

  • Hector Mappingの場合:

    sudo apt-get install ros-melodic-hector-mapping
    

  • Kartoの場合:

    sudo apt-get install ros-melodic-slam-karto
    

  • Frontier Explorationの場合
    こちらのパッケージはmelodicにおいてはソースコードからのビルドが必要です.

    mkdir -p catkin_ws/src
    cd catkin_ws/src
    sudo apt install git googletest
    catkin_init_workspace
    git clone https://github.com/paulbovbel/frontier_exploration.git
    rosdep update
    rosdep install -iry --from-paths .
    cd ../
    catkin_make
    

上のスクリプトの内部で出てきたrosdepコマンドはapt等をラップしたrosのコマンドラインツールで ROSパッケージにあるpackage.xmlをパースしパッケージが依存しているパッケージを列挙、インストールしてくれます.

NOTE: 今回はGmappingを使用します.

遠隔操作ノードの実行#

遠隔操作ノードはTB3搭載のボードではなくリモートPCで実行します.

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

roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
  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章を参照してください.

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

NOTE: 下記のパラメータのデフォルト値は$(rospack find turtlebot3_slam)/config/gmapping_params.yamlのファイルに定義されています.

  • maxUrange
  • デフォルト値:3.0
  • このパラメーターは、LIDARセンサーの最大使用可能範囲を設定します.

  • map_update_interval

  • デフォルト値:2.0
  • マップの更新間の時間(秒単位). これを低く設定すると、マップがより頻繁に更新されます. ただし、より大きな計算負荷が必要になります. このパラメーターの設定は、環境によって異なります.

  • minimumScore

  • デフォルト値:50
  • スキャンマッチングの結果を考慮するための最小スコア. このパラメーターにより、ポーズ推定のジャンプを回避できます. これが適切に設定されている場合は、(SLAMのノードが起動しているターミナルで)以下の情報を見ることができます.

    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
    

    この設定が高すぎる場合は、以下の警告が表示されます.

    Scan Matching Failed, using odometry. Likelihood=0
    lp:-0.0306155 5.75314e-06 -3.14151
    op:-0.0306156 5.90277e-06 -3.14151
    
  • linearUpdate

  • デフォルト値:1.0
  • ロボットが移動すると、毎回スキャン処理が行われます.

  • angularUpdate

  • デフォルト値:0.2
  • ロボットが回転すると、毎回スキャン処理が行われます. これをlinearUpdateよりも小さく設定することを推奨します.

パラメータを編集するために:

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

rosparam list

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

rosparam get パラメータ名

マップの保存#

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

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)をダブルクリックで開けます.

全てのプログラムを終了#

rosnode kill -a

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

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

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

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

参考文献#