Windows で ROS2 のシミュレーションを行う (6)
TurtleBot3 でナビゲーションを行う

前ページで作成した地図を用いて、TurtleBot3 のナビゲーションを行ってみよう。
シミュレータ上で指定した位置に TurtleBot3 が自動で移動するようになる。

TurtleBot3 のナビゲーション

これまで通り、ターミナルの一つのタブで以下のコマンドを実行し、仮想空間における TurtleBot3 のシミュレーションを開始しよう。
Gazobo のシミュレータが起動する。
 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
次に、ターミナルで新しいタブを開き、ナビゲーションを行うための以下のコマンドを実行する。
ホームディレクトリ ($HOME) 上の地図 (map.yaml) が読み込まれていることに注意。
もちろん、前ページで作成されたものである。
 ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME/map.yaml
すると、RViz 上に白い地図と、TurtleBot3 の初期位置を表す赤と緑(と青)の座標軸が表示される。
地図と座標軸のどちらかが表示されない場合、二つのアプリケーションを Ctrl-c で終了し、
turtlebot3_gazebo から実行し直して欲しい。



なお、上の画像はマウスで表示位置や角度を変更している。前ページと同様、以下の操作を用いている。 ここまでを確認したら、次は地図内の TurtleBot3 の正しい位置をマウスで指定しよう。下図のように 「2D Pose Estimate」ボタンをクリックし、
その後 TurtleBot3 の正しい自己位置を することで指定する。このシミュレータの場合、赤と緑(と青)の座標軸の赤い線に沿って指定すれば良いだろう。



下図のような表示に変わる。地図上に薄い色で表示されているものを Global Costmap、
TurtleBot3 の周囲に濃い色で表示されているものを Local Costmap という。
Costmap とは、その場所を TurtleBot3 が通れるどうか、そこが障害物かどうかを数値で表現したものである。



いま、TurtleBot3 の初期位置を手動で設定したので、Global Costmap と Local Costmap は微妙にずれていることがわかる。
例えば、9 本の柱に着目すれば、 Global Costmap の黒で表現された柱と、Local Costmap のピンクで表現された柱がずれている。

ここで、ターミナルの新しいタブでキー操作用のノードを起動し、TurtleBot3 を少し操作すると、これらは徐々に一致していく。
試してみよう。ターミナルの新しいタブで以下のコマンドを実行する。
 ros2 run teleop_twist_keyboard teleop_twist_keyboard
下図は、TurtleBot3 その場で二回転させた様子である。
TurtleBot3 の自己位置が正しく認識され、Global Costmap と Local Costmap が自動的に揃ったことがわかる。
キー操作用のプログラムを実行したターミナルにフォーカスが合っていることにも注意すること。

なお、自己位置が正しく認識されるに伴い、Amcl Particle という緑色の細かな矢印の存在範囲がより密集してきていることもわかるだろう。
これは、TurtleBot3 が存在する確率が高い領域を表現している。



なお、もしキー操作を入力しても TurtleBot3 が動かない場合、
全てのアプリケーションを Ctrl-c で終了し、turtlebot3_gazebo から実行し直さねばならないことが多い。
どうもこのページで体験するナビゲーションは、シミュレーションとの相性が悪いようである。

さて、以上の状態になったら、まず、k キーを押して TurtleBot3 の動きを止める。
そして、キー操作を受け付けるノードを起動したタブで Ctrl-c を実行し、キー操作を終了しよう
そうしないと、以下のナビゲーションは実行できない。

そして、次図のように「Navigation2 Goal」ボタンを押し、 マウスのドラッグにより、TurtleBot3 の目標到達地点を設定しよう。
矢印は、最後に TurtleBot3 が向くべき方向を表す。

このとき、このナビゲーションとシミュレーションの相性が悪いことを踏まえ、以下に注意して目標地を定めるのが良いかも知れない。

うまくいけば、下図のように動作の計画が立てられ、TurtleBot3 がそれに従って動き始める。
TurtleBot3 が動かない場合、キー操作用のノード teleop_twist_keyboard を終了させていない可能性がある。
しかし、teleop_twist_keyboard が終了していても TurtleBot3 が動きださないケースは多い。
その場合、やはり全てのアプリケーションを Ctrl-c で終了し、turtlebot3_gazebo から実行し直さねばならないことが多い。

やはり、これもナビゲーションとシミュレーションとの相性が悪いためであるので、
そこは割り切って「うまく体験できればラッキー」くらいの気持ちで取り組んで欲しい。
なお、TurtleBot3 の実機を使った場合は、ナビゲーションは正常に動作すると思う。

恐らく、最新の navigation2 パッケージを自分でダウンロードしてビルドすればシミュレーションでも安定して動作すると思われるが、
そうするとディスクが 14GB では足りなくなるし、ビルドの時間もかなりかかるので本ページでは取り扱わない。



TurtleBot3 が目標地に到達して TurtleBot3 が静止した様子が下図である。



もし、TurtleBot3 が調子良く動いている場合、目標を色々な場所に設定してナビゲーションを繰り返してみよう。
下図は TurtleBot3 が調子が良く動いている様子である。
目標地を設定しても TurtleBot3 が動作しなくなったら、恐らく turtlebot3_gazebo からの再実行が必要である。



なお、いつも通り、新たなタブで下記コマンドを実行してノード間の関係を表示すると下図のようになる。
 ros2 run rqt_graph rqt_graph
「Nodes only」の場合。



トピックも表示した場合。非常に規模の大きなプログラムであることがわかる。





おわりに

以上で、用意した ROS2 の演習は終了である。

この演習では約 14 GB のストレージを消費した。
削除したい場合は、まず下図のように Virtual Box マネージャーで ubuntu 20.04 を右クリックして「除去」を選択する。
そして、現れたウインドウで「すべてのファイルを削除」をクリックすること。
そうしないと 14 GB の領域が消えずに残ってしまう。



その後、VirtualBox を削除すれば良い。



前のページ「Windows で ROS のシミュレーションを行う (5) TurtleBot3 で地図を作成する

トップページに戻る