離散経路からMPCのターゲット(目標値)を取得する手法

def calc_ref_trajectory(state, cx, cy, cyaw, ck, sp, dl, pind):
    xref = np.zeros((NX, T + 1))
    dref = np.zeros((1, T + 1))
    ncourse = len(cx)

    ind, _ = calc_nearest_index(state, cx, cy, cyaw, pind)

    if pind >= ind:
        ind = pind

    xref[0, 0] = cx[ind]
    xref[1, 0] = cy[ind]
    xref[2, 0] = sp[ind]
    xref[3, 0] = cyaw[ind]
    dref[0, 0] = 0.0  # steer operational point should be 0

    travel = 0.0

    for i in range(T + 1):
        travel += abs(state.v) * DT
        dind = int(round(travel / dl))

        if (ind + dind) < ncourse:
            xref[0, i] = cx[ind + dind]
            xref[1, i] = cy[ind + dind]
            xref[2, i] = sp[ind + dind]
            xref[3, i] = cyaw[ind + dind]
            dref[0, i] = 0.0
        else:
            xref[0, i] = cx[ncourse - 1]
            xref[1, i] = cy[ncourse - 1]
            xref[2, i] = sp[ncourse - 1]
            xref[3, i] = cyaw[ncourse - 1]
            dref[0, i] = 0.0

    return xref, ind, dref

経路

$$ Path=\begin{bmatrix} x_0 & x_1 &\\y_0 & y_1 & …\\ \theta_0 & \theta_1 &\\vx_0 & vx_1 &\\vy_0 & vy_1 & …\\ \omega_0 & \omega_1 &\\\end{bmatrix} $$

目標経路

$$ Xref=\begin{bmatrix} x_{t0} & x_{t1} &\\y_{t0} & y_{t1} & …\\ \theta_{t0} & \theta_{t1} &\\vx_{t0} & vx_{t1} &\\vy_{t0} & vy_{t1} & …\\ \omega_{t0} & \omega_{t1} &\\\end{bmatrix} $$

離散経路Pathから目標値を抜き出す.

制御対象の現在地$x^T=(x_t,y_t,\theta_t)$をもとにPathの中で最も近い点を抜きだし,

$Xref$の$t0$の要素とする.

$t0$の要素から予測ホライゾンの長さまでの目標値を取り出す.

このとき,離散点の間隔は制御周期$dt$になるようにする必要がある.

現在の速度で制御周期時間の間に進むことのできる距離を$dd$経路の離散点の間隔 $dD$とする.

$$ dd=v_{now}*dt\\dD=\sqrt{(x_{t1}-x_{t0})^2+(y_{t1}-y_{t0})^2} $$

dD<dd

離散経路から目標値を取ってくるときのindexの間隔は以下になる.

$$ dind=round(\frac{dd}{dD}) $$

dD>dd

直線補間でdD間の目標値を補間する.

補間点の数は以下になる

$$ dN=round(\frac{dD}{dd}) $$