今のままではカメが真ん中に表示されているだけです。
「キーボードの入力をカメに伝えるノード」を別に立ち上げて、カメを動かしてみましょう。
まず別の新しいターミナルを開きます(元のターミナルは閉じないでください)。
矩形移動ノードの起動
まずは、カメを矩形で動かしてみます
ros2 run turtlesim draw_square
上記のコマンドを動かしていると、亀は矩形を描いてくれます。
ターミナルには以下のメッセージが表示されています。
[INFO] [1772575562.555887783] [draw_square]: New goal [7.544445 5.544445, 0.000000]
[INFO] [1772575564.476535022] [draw_square]: Reached goal
[INFO] [1772575564.476578480] [draw_square]: New goal [7.448444 5.544445, 1.570796]
[INFO] [1772575568.412361665] [draw_square]: Reached goal
[INFO] [1772575568.412416248] [draw_square]: New goal [7.466837 7.544360, 1.561600]
[INFO] [1772575570.347997782] [draw_square]: Reached goal
[INFO] [1772575570.348126074] [draw_square]: New goal [7.465954 7.448364, 3.132396]
[INFO] [1772575574.283041039] [draw_square]: Reached goal
[INFO] [1772575574.283107831] [draw_square]: New goal [5.466292 7.485147, 3.123200]
[INFO] [1772575576.252312492] [draw_square]: Reached goal
[INFO] [1772575576.252372492] [draw_square]: New goal [5.546279 7.483676, -1.589188]
[INFO] [1772575580.188284615] [draw_square]: Reached goal
[INFO] [1772575580.188381407] [draw_square]: New goal [5.491108 5.484437, -1.598385]
[INFO] [1772575582.124366554] [draw_square]: Reached goal
[INFO] [1772575582.124424929] [draw_square]: New goal [5.493756 5.580400, -0.027589]
[INFO] [1772575586.060208665] [draw_square]: Reached goal
[INFO] [1772575586.060250790] [draw_square]: New goal [7.492404 5.506846, -0.036785]
[INFO] [1772575587.996450743] [draw_square]: Reached goal
[INFO] [1772575587.996497910] [draw_square]: New goal [7.396468 5.510377, 1.534011]
[INFO] [1772575591.933130384] [draw_square]: Reached goal
[INFO] [1772575591.933257426] [draw_square]: New goal [7.488399 7.508264, 1.524815]
[INFO] [1772575593.868163639] [draw_square]: Reached goal
[INFO] [1772575593.868213306] [draw_square]: New goal [7.483986 7.412365, 3.095611]
[INFO] [1772575597.803921139] [draw_square]: Reached goal
[INFO] [1772575597.803972847] [draw_square]: New goal [5.487030 7.522665, 3.086415]
[INFO] [1772575599.739053323] [draw_square]: Reached goal
[INFO] [1772575599.739109739] [draw_square]: New goal [5.582884 7.517370, -1.625973]
キーボード操作ノードの起動
操作用のノードはこれです:
ros2 run turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use g|b|v|c|d|e|r|t keys to rotate to absolute orientations. 'f' to cancel a rotation.
'q' to quit.
カメを動かす!
-
turtle_teleop_keyを実行した方のターミナルをクリックして、アクティブな状態にします - キーボードの 矢印キー(↑ ↓ ← →) を押します
- 画面上のカメが線を引きながら動き始めます!
- 上下キーで前後に進む
- 左右キーで方向を変える
ROS 2の仕組み
-
/turtlesimノード- カメの描画担当
-
/teleop_turtleノード- キーボードの入力を読み取る担当
-
Topic(トピック)
- 2つのノードの間を流れるデータ
- 今回は、
/turtle1/cmd_velという名前のトピックを通して、「右にこれくらい回れ」「前にこれくらい進め」という命令が送られています
トピックの確認
カメを動かしている間に、さらにもう一つターミナルを開いて、以下のコマンドを打ってみてください。
ros2 topic list
いま、システムの中でどんな「道路(トピック)」が使われているかの一覧が見られます。
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
トピックの中身をリアルタイムで表示する
カメが動いている裏側で、どんな命令(数値)が飛び交っているのか覗いてみましょう。
新しいターミナルを開き、以下のコマンドを入力してください。
ros2 topic echo /turtle1/cmd_vel
このコマンドを打つと、ターミナルが待機状態になります。その状態で、**カメを操作していたターミナル(turtle_teleop_key を動かしている方)**をクリックして、矢印キーでカメを動かしてみてください。
エコー(echo)しているターミナルに、以下のような数字が表示されます。
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -2.0
---
これは何を意味している?
-
linear x: 前進・後退のスピードです。 -
angular z: 回転のスピード(ラジアン/秒)です。 - キーを押した瞬間に、操作ノードがこの「数値データ」をトピックに投げ、カメのノードがそれを受け取って画面上の位置を計算している、というわけです。
データの「型」を確認する
ROS 2では、やり取りするデータの形式(メッセージ型)が決まっています。以下のコマンドを打ってみてください。
ros2 topic info /turtle1/cmd_vel
すると、Type: geometry_msgs/msg/Twist と表示されます。これは「速度を扱うための標準的なパッケージの、Twistという型を使っているよ」という意味です。
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1
【おまけ】コマンドでカメを動かす
キーボードではなく、コマンドラインから直接「動け!」と命令を送ることもできます。
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 5.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
これを実行すると、カメがシュパッと円を描いて動きます。
-
--once: 1回だけ送る。 -
"{...}": 送りたい数値データ(JSON形式)
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=5.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))


