GazeboシミュレーションによるTurtlebot3の操作

ROSサポートの市販ロボットではよくあることですが、TurtleBot3には仮想ロボットでプログラミングや開発可能な環境が用意されています。 1つの方法はフェイクノードと3D視覚化ツールであるRVizを使う方法、もう一つの方法は、3-DロボットシミュレーターのGazeboを使用することです。 フェイクノードの方法では、ロボットの動きをテストすることはできますが、センサーの情報をシミュレートして取得することはできません。 SLAMなどセンサー情報の処理をテストするときは、センサーおよびカメラがのシミュレーションが使用できる物理シミュレータGazeboを使う必要があります。 この実験ではGazeboを使って端末上でロボットの操作を仮想的に実行してみましょう。

Gazeboを使ったTurtlebot3シミュレーション

実験用のUbuntu LinuxにはすでにGazeboの起動環境をインストールしてあります。 自分でセットアップしたPCでGazeboを初めて実行する場合は普段より起動に時間がかかることがあります(形状モデルや力学モデルをインターネットからダウンロードするため)。

Empty World

次のコマンドを使用して、Gazeboのデフォルト設定のWorldで、仮想TurtleBot3をテストする際に使用できます。

$ roslaunch exp3 empty_world.launch

roslaunch exp3 empty_world.launch

  • publish : joint_states, odom, scan, tf
  • subscribe : cmd_vel
  1. empty_world.launchを実行すると、設定ファイルに従ってGazeboシミュレータが実行され、設定されたTurtleBot3モデルがGazeboシミュレータに生成されます。この時読み込まれる設定ファイル(xacroとURDFファイル)に従って距離センサ(scan)、オドメトリー(odom)、関節モーターの状態(joint_states)、ロボット本体と関節部やセンサー系への座標変換(tf:transform)のトピックをpublishし、移動速度指示(平行移動速度、旋回角速度)(cmd_vel)をsubscribeします。

  2. Gazeboが起動しウィンドウが表示されたら、物理シミュレーションをスタートさせる必要があります。画面の左下のプレイボタン[▶] を押して時間をスタートさせることを忘れないようにしましょう。
  3. 次にteleop.launchを実行して画面の指示に従ってキーボードのキーを押すと、Gazeboシミュレータがteleopノードが生成した速度指令値を読み取り、シミュレータに生成されたロボットが動くことを確認できます(次節で詳述する)。

TurtleBot3 World

他にもいくつかのオブジェクトを配置したworldを読み込むことができるので、試してみましょう。 TurtleBot3 Worldは、TurtleBot3のシンボルの形状を構成するシンプルなオブジェクトで構成されているマップです。

$ roslaunch exp3 gazebo_manipulator_world.launch

TurtleBot3 House

TurtleBot3 House は住居の図面で制作されたマップです。

$ roslaunch exp3 gazebo_manipulator_house.launch

TurtleBot3 Stage4

TurtleBot3 Stage4 は壁で囲まれた迷路状のコースです。

$ roslaunch exp3 gazebo_manipulator_stage_4.launch

Gazebo上のTurtleBot3の動作指令

キー入力による遠隔操作

TurtleBot3 をキーボードでコントロールするために、新しいターミナルで下記のコマンドを使って遠隔操作を実行します。

$ roslaunch exp3 teleop.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

キーボードのキーで自由にGazebo内のロボットを動かしてみる。

roslaunch exp3 teleop.launch

teleop.launchファイルを実行して生成されたturtlebot3_teleop_keyboardノードでは、キーボードの入力を読み取って「あるトピック」に並進速度と旋回速度の各成分をpublishする。publishされたメッセージは最終的にロボット内のファームウェアに伝達されDYNAMIXELを制御するためのコマンドとして出力される。受信されたコマンドに従って車輪と接続されたDYNAMIXELが駆動し、ロボットを動かす。

障害物回避による自律走行

センサーの情報を読み取って障害物にぶつからないようにTurtleBot3を自律走行させるノードを実行できます。

$ roslaunch exp3 automove.launch

roslaunch exp3 automove.launch automove.launchファイルを実行すると、turtlebot3_gazeboパッケージのturtlebot3_driveノードを起動する。turtlebot3_driveノードはC++で書かれた自動走行指示をpublishするノードで、ソースコードはturtlebot3_gazebo/src/turtlebot3_drive.cppである。このソースファイルの中の閾値(どのくらいの距離で障害物と判定するか)や回避ロジックを変更すれば、独自の自動走行をさせることができるようになる。

ソースファイルを変更した時は、~/catkin_wsフォルダに移動して、catkin_makeコマンドを実行する必要がある。

Rvizによる情報可視化

Rvizはシミュレーションが実行されている間に発行されたトピックを視覚化します。下記のコマンドを入力し、新しいターミナルウィンドウでRVizをスタートすることができます。

$ roslaunch exp3 rviz.launch

課題2

  1. Gazeboシミュレータ(gazebo.launch)とRViz(rviz.launch)、teleop(teleop.launch)を起動してTurtlebotを適当に移動させ、その時のGazeboの画面(視点を自由に移動せよ)、RVizの画面をキャプチャしてレポートファイルに添付せよ。画面キャプチャにはgnome-screenshotコマンドを使うことができる。
    $ gnome-screenshot --area -f graph.jpg
    
  2. rosnode listコマンド、を実行してどのようなノードが起動しているか確認し、結果をレポートファイルに添付せよ。
  3. rostopic listコマンドを実行して、どのようなトピックが作られているか確認し、結果をレポートファイルに添付せよ。
  4. rostopic echoコマンドを実行して、いくつかのトピックメッセージが流れている様子を観察せよ。観察したトピック名とその内容(大量にあるので10行程度で良い)をレポートファイルに添付せよ。
  5. teleop.launchや各種コマンドを駆使して、Turtlebot3への行動命令が流れているトピックを特定せよ。そのトピック名と、メッセージの型名、メッセージの定義(rosmsg showコマンドを用いよ)をレポートファイルに添付せよ。
  6. rqt_graphコマンドを実行して、ノード・トピックの関係図を表示し、画像としてレポートファイルに添付しなさい。