中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

西寧做網(wǎng)站ci君博卻上無錫百度競價推廣

西寧做網(wǎng)站ci君博卻上,無錫百度競價推廣,河北哪些大學網(wǎng)站建設(shè)專業(yè)比較好,做網(wǎng)站服務(wù)器和域名文章目錄 1. 后輪反饋控制2. 算法原理3. 算法和仿真實現(xiàn) 1. 后輪反饋控制 后輪反饋控制(Rear wheel feedback)算法是利用后輪中心的跟蹤偏差來進行轉(zhuǎn)向控制量計算的方法,屬于Frenet坐標系的一個應(yīng)用。通過選擇合適的李雅普諾夫函數(shù)設(shè)計控制率…

文章目錄

    • 1. 后輪反饋控制
    • 2. 算法原理
    • 3. 算法和仿真實現(xiàn)

1. 后輪反饋控制

后輪反饋控制(Rear wheel feedback)算法是利用后輪中心的跟蹤偏差來進行轉(zhuǎn)向控制量計算的方法,屬于Frenet坐標系的一個應(yīng)用。通過選擇合適的李雅普諾夫函數(shù)設(shè)計控制率,利用后輪中心的跟蹤偏差來進行轉(zhuǎn)向控制量計算的方法。

2. 算法原理

在這里插入圖片描述

后輪反饋控制算法原理如上圖所示,其中

  • P P P:當前距離車輛最近的路經(jīng)點;

  • e y e_y ey? P P P點與車輛后輪中心點的橫向偏差 A P AP AP,實際上對應(yīng)的就是frenet坐標下的 l l l

  • φ \varphi φ:車輛朝向與 X X X軸正方向的夾角,即航向角;

  • φ r \varphi_{r} φr? P P P點切線與 X X X軸正方向的夾角;

  • φ e \varphi_e φe?:車輛航向角誤差,即 φ ? φ r \varphi-\varphi_{r} φ?φr?

  • n τ ? \vec{n_\tau} nτ? ? P P P點法線的單位向量;

  • τ r ? \vec{\tau_r} τr? ? P P P點切線的單位向量;

  • L L L:軸距

  • δ f \delta_f δf?:前輪轉(zhuǎn)角

  • v v v:車輛的速度

由前面的文章frenet坐標與cartesian坐標相互轉(zhuǎn)換與代碼實現(xiàn)和上圖的幾何關(guān)系可得車輛在參考軌跡上的投影點 P P P處的線速度 s ˙ \dot{s} s˙和橫向誤差 e y e_y ey?(即對應(yīng)frenet坐標系下的 l ˙ \dot{l} l˙)的表達式為
s ˙ = v ? τ r ? 1 ? k r l = ∣ v ? ∣ ∣ τ r ? ∣ c o s φ e 1 ? k r e y = ∣ v ? ∣ c o s φ e 1 ? k r e y (1) \dot{s}=\frac{\vec{v} \vec{\tau_r}}{1-k_rl} = \frac{|\vec{v}| |\vec{\tau_r}|cos{\varphi_e}}{1-k_re_y}=\frac{|\vec{v}|cos{\varphi_e}}{1-k_re_y} \tag{1} s˙=1?kr?lv τr? ??=1?kr?ey?v ∣∣τr? ?cosφe??=1?kr?ey?v cosφe??(1)

e y ˙ = l ˙ = v ? n r ? = ∣ v ? ∣ ∣ n r ? ∣ c o s ( π 2 ? φ e ) = ∣ v ? ∣ s i n φ e (2) \dot{e_y}=\dot{l}= \vec{v} \vec{n_r}= |\vec{v}| |\vec{n_r}| cos({\frac{\pi}{2}-\varphi_e}) = |\vec{v}| sin{\varphi_e} \tag{2} ey?˙?=l˙=v nr? ?=v ∣∣nr? ?cos(2π??φe?)=v sinφe?(2)

由圖中幾何關(guān)系可得航向誤差為
φ e = φ ? φ r (3) \varphi_e = \varphi-\varphi_{r} \tag{3} φe?=φ?φr?(3)
則航向誤差變化率為
φ e ˙ = φ ˙ ? φ r ˙ = φ ˙ ? s ˙ R r = φ ˙ ? s ˙ k r (4) \dot{\varphi_e} = \dot{\varphi}-\dot{\varphi_{r}} = \dot{\varphi}-\frac{\dot{s}}{R_r }= \dot{\varphi}-\dot{s}k_r \tag{4} φe?˙?=φ˙??φr?˙?=φ˙??Rr?s˙?=φ˙??s˙kr?(4)

