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)

  建立模型时,应尽可能使模型简单易用,且能真实反映车辆特性,搭建车辆模型多基于单车模型(Bicycle Model),使用单车模型需做如下假设[^1]:

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

单车模型(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 VV and makes an angle β \betaβ with the longitudinal axis of the vehicle. The angle β \betaβ is called the slip angle of the vehicle.
如若有确切出处可以证明我所书写的有错,感谢指正并附上出处,感激不尽。

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

当车辆为前轮驱动(front-wheel-only)时,可假设 δ r \delta_r δr恒为0。

车辆运动学模型

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

  基于单车模型,如图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)可得:

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)可得:

( 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)可得:

ψ ˙ = 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 c o s β ℓ f + ℓ r ( t a n δ f − t a n δ r ) (1.8) \begin{cases} \dot{X} = V\cos(\psi+\beta) \\ \dot{Y} = V\sin(\psi+\beta) \\ \dot{\psi} = \frac {Vcos\beta}{\ell_f+\ell_r}(tan\delta_f-tan\delta_r) \end{cases} \tag{1.8} 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)求得:

β = 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)

阿克曼转向几何(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°。

当以后轴中心为参考点时,转向半径R为下图中红线

图3 阿克曼转向几何

当滑移角 β \beta β很小时,且后轮偏角为0时,公式(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°, ω \omega ω为横摆角速度,滑移角 β \beta β极小,假设为0。

当状态量为 ξ = [ X r , Y r , ψ ] \xi=[X_r, Y_r, \psi] ξ=[Xr,Yr,ψ],被控量为 u = [ v r , δ f ] T u=[v_r, \delta_f]^T u=[vr,δf]T时,公式(1.8)可转换为如下形式:
[ X r ˙ Y r ˙ ψ ˙ ] = [ c o s ψ s i n ψ t a n δ 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/lvr(1.15)
但在无人车控制过程中,一般控制对象 u = [ v r , ω ] T u=[v_r, \omega]^T u=[vr,ω]T,则式1.15可写为:

[ X r ˙ Y r ˙ ψ ˙ ] = [ c o s ψ s i n ψ 0 ] v r + [ 0 0 1 ] ω (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}\omega \tag{1.16} Xr˙Yr˙ψ˙=cosψsinψ0vr+001ω(1.16)

速度 v r v_r vr的控制主要通过刹车(brake)、油门(throttle)、档位(gear)等来控制,横摆角速度主 ω \omega ω要通过转动方向盘(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.");

猜你喜欢

转载自blog.csdn.net/Csdn_Darry/article/details/110739719