Apollo代码学习(二)—车辆运动学模型

Apollo(阿波罗)是一个开放的、完整的、安全的自动驾驶平台,以灵活和高性能的技术架构,为全自动驾驶提供支持。

前言

要实现对车辆的控制,研究其运动学模型和动力学模型必不可少。上文对横纵向控制的构成及实现做了概述,本文将从车辆的运动学和动力学模型入手,研究如何控制车辆,以及为什么这样控制车辆。

本文的观点及图表多基于下述书籍及链接,并结合Apollo代码整理而来,由于本身并没有学过实车相关的知识,对力学的认知也不够深,如有理解偏颇或侵权之处,请指正删改。
【1】Rajamani R. Vehicle Dynamics and Control[M]. Springer Science, 2006.
【2】龚建伟, 姜岩, 徐威. 无人驾驶车辆模型预测控制[M]. 北京理工大学出版社, 2014.
【3】无人驾驶汽车系统入门(五)——运动学自行车模型和动力学自行车模型

提倡大家支持正版资源,本人提供文档仅限交流学习使用,侵删:
【1】Rajamani R. Vehicle Dynamics and Control[M]. Springer Science, 2006. | CSDN资源
【2】龚建伟, 姜岩, 徐威. 无人驾驶车辆模型预测控制[M]. 北京理工大学出版社, 2014. | CSDN资源

车辆模型

车辆运动学模型与动力学模型的建立是出于车辆运动的规划与控制考虑的。自动驾驶场景下,车辆大多按照规划轨迹行驶,控制模块的作用就是控制车辆尽可能精准的按照规划轨迹行驶。这就要求规划轨迹尽可能贴近实际情况,也就是说,轨迹规划过程中应尽可能考虑车辆运动学及动力学约束,使得运动跟踪控制的性能更好。

搭建车辆模型主要是为了更好的规划和控制,因此,在分析模型时尽量以应用时所需的输入、输出对对象进行建模分析。Apollo中,计算控制命令需要车辆的定位信息、底盘信息以及规划信息等,

