ROS 2 実践コース|#F1 班で設計して、ひとりずつ作る(総合制作の前半)

延長コース F は総合制作です。受けたコースで作ったノードを組み合わせて、班で 1 つの振る舞いを作ります。

たとえば「前に物が近づいたら止まり、空いている向きへ向き直してから進む」(/scan を使う)、「体が大きく傾いたら止まって、そのことを知らせる」(/imu で始まるトピックを使う)といったものです。どれも、1 人では 2 週では作れません。分担して作り、あとでつなぎます。

いまのロボットが出しているのは、/scan・/imu で始まるトピック・/joint_states などです。カメラの画像や /odom はまだ出していません。カメラ(コース C)や Nav2(コース E)を使いたい班は、受けたコースの範囲で、記録データやシミュレーションの中で作ります。

先に決めるのは、トピックの名前・型・周期・単位。それさえ合っていれば、別々に作れる
先に決めるのは、トピックの名前・型・周期・単位。それさえ合っていれば、別々に作れる

この記事の位置

項目内容
コース延長コース F「総合制作」(2 週・回 F1〜F4)
この記事第 1 週(回 F1・F2)
前に受けるコース延長コースのうちどれか 1 つ(A〜E)
ロボットこの週は出しません。記録データだけで作ります
この週で身につけること分担して作れる形に設計を割ること

この記事は延長コース Fの 2 回分(F1・F2)です。授業で受ける人は、記録を実習レポート(Word)の「回 F1」「回 F2」のシートに分けて書きます。スクリーンショットは、シートの中の「画面:」の欄(実験の表のすぐ下)に貼ります。延長コースのレポートは、コア(第 1〜12 回)とは別の 1 本にします。ファイルは Google Classroom で配られ、コースの最後に Google Classroom で 1 回だけ出します。期限は最後の実習から 1 週間後の 23:59 です。ひとりで学ぶ人も、予想と結果を同じ形でノートに残しておくと、あとで見返せます。

回 F1 班で設計する

班の設計シート(1 枚にまとめる)

  つくる振る舞い:
  ノードの図:誰が何を出し、誰が受けるか(矢印つき)
  トピックの表:名前 / 型 / 周期 / 単位 / 見つからないときの値
  止める条件:何がどうなったら止めるか。どの層で止めるか
  試験計画:段階 1(記録データ)/ 段階 2(机の上)/ 段階 3(床)で、それぞれ何を確かめるか
  担当:誰がどのノードを作るか

F1-1 ノードの図を描く

ここでは、班で作る振る舞いを、知覚・判断・行動のノードに分けて図にします。

まず、誰が何を出し、誰が受けるかを図にします。知覚・判断・行動に分けるのは、コアの #12 でやったとおりです。この形にしておくと、分担しやすくなります。

役割やること出すもの
知覚センサーの値から、意味のある数を出す距離、位置、有無など
判断その数から、どうするかを決める止まる・進む・向きを変える
行動決まったことを指令にするcmd_vel への指令(試すあいだは -r cmd_vel:=/cmd_vel_test でつなぎ替える)

F1-2 トピックの表を埋める

ここでは、ノードとノードのあいだを流れるトピックを 1 本ずつ表にします。

名前・型・周期・単位、そして見つからないときの値まで決めます。ここが、この 2 週でいちばん大事なところです。ここが決まっていれば、中身は別々に作っても必ずつながります。決まっていなければ、つなぐ日に必ず食い違いが出ます。

表は次の形にします。1 行目は、知覚のノードが前方の距離を出す場合の書き方の例です。名前(/front_distance)は例なので、自分たちで決めた名前に置き換えます。

