Twinclue's Blog

RoboCup Junior Rescue Mazeに参加するTwinclueのブログ

関東ブロック出場機体解説

ごきげんよう。今回の記事では、関東ブロックに出場したロボットの解説を行います。中心的な情報はプレゼンポスターにある程度まとまっていますので、これを補足する形で以下をご参照ください。

drive.google.com

ハードウェア

概要

今回の機体はレーザーカッターで切断したMDFと3DプリントしたPLAの部品を主に使用しています。部品同士の固定にはネジとインサートナットを用いています。
駆動モジュールとバンパー、モーター駆動回路からなる駆動層、メイン基板とToFセンサ基板が配置されたメイン層、UI基板とレスキューキット排出機構、被災者検知基板、バッテリ取付口から成る上層の3つの層で構成されています。 これら3つの層は後述するコンセプトにより、容易に分解し、"三枚おろし"にすることが可能になっています。

コンセプト

今回のハードウェアにおけるコンセプトは、「『高安定性』『高メンテナンス性』を持つ」です。

高安定性

Mazeは8分間の時間制限の中で障害物や段差などのある迷路内を走り続け、被災者を発見するレスキュー競技です。そのため、レスキューする側がレスキューされる必要のある事態(=競技進行の停止)はあってはなりません。よって、スタックや故障が絶対に発生せず、迷路の1タイル1タイルを確実に進み続ける事のできる安定性を求めました。
高安定性を目指した設計により、結果的に2cmのバンプを物ともせず、ルールに規定される坂の角度よりもきつい角度の坂も余裕で登り切ることのできる機体となりました。

高メンテナンス性

経験上、ロボット競技での故障は、機体を一部分解してのメンテナンスや調整時が最も発生しやすいと考えています。 そこで、メンテナンスや調整時に故障しにくくなるような工夫を各所に行いました。 主な工夫は大胆なモジュラー構造です。f:id:Twinclue:20220331132414p:plain また、このモジュラー構造を取り入れたことにより、部分的な構造変更や改良も容易に行うことができるようになりました(実際に、大会直前に駆動モジュールのみ大きく構造変更を行いました)

駆動モジュール

前述したとおり、駆動モジュールは大会の直前に大きく構造変更をしました。この記事では変更後の駆動モジュールについて説明します。
今回使用したモーターはMaxon RE 16 グラファイトブラシ 4.5W 12V + GP16A 19:1です。 (これまでに使用していたモーターを、予備含めて壊してしまい、新規で調達する時間的余裕がなかったため、Kossanの手元にあったものを応急的に使用しました。)
モーター回転数が、最大連続トルク時でも11900RPMで、19:1のギヤヘッドを噛ませたとしても速すぎるため、ここから更に減速する必要がありました。そのため、ウォームギヤによる減速機構を採用しました。 f:id:Twinclue:20220331132608p:plain モーターの全長が長い点や、メイン基板へのアクセスが必要な点などから、モーターを各軸斜め、互い違いに配置したことで、このようなインパクトの強い見た目になってしまいました。(もっとスマートな方法があったのでは……という気がしてなりません)

レスキューキット排出機構

できるだけ飛び出す部分を減らし、かつ補充を容易にするため、以下の図のように下から押し上げて左右に振り分ける構造としました。
かなりきれいにまとめることができたのですが、レスキューキットを上に押し上げるためのゴムを取り付けるのがやや難しくなってしまいました…… f:id:Twinclue:20220331132938p:plain

回路

このロボットには7種類9枚の自作基板が使われています。

f:id:Twinclue:20220204214932p:plain
基板の配置

I2C配線保護の詳細

 今回の機体はToFセンサが前後方にそれぞれ5個配置されていて、5個ごとにI2CマルチプレクサPCA9547Dに接続されています。この基板は同じものが2枚使われており、それぞれがケーブルを介してメイン基板に接続されています。ToFセンサをメイン基板に接続する方法は何種類も検討しましたが、電子部品間の配線長を軒並み短くできるこの形を選びました。各基板上においても、片面に集めたI2C線をできる限りGNDパターンで囲うアートワークにして通信の安定化を狙いました。(←実はこの効果をちゃんと検証できてないのですが、波形が綺麗で通信も失敗してないのでヨシ!👈🐱)

