======================================================================== 技術スタック選定 (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: 環境変数管理