延長コース 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_distance | std_msgs/msg/Float32 | 5 Hz | m | -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 各自が担当のノードを作る
この回は、各自が担当のノードを作り、記録データだけで単体の検証をします。
- F2-1 自分のノードを、設計シートどおりに作ります(AI に書かせてかまいません)。
- F2-2 記録データだけで単体の検証をします。入力を記録から与え、出力を
ros2 topic echoで見ます。 - F2-3 設計シートの表と、
ros2 topic info -vの結果を並べて確かめます。 - 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 でやったことが、ここで効いてきます。
| 確かめること | 結果 |
|---|---|
| 設計シートどおりの名前・型・周期で出ているか | |
| 入力が来ないとき、何を出すか | |
| おかしな値(範囲外)が来たとき、何を出すか | |
| 自分のノードだけで、止まる側に倒れるか |
最後の行が大事です。つないだときに相手が動かなくても、自分のノードは危なくない側に倒れるか。全員がこれを確かめてあれば、つなぐ日の事故が減ります。
見本を見る(自分のノードで確かめてから開く)
この回で撮っておく画面
動画は撮りません。そのかわり、下の画面を撮って残します。授業で受ける人は、実習レポートの「回 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 では、つないで、机の上で確かめて、最後に床で動かして発表します。