f:id:Twinclue:20220204215930p:plain
ToF基板

被災者検出基板

f:id:Twinclue:20220204190323j:plain  Maze競技には熱を持つ被災者、文字をもつ被災者と色を持つ被災者がありますが、それらの検出を担う部品が全て接続される基板を製作しました。この基板にはカメラセンサOpenMV M7と温度センサD6T-1A-01の他に、カメラによって制御される白色LEDとカメラ操作用のスイッチがあります。この基板は左右に1つずつあり、カメラセンサと温度センサはそれぞれ別の通信を用いてメインマイコンに直接接続されています。この構成は被災者を任意のタイミングで検出することに難があったため、現在製作中の基板では新たに追加するサブマイコンに接続されています。

電源管理

バッテリはバッテリボックスと一体化した基板に接続されており、同基板のヒューズ、ロッカースイッチ、簡易電圧計を用いて簡単な電池の管理が行われます。そこから電力供給を受けるメイン基板はモーターを含む他の基板への電源供給も兼ねており、バッテリの過電圧保護機能を含んでいます。このロボットでは電圧センサを専用マイコンATtiny85-20PUで読み取り、バッテリ電圧が閾値を下回ったところで電源を遮断する設計になっています(ここあたりの設計をミスりまくったのが悲しい)。しかし大きな電流が流れた際の電圧降下を推定できない仕様であったため、次の基板では電流センサも使用する予定です。

LED

某競技と違って基本的にどんなにLED光らせても違反にはならないので、各基板の状態表示やUIとしてLEDを多めに載せました。床の色(白/黒/銀)を検知する基板とUI基板には、NeoPixelシリーズなどに使われるWS2812を採用しました。数珠繋ぎにすることで1ピンの信号で全て制御できるため、今後の拡張性が高まることを期待しました。またメイン基板に存在する複数の直流電源はそれぞれにLEDをつけました。電源周りのトラブルシューティングに役立った反面、光が壁に当たって被災者検知に支障をきたした可能性があります。

ソフトウェア

迷路探索

迷路探索は、右側の壁にできるだけ沿って進みつつ、到達回数が少ない方向があればそちらを優先して探索する”拡張右手法”を採用しています。
拡張右手法は比較的かんたんに実装ができ、探索できない地点が生まれないのがメリットです。一方、「未到達の点へ最短経路で到達する」といった機能はないため、マップの形状によっては無駄な走行時間が多く発生することがあります。
"到達回数が少ないほうがあれば~"を達成するために、各座標における到達回数などを記録する必要がありますが、Twinclueではこれを一次元配列に格納しています。
また、これにより消費するRAM領域の削減や処理の簡略化に成功しています。

画像認識

画像認識は、各被災者をいくつかの特徴によって分類し、それらの特徴の組み合わせによって判別しています。 判断のための特徴と組み合わせは次の図のとおりです。

f:id:Twinclue:20220321185848p:plain
画像認識時の被災者分類テーブル
まず被災者を色(緑・黄・赤・黒)で分別します。緑・黄・赤のうちどれかであれば、その時点で被災者の種類が確定します。 黒であったとき、円とみなせる部位と直線とみなせる部位をそれぞれカウントし、その個数本数によってH・S・Uの分別をします。
その後、その被災者に対応した落とすべきレスキューキットの数をメインマイコンへと送信しています。

ソフトウェアの公開

Twinclueは以下のGithubリポジトリにて開発を進めています。 ライセンスの範囲でお使いいただくこともできますが、Twinclue用として開発しているのでほとんどコメントは入っていません。 また、とても未熟なので各所に誤った用法やトンチキな記述があるかもしれません。 参考程度にお使いください。
なお、公開しているソフトウェアについての質問はいつでも受け付けています。動作についての保証はできかねます。

github.com