:一個剛體的角速度 = 線速度/線速度到速度瞬心的距離,上式中 R r R_r Rr?為點 P P P處的瞬時圓心半徑。

將(1)代入(4)可得
φ e ˙ = φ ˙ ? s ˙ k r = φ ˙ ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y (4) \dot{\varphi_e} = \dot{\varphi}-\dot{s}k_r = \dot{\varphi}-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}\tag{4} φe?˙?=φ˙??s˙kr?=φ˙??1?kr?ey?kr?v cosφe??(4)
綜上可得后輪反饋控制算法對應(yīng)模型的微分方程為

{ s ˙ = ∣ v ? ∣ c o s φ e 1 ? k r e y e y ˙ = ∣ v ? ∣ s i n φ e φ e ˙ = φ ˙ ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y (5) \begin{cases} \dot{s}&=\quad \frac{|\vec{v}|cos{\varphi_e}}{1-k_re_y} \\ \dot{e_y}&=\quad |\vec{v}| sin{\varphi_e}\\ \dot{\varphi_e} &=\quad \dot{\varphi}-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y} \end{cases} \tag{5} ? ? ??s˙ey?˙?φe?˙??=1?kr?ey?v cosφe??=v sinφe?=φ˙??1?kr?ey?kr?v cosφe???(5)

有了模型的微分方程,我們可以根據(jù)李雅普諾夫第二方法設(shè)計該模型的車輛航向變化率 φ ˙ \dot{\varphi} φ˙?。

李雅普諾夫第二方法:

穩(wěn)定的系統(tǒng)能量總是不斷被耗散的,李雅普諾夫通過定義一個標量函數(shù) V ( x ) V(x) V(x) (通常能代表廣義能量)來分析穩(wěn)定性。這種方法的避免了直接求解方程,也沒有進行近似線性化,所以也一般稱之為直接法。 V ( x ) V(x) V(x)需滿足:

  1. V ( x ) = 0 V(x)=0 V(x)=0 當且僅當 x = 0 x =0 x=0
  2. V ( x ) > 0 V(x)>0 V(x)>0 當且僅當 x ≠ 0 x\neq0 x=0
  3. V ˙ ( x ) ≤ 0 \dot{V}(x)\leq0 V˙(x)0 x ≠ 0 x \neq0 x=0

則稱系統(tǒng)在李雅普諾夫意義下是穩(wěn)定的,特別的,若 x ≠ 0 x \neq0 x=0時,有 V ˙ ( x ) < 0 \dot{V}(x)<0 V˙(x)<0,則系統(tǒng)是漸進穩(wěn)定的。

這里我們比較關(guān)心的就是橫向誤差 e y e_y ey? φ e \varphi_e φe?,期望他們隨著時間的增長逐漸收斂于0,我們可以定義李雅普諾夫函數(shù)形式如下:
V ( e y , φ e ) = 1 2 e y 2 + 1 2 k e φ e 2 (6) V(e_y,\varphi_e)=\frac{1}{2}e_y^2+\frac{1}{2k_e}\varphi_e^2 \tag{6} V(ey?,φe?)=21?ey2?+2ke?1?φe2?(6)
其中 k e > 0 k_e>0 ke?>0。

為了使 ( e y , φ e ) (e_y,\varphi_e) (ey?,φe?)在平衡點 ( 0 , 0 ) (0,0) (0,0)處穩(wěn)定,根據(jù)李雅普諾夫第二方法的穩(wěn)定判據(jù), V ( x ) V(x) V(x)需滿足:

  1. V ( e y , φ e ) = 0 V(e_y,\varphi_e)=0 V(ey?,φe?)=0 當且僅當 e y = 0 , φ e = 0 e_y=0,\varphi_e =0 ey?=0,φe?=0
  2. V ( e y , φ e ) > 0 V(e_y,\varphi_e)>0 V(ey?,φe?)>0 當且僅當 e y ≠ 0 , φ e ≠ 0 e_y\neq0,\varphi_e\neq0 ey?=0,φe?=0
  3. V ˙ ( e y , φ e ) ≤ 0 \dot{V}(e_y,\varphi_e)\leq0 V˙(ey?,φe?)0 e y ≠ 0 , φ e ≠ 0 e_y\neq0,\varphi_e\neq0 ey?=0,φe?=0

