========================================================================
技術スタック選定 (Technology Stack Selection)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
1-0. 目的
ライントレース自律走行システムで使用する技術スタックと,
その選定理由を定義する.
1-1. 全体方針
・言語: Python で統一する(Pi 側・PC 側ともに).
・既存資産: モーター制御コード(`src/pi/motor.py`)を流用する.
・選定基準: 低遅延・軽量・Python との親和性を重視する.
2. 技術スタック一覧 (Technology Stack)
------------------------------------------------------------------------
2-1. 通信: ZMQ(ZeroMQ)
・ライブラリ: pyzmq
・通信パターン: PUB/SUB
・オプション: ZMQ_CONFLATE=1(受信側で最新メッセージのみ保持)
・用途:
- Pi → PC: カメラ画像の送信
- PC → Pi: 操舵量(throttle,steer)の送信
■ 選定理由
・ブローカー不要で軽量,低遅延に適している.
・PUB/SUB + CONFLATE により,送受信が互いをブロックせず,
常に最新データのみを扱える.
・バイナリデータ(画像)の送受信が容易である.
■ 不採用とした候補
・WebSocket: バイナリ送信のオーバーヘッドが大きい.
・gRPC: 構造化 API 向きで,リアルタイム制御には過剰.
・生 UDP: 最も低遅延だが,フレーミングやシリアライズを
自前で実装する必要がある.
2-2. GUI フレームワーク: PySide6
・用途: PC 側のアプリケーション全般
- カメラ映像のリアルタイム表示
- 自動操縦 ON/OFF ボタン
- パラメータ調整スライダー
- 手動操作のキー入力ハンドリング
■ 選定理由
・ボタン・スライダー等のウィジェットが豊富である.
・QTimer による映像のリアルタイム更新が容易である.
・キーボード入力のハンドリングが柔軟で,手動操作に適している.
・ライセンスが LGPL で利用しやすい.
■ 不採用とした候補
・OpenCV highgui(imshow): ボタンやスライダーの自由度が低い.
・tkinter: リアルタイム映像表示のパフォーマンスに不安がある.
2-3. 画像処理: OpenCV(cv2)
・用途: PC 側での画像処理・線検出
- グレースケール変換
- ガウシアンブラー
- 二値化
- 重心算出
■ 選定理由
・ライントレースに必要な処理がすべて揃っている.
・NumPy ベースで PySide6 への画像受け渡しが容易である.
・既存コードでの使用実績がある.
2-4. カメラ制御: Picamera2
・用途: Pi 側でのカメラフレーム取得
■ 選定理由
・Raspberry Pi カメラの標準ライブラリである.
・既存コードでの使用実績がある.
2-5. モーター制御: RPi.GPIO
・用途: Pi 側での TB6612FNG モータードライバ制御
■ 選定理由
・既存コード(`src/pi/motor.py`)をそのまま流用できる.
・PWM 制御・GPIO 出力に必要な機能が揃っている.
2-6. 環境変数管理: python-dotenv
・用途: .env ファイルから環境変数を読み込む
- PC の IP アドレス
- 通信ポート番号
■ 選定理由
・ネットワーク設定など環境固有の値をコードから分離できる.
・.env ファイルを .gitignore に含めることで,
Git に環境固有情報をコミットしない運用が可能.
3. 構成まとめ (Summary)
------------------------------------------------------------------------
■ Raspberry Pi 側
・Picamera2: カメラフレーム取得
・RPi.GPIO: モーター制御
・pyzmq: PC との通信
・python-dotenv: 環境変数管理
■ PC 側
・PySide6: GUI アプリケーション
・OpenCV: 画像処理・線検出
・pyzmq: Pi との通信
・python-dotenv: 環境変数管理