基于Carla的EMplanner教程一:动力学模型到LQR

Carla教程一、动力学模型到LQR

从运动学模型和动力学模型到LQR

模型就是可以描述车辆运动规律的模型。车辆建模都是基于自行车模型的设定,也就是将四个轮子抽象为自行车一样的两个轮子来建模。

1、运动学模型

运动学模型是基于几何关系分析出来的,一般适用于低俗情况下,这种情况可以不考虑轮胎的侧偏特性。另外,这里假设前轮的方向就是当前车辆速度的方向。但是高速情况并非如此。整个控制量可以简化为加速度a和偏航角 δ \delta δ。其中油门代表a为正,刹车代表a为负。偏航角是方向盘的控制量。然后可以定义下面的几个状态量,用来描述车辆当前状态:

  • x:车辆当前横轴坐标
  • y:车辆纵轴坐标
  • v: 车辆速度
  • φ \varphi φ:车辆横摆角
    请添加图片描述

最后推导得到的动力学模型如下:
x ˙ = v cos ⁡ φ y ˙ = v sin ⁡ φ φ ˙ = v tan ⁡ δ f L \dot{x}=v\cos \varphi \\ \dot{y}=v\sin \varphi \\ \dot{\varphi}=\frac{v\tan \delta _f}{L} x˙=vcosφy˙=vsinφφ˙=Lvtanδf
其中 δ f \delta_f δf是前轮的转向角。因为后轮一般都是不转向的,所以 δ r \delta_r δr是零。

2、动力学模型

需要考虑轮胎的侧偏性质。动力学模型是通过对轮胎和地面之间的相互作用来描述车辆的运动。动力学模型是基于车辆的动力学原理进行建模的,它考虑了车辆的质量、加速度、速度、转向等因素,可以更加精确地预测车辆的运动轨迹。动力学模型的优点在于可以考虑更多的因素,更加精确地预测车辆的运动轨迹,适用于高速行驶和紧急情况下的自动驾驶。但是,动力学模型对传感器的精度要求较高,对于复杂的路况和车辆之间的交互,需要更多的计算资源。

动力学模型可以将车辆运动的横纵向解耦,而运动学模型则无法解耦。

根据自行车动力学模型的推导,注意动力学模型中一个很关键的参数就是轮胎测偏参数,轮胎测偏力和轮胎测偏角度成正比。在实际中,测偏刚度是负数。