對于1、2兩條,我們選取的李亞普函數(shù) V ( e y , φ e ) V(e_y,\varphi_e) V(ey?,φe?)顯然滿足。所以滿足李雅普諾夫第二方法的前兩條。

對于 V ˙ ( e y , φ e ) \dot{V}(e_y,\varphi_e) V˙(ey?,φe?)我們結(jié)合(5)可得
V ˙ ( e y , φ e ) = e y e y ˙ + 1 k e φ e φ e ˙ = e y ∣ v ? ∣ s i n φ e + 1 k e φ e ( φ ˙ ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y ) (7) \begin{aligned} \dot{V}(e_y,\varphi_e) &=e_y\dot{e_y}+\frac{1}{k_e}\varphi_e \dot{\varphi_e}\\ &=e_y|\vec{v}| sin{\varphi_e}+ \frac{1}{k_e}\varphi_e(\dot{\varphi}-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}) \end{aligned} \tag{7} V˙(ey?,φe?)?=ey?ey?˙?+ke?1?φe?φe?˙?=ey?v sinφe?+ke?1?φe?(φ˙??1?kr?ey?kr?v cosφe??)?(7)
V ˙ ( e y , φ e ) = 0 \dot{V}(e_y,\varphi_e)=0 V˙(ey?,φe?)=0,結(jié)合(7)式可得
e y ∣ v ? ∣ s i n φ e + 1 k e φ e ( φ ˙ ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y ) = 0 k e e y ∣ v ? ∣ s i n φ e φ e + φ ˙ ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y = 0 (8) \begin{aligned} e_y|\vec{v}| sin{\varphi_e}+ \frac{1}{k_e}\varphi_e(\dot{\varphi}-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y})&=0\\ k_ee_y|\vec{v}| \frac{sin{\varphi_e}}{\varphi_e}+ \dot{\varphi}-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}&=0 \end{aligned} \tag{8} ey?v sinφe?+ke?1?φe?(φ˙??1?kr?ey?kr?v cosφe??)ke?ey?v φe?sinφe??+φ˙??1?kr?ey?kr?v cosφe???=0=0?(8)
由上式可以得到零界航向變化率 φ 0 ˙ \dot{\varphi_0} φ0?˙?等于
φ 0 ˙ = k r ∣ v ? ∣ c o s φ e 1 ? k r e y ? k e e y ∣ v ? ∣ s i n φ e φ e (9) \dot{\varphi_0}=\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}-k_ee_y|\vec{v}| \frac{sin{\varphi_e}}{\varphi_e} \tag{9} φ0?˙?=1?kr?ey?kr?v cosφe???ke?ey?v φe?sinφe??(9)
為了使 V ˙ ( e y , φ e ) \dot{V}(e_y,\varphi_e) V˙(ey?,φe?)滿足要求3,我們可以設(shè)計一個調(diào)節(jié)函數(shù) g ( e y , φ e ) = k φ ∣ v ? ∣ φ e > 0 g(e_y,\varphi_e) = k_\varphi |\vec{v}|\varphi_e>0 g(ey?,φe?)=kφ?v φe?>0,其中 k φ > 0 k_{\varphi}>0 kφ?>0,我們可以將車輛航向的變化率 φ ˙ \dot{\varphi} φ˙?設(shè)置為
φ ˙ = φ 0 ˙ ? g ( e y , φ e ) = k r ∣ v ? ∣ c o s φ e 1 ? k r e y ? k e e y ∣ v ? ∣ s i n φ e φ e ? k φ ∣ v ? ∣ φ e (10) \dot{\varphi}=\dot{\varphi_0}-g(e_y,\varphi_e)=\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}-k_ee_y|\vec{v}| \frac{sin{\varphi_e}}{\varphi_e}-k_\varphi |\vec{v}|\varphi_e \tag{10} φ˙?=φ0?˙??g(ey?,φe?)=1?kr?ey?kr?v cosφe???ke?ey?v φe?sinφe???kφ?v φe?(10)
將(10)代入(7)得
V ˙ ( e y , φ e ) = e y ∣ v ? ∣ s i n φ e + 1 k e φ e ( φ ˙ ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y ) = e y ∣ v ? ∣ s i n φ e + 1 k e φ e ( k r ∣ v ? ∣ c o s φ e 1 ? k r e y ? k e e y ∣ v ? ∣ s i n φ e φ e ? k φ ∣ v ? ∣ φ e ? k r ∣ v ? ∣ c o s φ e 1 ? k r e y ) = e y ∣ v ? ∣ s i n φ e + 1 k e φ e ( ? k e e y ∣ v ? ∣ s i n φ e φ e ? k φ ∣ v ? ∣ φ e ) = ? k φ k e ∣ v ? ∣ φ e 2 < 0 (11) \begin{aligned} \dot{V}(e_y,\varphi_e) &=e_y|\vec{v}| sin{\varphi_e}+ \frac{1}{k_e}\varphi_e(\dot{\varphi}-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y})\\ &=e_y|\vec{v}| sin{\varphi_e}+ \frac{1}{k_e}\varphi_e(\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}-k_ee_y|\vec{v}| \frac{sin{\varphi_e}}{\varphi_e}-k_\varphi |\vec{v}|\varphi_e-\frac{k_r|\vec{v}|cos{\varphi_e}}{1-k_re_y}) \\ &=e_y|\vec{v}| sin{\varphi_e}+\frac{1}{k_e}\varphi_e(-k_ee_y|\vec{v}| \frac{sin{\varphi_e}}{\varphi_e}-k_\varphi |\vec{v}|\varphi_e) \\ &=-\frac{k_\varphi}{k_e} |\vec{v}|\varphi_e^2 < 0 \end{aligned} \tag{11} V˙(ey?,φe?)?=ey?v sinφe?+ke?1?φe?(φ˙??1?kr?ey?kr?v cosφe??)=ey?v sinφe?+ke?1?φe?(1?kr?ey?kr?v cosφe???ke?ey?v φe?sinφe???kφ?v φe??1?kr?ey?kr?v cosφe??)=ey?v sinφe?+ke?1?φe?(?ke?ey?v φe?sinφe???kφ?v φe?)=?ke?kφ??v φe2?<0?(11)
因此我們設(shè)計的公式(10)即車輛航向的變化率 φ ˙ \dot{\varphi} φ˙?滿足李雅普諾夫的穩(wěn)定性條件。