Status xxxController::ComputeControlCommand(
    const localization::LocalizationEstimate *localization, //定位信息
    const canbus::Chassis *chassis,  //底盘信息
    const planning::ADCTrajectory *planning_published_trajectory, //规划信息
    ControlCommand *cmd //控制命令)

其中,
定位信息(localization.proto)包含

message LocalizationEstimate {
  optional apollo.common.Header header = 1;
  optional apollo.localization.Pose pose = 2;
  optional Uncertainty uncertainty = 3;

  // The time of pose measurement, seconds since the GPS epoch (Jan 6, 1980).
  optional double measurement_time = 4;  // In seconds.

  // Future trajectory acturally driven by the drivers
  repeated apollo.common.TrajectoryPoint trajectory_point = 5;
}

底盘信息(chassis.proto)包含

message Chassis {
  enum DrivingMode {
    COMPLETE_MANUAL = 0;  // human drive
    COMPLETE_AUTO_DRIVE = 1;
    AUTO_STEER_ONLY = 2;  // only steer
    AUTO_SPEED_ONLY = 3;  // include throttle and brake

    // security mode when manual intervention happens, only response status
    EMERGENCY_MODE = 4;
  }
  
  ...

  // Only available for Lincoln now
  optional ChassisGPS chassis_gps = 28;

  optional apollo.common.EngageAdvice engage_advice = 29;
}

规划信息(planning.proto)包含

message ADCTrajectoryPoint {
  optional double x = 1;  // in meters.
  optional double y = 2;  // in meters.
  optional double z = 3;  // height in meters.

  optional double speed = 6;  // speed, in meters / second
  optional double acceleration_s = 7;  // acceleration in s direction
  optional double curvature = 8;  // curvature (k = 1/r), unit: (1/meters)
  // change of curvature in unit s (dk/ds)
  optional double curvature_change_rate = 9;
  // in seconds (relative_time = time_of_this_state - timestamp_in_header)
  optional double relative_time = 10;
  optional double theta = 11;  // relative to absolute coordinate system
  // calculated from the first point in this trajectory
  optional double accumulated_s = 12;

  // in meters, reference to route SL-coordinate
  optional double s = 4 [deprecated = true];
  // in meters, reference to route SL-coordinate
  optional double l = 5 [deprecated = true];
}

对上述元素进行精简,我们需要关注的信息主要有:

  1. 时间( t t t
  2. 位置( x , y x, y x,y
  3. 速度( v v v
  4. 加速度( a a a
  5. 角速度( ω \omega ω
  6. 位移( s s s
  7. 航向角( ψ \psi ψ
  8. 曲率( k k k
  9. 前轮转角( w h e e l wheel wheel
  10. 方向盘转角( s t e e r steer steer
  11. 刹车( b r a k e brake brake
  12. 油门( t h r o t t l e throttle throttle
  13. 档位( g e a r gear gear

其中,

  • 方向盘转角( s t e e r steer steer
  • 刹车( b r a k e brake brake
  • 油门( t h r o t t l e throttle throttle
  • 档位( g e a r gear gear

为主要被控量。

单车模型(Bicycle Model)

建立模型时,应尽可能使模型简单易用,且能真实反映车辆特性,搭建车辆模型多基于 单车模型 ( B i c y c l e   M o d e l ) \color{Maroon}单车模型(Bicycle\ Model) 单车模型(Bicycle Model),使用单车模型需做如下假设[^1]:

  1. 不考虑车辆在Z轴方向的运动,只考虑XY水平面的运动,如图1所示;
  2. 左右侧车轮转角一致,这样可将左右侧轮胎合并为一个轮胎,以便于搭建单车模型,如图2所示;
  3. 车辆行驶速度变化缓慢,忽略前后轴载荷的转移;
  4. 车身及悬架系统是刚性的。
图1 车辆模型

单车模型 ( B i c y c l e   M o d e l ) \color{Maroon}单车模型(Bicycle\ Model) 单车模型(Bicycle Model)将左/右前轮合并为一个点,位于A点;将左/右后轮合并为一个点,位于B点;点C为车辆质心点。

图2 单车模型

其中, O O O为OA、OB的交点,是车辆的瞬时滚动中心,线段OA、OB分别垂直于两个滚动轮的方向; β \beta β滑移角(Tire Slip Angle),指车辆速度方向和车身朝向两者间所成的角度, ψ \psi ψ航向角(Heading Angle),指车身与X轴的夹角。

关于滑移角和航向角,此处有较大争议,由于此处是翻译而来的,而我不能给大家准确的信息,因此附上原文,望大家自己甄别:
原文出处:Vehicle Dynamics and Control. p20
( X , Y ) are inertial coordinates of the location of the vehicle while ψ \psi ψ describes the orientation of the vehicle. The velocity of the vehicle is denoted by V V V and makes an angle β \beta β with the longitudinal axis of the vehicle. The angle β \beta β is called the slip angle of the vehicle.
如若有确切出处可以证明我所书写的有错,感谢指正并附上出处,感激不尽。

符号定义符号定义
A A A前轮中心 B B B后轮中心
C C C车辆质心 O O O转向圆心
V V V质心车速 R R R转向半径
β \beta β滑移角 ψ \psi ψ航向角
δ r \delta_r δr后轮偏角 δ f \delta_f δf前轮偏角

当车辆为 前轮驱动 ( f r o n t − w h e e l − o n l y ) \color{Maroon}前轮驱动(front-wheel-only) 前轮驱动(frontwheelonly)时,可假设 δ r \delta_r δr恒为0。
勘误 \color{Maroon}勘误 勘误
之前文中说 ℓ r \ell_r r是后悬长度, ℓ f \ell_f f是前悬长度,是错误的,前悬后悬长度计算应该是从后轴中心开始,而不是从质心开始的。

车辆运动学模型

运动学是从几何学的角度研究物体的运动规律,包括物体在空间的位置、速度等随时间而产生的变化,因此,车辆运动学模型应该能反映车辆位置、速度、加速度等与时间的关系。在车辆轨迹规划过程中应用运动学模型,可以使规划出的轨迹更切合实际,满足行驶过程中的运动学几何约束,且基于运动学模型设计出的控制器也能具有更可靠的控制性能。

基于单车模型,如图2所示,搭建车辆运动学模型。由正弦法则:
sin ⁡ ( δ f − β ) ℓ f = sin ⁡ ( π 2 − δ f ) R (1.1) \frac{\sin(\delta_f-\beta)}{\ell_f}=\frac{\sin(\frac{\pi}{2}-\delta_f)}{R} \tag{1.1} fsin(δfβ)=Rsin(2πδf)(1.1)
sin ⁡ ( β − δ r ) ℓ r = sin ⁡ ( π 2 + δ r ) R (1.2) \frac{\sin(\beta-\delta_r)}{\ell_r}=\frac{\sin(\frac{\pi}{2}+\delta_r)}{R} \tag{1.2} rsin(βδr)=Rsin(2π+δr)(1.2)
展开公式 ( 1.1 ) ( 1.2 ) (1.1)(1.2) (1.1)(1.2)可得:
sin ⁡ δ f cos ⁡ β − sin ⁡ β cos ⁡ δ f ℓ f = cos ⁡ δ f R (1.3) \frac{\sin\delta_f\cos\beta-\sin\beta\cos\delta_f}{\ell_f}=\frac{\cos\delta_f}{R} \tag{1.3} fsinδfcosβsinβcosδf=Rcosδf(1.3)
cos ⁡ δ r sin ⁡ β − cos ⁡ β sin ⁡ δ r ℓ r = cos ⁡ δ r R (1.4) \frac{\cos\delta_r\sin\beta-\cos\beta\sin\delta_r}{\ell_r}=\frac{\cos\delta_r}{R} \tag{1.4} rcosδrsinβcosβsinδr=Rcosδr(1.4)
联立公式 ( 1.3 ) ( 1.4 ) (1.3)(1.4) (1.3)(1.4)可得:
( tan ⁡ δ f − tan ⁡ δ r ) cos ⁡ β = ℓ f + ℓ r R (1.5) (\tan\delta_f-\tan\delta_r)\cos\beta=\frac{\ell_f+\ell_r}{R} \tag{1.5} (tanδftanδr)cosβ=Rf+r(1.5)

低速环境下,车辆行驶路径的转弯半径变化缓慢,此时我们可以假设车辆的方向变化率等于车辆的角速度。则车辆的角速度为 ψ ˙ = V R (1.6) \dot{\psi}=\frac{V}{R} \tag{1.6} ψ˙=RV(1.6)
联立公式 ( 1.5 ) ( 1.6 ) (1.5)(1.6) (1.5)(1.6)可得:
ψ ˙ = V cos ⁡ β ℓ f + ℓ r ( tan ⁡ δ f − tan ⁡ δ r ) (1.7) \dot{\psi}=\frac{V\cos\beta}{\ell_f+\ell_r}(\tan\delta_f-\tan\delta_r) \tag{1.7} ψ˙=f+rVcosβ(tanδftanδr)(1.7)
则在惯性坐标系XY下,可得车辆运动学模型:

{ X ˙ = V cos ⁡ ( ψ + β ) Y ˙ = V sin ⁡ ( ψ + β ) ψ ˙ = V cos ⁡ β ℓ f + ℓ r ( tan ⁡ δ f − tan ⁡ δ r ) (1.8) \begin{cases} \dot{X}=V\cos(\psi+\beta) \\ \dot{Y}=V\sin(\psi+\beta) \\ \dot{\psi}=\frac{V\cos\beta}{\ell_f+\ell_r}(\tan\delta_f-\tan\delta_r) \tag{1.8} \end{cases} X˙=Vcos(ψ+β)Y˙=Vsin(ψ+β)ψ˙=f+rVcosβ(tanδftanδr)(1.8)

此模型中有三个输入: δ f \delta_f δf δ r \delta_r δr V V V
滑移角 β \beta β可由公式 ( 1.3 ) ( 1.4 ) (1.3)(1.4) (1.3)(1.4)求得:
β = tan ⁡ − 1 ( ℓ f tan ⁡ δ r + ℓ r tan ⁡ δ f ℓ f + ℓ r ) (1.9) \beta=\tan^{-1}(\frac{\ell_f\tan\delta_r+\ell_r\tan\delta_f}{\ell_f+\ell_r}) \tag{1.9} β=tan1(f+rftanδr+rtanδf)(1.9)

阿克曼转向几何(Ackerman turning geometry)

阿克曼转向几何 ( A c k e r m a n   T u r n i n g   G e o m e t r y ) \color{Red}阿克曼转向几何(Ackerman\ Turning\ Geometry) 阿克曼转向几何(Ackerman Turning Geometry)是一种为了解决交通工具转弯时,内外转向轮路径指向的圆心不同的几何学。

在单车模型中,将转向时左/右前轮偏角假设为同一角度,虽然通常两个角度大致相等,但实际并不是,通常情况下,内侧轮胎转角更大。如下图所示, δ o \delta_o δo δ i \delta_i δi分别为外侧前轮和内侧前轮偏角,当车辆右转时,右前轮胎为内侧轮胎,其转角 δ i \delta_i δi较左前轮胎转角 δ o \delta_o δo更大。 ℓ w \ell_w w为轮距, L L L为轴距,后轮两轮胎转角始终为 0 ° \color{Maroon}0\degree
当以后轴中心为参考点时,转向半径 R R R为下图中 红线 \color{Red}红线 红线

图3 阿克曼转向几何

当滑移角 β \beta β很小时,且后轮偏角为0时,公式 ( 1.7 ) (1.7) (1.7)可表述为:
ψ ˙ V ≈ 1 R = δ L (1.10) \frac{\dot{\psi}}{V}\approx\frac{1}{R}=\frac{\delta}{L} \tag{1.10} Vψ˙R1=Lδ(1.10)
由于内外侧轮胎的转向半径不同,因此有:
δ o = L R + ℓ w 2 (1.11) \delta_o=\frac{L}{R+\frac{\ell_w}{2}} \tag{1.11} δo=R+2wL(1.11)
δ i = L R − ℓ w 2 (1.12) \delta_i=\frac{L}{R-\frac{\ell_w}{2}} \tag{1.12} δi=R2wL(1.12)
则前轮平均转角
δ = δ o + δ i 2 ≅ L R (1.13) \delta=\frac{\delta_o+\delta_i}{2}\cong\frac{L}{R}\tag{1.13} δ=2δo+δiRL(1.13)
内外转角之差
Δ δ = δ i − δ o = L R 2 ℓ w = δ 2 ℓ w L (1.14) \Delta\delta=\delta_i-\delta_o=\frac{L}{R^2}\ell_w=\delta^2\frac{\ell_w}{L} \tag{1.14} Δδ=δiδo=R2Lw=δ2Lw(1.14)
因此,两个前轮的转向角的差异 Δ δ \Delta\delta Δδ与平均转向角 δ \delta δ的平方成正比。

依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大大约2~4度,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,让车辆可以顺畅的转弯。

图4 梯形拉杆装置差动转向机构

小结

以后轴中心为参考点,以单车模型为基础建立车辆的运动学模型, ( X r , Y r ) (X_r, Y_r) (Xr,Yr)为后轴中心坐标, ψ \psi ψ为航向角, v r v_r vr为车速, δ f \delta_f δf为前轮转角,后轮转角 δ r \delta_r δr恒为 0 ° 0\degree w w w为横摆角速度,滑移角 β \beta β极小,假设为0。

当状态量为 ξ = [ X r , Y r , ψ ] T \xi=[X_r, Y_r, \psi]^T ξ=[Xr,Yr,ψ]T,被控量为 u = [ v r , δ f ] T u=[v_r, \delta_f]^T u=[vr,δf]T时,公式 ( 1.8 ) (1.8) (1.8)可转换为如下形式:
[ X r ˙ Y r ˙ ψ ˙ ] = [ cos ⁡ ψ sin ⁡ ψ tan ⁡ δ f / l ] v r (1.15) \begin{bmatrix} \dot{X_r} \\ \dot{Y_r} \\ \dot\psi \end{bmatrix}= \begin{bmatrix} \cos\psi \\ \sin\psi \\ \tan{\delta_f}/l \end{bmatrix}v_r \tag{1.15} Xr˙Yr˙ψ˙ = cosψsinψtanδf/l vr(1.15)
但在无人车控制过程中,一般控制对象 u = [ v r , w ] T u=[v_r, w]^T u=[vr,w]T,则式1.15可写为:
[ X r ˙ Y r ˙ ψ ˙ ] = [ cos ⁡ ψ sin ⁡ ψ 0 ] v r + [ 0 0 1 ] w (1.16) \begin{bmatrix} \dot{X_r} \\ \dot{Y_r} \\ \dot\psi \end{bmatrix}= \begin{bmatrix} \cos\psi \\ \sin\psi \\ 0 \end{bmatrix}v_r+ \begin{bmatrix} 0\\ 0 \\ 1 \end{bmatrix}w \tag{1.16} Xr˙Yr˙ψ˙ = cosψsinψ0 vr+ 001 w(1.16)
速度 v r v_r vr的控制主要通过刹车( b r a k e brake brake)、油门( t h r o t t l e throttle throttle)、档位( g e a r gear gear)等来控制,横摆角速度 w w w主要通过转动方向盘( s t e e r steer steer)来控制。

Apollo中的运动学约束(control_gflags.cc)主要有:

DEFINE_int32(max_localization_miss_num, 20,
             "Max missing number of localization before entering estop mode");
DEFINE_int32(max_chassis_miss_num, 20,
             "Max missing number of chassis before entering estop mode");
DEFINE_int32(max_planning_miss_num, 20,
             "Max missing number of planning before entering estop mode");

DEFINE_double(max_acceleration_when_stopped, 0.01,
              "max acceleration can be observed when vehicle is stopped");
DEFINE_double(max_abs_speed_when_stopped, 0.01,
              "max absolute speed can be observed when vehicle is stopped");
DEFINE_double(steer_angle_rate, 100.0,
              "Steer angle change rate in percentage.");

车辆动力学模型请看下一篇博文:Apollo代码学习(三)—车辆动力学模型

  • 120
    点赞
  • 869
    收藏
    觉得还不错? 一键收藏
  • 38
    评论
为了学习Apollo代码,你可以按照以下步骤进行: 1. 下载Apollo源码并导入到开发工具中。你可以从Apollo的GitHub或者Gitee仓库中获取源码。 2. 学习Apollo的核心概念和工作原理。了解各个模块的职责以及分步执行流程。 3. 阅读Apollo的文档和代码注释。文档中提供了详细的使用说明和示例代码代码注释可以帮助你理解代码的功能和实现细节。 4. 运行Apollo的示例代码Apollo提供了一些示例代码,可以帮助你更好地理解如何使用Apollo来实现配置中心功能。 5. 自己编写测试代码。根据自己的需求和学习进度,可以编写一些测试代码来验证和深入理解Apollo的功能。 6. 练习修改配置和热发布。通过修改配置文件并观察变化,可以更好地理解Apollo的配置管理功能和热发布机制。 请注意,学习Apollo代码需要一定的Java和Spring框架的基础知识。如果你对这些领域不熟悉,建议先学习Java和Spring相关的知识再进行深入的学习。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Apollo学习(超详细)](https://blog.csdn.net/hyzsuccess/article/details/127867287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值