========================================================================
操舵量計算仕様 (Steering Calculation Specification)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
1-0. 目的
カメラ画像から黒線の位置を検出し,PD 制御によって操舵量と速度を
算出する方法を定義する.
1-1. 基本方針
・制御方式: PD 制御(I 項なしで開始)
・偏差の算出: 画像の近方・遠方2領域から黒線の重心位置を取得する.
・操舵量: 偏差に基づく PD 制御で決定する.
・速度: 操舵量に応じて動的に調整する(カーブ減速,直線加速).
2. 画像処理パイプライン (Image Processing Pipeline)
------------------------------------------------------------------------
2-1. 処理フロー
1. カメラからフレームを取得する.
2. グレースケールに変換する.
3. ガウシアンブラーを適用する(軽いノイズ除去).
4. 固定閾値で二値化する(BINARY_INV).
5. 横方向クロージングで反射による途切れを補間する.
6. 近方領域・遠方領域それぞれで黒ピクセルの重心 x 座標を算出する.
■ 横方向クロージング
光の反射により線が途切れる問題への対策として,
二値化後にモルフォロジーのクロージング処理(膨張→収縮)を行う.
横長の楕円カーネルを使用することで,縦方向への影響を抑えつつ
線の途切れを左右から埋める.
・カーネル形状: 横長楕円(幅 25 × 高さ 3)
・効果: 反射で欠けた部分を,左右の検出済みピクセルからつなぐ
・注意: カーネル幅は途切れの大きさに応じて調整する
2-2. 2領域方式
カメラは真下を向いているため,画像内の位置が路面上の距離に対応する.
画像を上下2つの領域に分割し,それぞれで線の位置を検出する.
画像上部 ─── 遠方領域(これから通る場所)
│
画像下部 ─── 近方領域(今いる場所)
・近方領域: 画像下部の水平帯.現在の車体位置に対する線のずれを示す.
・遠方領域: 画像上部の水平帯.この先のコース方向を示す.
※ 各領域の具体的な y 座標範囲は実走テストで調整する.
3. 偏差の算出 (Error Calculation)
------------------------------------------------------------------------
3-1. 基本偏差
各領域で検出した黒線の重心 x 座標と,画像中心 x 座標との差を
偏差とする.
e_near = image_center_x - near_line_x
e_far = image_center_x - far_line_x
・e > 0: 線が画像の左側にある(右に寄っている)
・e < 0: 線が画像の右側にある(左に寄っている)
・e = 0: 線が画像の中心にある(理想状態)
3-2. 制御用偏差
近方偏差と遠方偏差を重み付きで合成し,制御に使用する偏差とする.
e = α * e_near + β * e_far
・α: 近方の重み(現在の位置補正)
・β: 遠方の重み(先読み補正)
・α + β = 1.0 とする.
※ α,β の具体的な値は実走テストで調整する.
4. PD 制御 (PD Control)
------------------------------------------------------------------------
4-1. 操舵量の計算
steer = Kp * e + Kd * (e - e_prev) / dt
・Kp: 比例ゲイン.偏差に比例した操舵量を出力する.
- 大きいほど応答が速いが,振動しやすい.
・Kd: 微分ゲイン.偏差の変化率に比例した操舵量を出力する.
- 振動を抑制し,カーブへの追従を滑らかにする.
・e_prev: 前フレームの偏差.
・dt: 前フレームからの経過時間.
4-2. 操舵量の制限
計算結果を -1.0 ~ +1.0 の範囲にクランプする.
steer = clamp(steer, -1.0, +1.0)
4-3. I 項について
初期段階では I 項を使用しない.
理由: カーブ中に偏差が蓄積し,カーブ出口でオーバーシュート
(ワインドアップ)を引き起こすリスクがあるため.
直線走行で定常的にずれ続ける症状が確認された場合にのみ,
小さい Ki で追加を検討する.
5. 速度制御 (Speed Control)
------------------------------------------------------------------------
5-1. 基本方式(操舵量連動)
throttle = max_throttle - k * |steer|
・max_throttle: 直線での最大速度.
・k: 減速係数.操舵量が大きいほど減速する.
・|steer| が大きい → カーブ中 → 減速
・|steer| が小さい → 直線 → 加速
5-2. 発展方式(曲率推定連動)
基本方式で速度の限界を感じた場合,近方・遠方の偏差差分から
曲率を推定し,カーブの手前で事前に減速する方式へ移行する.
curvature = |e_far - e_near|
throttle = max_throttle - k * curvature
※ 基本方式で完走を達成した後に検討する.
6. パラメータ一覧 (Parameters)
------------------------------------------------------------------------
■ 画像処理パラメータ
・画像解像度: 320x240
・ブラーカーネルサイズ: 5
・二値化閾値: 80(固定閾値)
・クロージングカーネル: 幅 25 × 高さ 3(横長楕円)
・近方領域の y 範囲: 画像高さの 70% ~ 100%
・遠方領域の y 範囲: 画像高さの 30% ~ 50%
■ 偏差合成パラメータ
・α(近方の重み): 実走テストで決定
・β(遠方の重み): 実走テストで決定
■ PD 制御パラメータ
・Kp(比例ゲイン): 実走テストで決定
・Kd(微分ゲイン): 実走テストで決定
■ 速度制御パラメータ
・max_throttle(最大速度): 実走テストで決定
・k(減速係数): 実走テストで決定