根據(jù)前面文章介紹過的車輛運動學模型下的幾何關(guān)系
t a n δ f = L R (12) tan\delta_f=\frac{L}{R} \tag{12} tanδf?=RL?(12)
車輛的航向變化率與車速的轉(zhuǎn)彎半徑關(guān)系 φ ˙ = v / R \dot{\varphi}=v/R φ˙?=v/R,結(jié)合上式可得
δ f = a r c t a n φ ˙ L v (13) \delta_f=arctan\frac{\dot{\varphi}L}{v} \tag{13} δf?=arctanvφ˙?L?(13)

3. 算法和仿真實現(xiàn)

rear_wheel_feedback.py

import math
import numpy as npclass C:# System configK_theta = 1.0K_e = 0.5def normalize_angle(angle):a = math.fmod(angle + np.pi, 2 * np.pi)if a < 0.0:a += (2.0 * np.pi)return a - np.pidef rear_wheel_feedback_control(vehicle, ref_path):theta_e, er, k, ind = calc_preparation(vehicle, ref_path)vr = vehicle.vdot_phi = vr * k * math.cos(theta_e) / (1.0 - k * er) - \C.K_theta * abs(vr) * theta_e - C.K_e * vr * math.sin(theta_e) * er / (theta_e + 1e-19)delta = math.atan2(vehicle.L * dot_phi, vr)return delta, ind, erdef calc_preparation(vehicle, ref_path):"""計算角度誤差theta_e、橫向誤差er、曲率rk和索引index"""rx, ry, ref_yaw, ref_kappa = ref_path[:, 0], ref_path[:, 1], ref_path[:, 2], ref_path[:, 4]dx = [vehicle.x - icx for icx in rx]dy = [vehicle.y - icy for icy in ry]d = np.hypot(dx, dy)index = np.argmin(d)rk = ref_kappa[index]ryaw = ref_yaw[index]vec_nr = np.array([math.cos(ryaw + math.pi / 2.0),math.sin(ryaw + math.pi / 2.0)])vec_target_2_rear = np.array([vehicle.x - rx[index],vehicle.y - ry[index]])er = np.dot(vec_target_2_rear, vec_nr)theta_e = normalize_angle(vehicle.yaw - ryaw)return theta_e, er, rk, index

