# RCJJ2026テクニカルドキュメント # チーム ## チームについての説明 私たちTuton(読み:ツートン)は、世界大会への出場を目指してこれまでレスキューリーグに参加してきました。チーム名の由来はモールス信号です。 昨年度まではレスキューラインに出場していましたが、ロボカップジュニアジャパンオープン2025では準優勝となり世界大会への出場は叶いませんでした。この敗因としてはスケジュール管理の失敗、練習走行の回数及びバリエーションの不足、ハードウェアの技術的な安定性不足があったと考えています。 今年度は新たな刺激を求めてレスキューメイズに移行し、レスキューメイズでの世界大会優勝を目指すことにしました。リーグは変わりましたが、活動の中で大切なことは変わりません。大会で安定した走行を実現するためには、客観的な現状分析と改善・検証、緻密な開発計画、そしてあらゆるケースを想定した設計・開発が重要です。 昨年度の反省も踏まえ、今年は開発プロセスを客観的に見つめることを最も重視して活動を行ってきました。また、ソフトウェア・ハードウェアともに、整備性・安定性・ロバスト性を意識して開発しました。 そして、RCJで最も重要なことは、勝つことではなく「学び」です。そういった意味で競技者はかけがえのない仲間であり、彼ら彼女らとの交流や技術の共有は私たちのRCJ人生において不可欠なものです。 昨年度に引き続き、私たちは今年もHPやSNS、YouTube等で積極的な発信を行ってきました。また、機体設計やソフトウェアのデータはGitHubで公開しています。 HP:https://tuton-rcj.github.io/ X:https://x.com/tuton_RCJ GitHub:https://github.com/tuton-RCJ YouTube:https://www.youtube.com/@tuton_RCJ 全国大会優勝、世界大会優勝、そしてメイズ競技をさらに盛り上げることを目指してこれからも頑張ります。 ## チームの所属団体 東京都立小石川中等教育学校 物理研究会ロボット班 HP:https://www.metro.ed.jp/koishikawa-s/ ## チームメンバー - shuji キャプテン。中2からRCJに参加している。 基板モジュールの設計と低レイヤのソフトウェアを担当している。 - kapi ハードウェア担当。中2からRCJに参加している。 ロボットのハードウェアの設計・製造を担当している。 - mitu ソフトウェア担当。高1からRCJに参加している。 アクチュエータ・各種センサなどのドライバ以外のプログラミングを行っている。 # ハードウェア ## ロボットの写真 ![robot](https://hackmd.io/_uploads/rk7Q0IkjZe.jpg) ## ロボットの全般説明 ### ``a.使用しているロボットキット・マイコンボードを記述してください。`` ロボットには以下のプロセッサを使用した。 - Raspberry Pi 4 model B:1個 - メインの処理を行う。 - STM32F446RE:3個、STM32F103C8:2個 - サブマイコンとして使用。センサやモータの処理を行う。詳細は「自作した回路」にて説明する。 ### ``b.ロボット内で無線通信を使用している場合は、その旨を記述してください。`` ロボット内では無線通信を使用しない。 ### ``c.タイヤ/クローラー,モーター,モータードライバなど、駆動系に関する説明もここに記述してください。`` 駆動用モータとしてSTS3032シリアルサーボを4つ使用している。シリコンタイヤの四輪駆動によりグリップ力とトルクを向上させた。 制御はRS485変換回路を通してSTM32F446REからUARTで行う。 ## 使用しているセンサーと使用目的 - LiDAR T-mini Plus 1個 - 壁の点群データを取得する。 - レーザーclass1 - ToF測距センサ VL53L4CX 8個 - 前後左右の壁までの距離を取得する。 - レーザーclass1 - 9軸センサ BNO085 1個 - ロボットの角度を取得する。 - 旋回時の補正、坂道の判定とその角度の取得に使用。 - ToF測距センサ VL53L0X 1個 - 前方の壁までの距離を取得する。 - VL53L4CXと高さが異なるように設置しているので、前方が壁なのか斜面なのかを区別できる。 - レーザーclass1 - UnitVカメラ 2個 - 被災者を検出する。 - カラーセンサ S9706 2個 - 色タイルを判別する。前後に搭載。 - フォトリフレクタ LBR127HLD 4個 - 銀タイルを判別する。前後に搭載。 - Raspberry Pi Camera V3 1個 - 黒タイルの判別に補助的に使用する。 - マイクロスイッチ AV620264 2個 - 障害物の検知に使用する。 ## 被災者の探索 ロボットの上部中央に設置された左右2つのUnitVカメラで被災者を発見する。開発初期は機体の横側に置いていたが、十分な視野を確保するためにこの位置に移動した。 ![image](https://hackmd.io/_uploads/SkcjALksZx.png) また、会場の光環境に左右されないよう、壁を照らすフルカラーLEDを備えている。 ## レスキューキット 3Dプリンタで作成した11mm立方サイズの立方体をレスキューキットとしている。 ![image](https://hackmd.io/_uploads/ByG30LJoWl.png) 直線状に装填したレスキューキットを一つずつ押し出してくような機構でレスキューキット排出を行う。 排出の様子:https://youtu.be/iyLoZqMaiBs レスキューキット排出機構は左右に2つ備わっており、それぞれ6つのレスキューキットを装填してある。 片側のレスキューキットが枯渇した場合は180°回転して反対側のレスキューキットを排出する。 ## 自作した回路 今回は6つのプリント基板を設計し、JLCPCBに発注して製作した。 - 01-MAIN基板 - ![image](https://hackmd.io/_uploads/Hyqf0JBcWx.png) - 主要なセンサ・アクチュエータを接続する基板であり、Raspberry Piとの通信に応じてそれらの処理を行う。 - 主な使用部品 - STM32F446RE - BNO085 - DCDCコンバータ OKL-T/6-W12N-C - DCDCコンバータ TPS5430 - 接続部品 - STS3032 - UnitV - T-mini Plus - AV620264 - 02-BOTTOM基板 - ![image](https://hackmd.io/_uploads/SJxoAJr5Zx.png) - 色タイルを判別するためのカラーセンサとフォトリフレクタを搭載している。 - 主な使用部品 - STM32F103C8 - S9706 - LBR127HLD - 03-ToF基板 - ![image](https://hackmd.io/_uploads/HyUullB5-e.png) - ToF測距センサを搭載している。 - 主な使用部品 - STM32F446RE - 05-VL53L4CX基板 - 04-RPi基板 - ![image](https://hackmd.io/_uploads/r12kelSq-x.png) - Raspberry Piに取り付けるシールド基板。 - 主な使用部品 - Raspberry Pi 4 model B - 05-VL53L4CX基板 - ![image](https://hackmd.io/_uploads/SJUylgH9bl.png) - VL53L4CXセンサの自作モジュール。 - 主な使用部品 - VL53L4CX - 06-Display基板 - ![image](https://hackmd.io/_uploads/SJUnyP1o-x.png) - ディスプレイの処理を行う。また、坂道判定用のToFセンサも1つ搭載している。 - 主な使用部品 - STM32F446RE - M154-240240-RGB - VL53L0X ### 基板の構成の全体像 ![image](https://hackmd.io/_uploads/ry6CCU1oWg.png) ### 設計にあたり意識した点 確実に動作する基板を作るために、以下の点を意識した。 - I2C配線は全て基板内に収め、できるだけ短くした。 - モータ類とプロセッサ類でDCDCコンバータを分け、電源のノイズでマイコンがリセットしないようにした。 - センサ類は基板に直接はんだ付けし、ケーブルの数を必要最小限に抑えた。 - シルクを丁寧に入れ、部品の実装ミスを防いだ。 ## 特徴・工夫した点・苦労した点・アピールポイント 開発期間が短かったため、拡張性・整備性に優れたハードウェア設計を意識した。 最大の特徴は基板モジュールという概念である。 プリント基板やセンサ類は全て基板モジュールとして1つのコンポーネントになっており、ねじ2本を抜くだけで簡単に取り外すことができる。 参考:https://youtu.be/SbAF_Ybdz7A ![image](https://hackmd.io/_uploads/BJSZ1wyj-g.png) これは整備性の向上とともに、開発の分担という面でも非常に役に立った。 また、レスキュー競技では坂道やバンプなどがハードウェアの大きな障壁となっている。昨年度のレスキューライン機体に引き続き、5mm厚のアルミニウムの底板と自作のシリコンタイヤを使用し、低重心とタイヤの高いグリップ力を実現した。 ![image](https://hackmd.io/_uploads/SyQMkw1sZl.png) # ソフトウェア ## 使用しているプログラミング言語・ソフトウェア それぞれ以下の開発環境・プログラミング言語で開発している。 - Raspberry Pi 4 model B - Python - Visual Studio Code (Remote SSH拡張機能使用) - STM32F446RE/STM32F103C8 - Arduino言語(C/C++) - Visual Studio Code (PlatformIO拡張機能) - UnitV カメラ - Python - MaixPy IDE - アルゴリズム研究用ソフトウェア - Python - Visual Studio Code、Antigravity ## 迷路探索 ### 全探索の基本方針 基本的に「現在地から最も近い未到達タイルに最短経路で移動する」ことを繰り返す。全探索が完了したらスタート地点に最短経路で帰還する。 1. ロボットは各タイルに到着すると、距離センサでそのタイルの4辺の壁の有無を確認し、それらのタイルをマッピングデータに登録する。まだ登録されていない座標であれば未到達タイルとして登録する。 2. マッピングデータに保存してある未到達タイルの中から後述する計算方法で現在地から最も近いタイルを求め、そのタイルに移動する ![image](https://hackmd.io/_uploads/ryZdtERY-l.png) ★のマスが未到達タイル。この中で現在地から最も近いものに向かう。 これを繰り返すことで、拡張右手法などよりもはるかに効率的な探索が可能となる。 ### コスト計算 探索アルゴリズムに使用する最短経路計算について説明する。 コスト計算はダイクストラ法によって行う。 タイルを頂点、タイル間の移動を辺としてグラフを構築することで、ダイクストラ法を適用して最短経路を計算することができる。 ![image](https://hackmd.io/_uploads/SJaVkNCKWx.png) しかし、このグラフでダイクストラ法を適用すると、旋回のコストを考慮することができない。 ロボットは正面のマスに進むためには(1マスの移動時間)のコストを必要するが、右のマスに進むためには(1マスの移動時間)+(90°の旋回時間)のコストが必要となる。そのため、ロボットの向きを考慮してコスト計算を行わなければ実際の挙動に忠実な計算はできない。 そこで、各タイルにロボットの向きを持たせたものを頂点とするグラフを構築することでこの問題を解決した。 ![image](https://hackmd.io/_uploads/SJ3dyVRKWl.png) この図において緑の辺のコストを(1マスの移動時間)、オレンジの辺のコストを(1マスの移動時間)+(90°の旋回時間)、赤の辺のコストを(1マスの移動時間)+(180°の旋回時間)とすることで実際の挙動に忠実なコスト計算が可能となる。 ### シミュレーション・評価実験 上記のアルゴリズムを開発するにあたり、アルゴリズムを比較するためのGUIやシミュレーション環境を作成して研究を行った。 本ソフトウェアはRCJ CMSのJSONマップデータに対応しているため、CMSと組み合わせて使用することができる。 ![image](https://hackmd.io/_uploads/ByOY6VAt-x.png) アルゴリズムの評価にはランダムに生成した迷路を使用している。 実際のレスキューメイズのフィールドに近い迷路で実験をするために、以下の手順で生成した。 1. 穴掘り法で木構造迷路を生成する。 2. 1.で作成した迷路の壁を一定の割合でランダムに破壊する。 3. スタート地点・青タイルをランダムに配置する。 拡張右手法と本手法の探索コストを比較した実験結果を以下に示す。 ![image](https://hackmd.io/_uploads/r1qF07SqZx.png) 縦軸が全探索の総コストである。それぞれのフィールドについて、拡張右手法で探索させた結果を青で、私たちの手法で探索させた結果を橙で示している。 Field Indexが0~99のものは6x6、100~199は8x8、200~299は10x10、300~399は12x12、400~499は14x14のサイズのフィールドである。 この結果から、本手法は拡張右手法よりも低コストかつ安定したコストで探索することができることが分かった。 ## 被災者の発見 被災者発見はUnitVカメラにて行う。 バグの修正および同期処理による高速化のためにUnitVのファームウェアを書き換えた。 ### 色被災者 色被災者は連結成分に基づいて検出する。具体的な手順は次のようである。 1. 事前に定められた LAB 色空間における閾値に適合するピクセルのみを抽出する。 2. 抽出されたピクセルから連結成分を求める。 3. 各連結成分について、その連結成分が含むピクセルの個数が一定値以上であるならば被災者であるとする。 ### 文字被災者 文字被災者は CNN によって検出する。モデルのアーキテクチャは MobileNetV1 (α=0.75) とし、自作した H,S,U 及びそのほかのアルファベット・数字各 4000 枚程度を含むラベル付きデータセットによって訓練を行った。以下の画像はデータセットの凡例である。 | H | S | U | Others | | -------- | -------- | -------- | ------ | | ![729](https://hackmd.io/_uploads/HkbjvQV9-l.jpg) | ![1497](https://hackmd.io/_uploads/H1k_P7Nqbx.jpg) | ![1434](https://hackmd.io/_uploads/SyfYPmEqbe.jpg) | ![1735](https://hackmd.io/_uploads/HJrTDQEcZe.jpg) | 汎化性能を高めるために、以下のような手法を採用した。 - データ拡張 - データセットに含まれる画像に対して訓練時に適当な処理を行うことで、訓練に用いられる画像のバリエーションを増やし、汎化性能の向上を狙った。CutMix (α=0.5), Flip を適用した。 - Max Logit Score による OoD 検出 - Vaze et al., (2021) が示すように、よく訓練されたモデルがデータセット内に含まれていない例を分類する際の内部状態を見ると、 logit 層という最終的な分類結果を出力する寸前の部分の値が小さくなる傾向にあることがわかる。そのため、logit 層の最大値が閾値を下回った場合、出力を無視することにした。 ## 工夫した点・苦労した点・アピールポイント コードの可読性や保守性を特に重視した。 Raspberry Pi のコードはPythonで記述しているが、型ヒントやEnumsを積極的に使用することで共同開発における混乱を防いでいる。 また、関数やクラスをドキュメントに整理することでチーム内での理解の共有に努めた。 昨シーズンのロボットではマイコン間の通信設計が粗雑でありトラブルの原因となっていた。そこで、シーケンス番号とチェックディジットを含んだ堅牢なリクエスト&レスポンス方式を設計し、プロセッサ間の通信に使用した。 センサやモータの制御を担当するサブマイコンは、メインプロセッサからの指令に対して即座に応答する必要があるため、高速に制御ループを回す必要がある。 そこで、センサやアクチュエータのライブラリを洗練させ、制御周期が短くなるように努力した。