自动驾驶控制算法——横纵向误差计算

这篇具有很好参考价值的文章主要介绍了自动驾驶控制算法——横纵向误差计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

建立道路-车辆误差模型

首先要建立车辆质心相对于车道中心线的误差模型,示意图如下所示:
车辆误差模型,自动驾驶控制算法,自动驾驶,机器学习,概率论

Frenet坐标系与全局笛卡尔Cartesian坐标系转换

  • 参考:https://mp.weixin.qq.com/s/VrbvIdoqFu6EBFZOwdaKUA 自动驾驶规控混乱源头:Frenet坐标系

Cartesian转Frenet公式

C a r t e s i a n Cartesian Cartesian坐标系下,车辆运动状态可以描述为 ( x , y , θ , v , a , k ) (x, y, \theta, v, a, k) (x,y,θ,v,a,k), 在 F r e n e t Frenet Frenet坐标系下, 车辆的运动状态可以描述为 ( s r , x r , y r , θ r , k r , k r ′ ) (s_r, x_r, y_r,\theta_r, k_r, k_r') (sr,xr,yr,θr,kr,kr),求车辆在Frenet坐标系下的运动状态表达: [ s , s ˙ , s ¨ , d , d ˙ , d ¨ , d ′ , d ′ ′ ] \left[s, \dot{s}, \ddot{s}, d, \dot{d}, \ddot{d}, d', d''\right] [s,s˙,s¨,d,d˙,d¨,d,d′′]

公式总结如下:
s = s r s=s_r s=sr

s ˙ = v ∗ cos ⁡ ( θ − θ r ) 1 − k r ∗ d \dot{s} =\frac{v*\cos(\theta -\theta_r)}{1-k_r*d} s˙=1krdvcos(θθr)

