Skip to content

遠隔操作#

まずは一番シンプルなキーボード入力による遠隔操作を試してみましょう。

操作手順#

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

Not Found

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を使うと他の人と共同開発する際の意思疎通の失敗により結合ができなくなるリスクを大きく下げることができます。


Last update: October 17, 2023