========================================================================
システム構成仕様 (System Architecture Specification)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
1-0. 目的
ライントレース自律走行を実現するために,Raspberry Pi と PC が
それぞれ担う処理と,両者間の通信の流れを定義する.
1-1. 全体構成
Raspberry Pi はカメラ画像の取得とモーター制御を担当し,
PC は画像処理・操舵量計算・GUI 表示を担当する.
Raspberry Pi PC
──────────── ──
カメラ撮影 画像受信
│ │
└──── 画像送信 ──────> │
画像処理・線検出
│
操舵量計算(PD 制御)
│
┌──── 操舵量受信 <────── 操舵量送信
│
モーター制御
2. Raspberry Pi 側の処理 (Raspberry Pi Processing)
------------------------------------------------------------------------
2-1. カメラ画像の取得
・Picamera2 を使用してグレースケール(Y8 フォーマット)でフレームを取得する.
・取得した画像を JPEG 圧縮して PC に送信する.
※ グレースケールで取得することで,転送データ量を BGR 比で 1/3 に削減する.
2-2. 操舵量の受信
・PC から送信された操舵量(throttle,steer)を受信する.
2-3. モーター制御
・受信した throttle,steer を既存の `MotorDriver.set_drive()` に渡し,
左右モーターを制御する.
・差動2輪駆動の計算は既存コードを流用する.
- left = throttle + steer
- right = throttle - steer
・極性補正・PWM 出力も既存コードに従う.
2-4. フェイルセーフ
・一定時間(例: 0.5秒)操舵量を受信しなかった場合,
モーターを自動停止する.
・通信切断時の暴走を防止する.
3. PC 側の処理 (PC Processing)
------------------------------------------------------------------------
3-1. 画像の受信
・Raspberry Pi から送信されたカメラ画像を受信する.
3-2. 画像処理・線検出
・受信した画像から黒線の位置を検出する.
・処理手順:
1. CLAHE によるコントラスト強調
2. ガウシアンブラー(ノイズ除去)
3. 固定閾値で二値化
4. オープニングで孤立ノイズ除去
5. 横方向クロージングで途切れ補間
6. 白ピクセルに2次多項式フィッティング
※ グレースケール変換は Pi 側(撮影時)で完了しているため不要
・位置偏差・傾き・曲率を算出する.
・詳細は `TECH_01_操舵量計算仕様.txt` を参照する.
3-3. 操舵量計算
・多項式フィッティングから得た位置偏差と傾きで
PD 制御により操舵量を計算する.
・速度は曲率に応じて動的に調整する.
・レートリミッターで急激な操舵変化を抑制する.
・詳細は `TECH_01_操舵量計算仕様.txt` を参照する.
3-4. 操舵量の送信
・計算した throttle,steer を Raspberry Pi に送信する.
3-5. GUI 表示
■ カメラ映像表示
・受信した画像をリアルタイムで表示する.
・デバッグオーバーレイを重ねて表示できる.
・詳細は `TECH_03_デバッグオーバーレイ仕様.txt` を参照する.
■ 自動操縦の切り替え
・自動操縦の ON / OFF を切り替えるボタンを設ける.
・ON: 画像処理の結果に基づいて操舵量を自動計算・送信する.
・OFF: 手動操作モードに切り替わる.
■ パラメータ調整
・PD 制御パラメータ(Kp,Kh,Kd 等)をリアルタイムに変更できる
UI を設ける.
・画像処理パラメータ(二値化閾値,CLAHE 強度等)も
リアルタイムに変更できる.
・変更したパラメータは即座に処理に反映される.
■ パラメータ保存・読み込み
・調整したパラメータをタイトル・メモ付きで JSON に保存できる.
・保存済みパラメータをコンボボックスから選択・読み込みできる.
・確認ダイアログ付きの削除機能を備える.
■ 手動操作
・自動操縦 OFF 時に,ユーザーが手動で車体を操作できる.
・操作方式は操作性を重視して設計する.
4. 設計方針 (Design Policy)
------------------------------------------------------------------------
4-1. 操舵量計算の独立性
操舵量の計算ロジックは,タイム短縮やコースアウト防止のために
試行錯誤で改善していくことを前提とする.
そのため,操舵量計算を他の処理から独立させ,計算式やアルゴリズムの
変更が通信・モーター制御・GUI のコードに影響しない構成とする.
・入力: グレースケールのカメラ画像(NumPy 配列)
・出力: throttle(float: -1.0 ~ +1.0),steer(float: -1.0 ~ +1.0)
この入出力を維持する限り,計算の中身(偏差の取り方,制御式,
速度調整の方法等)を自由に変更できる.
5. 通信の流れ (Communication Flow)
------------------------------------------------------------------------
5-1. 全体のループ
以下のサイクルを毎フレーム繰り返す.
1. Pi: カメラでフレームを取得する.
2. Pi → PC: 画像を送信する.
3. PC: 画像処理・線検出を行う.
4. PC: 操舵量を計算する(自動時)またはユーザー入力を取得する(手動時).
5. PC → Pi: 操舵量(throttle,steer)を送信する.
6. Pi: 受信した操舵量でモーターを制御する.
5-2. 通信要件
・双方向通信: Pi → PC(画像),PC → Pi(操舵量).
・低遅延: 画像取得からモーター反映までの遅延を最小限にする.
※ 遅延が大きいとコースアウトのリスクが増加する.
・信頼性: パケットロス時の振る舞いを定義する.
- 画像が届かない場合: 前フレームの操舵量を維持する.
- 操舵量が届かない場合: フェイルセーフでモーター停止する.