基于PID的轨迹跟踪

文章介绍了如何使用PID算法进行轨迹跟踪控制,重点讲述了基于车辆侧向路径位移偏差的PID输入计算,包括侧向路径偏差ey的定义、预瞄点的选取和计算,以及方向盘转角的控制策略。内容适用于理解PID在自动驾驶或机器人导航中的基本应用。

《一文读懂PID》中,我们已经清楚了PID的原理,为了帮助大家更好的掌握PID控制算法,本期分享《PID在轨迹跟踪中的应用》来进行分析学习,文末附本分析的案例模型,建议收藏学习!

本篇文章介绍一种简单的方法:基于车辆侧向路径位移偏差用PID算法来控制小车的方向盘转角。

01. 侧向路径偏差ey

关于轨迹跟踪控制,我们知道PID控制器可以用下面的表达式来表示:

图片
对于PID控制器而言,方向盘转角(steering angle)是被控量,是PID的输出;e是PID的输入,这里显然需要确定e是什么的误差。

我们这里的思路是基于车辆侧向路径位移偏差来控制车辆,这里的e我们用ey来表示。

先给定一个期望路径,期望路径可以通过很多种方式获得,这里为了方便理解给定了一条期望路径。

这条路径处于大地坐标系X0Y中,车辆在这个平面直角坐标系的位置,我们表示为C(Xc,Yc),车辆坐标系我们用xcy表示,如图1所示。

图片
图1:期望路径

假设在t时刻,期望路径在车辆坐标系中的方程为y=f(x),车辆的转向瞬心为O’,车速为V,车速在车辆坐标系x轴的分量为u,沿y轴的分量为v,横摆角速度为r,车辆质心侧偏角为β。

注意这里沿着x轴的加速度假设为0。

令预瞄时间为Tp,Q点是经过时间Tp之后车辆实际所在的位置,P点是车辆在位置C时的预瞄点,也就是车辆经过时间Tp之后的目标位置。

如果我们知道Q点和P点在车辆坐标系下各自的y坐标,那么我们就可以得到在经过Tp之后车辆的侧向路径偏差了。
图片
图2:侧向路径偏差

侧向路径偏差ey就是车辆实际到达的点Q与目标点(预瞄点)P之间的距离,在车辆坐标系中,P点坐标为(xP,yP),Q点坐标为(xQ,yQ),线段PQ与y轴的夹角为δ,根据勾股定理,可计算线段PQ的长度为:
图片

当δ非常小时,可认为:cosδ近似为1,那么可得到侧向路径偏差ey:
图片

很显然,如果能计算出yP,yQ,就可以计算出ey。

02. 计算yQ

第一步,先确定yQ

假设路径角与车辆质心侧偏角都很小,那么这里的线段图片

弧段图片,近似相等:

图片

车辆从当前位置C沿路径(弧段)CQ行驶到Q点时,所用的时长为Tp,横摆角速度为r,那么车辆转过的角度很快就可以求得:θQ=r·Tp

直线CQ相对于车辆速度的夹角为图片
,所以直线CQ与车辆坐标x轴的夹角就为图片这样,我们就可以求得Q点在车辆坐标系y方向的坐标值:

图片

03. 计算yP

第二步,来确定预瞄点P在车辆坐标系下y方向的坐标值。

首先,先介绍一下,我们这里的预瞄点如何来取,如图3所示。
图片
图3:取预瞄点

预瞄点就是车辆在经过控制后到达期望路径上的一个目标点。

这个点的选取跟车辆的速度、航向及预瞄时间相关。

车辆当前位置为C(Xc,Yc),预瞄时间为Tp,车速为V,那么理想状态,车辆从当前位置到预瞄点p运行过的距离为预瞄距离 L=u·Tp。

以C点为圆心,以L为半径画一个圆,可知,这个圆与路径至少有两个交点,我们取车辆运行方向上的那个点为我们的预瞄点。

需要明确的是,目标路径是由一系列的点组成,这些点可以由这个序列来表示{J0,J1,J2,…Jn},其中J0和Jn分别是路径的起点和终点,如果是实时采集的目标路径,n可以是无穷的。我们这里为了方便,取n=200,(注意:实际控制中,这里可以是无数个点)。

路径上这些点在大地坐标系下的坐标为(Xi,Yi),i=0,1,2,…n ,相邻两个点之间的距离设为L0,这个值可以根据实际控制情况来取。我们这里取L0=1m。

我们要从这些点中去找到预瞄点P。

要注意的是,我们通过预瞄距离画圆与路径的交点并不一定正好是我们设定的目标路径点集中{J0,J1,J2,…Jn}的点,有可能是在两个路径点之间,通常我们选择车辆运行方向上前面的点,如图4所示。
图片
图4:选择预瞄点

