遠隔操作#
まずは一番シンプルなキーボード入力による遠隔操作を試してみましょう。
操作手順#
VNCでハンズオン環境に入り、以下のコマンドを実行します。
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
すると、gazeboのワールドが立ち上がります。 そしてもう1つのターミナルを立ち上げ以下のコマンドを入力します。
ros2 run turtlebot3_teleop teleop_keyboard
上のコマンドを実行したターミナルに以下の出力がなされた場合、うまく動いています。
Control Your TurtleBot3!
---------------------------
Moving around:
w
a s d
x
w/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26)
a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82)
space key, s : force stop
w/xを押すとTurtlebot3が加減速、a/dを押すと左右旋回します。sを押すと緊急停止します。
遠隔操作の仕組み#
さて、今画面の中のTurtlebot3を操作できましたがこのときなぜTurtlebot3を遠隔操作できたのでしょう?
ROS2ではrqt_graphコマンドを使うことでノードのつながりを可視化できます。
rqt_graph
cmd_vel
トピックによってteleop_keyboard
というノードとturtlebot3_diff_drive
というノードがつながっていますね!
turtlebot3_diff_drive
ノードはgazeboのプラグインで、gazeboの世界に速度司令を送り込む役割を果たしています。
teleop_keyboard
ノードはROS2ノードでキー入力をもとに速度司令データを生成し、cmd_vel
トピックを介して速度司令を送っています。
次に、cmd_vel
トピックにどんなデータが流れているのか観察してみましょう。
ハンズオン環境でもう1つターミナルを立ち上げます。
ros2 topic echo /cmd_vel
立ち上げたターミナルに上記のコマンドを入力してみてください。
これでcmd_vel
トピックにどのようなデータが流れているのかがわかりました。
しかし、これではデータがどのように時系列で変化したかという情報はわかりません。
rosにはそのような要望に答えるGUIツールがあります。
ハンズオン環境でもう1つターミナルを立ち上げます。
rqt
立ち上げたターミナルに上記のコマンドを入力してみてください。
するとGUIが開きますので、plugins -> visualization -> plotの順番に選択します。
グラフのような画面が出てきたら、topic欄に下記の文字列を入力します。
/cmd_vel/linear/x
その後、+
ボタンをクリックします。
さらにtopic欄に下記の文字列を入力します。
/cmd_vel/angular/z
入力が終わったら+
をクリックしてください。
/cmd_vel
のあとについてくる/linear/x
や/angular/z
ってなんだよ?と思われるかと思いますが、それはcmd_vel
トピックがgeometry_msgs/msg/Twist
型という型を持っているからです。
geometry_msgs/msg/Twist
型はここで構造が定義されており、この構造に従ったデータしか受け付けません。
つまり/cmd_vel/x
という値は存在しませんのでそこに値をsetしたりgetできません。
これによってROSを使うと他の人と共同開発する際の意思疎通の失敗により結合ができなくなるリスクを大きく下げることができます。