kinematic_bicycle_model.py

import math
import numpy as npclass Vehicle:def __init__(self,x=0.0,y=0.0,yaw=0.0,v=0.0,dt=0.1,l=3.0):self.steer = 0self.x = xself.y = yself.yaw = yawself.v = vself.dt = dtself.L = l  # 軸距self.x_front = x + l * math.cos(yaw)self.y_front = y + l * math.sin(yaw)def update(self, a, delta, max_steer=np.pi):delta = np.clip(delta, -max_steer, max_steer)self.steer = deltaself.x = self.x + self.v * math.cos(self.yaw) * self.dtself.y = self.y + self.v * math.sin(self.yaw) * self.dtself.yaw = self.yaw + self.v / self.L * math.tan(delta) * self.dtself.v = self.v + a * self.dtself.x_front = self.x + self.L * math.cos(self.yaw)self.y_front = self.y + self.L * math.sin(self.yaw)class VehicleInfo:# Vehicle parameterL = 3.0  #軸距W = 2.0  #寬度LF = 3.8  #后軸中心到車頭距離LB = 0.8  #后軸中心到車尾距離MAX_STEER = 0.6  # 最大前輪轉(zhuǎn)角TR = 0.5  # 輪子半徑TW = 0.5  # 輪子寬度WD = W  #輪距LENGTH = LB + LF  # 車輛長度def draw_trailer(x, y, yaw, steer, ax, vehicle_info=VehicleInfo, color='black'):vehicle_outline = np.array([[-vehicle_info.LB, vehicle_info.LF, vehicle_info.LF, -vehicle_info.LB, -vehicle_info.LB],[vehicle_info.W / 2, vehicle_info.W / 2, -vehicle_info.W / 2, -vehicle_info.W / 2, vehicle_info.W / 2]])wheel = np.array([[-vehicle_info.TR, vehicle_info.TR, vehicle_info.TR, -vehicle_info.TR, -vehicle_info.TR],[vehicle_info.TW / 2, vehicle_info.TW / 2, -vehicle_info.TW / 2, -vehicle_info.TW / 2, vehicle_info.TW / 2]])rr_wheel = wheel.copy() #右后輪rl_wheel = wheel.copy() #左后輪fr_wheel = wheel.copy() #右前輪fl_wheel = wheel.copy() #左前輪rr_wheel[1,:] += vehicle_info.WD/2rl_wheel[1,:] -= vehicle_info.WD/2#方向盤旋轉(zhuǎn)rot1 = np.array([[np.cos(steer), -np.sin(steer)],[np.sin(steer), np.cos(steer)]])#yaw旋轉(zhuǎn)矩陣rot2 = np.array([[np.cos(yaw), -np.sin(yaw)],[np.sin(yaw), np.cos(yaw)]])fr_wheel = np.dot(rot1, fr_wheel)fl_wheel = np.dot(rot1, fl_wheel)fr_wheel += np.array([[vehicle_info.L], [-vehicle_info.WD / 2]])fl_wheel += np.array([[vehicle_info.L], [vehicle_info.WD / 2]])fr_wheel = np.dot(rot2, fr_wheel)fr_wheel[0, :] += xfr_wheel[1, :] += yfl_wheel = np.dot(rot2, fl_wheel)fl_wheel[0, :] += xfl_wheel[1, :] += yrr_wheel = np.dot(rot2, rr_wheel)rr_wheel[0, :] += xrr_wheel[1, :] += yrl_wheel = np.dot(rot2, rl_wheel)rl_wheel[0, :] += xrl_wheel[1, :] += yvehicle_outline = np.dot(rot2, vehicle_outline)vehicle_outline[0, :] += xvehicle_outline[1, :] += yax.plot(fr_wheel[0, :], fr_wheel[1, :], color)ax.plot(rr_wheel[0, :], rr_wheel[1, :], color)ax.plot(fl_wheel[0, :], fl_wheel[1, :], color)ax.plot(rl_wheel[0, :], rl_wheel[1, :], color)ax.plot(vehicle_outline[0, :], vehicle_outline[1, :], color)ax.axis('equal')

path_generator.py

