ちょっと作りたくなりました。まずは計画です。
どこまでできるかはわかりませんが、少しずつ進めていこうと思っています。
1. 概要
Arduino自作ラジコンを起点として、
- 2モータ差動駆動(スキッドステア)ローバ
- Raspberry Pi による映像配信・制御ハブ
- Pixhawk(ArduPilot Rover)による自律走行
- Meta Quest 3 などによる AR/MR 表示+ヘッドトラッキング/ハンドジェスチャ入力
- Whisper / Piper / LLM による音声対話・AIアシスト
を段階的に統合し、
「会話できる・ARで見える・自律して走るローバ」
を構築していきます。
2. 足回り方針:2モータ差動駆動(スキッドステア)で統一
最終構成および全フェーズ共通の前提として、
- 左右独立 2 モータ構成
- ステアリングは「左右の速度差」で実現
- ロボットの足回りとしてArduino / RasPi / Pixhawkは、同一ロジックで制御可能にする
3. 統合アーキテクチャ
3.1 構成レイヤ
[ Meta Quest 3 ]
├─ AR/MR表示 (OpenXR + Unity)
├─ ヘッドトラッキング
└─ ハンドジェスチャ / UI入力
│ UDP/WebRTC/TCP
▼
[ Raspberry Pi ]
├─ 映像配信 (H.264 / WebRTC / UDP)
├─ 制御ハブ (ヘッド/操作 → Pixhawk/モータ)
└─ MAVLink中継 (Pixhawk ↔ Quest/PC)
│ シリアル/UDP
▼
[ Pixhawk (Rover) ]
├─ 2モータ差動駆動制御
├─ Waypoint / RTL / FailSafe
└─ Telemetry (MAVLink)
│
▼
[ ローバシャーシ(2モータ) ]
3.2 RC・フェイルセーフ経路
- S-FHSS (R4SF + Jumper T8SG) は独立系として利用
- SW等で以下を切替:
- 「RC直結モード」:受信機 → モータ/Pixhawk RC IN
- 「自律/遠隔モード」:Pixhawk/RasPi → モータ
- 通信断時は Pixhawk のフェイルセーフまたは RC で介入可能な構成とする
4. 通信・ネットワーク設計(UDP多重)
4.1 ポート/チャンネル設計(案)
同一 5GHz Wi-Fi ネットワーク上で、多重通信を行う。
| 用途 | プロトコル | 想定ポート | 送受信元 |
|---|---|---|---|
| MAVLink(地上局) | UDP | 14550 | Pixhawk → Mission Planner / RasPi / Quest |
| MAVLink(AR表示用) | UDP | 14551 | Pixhawk → RasPi → Quest |
| 映像ストリーム | UDP / WebRTC | 5600–5699 | RasPi → Quest / PC |
| ヘッドトラッキング | UDP | 7000 | Quest → RasPi |
| 操作・モード指令 | UDP/TCP | 7001 | Quest / PC → RasPi |
| システム監視 / ログ | UDP/TCP | 7010 | RasPi → ログPC等 |
※実際のポート番号は後で固定化するが、1本のWi-Fiで運用可能とする。
4.2 モード別の通信イメージ
4.2.1 RCモード(手動)
- 経路:S-FHSS or 自作コントローラ → 受信機 → SW → モータ or Pixhawk
- 最も安全・確実なモード(フェイルセーフ用途)
4.2.2 遠隔FPVモード(非自律)
- 操作:Quest / PC → UDP制御(スティック/ジェスチャ)
- 足回り:RasPi直制御 or Pixhawk MANUALモード
- 映像:RasPi → WebRTC → Quest
- S-FHSSは緊急用
4.2.3 自律走行モード
- Waypoint:Mission Planner or RasPi/Questから Pixhawk に送信
- Raspi/Pixhawk がローバ制御
- Quest は HUD(地図+姿勢+バッテリ+映像)表示
- 必要なら S-FHSS or UI で「停止」「RTL」
5. ヘッドトラッキング仕様(段階移行)
5.1 フェーズ2〜3:Arduinoヘッドトラッカー継続
- 構成:
- ヘッド側:Arduino nano+ MPU6050 + nRF24
- ローバ側:Arduino / RasPi + nRF24受信
- インターフェース:
head_yaw,head_pitch,reset_flag
- ドリフト対策:
reset_flag受信時に現在値をゼロ点として再定義
これを 「共通IF:head_yaw / head_pitch」 として定義しておく。
5.2 フェーズ4〜5:Questヘッドトラッキングへの移行
- ソース:Meta Quest 3 の 6DoF姿勢
- Questアプリで:
- Yaw/Pitch を算出して
head_yaw / head_pitchとして UDP送信(ポート7000) - 「センター」UI or ジェスチャ → resetコマンド送信
- Yaw/Pitch を算出して
- ローバ側(RasPi/Pixhawk制御側)は、Arduino時代と同じロジックで扱えるようにする。
6. 映像伝送選択肢
6.1 正式採用(第一候補)
Raspberry Pi カメラ → H.264 → Wi-Fi配信
- 形式:GStreamer / WebRTC / RTSP over UDP
- 利点:
- デジタル映像のため AR/MR へのオーバーレイが容易
- 録画・解析・配信との親和性が高い
- 同一ネットワーク上で MAVLink / 制御と統合管理可能
6.2 サブ選択肢(補完)
- 5.8GHzアナログVTX+ゴーグル
- 超低遅延・信頼性高いが、統合性が低い
- デバッグ・遅延比較用として利用
- ROTG02 + Quest UVC入力(DJIドローンからの映像を受信したいという期待もある)
- 実験的選択肢。再現性・互換性に難あるかも
- 正式仕様の中核には据えないが期待はある
7. Phase別 実装ToDo一覧
Phase 1:Arduino差動駆動版(既存整理+改良)
- スキッドステア対応シャーシ(2モータ)での制御確認
- Arduino+L298Nで左右モータ差動制御ロジック実装
- ヘッドトラッキング(Arduino+nRF24)の仕様を head_yaw/pitch IF として整理
Phase 2:Raspberry Pi 制御版
- RasPiから2モータ差動駆動(GPIO + モータドライバ)
- RasPiカメラ/USBカメラ → H.264配信(UDP/WebRTC)
- Arduinoヘッドトラッカーからのデータを RasPi で受信し、カメラサーボ制御
- UDPポート設計の暫定版を実機に反映
Phase 3:AI音声・対話統合
- RasPi or 外部PCで Whisper / Piper / LLM 実行環境構築
- 「音声コマンド → モード切替/速度指令」IF設計
- ログ・対話履歴をターミナル or WebUIで確認できるようにする
Phase 4:Pixhawk統合(Rover)
- Pixhawk をローバモード+スキッドステア設定
- RasPi ↔ Pixhawk 間で MAVLink中継(シリアル↔UDP)
- Mission Planner からの制御と RasPi からの制御の役割分担を明確化
- フェイルセーフ(通信断時の停止/RTL)確認
Phase 5:Meta Quest 3 AR/MR 統合
- Unity(OpenXR)で MR UI:映像+地図+HUD の3ペイン構成
- Questヘッドトラッキング → UDP(7000) → RasPi → カメラサーボ
- ハンドジェスチャ/UI操作 → モード切替・E-STOP実装
- MAVLinkステータスをHUD表示(速度・バッテリ・モード等)
Phase 6:洗練・展開
- Quest 4等への移行(OpenXR準拠で互換確保)
- 教材・展示向けドキュメント化
- 公開用リポジトリ/ブログ連載の整理
8. メモ・設計ポリシー
- すべてのフェーズで「再現性」「段階的移行」「安全(RCフェイルセーフ)」を重視
- インターフェースは可能な限り固定:
throttle / steer / left / righthead_yaw / head_pitch / resetmode / estop
- 物理は変わっても、論理は変えない設計を目指す
- S-FHSSは「最後の物理リモコン」として残す(人間がいつでも奪える系統)