名前型周期単位見つからないときの値出す人 → 受ける人
(例)/front_distancestd_msgs/msg/Float325 Hzm-1.0(前に何も見えないとき)知覚 → 判断
欄書くこと
名前トピックの名前。/ から書く。班の中で同じ名前を 2 つの意味に使わない
型ros2 interface show で中身を見られる型の名前。例では、数を 1 つだけ入れる Float32
周期1 秒に何回出すか。例は、ロボットから PC に届く /scan の回数(5 Hz)に合わせた
単位数の単位。m か cm か、度かラジアンかを必ず書く
見つからないときの値入力が無い・何も見えないときに出す値。例の -1.0 は、距離としてありえない値なので「見えていない」と区別できる。0 にすると「目の前にある」と区別できない
出す人 → 受ける人どのノードが出し、どのノードが受けるか。F1-1 の図の矢印と同じになる

延長コース A を受けた人は、自作のメッセージ型を使ってもかまいません。ただし、班の全員が ros2 interface show でその型を見られる状態にしておきます。

F1-3 止める条件と、試験計画を書く

ここでは、止める条件と、段階 1〜3 の試験計画を書きます。

止める条件は、どの層で止めるかまで書きます。自分たちのノードで止めるのか、安全層に任せるのか。延長コース D を受けた人は、回 D3 で見た層の図がそのまま使えます。

試験計画は、段階 1(記録データ)・段階 2(机の上)・段階 3(床)で、それぞれ何が見えたら合格とするかを先に書きます。あとから「なんとなく動いた」で済ませないためです。

F1-4 担当を決める

ここでは、誰がどのノードを作るかを決めます。

1 人 1 ノードを基本にします。作る量が違っても、そろえようとしなくてかまいません。作るものが小さい人は、つなぐ日の検証を多めに受け持ちます。

この回で撮っておく画面

動画は撮りません。そのかわり、下の画面を撮って残します。授業で受ける人は、実習レポートの「回 F1」の、それぞれの「画面:」の欄に貼ります。ひとりで学ぶ人も、同じ画面を残しておくと、あとで値を見直せます。最初の 1 枚は、実習を始める前に端末で TZ=Asia/Tokyo date と打ち、日付と時刻が出た画面です。授業の日に実習したことの記録になります。講義用の環境の時計は世界標準時(UTC)なので、TZ=Asia/Tokyo を付けて日本時間で出します。

  • TZ=Asia/Tokyo date(回の頭)
  • ノードの図(写真)(実験 F1-1 の欄)
  • トピックの表(写真)(実験 F1-2 の欄)
  • 止める条件と層の図(写真)(実験 F1-3 の欄)
  • 試験計画(写真)(実験 F1-3 の欄)
  • 担当の表(写真)(実験 F1-4 の欄)

本質の問い(回 F1)

  • 別々の人が作ったノードが、つないだときに必ずつながるようにするには、何を先に決めておく必要があるか。自分の班の設計で説明しなさい。
考え方のすじ道(答えを書いてから開く)

コアの第 1 週から繰り返してきた話です。インターフェースは契約。名前・型・周期・単位が合っていれば、中身を誰が書いてもつながります。

見落としやすいのは、名前と型より先に単位と見つからないときの値です。距離が m なのか cm なのか。見つからないときに 0 を送るのか、何も送らないのか。ここが食い違うと、つないだ日に動きません。

レポートには、自分の班で実際に決めた表を載せ、「どこで食い違いそうだったか」も書いてください。回 F3 で、実際に食い違ったかどうかが分かります。

回 F2 各自が担当のノードを作る

この回は、各自が担当のノードを作り、記録データだけで単体の検証をします。

  1. F2-1 自分のノードを、設計シートどおりに作ります(AI に書かせてかまいません)。
  2. F2-2 記録データだけで単体の検証をします。入力を記録から与え、出力を ros2 topic echo で見ます。
  3. F2-3 設計シートの表と、ros2 topic info -v の結果を並べて確かめます。
  4. F2-4 入力が来ないとき・おかしな値のときに、何を出すかを確かめます。
# 自分のノードだけを、記録データで動かす
ros2 bag play room_scan --loop
ros2 topic echo /(自分が出すトピック)