s ¨ = a ∗ cos ⁡ ( θ − θ r ) − s ˙ 2 ∗ [ d ′ ( k ∗ 1 − k r cos ⁡ ( θ − θ r ) − k r ) − ( k r ′ ∗ d + k r ∗ d ′ ) ] 1 − k r ∗ d \ddot{s}=\frac{a*\cos(\theta -\theta_r)-\dot{s}^2*[d'(k*\frac{1-k_r}{\cos(\theta -\theta_r)}-k_r)-(k_r'*d+k_r*d')]}{1-k_r*d} s¨=1krdacos(θθr)s˙2[d(kcos(θθr)1krkr)(krd+krd)]

d = − sin ⁡ θ r ∗ ( x − x r ) + cos ⁡ θ r ∗ ( y − y r ) d=-\sin \theta_r*(x-x_r)+\cos \theta_r*(y-y_r) d=sinθr(xxr)+cosθr(yyr)

d ˙ = v ∗ sin ⁡ ( θ − θ r ) \dot{d}=v*\sin(\theta-\theta_r) d˙=vsin(θθr)

d ¨ = a ∗ sin ⁡ ( θ − θ r ) \ddot{d}=a*\sin(\theta-\theta_r) d¨=asin(θθr)

d ′ = ( 1 − k r ∗ d ) tan ⁡ ( θ − θ r ) d'=(1-k_r*d) \tan(\theta-\theta_r) d=(1krd)tan(θθr)

d ′ ′ = − ( k r ′ + k r ∗ d ′ ) tan ⁡ ( θ − θ r ) + 1 − k r ∗ d cos ⁡ 2 ( θ − θ r ) ∗ ( k ∗ 1 − k r ∗ d cos ⁡ ( θ − θ r ) − k r ) d''=-(k_r'+k_r*d') \tan(\theta-\theta_r) +\frac{1-k_r*d}{\cos^2(\theta-\theta_r)}*(k* \frac{1-k_r*d}{\cos(\theta-\theta_r)} - k_r) d′′=(kr+krd)tan(θθr)+cos2(θθr)1krd(kcos(θθr)1krdkr)

其中:

C a r t e s i a n Cartesian Cartesian坐标系下的量:

  • x , y x,y x,y表示车辆在 C a r t e s i a n Cartesian Cartesian坐标系下的位置信息;
  • θ \theta θ为车辆在 C a r t e s i a n Cartesian Cartesian坐标系下的航向角;
  • k k k C a r t e s i a n Cartesian Cartesian坐标系下的曲率;
  • v v v为车辆在 C a r t e s i a n Cartesian Cartesian坐标系下的线速度;
  • a = d v d t a=\frac{dv}{dt} a=dtdv为车辆在 C a r t e s i a n Cartesian Cartesian坐标系下的加速度;

F r e n e t Frenet Frenet坐标系下的量:

  • s s s F r e n e t Frenet Frenet坐标系下的纵向位移;
  • s ˙ = d s d t \dot{s}=\frac{ds}{dt} s˙=dtds F r e n e t Frenet Frenet坐标系下纵向速度;
  • s ¨ = d s ˙ d t \ddot{s}=\frac{d \dot{s}}{dt} s¨=dtds˙ F r e n e t Frenet Frenet坐标系下纵向加速度;
  • d d d为横向位移, 即 F r e n e t Frenet Frenet坐标系下横坐标;
  • d ˙ \dot{d} d˙为为 F r e n e t Frenet Frenet坐标系下的横向速度;
  • d ¨ \ddot{d} d¨为为 F r e n e t Frenet Frenet坐标系下的横向加速度;
  • d ′ = d d d s d'= \frac{d d}{ds} d=dsdd F r e n e t Frenet Frenet坐标系下横向位移对纵向坐标的一阶导数;
  • d ′ ′ = d d ′ d s d''= \frac{d d'}{ds} d′′=dsdd F r e n e t Frenet Frenet坐标系下横向位移对纵向坐标的二阶导数;
  • 注: x ˙ = d x d t , x ′ = d x d s \dot{x}=\frac{dx}{dt},x'=\frac{dx}{ds} x˙=dtdx,x=dsdx

计算横向误差

在使用Frenet坐标系时,首先根据车辆位置找到参考路径上距离车辆最近的点(匹配点match_point),以匹配点为参考路径点并建立s-d坐标系,如上图所示。 首先计算车辆相对位置:
d x = x − x m a t c h d y = y − y m a t c h dx=x-x_{match} \\ dy=y-y_{match} dx=xxmatchdy=yymatch
通过二维坐标系旋转公式可以得到车辆在frenet坐标系中相对于道路中心线的相对坐标为:
[ s d ] = [ cos ⁡ ψ m a t c h sin ⁡ ψ m a t c h − sin ⁡ ψ m a t c h cos ⁡ ψ m a t c h ] [ d x d y ] \begin{bmatrix} s \\d \end{bmatrix} =\begin{bmatrix} \cos \psi_{match} & \sin \psi_{match} \\ -\sin \psi_{match} & \cos \psi_{match} \end{bmatrix} \begin{bmatrix} dx \\ dy \end{bmatrix} [sd]=[cosψmatchsinψmatchsinψmatchcosψmatch][dxdy]
定义: e 1 e_1 e1为横向误差, e 2 e_2 e2为航向角误差、 e 1 ˙ \dot{e_1} e1˙为横向误差变化速率、 e 2 ˙ \dot{e_2} e2˙为航向角误差变化率,则有:
e 1 = − sin ⁡ ψ m a t c h ∗ d x + cos ⁡ ψ m a t c h ∗ d y e 2 = ψ − ψ m a t c h \begin{aligned} e_1 & =-\sin \psi_{match}*dx+\cos \psi_{match}*dy \\ e_2 & =\psi-\psi_{match} \end{aligned} e1e2=sinψmatchdx+cosψmatchdy=ψψmatch
其中: ψ \psi ψ车辆当前位置航向角, ψ m a t c h \psi_{match} ψmatch为路径参考点的航向角,进一步有:
e 1 ˙ = v ∗ sin ⁡ ( ψ − ψ m a t c h ) e 2 ˙ = ψ ˙ − ψ m a t c h ˙ = ψ ˙ − v ∗ k m a t c h \begin{aligned} \dot{e_1} & =v*\sin(\psi-\psi_{match}) \\ \dot{e_2} & =\dot{\psi}-\dot{\psi_{match}}=\dot{\psi}-v*k_{match} \end{aligned} e1˙e2˙=vsin(ψψmatch)=ψ˙ψmatch˙=ψ˙vkmatch
其中: v v v为车辆当前纵向速度, ψ ˙ \dot{\psi} ψ˙为车辆当前横摆角速度(或航向角变化率), k m a t c h k_{match} kmatch为匹配点曲率。

计算纵向误差

在纵向控制中,涉及到起始点、匹配点、参考点、预瞄点,示意图如下:

车辆误差模型,自动驾驶控制算法,自动驾驶,机器学习,概率论

Frenet坐标系定义

s s s:沿参考轨迹纵向累积距离

s ˙ \dot{s} s˙:沿参考轨迹纵向速度

d d d:参考轨迹横向距离

d ˙ \dot{d} d˙:参考轨迹横向速度

关键路径点

Apollo规划模块计算的参考轨迹具有一个全局时间戳,表示参考轨迹起始点的时间戳。参考轨迹上的其他点采用相对时间戳表示,即相对于起始点的时间戳。

(1)起始点:参考轨迹的起始点,相对时间戳为0s;

(2)匹配点 ( x m a t c h , y m a t c h ) (x_{match},y_{match}) (xmatch,ymatch):根据车辆位置找到参考路径最近点,并以此点建立Frenet坐标系。由位置寻找,与相对时间戳无关;

// 找到距离车辆位置最近的参考路径点
// 匹配最近点时:插值法+优选法(黄金分割法)来找到最近的点
auto matched_point = trajectory_analyzer->QueryMatchedPathPoint(
     vehicle_state->x(), vehicle_state->y());

// 根据匹配点建立Frenet坐标系,并计算横/纵向坐标
trajectory_analyzer->ToTrajectoryFrame(
    vehicle_state->x(), vehicle_state->y(), vehicle_state->heading(),
    vehicle_state->linear_velocity(), matched_point, &s_matched,
    &s_dot_matched, &d_matched, &d_dot_matched);

以匹配点作为参考点,建立Frenet坐标系,车辆质心在Frenet坐标系下与道路中心线相对坐标可表示为:
[ s d ] = [ cos ⁡ ψ m a t c h sin ⁡ ψ m a t c h − sin ⁡ ψ m a t c h cos ⁡ ψ m a t c h ] [ d x d y ] \begin{bmatrix} s \\ d \end{bmatrix} =\begin{bmatrix} \cos \psi_{match} & \sin \psi_{match} \\ -\sin \psi_{match} & \cos \psi_{match} \end{bmatrix} \begin{bmatrix} dx \\ dy \end{bmatrix} [sd]=[cosψmatchsinψmatchsinψmatchcosψmatch][dxdy]

车辆的全局坐标需考虑匹配点的纵向里程距离 s m a t c h s_{match} smatch,故:
s = cos ⁡ ψ m a t c h ∗ d x + sin ⁡ ψ m a t c h ∗ d y + s m a t c h d = − sin ⁡ ψ m a t c h ∗ d x + cos ⁡ ψ m a t c h ∗ d y \begin{aligned} s & =\cos \psi_{match}*dx +\sin \psi_{match} * dy + s_{match} \\ d & =-\sin \psi_{match}*dx+\cos \psi_{match}*dy \end{aligned} sd=cosψmatchdx+sinψmatchdy+smatch=sinψmatchdx+cosψmatchdy

在Frenet坐标系下车辆的纵向速度和横向速度如下:
s ˙ = v ∗ cos ⁡ ( ψ − ψ m a t c h ) 1 − k m a t c h ∗ d d ˙ = v ∗ sin ⁡ ( ψ − ψ m a t c h ) \begin{aligned} \dot{s} & =\frac{v*\cos(\psi -\psi_{match})}{1-k_{match}*d} \\ \dot{d} & = v*\sin(\psi-\psi_{match}) \end{aligned} s˙d˙=1kmatchdvcos(ψψmatch)=vsin(ψψmatch)

3)参考点 ( x r e f , y r e f ) (x_{ref},y_{ref}) (xref,yref):根据当前绝对时间戳确定参考点位置;

double preview_time = lon_controller_conf.preview_window() * ts;

// 当前时间确定参考点,预瞄时间确定预瞄点
// 预瞄时间 = 预瞄窗口数目 * 预瞄窗口时间 (此例为 20 * 0.01 = 0.2s)
double current_control_time = ::apollo::cyber::Clock::NowInSeconds();
double preview_control_time = current_control_time + preview_time;

// 根据绝对时间戳匹配参考点和预瞄点
TrajectoryPoint reference_point =
    trajectory_analyzer->QueryNearestPointByAbsoluteTime(
        current_control_time);
TrajectoryPoint preview_point =
    trajectory_analyzer->QueryNearestPointByAbsoluteTime(
        preview_control_time);

// header_time_为参考轨迹的全局时间戳
// 相对路径时间戳 = 绝对时间戳 - 参考轨迹全局时间戳
// 最后根据相对路径时间戳找到参考轨迹对应点
TrajectoryPoint TrajectoryAnalyzer::QueryNearestPointByAbsoluteTime(
    const double t) const {
  return QueryNearestPointByRelativeTime(t - header_time_);
}

(4)预瞄点 ( x p r e , y p r e ) (x_{pre},y_{pre}) (xpre,ypre):根据预瞄绝对时间戳确定预瞄点位置,预瞄绝对时间戳=参考绝对时间戳+预瞄时间

因此:

  • 根据参考点计算出来的位置误差、速度误差以及加速度误差表达式为:
    r e f S t a t i o n e r r o r = s r e f − s r e f S p e e d e r r o r = v r e f − s ˙ r e f A c c e l e r a t i o n e r r o r = a r e f − s ¨ refStation_{error}=s_{ref}-s \\ refSpeed_{error}=v_{ref}-\dot{s} \\ refAcceleration_{error}=a_{ref}-\ddot{s} refStationerror=srefsrefSpeederror=vrefs˙refAccelerationerror=arefs¨

  • 根据预瞄点计算出来的位置误差、速度误差以及加速度误差表达式为:
    p r e S t a t i o n e r r o r = s r e f − s p r e S p e e d e r r o r = v r e f − s ˙ p r e A c c e l e r a t i o n e r r o r = a p r e − s ¨ preStation_{error}=s_{ref}-s \\ preSpeed_{error}=v_{ref}-\dot{s} \\ preAcceleration_{error}=a_{pre}-\ddot{s} preStationerror=srefspreSpeederror=vrefs˙preAccelerationerror=apres¨文章来源地址https://www.toymoban.com/news/detail-700161.html

到了这里,关于自动驾驶控制算法——横纵向误差计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包