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