# 設計シートどおりかを確かめる
ros2 node info /(自分のノード)
ros2 topic info -v /(自分が出すトピック)
打つもの意味
ros2 bag play room_scan --loopコアの #10 で記録した room_scan を、くり返し流す。ロボットの代わりに /scan などが出る。記録を置いたフォルダ(#10 では ~/bags)で打つ。シミュレーションで作る班は、記録の代わりにシミュレーションを起動する
ros2 topic echo /(自分が出すトピック)自分のノードが出している値を見る
ros2 node info /(自分のノード)自分のノードが何を受け、何を出しているかの一覧。設計シートの矢印と比べる
ros2 topic info -v /(自分が出すトピック)型と、出す側・受ける側の数を見る。設計シートの型と比べる

この時点でロボットには出しません。班の全員がそろっていなくても、記録データがあれば自分のところは進められます。コアの #10 でやったことが、ここで効いてきます。

判断のノードだけを動かしたところ。左下から入力を与え、右上に出ている値(true/false)、右下に ros2 topic info -v の結果を並べて、設計シートと突き合わせる
判断のノードだけを動かしたところ。左下から入力を与え、右上に出ている値(true/false)、右下に ros2 topic info -v の結果を並べて、設計シートと突き合わせる
確かめること結果
設計シートどおりの名前・型・周期で出ているか
入力が来ないとき、何を出すか
おかしな値(範囲外)が来たとき、何を出すか
自分のノードだけで、止まる側に倒れるか

最後の行が大事です。つないだときに相手が動かなくても、自分のノードは危なくない側に倒れるか。全員がこれを確かめてあれば、つなぐ日の事故が減ります。

見本を見る(自分のノードで確かめてから開く)
知覚のノードだけを止めたところ。判断は「入力が来ていません。止まれにします」と出し続け、右の指令は 0.0 のまま動かない。これが「止まる側に倒れる」ということ
知覚のノードだけを止めたところ。判断は「入力が来ていません。止まれにします」と出し続け、右の指令は 0.0 のまま動かない。これが「止まる側に倒れる」ということ

この回で撮っておく画面

動画は撮りません。そのかわり、下の画面を撮って残します。授業で受ける人は、実習レポートの「回 F2」の、それぞれの「画面:」の欄に貼ります。ひとりで学ぶ人も、同じ画面を残しておくと、あとで値を見直せます。最初の 1 枚は、実習を始める前に端末で TZ=Asia/Tokyo date と打ち、日付と時刻が出た画面です。授業の日に実習したことの記録になります。講義用の環境の時計は世界標準時(UTC)なので、TZ=Asia/Tokyo を付けて日本時間で出します。

  • TZ=Asia/Tokyo date(回の頭)
  • 自分のノードの ros2 node info(実験 F2-1 の欄)
  • 記録を流したときの ros2 topic echo(実験 F2-2 の欄)
  • ros2 topic info -v と設計シートの比較(実験 F2-3 の欄)
  • 入力が来ないときの出力(実験 F2-4 の欄)
  • 範囲外の値を入れたときの出力(実験 F2-4 の欄)

つまずきやすい点

症状見るところ
設計が大きすぎて終わらないできることを 1 つに絞る。回 F3 でつなぐ時間を残しておく
担当の境目でもめるトピックの表に戻る。境目はトピックであって、人ではない
記録データに自分の入力が無い先生に相談して、必要なトピックを含む記録を用意する
単体では動くが不安入力が来ないときの動きを確かめたか。ここを飛ばすと、つなぐ日に困る
自作の型が相手から見えない同じパッケージをビルドしているか。ros2 interface show で確かめる

まとめ

やったことわかったこと
班で設計する境目はトピック。そこが決まれば分担できる
単位と「見つからないとき」を決める食い違いは、たいていここで起きる
止める層を決める止める仕組みは、後から足すものではない
記録データで単体検証全員がそろわなくても、自分のところは進められる

次の #F2 では、つないで、机の上で確かめて、最後に床で動かして発表します。

トップへ戻る