经过推导可以计算出关于横向速度和角速度作为状态变量,横向加速度和横向角速度变化量为因变量的状态方程。如下:
   ( y ¨ φ ¨ )    =    ( C φ f +    C φ r m v x a C φ f −    b C φ r I v x a C φ f +    b C φ r m v x − v x a 2 C φ f +    b 2 C φ r I v x ) ( y ˙ φ ˙ )    +    ( − C φ f m − a C φ f I ) δ \,\,\left( \begin{array}{c} \ddot{y}\\ \ddot{\varphi}\\ \end{array} \right) \,\,=\,\,\left( \begin{array}{c} \frac{C_{\varphi _f}+\,\,C_{\varphi _r}}{mv_x}\\ \frac{aC_{\varphi _f}-\,\,bC_{\varphi _r}}{Iv_x}\\ \end{array} \right. \left. \begin{array}{c} \frac{aC_{\varphi _f}+\,\,bC_{\varphi _r}}{mv_x}-v_x\\ \frac{a^2C_{\varphi _f}+\,\,b^2C_{\varphi _r}}{Iv_x}\\ \end{array} \right) \left( \left. \begin{array}{c} \dot{y}\\ \dot{\varphi}\\ \end{array} \right) \right. \,\,+\,\,\left( \begin{array}{c} -\frac{C_{\varphi _f}}{m}\\ -\frac{aC_{\varphi f}}{I}\\ \end{array} \right) \delta (y¨φ¨)=(mvxCφf+CφrIvxaCφfbCφrmvxaCφf+bCφrvxIvxa2Cφf+b2Cφr (y˙φ˙)+(mCφfIaCφf)δ
从公式中能看到,通过控制delta转向角来实现控制角速度和y轴方面的加速度。delta代表的方向盘的转角,也就是控制量。

规划模块获得了 ( x r    , y r , v r , θ r , a r ) (x_{r\,\,},y_r,v_r,\theta _r,a_r) (xr,yr,vr,θr,ar),这些都是参考信息,是希望车辆能够达到的状态。因此需用通过车辆当前的状态 ( x    , y , v , θ , a ) (x_{\,\,},y,v,\theta ,a) (x,y,v,θ,a)。然后计算如下误差:

  • 纵向误差
  • 横向误差
  • 航向误差
  • 速度误差
  • 加速度误差

但是首先需要将 ( x r    , y r , v r , θ r , a r ) (x_{r\,\,},y_r,v_r,\theta _r,a_r) (xr,yr,vr,θr,ar) ( x    , y , v , θ , a ) (x_{\,\,},y,v,\theta ,a) (x,y,v,θ,a)转化为frenet坐标系信息。然后计算基于Frenet坐标系下的误差。

所以,控制器的目标就是让 x r x_r xr x x x尽可能接近,也就是误差 e r r e_{rr} err最小。

请添加图片描述

所以可以构造一个损失函数 J J J,如下:
J    =    e r r 2    +    u 2 J\,\,=\,\,e_{rr}^{2}\,\,+\,\,u^2 J=err2+u2
其中 u u u是为了控制更加平顺。写成二次型如下:
J    =    e r r T Q    e r r +    u T R u J\,\,=\,\,{e_{rr}}^TQ\,\,e_{rr}+\,\,u^TRu J=errTQerr+uTRu
变成了目标 J J J在约束条件: e ˙ r r = A ˉ e r r + B ˉ u \dot{e}_{rr}=\bar{A}e_{rr}+\bar{B}u e˙rr=Aˉerr+Bˉu 下的最小求解。这就是所谓的LQR(线性二次调节器)

根据动力学公式推导,找到这个约束条件中的A和B。得到的公式如下:
( e ˙ d e ¨ d e ˙ α e ¨ α ) = ( 0 1 0 0 0 C φ f + C φ r m v x − C φ f + C φ r m a C φ f − b C φ r m v x 0 0 0 1 0 a C φ f − b C φ r I v x − a C φ f − b C φ r I a 2 C φ f + b 2 C φ r I v x ) ( e d e ˙ d e φ e ˙ φ )    +    ( 0 − C φ f m 0 − a C φ f I ) δ + ( 0 a C φ f − b C φ r m v x − v x 0 a 2 C φ f + b 2 C φ r I v x ) θ ˙ r \left( \begin{array}{c} \dot{e}_d\\ \ddot{e}_d\\ \dot{e}_{\alpha}\\ \ddot{e}_{\alpha}\\ \end{array} \right) =\left( \begin{matrix} 0& 1& 0& 0\\ 0& \frac{C_{\varphi f}+C_{\varphi r}}{mv_x}& -\frac{C_{\varphi f}+C_{\varphi r}}{m}& \frac{aC_{\varphi f}-bC_{\varphi r}}{mv_x}\\ 0& 0& 0& 1\\ 0& \frac{aC_{\varphi f}-bC_{\varphi r}}{Iv_x}& \frac{-aC_{\varphi f}-bC_{\varphi r}}{I}& \frac{a^2C_{\varphi f}+b^2C_{\varphi r}}{Iv_x}\\ \end{matrix} \right) \left( \begin{array}{c} e_d\\ \dot{e}_d\\ e_{\varphi}\\ \dot{e}_{\varphi}\\ \end{array} \right) \,\,+\,\,\left( \begin{array}{c} 0\\ -\frac{C_{\varphi f}}{m}\\ 0\\ -\frac{aC_{\varphi f}}{I}\\ \end{array} \right) \delta +\left( \begin{array}{c} 0\\ \frac{aC_{\varphi f}-bC_{\varphi r}}{mv_x}-v_x\\ 0\\ \frac{a^2C_{\varphi f}+b^2C_{\varphi r}}{Iv_x}\\ \end{array} \right) \dot{\theta}_r e˙de¨de˙αe¨α = 00001mvxCφf+Cφr0IvxaCφfbCφr0mCφf+Cφr0IaCφfbCφr0mvxaCφfbCφr1Ivxa2Cφf+b2Cφr ede˙deφe˙φ + 0mCφf0IaCφf δ+ 0mvxaCφfbCφrvx0Ivxa2Cφf+b2Cφr θ˙r
要求解J在上述约束下的解,得需要将其离散化,然后可用拉格朗日乘子法就可以直接求解。

补充一下拉格朗日乘子法的知识:

  • 拉格朗日乘子法(Lagrange multipliers)是一种寻找多元函数在一组约束下极值的方法。
  • 通过引入拉格朗日乘子,可将有 d个变量与 k 个约束条件的最优化问题转化为具有 d+k 个变量的无约束优化问题求解。

离散化以后的称之为DLQR, 离散LQR只涉及到拉格朗日乘子法,问题变成了 J    =    ∑ k = 0 + ∞ ( x K T Q x k    +    u k T R u k ) J\,\,=\,\,\sum_{k=0}^{+\infty}{\left( x_{K}^{T}Qx_k\,\,+\,\,u_{k}^{T}Ru_k \right)} J=k=0+(xKTQxk+ukTRuk)在约束 x k + 1 = A ˉ x k + B ˉ u k x_{k+1}=\bar{A}x_k+\bar{B}u_k xk+1=Aˉxk+Bˉuk的求解极小值。

3、LQR
问题一、如何将状态方程离散化

现在要将 x ˙ = A ˙ x + B ˙ u \dot{x}=\dot{A}x+\dot{B}u x˙=A˙x+B˙u离散化,有前向欧拉法、中点欧拉法和后向欧拉法。

欧拉法回顾:

如果要对 x ˙ = A ˙ x \dot{x}=\dot{A}x x˙=A˙x进行离散化,将其左右同时积分,结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HNOgDUhH-1690441990297)(E:\文档\A校招面试准备内\images\oula.PNG)]