"""
路徑軌跡生成器
"""import math
import numpy as npclass Path:def __init__(self):self.ref_line = self.design_reference_line()self.ref_yaw = self.cal_yaw()self.ref_s = self.cal_accumulated_s()self.ref_kappa = self.cal_kappa()def design_reference_line(self):rx, ry = [], []step_curve = 0.005 * math.pistep_line = 0.25for ix in np.arange(5, 80, step_line):rx.append(ix)ry.append(60)cx, cy, cr = 80, 45, 15theta = np.arange(math.pi/2, -math.pi/2, -step_curve)for itheta in theta:rx.append(cx + cr * math.cos(itheta))ry.append(cy + cr * math.sin(itheta))for ix in np.arange(80, 15, -step_line):rx.append(ix)ry.append(30)cx, cy, cr = 15, 15, 15theta = np.arange(math.pi/2, math.pi * 1.5, step_curve)for itheta in theta:rx.append(cx + cr * math.cos(itheta))ry.append(cy + cr * math.sin(itheta))for ix in np.arange(15, 90, step_line):rx.append(ix)ry.append(0)return np.column_stack((rx, ry))def cal_yaw(self):yaw = []for i in range(len(self.ref_line)):if i == 0:yaw.append(math.atan2(self.ref_line[i + 1, 1] - self.ref_line[i, 1],self.ref_line[i + 1, 0] - self.ref_line[i, 0]))elif i == len(self.ref_line) - 1:yaw.append(math.atan2(self.ref_line[i, 1] - self.ref_line[i - 1, 1],self.ref_line[i, 0] - self.ref_line[i - 1, 0]))else:yaw.append(math.atan2(self.ref_line[i + 1, 1] - self.ref_line[i -1, 1],self.ref_line[i + 1, 0] - self.ref_line[i - 1, 0]))return yawdef cal_accumulated_s(self):s = []for i in range(len(self.ref_line)):if i == 0:s.append(0.0)else:s.append(math.sqrt((self.ref_line[i, 0] - self.ref_line[i-1, 0]) ** 2+ (self.ref_line[i, 1] - self.ref_line[i-1, 1]) ** 2))return sdef cal_kappa(self):# 計算曲線各點的切向量dp = np.gradient(self.ref_line.T, axis=1)# 計算曲線各點的二階導數(shù)d2p = np.gradient(dp, axis=1)# 計算曲率kappa = (d2p[0] * dp[1] - d2p[1] * dp[0]) / ((dp[0] ** 2 + dp[1] ** 2) ** (3 / 2))return kappadef get_ref_line_info(self):return self.ref_line[:, 0], self.ref_line[:, 1], self.ref_yaw, self.ref_s, self.ref_kappa

main.py

from kinematic_bicycle_model import Vehicle, VehicleInfo, draw_trailer
from rear_wheel_feedback import rear_wheel_feedback_control
from path_generator import Path
import numpy as np
import matplotlib.pyplot as plt
import imageio.v2 as imageioMAX_SIMULATION_TIME = 200.0  # 程序最大運行時間200*dtdef main():# 設(shè)置跟蹤軌跡rx, ry, ref_yaw, ref_s, ref_kappa = Path().get_ref_line_info()ref_path = np.column_stack((rx, ry, ref_yaw, ref_s, ref_kappa))# 假設(shè)車輛初始位置為(5,55),航向角yaw=pi/6,速度為2m/s,時間周期dt為0.1秒vehicle = Vehicle(x=5.0,y=55.0,yaw=np.pi/6,v=2.0,dt=0.1,l=VehicleInfo.L)time = 0.0  # 初始時間target_ind = 0# 記錄車輛軌跡trajectory_x = []trajectory_y = []lat_err = []  # 記錄橫向誤差i = 0image_list = []  # 存儲圖片plt.figure(1)last_idx = ref_path.shape[0] - 1  # 跟蹤軌跡的最后一個點的索引while MAX_SIMULATION_TIME >= time and last_idx > target_ind:time += vehicle.dt  # 累加一次時間周期# rear_wheel_feedbackdelta_f, target_ind, e_y = rear_wheel_feedback_control(vehicle, ref_path)# 橫向誤差lat_err.append(e_y)# 更新車輛狀態(tài)vehicle.update(0.0, delta_f, np.pi / 10)  # 由于假設(shè)縱向勻速運動,所以加速度a=0.0trajectory_x.append(vehicle.x)trajectory_y.append(vehicle.y)# 顯示動圖plt.cla()plt.plot(ref_path[:, 0], ref_path[:, 1], '-.b', linewidth=1.0)draw_trailer(vehicle.x, vehicle.y, vehicle.yaw, vehicle.steer, plt)plt.plot(trajectory_x, trajectory_y, "-r", label="trajectory")plt.plot(ref_path[target_ind, 0], ref_path[target_ind, 1], "go", label="target")plt.axis("equal")plt.grid(True)plt.pause(0.001)plt.savefig("temp.png")#     i += 1#     if (i % 50) > 0:#         image_list.append(imageio.imread("temp.png"))## imageio.mimsave("display.gif", image_list, duration=0.01)plt.figure(2)plt.subplot(2, 1, 1)plt.plot(ref_path[:, 0], ref_path[:, 1], '-.b', linewidth=1.0)plt.plot(trajectory_x, trajectory_y, 'r')plt.title("actual tracking effect")plt.subplot(2, 1, 2)plt.plot(lat_err)plt.title("lateral error")plt.show()if __name__ == '__main__':main()