接下来,我们就来确定预瞄点P的坐标了。

设车辆当前位置为(Xc,Yc),方位角为φ,那么目标路径上的各个点(Xi,Yi)在车辆坐标系中的坐标我们就可以求得:
图片

我们先找到目标路径上距离车辆当前位置最近的点Jp,p是序号,p的取值在0到n之间(0≤p≤n)。

我们设弧段JpJp+1+Jp+2…Jp+m为目标路径上的预瞄曲线段,根据前面的条件,我们可以知道这个弧段的长度约等于预瞄距离L。

这样一来我们可以得到m的值,图片。

我们前面讲过要取车辆方向上的前一个点,所以m的取值还得做一个变化:图片

因为这里的p,m都是点的序号,所以用int取整。

p的初值为0,车辆起步后通过实时搜索最近点来确定p的值。

那么就有: 图片
这样预瞄点P在车辆坐标系下的y轴坐标为:
图片
到这里PID控制器的输入——侧向路径偏差就可以计算了:
图片

04. 方向盘转角的控制

在控制算法上,PID相对于其他控制算法要简单很多,我们就基于下面这个公式来构建这个模型。
图片

Kp,Kd,Ki这三个参数的调试是PID控制器的核心。

结合前面的公式:
图片

到这里,基于PID的轨迹跟踪控制算法设计可以说完成大半了,接下来的工作就是通过调节PID的三个参数来调整车辆的行驶效果了。

本文仅用最简单的示例来帮助理解基于PID的轨迹跟踪控制,将车辆看作一个点,只考虑了车辆的侧向路径偏差。车辆实际运行是还需要考虑更多的因素,如车辆的动力学、运动学模型,车辆的航向角、车速、车速稳定性等等。

PS:对于本文分享的案例模型感兴趣的学员,可以联系博主~

本文来源:【汽车学堂Automooc】

### 机器人预瞄PID路径跟踪实现方法 #### 预瞄点的选择与计算 在纯追踪(Pure Pursuit)算法中,预瞄点的概念至关重要。该点位于车辆前方一定距离处,此距离被称为预瞄距离(Lookahead Distance, Ld)[^2]。为了确保稳定性和响应性,在不同行驶速度下应动态调整这一参数。 对于给定的目标轨迹,程序会持续寻找离当前最近的一个满足特定条件的未来位置作为新的瞄准对象——即所谓的“预瞄点”。具体来说,就是找到第一个使得从当前位置到其连线长度等于设定好的前瞻距离的位置点[^1]。 ```python def find_look_ahead_point(current_position, lookahead_distance, path_points): min_dist = float('inf') look_ahead_index = None for i, point in enumerate(path_points): dist_to_path = np.linalg.norm(np.array(point) - current_position) if abs(dist_to_path - lookahead_distance) < min_dist: min_dist = abs(dist_to_path - lookahead_distance) look_ahead_index = i return path_points[look_ahead_index] ``` #### 计算转向角度误差 一旦确定了预瞄点,则可以根据它来决定如何调整方向以接近理想路线。这里涉及到几个几何关系:θ 表示所需改变的方向角;L 是固定不变的轮轴间距;而 α 则指代车身坐标系下的横向偏差角。利用这些变量可求得期望转角: \[ \theta = atan\left(\frac{2Lsin{\alpha}} {Lookahead\_Distance}\right)\tag{1} \] 其中 \( Lookahead\_Distance \) 即为前述提到过的预瞄距离\( L_d \),用于平衡反应灵敏度和稳定性之间权衡。 #### PID 控制器设计 引入比例-积分-微分 (Proportional Integral Derivative, PID) 控制机制能够有效提升系统的鲁棒性能并减少稳态误差。针对上述所获得的角度差值 θ ,构建相应的反馈回路如下所示: - **I项**: 积累过往累积下来的定位失误情况加以补偿; - **D项**: 抵消因外界干扰因素造成的瞬时波动影响。 最终输出至执行机构(如电机驱动单元), 影响实际运动行为直至达到预期效果为止[^3]. ```python class PidController: def __init__(self, kp, ki, kd): self.kp = kp self.ki = ki self.kd = kd self.integral_error = 0.0 self.previous_error = 0.0 def compute(self, error, dt): p_term = self.kp * error self.integral_error += error * dt i_term = self.ki * self.integral_error d_term = self.kd * ((error - self.previous_error)/dt) output = p_term + i_term + d_term self.previous_error = error return output ``` 通过不断迭代优化以上三个核心组件的工作流程,即可完成一套完整的基于预瞄策略的PID路径跟随控制系统的设计与实施过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值