对于 x ˙ = A ˙ x + B ˙ u \dot{x}=\dot{A}x+\dot{B}u x˙=A˙x+B˙u离散化,采用重点欧拉法和向前欧拉法结合,最后得到的 x k + 1 = A ˉ x k + B ˉ u k x_{k+1}=\bar{A}x_k+\bar{B}u_k xk+1=Aˉxk+Bˉuk,其中:
A ˉ = ( I − A d t 2 ) − 1 ( I + A d t 2 ) B ˉ    =    B d t \bar{A}=\left( I-\frac{Adt}{2} \right) ^{-1}\left( I+\frac{Adt}{2} \right) \\ \bar{B}\,\,=\,\,Bdt Aˉ=(I2Adt)1(I+2Adt)Bˉ=Bdt
dt可以设置为0.01。

问题二、如何求解DLQR?

推导过程过于复杂,此处战且不表,结论如下:

对于状态方程: e ˙ r r    =    A e r r + B u \dot{e}_{rr}\,\,=\,\,Ae_{rr}+Bu e˙rr=Aerr+Bu

  1. 离散化:$e_{rr}\left( k+1 \right) ,,=,,\bar{A}e_{rr}\left( k \right) +\bar{B}u\left( k \right) $

  2. 求解Riccati方程: P = Q + A ˉ T P A ˉ − A ˉ T P B ˉ ( R + B ˉ T P B ˉ ) − 1 B ˉ T P A ˉ P=Q+\bar{A}^TP\bar{A}-\bar{A}^TP\bar{B}\left( R+\bar{B}^TP\bar{B} \right) ^{-1}\bar{B}^TP\bar{A} P=Q+AˉTPAˉAˉTPBˉ(R+BˉTPBˉ)1BˉTPAˉ

    最初P初始化为Q,然后持续迭代P。

  3. 求解: K = ( R + B ˉ T P B ˉ ) − 1 B ˉ T P A ˉ K=\left( R+\bar{B}^TP\bar{B} \right) ^{-1}\bar{B}^TP\bar{A} K=(R+BˉTPBˉ)1BˉTPAˉ

  4. 得: u k = − k e r r ( k ) u_k=-ke_{rr}\left( k \right) uk=kerr(k)

### 导入外部车辆动力学模型CARLACARLA模拟平台中引入外部车辆动力学模型涉及多个方面的工作。通常情况下,CARLA自带了定数量预定义的车辆及其物理属性设置;然而为了满足特定研究需求或更精确地仿真某些类型的汽车行为,则可能需要自定义这些参数甚至完全替换默认的动力学机制。 对于希望集成第三方库(如通过Python接口操作NVIDIA GPU状态监控工具`gputil`[^1])或其他形式的硬件加速功能来说,这并不是直接关联的任务路径。不过,在考虑增强CARLA中的车辆表现真实性时,可以采取如下方法来实现这点: #### 方法:修改现有Actor蓝图 可以通过调整现有的actor蓝图文件(.xodr,.json),加入新的物理特性描述符,从而改变已存在车型的行为模式。此过程需深入了解UE4引擎以及CARLA内部架构,并确保所做更改不会破坏系统的稳定性。 #### 方法二:创建全新的Vehicle Blueprint 利用Unreal Engine 4(UE4)的强大编辑能力构建个完整的新型号车体蓝图,其中包含了来自其他来源的动力学数据集。之后再将其导出并与CARLA环境同步加载运行。这种方式提供了最大的灵活性但也伴随着较高的开发成本和技术门槛。 #### 方法三:API扩展与插件开发 如果上述两种方案都不能很好地解决问题的话,还可以尝试基于CARLA提供的开放API进行二次开发工作。编写专门用于处理特殊车辆运动规律的服务端脚本或者客户端应用程序逻辑,进而达到预期效果。此外也可以探索官方文档里提到过的传感器融合技术,或许能从中找到灵感启发。 ```python import carla client = carla.Client('localhost', 2000) world = client.get_world() # 假设已经有个名为'my_vehicle'的新车辆蓝图被成功注册到了服务器上 blueprint_library = world.get_blueprint_library() vehicle_bp = blueprint_library.find('my_vehicle') spawn_point = carla.Transform(carla.Location(x=30, y=0, z=1), carla.Rotation(yaw=-90)) ego_vehicle = world.spawn_actor(vehicle_bp, spawn_point) try: while True: # 这里可以根据实际情况更新ego_vehicle的状态或者其他交互操作 pass finally: ego_vehicle.destroy() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值