運行效果:

控制效果和橫向誤差:
在這里插入圖片描述

以上內(nèi)容僅是個人理解,如有漏誤歡迎批評指正!

文章首發(fā)公眾號:iDoitnow如果喜歡話,可以關(guān)注一下

http://www.risenshineclean.com/news/22497.html

相關(guān)文章:

  • 企業(yè)建站業(yè)務(wù)還能做嗎沈陽seo合作
  • 模具 東莞網(wǎng)站建設(shè)長沙網(wǎng)絡(luò)推廣外包費用
  • 手機 網(wǎng)站 微信 源碼河南網(wǎng)站seo
  • 龍巖網(wǎng)站制作長沙網(wǎng)站快速排名提升
  • 只做日本的網(wǎng)站網(wǎng)站域名購買
  • 茄子河區(qū)網(wǎng)站建設(shè)自查報告常用的網(wǎng)絡(luò)推廣方式有哪些
  • 網(wǎng)站如何做用戶的實名認證開發(fā)一個網(wǎng)站的步驟流程
  • 公主墳網(wǎng)站建設(shè)學電腦辦公軟件培訓班
  • 孝義網(wǎng)站開發(fā)公司交友平臺
  • 建立網(wǎng)站項目百度商城購物
  • 小商品批發(fā)網(wǎng)云南網(wǎng)站seo服務(wù)
  • 怎么看網(wǎng)站建設(shè)有多久國外域名注冊
  • 做一個小說閱讀網(wǎng)站怎么做seo關(guān)鍵詞優(yōu)化推廣哪家好
  • 手機網(wǎng)站制作價格百度點擊率排名有效果嗎
  • 長沙定制網(wǎng)站建設(shè)一站式自媒體服務(wù)平臺
  • 怎樣做汽車之家視頻網(wǎng)站游戲推廣員如何推廣引流
  • 高古樓網(wǎng)站 做窗子網(wǎng)站制作的基本流程
  • 怎么做公司網(wǎng)站推廣免費正規(guī)的接單平臺
  • 西寧企業(yè)做網(wǎng)站互聯(lián)網(wǎng)公司有哪些
  • 剛開始做寫手上什么網(wǎng)站seo大全
  • 企業(yè)網(wǎng)站建立網(wǎng)絡(luò)虛擬社區(qū)時對于企業(yè)成品短視頻網(wǎng)站源碼搭建
  • 織夢手機網(wǎng)站模板刪除注冊城鄉(xiāng)規(guī)劃師含金量
  • 網(wǎng)站開發(fā)時怎么隱藏文字上海關(guān)鍵詞排名優(yōu)化怎樣
  • 美國人做的古文字網(wǎng)站亞馬遜免費的關(guān)鍵詞工具
  • 靈山招聘網(wǎng)靈山英才網(wǎng)做靈山專業(yè)的招聘網(wǎng)站百度一下點擊搜索
  • 騰訊服務(wù)器做網(wǎng)站龍崗網(wǎng)站設(shè)計
  • 網(wǎng)站建設(shè)策劃書范文案例網(wǎng)絡(luò)優(yōu)化工程師騙局
  • 不收費的小說網(wǎng)站排名百度推廣非企代理
  • git 網(wǎng)站開發(fā)應(yīng)用有哪些網(wǎng)絡(luò)營銷公司
  • 蘇州做網(wǎng)站推廣常州網(wǎng)站推廣