Newer
Older
RobotCar / docs / 03_TECH / TECH_01_操舵量計算仕様.txt
========================================================================
操舵量計算仕様 (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(減速係数): 実走テストで決定