【自动驾驶】控制算法(十一)深度解析车辆纵向控制 | 纵向双 PID 控制算法

news2024/12/26 11:59:32

写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。

🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒
若您觉得内容有价值,还请评论告知一声,以便更多人受益。
转载请注明出处,尊重原创,从我做起。

👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜
在这里,您将收获的不只是技术干货,还有思维的火花

📚 系列专栏:【运动控制】系列,带您深入浅出,领略控制之美。🖊
愿我的分享能为您带来启迪,如有不足,敬请指正,让我们共同学习,交流进步!

🎭 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 🌟
感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~


文章目录

  • 引言
  • 一、Carsim 软件设置
    • 1.1 初速度
    • 1.2 制动与转向
    • 1.3 变速器
    • 1.4 输入输出
    • 1.5 仿真时间
  • 二、整合油门刹车标定表
    • 2.1 整合必要性
    • 2.2 油门采集程序
    • 2.3 刹车采集程序
    • 2.4 数据处理
  • 三、油门刹车表定标的应用
    • 3.1 使用标定表进行纵向控制
    • 3.2 加速度策略与速度匹配
    • 3.3 模型运行与初步结果分析
    • 3.4 加入 PID 控制器以优化控制效果
      • (1) 比例控制器
      • (2) 积分控制器
      • (3) 微分控制器
  • 四、PID 算法各项的作用
    • 4.1 比例项
    • 4.2 积分项
    • 4.3 微分项
    • 4.4 微分项与积分项的对比
      • (1) 微分项的预测作用
      • (2) 积分项的滞后作用
  • 五、PID参数整定
    • 5.1 整定顺序
    • 5.2 比例参数的调整
    • 5.3 积分参数的调整
    • 5.4 微分参数的调整
  • 六、横纵向控制
    • 6.1 参考轨迹生成
    • 6.2 参数调整
    • 6.3 模型打包
  • 七、进阶学习
  • 八、总结
  • 参考资料


引言

  各位小伙伴们大家好,本篇博客是自动驾驶控制算法第 11 节,在第 9 节和第 10 节讲了如何制作电机模型、怎么做油门刹车标定表,本篇博客讲解如何用标定表做纵向控制。内容整理自 B站知名up主 忠厚老实的老王 的视频,作为博主的学习笔记,分享给大家共同学习。


一、Carsim 软件设置

1.1 初速度

  首先看一下软件的设置,用 GitHub 上的代码跑出问题的很大原因就是初速度,初速度是不是为 0 0 0?如果初速度如果不是 0 0 0 ,就会出错。

1.2 制动与转向

  除了初速度之外,还有制动以及转向,不要做任何在 Carsim 软件里预设的制动和转向,而要在 Simulink 上去做。

在这里插入图片描述

1.3 变速器

  Carsim 默认的变速器是五档的,要改成一档变速器,把换挡的时间改短一点,也就是认为没有换挡,像电动车一样。

在这里插入图片描述

1.4 输入输出

  选择 Choose run to get export information,在里面选择最上面 Quick Start 里的 Baseline

  • 输入:发动机的扭距以及制动压力
  • 输出: v x v_x vx a x a_x ax 以及发动机转速 AV_Eng

可以根据单位用 Select by units 选择:

在这里插入图片描述

1.5 仿真时间

  最后把仿真的时间改长一点,因为做纵向标定时,特别是快速减速的话,需要很长时间才能停下来,所以要把时间弄改长一点:

在这里插入图片描述

  一切准备就绪后,点击 Send to simulink


二、整合油门刹车标定表

2.1 整合必要性

  现在希望把油门和刹车做到一张表上,这样就不需要两个表了,所以先做一张总表,不需要两个分开的刹车油门表,这主要是要考虑控制的连续性,做到一张表上,油门和刹车可以在一些没采到的点做插值处理。

  如果把它做到一张表,会变得更加平顺,如果是两个表的话,从零开始到加速还好,但是一旦从比较高的速度减速,如果是两个表就很难过渡,比如规划速度是 10 m / s 10m/s 10m/s,但现在速度是 50 m / s 50m/s 50m/s,要减速的话,一开始肯定会会猛踩刹车,但是一旦刹车已经踩到让车速已接近 10 10 10 时,如果调教不好,可能会出现一下子刹车过头的现象,速度右就小于 10 10 10 了,此时,系统又可能过度补偿,导致速度超过 10 m / s 10 m/s 10m/s,从而产生振荡现象,即速度忽高忽低,无法稳定在目标值附近。

  这种振荡现象主要由于两个表之间缺乏有效的协调机制。在减速过程中,系统需要同时调整油门和刹车,才能实现平稳过渡。而两个表的结构难以实现这种复杂的控制逻辑,导致系统出现过度反应和补偿。

  相比之下,使用一张油门刹车总表可以实现更平滑的控制,可以自动进行插值,因此可以根据当前速度和目标速度,计算出合适的加速度值,从而实现平稳过渡。

  定义统一的油门刹车信号 x x x,如果是正数,就代表油门;负数代表刹车,但此信号还不能直接用,因为要接在油门和刹车上,所以还要写函数来切换。函数的输入是 x x x,输出就是油门和刹车。

function [thr,brake] = fcn(x)
    %正数代表油门,负数代表刹车
    %不允许同时踩油门和刹车
    if x>=0
        thr=x;%把油门赋值给x
        brake=0;%把刹车弄设为0。
    else
        thr=0;%把油门设为0
        brake=-x;%刹车设为-x
    end

  刹车本质是制动压力,制动压力的数值也是正的,所以要加负号。比如 x = − 1 x=-1 x=1,就代表刹车的压力是 1 M P a 1MPa 1MPa,所以要加负号。

  一切准备就绪后,编写标定程序,分成三个部分:首先油门采集代码、刹车采集代码、数据处理。

2.2 油门采集程序

throttle_calibration.m

thr=0;%初始化油门
for i=1:21
    %该程序非常耗时,如果需要更多更密集的数据,请先测试
    sim('calibration');
    v_temp(:,i)=vx.data;
    a_temp(:,i)=ax.data;
    thr_temp(:,i)=ones(length(vx.data),1)*thr;
    thr=thr+0.1;
end

%合并,一定要转成行向量再合并,否则会导致合并失败
v=v_temp(:,1)';
a=a_temp(:,1)';
tr=thr_temp(:,1)';
for i=2:length(a_temp(1,:))
    v=[v,v_temp(:,i)'];
    a=[a,a_temp(:,i)'];
    tr=[tr,thr_temp(:,i)'];
end

%拟合
F=scatteredInterpolant(v',a',tr');%转成列向量
vu=0:0.1:50;
au=0:0.1:5;
table=zeros(length(vu),length(au));
for i=1:length(vu)
    for j=1:length(au)
        table(i,j)=F(vu(i),au(j));
    end
end

2.3 刹车采集程序

  在刹车代码有不一样的地方,就是初速度。在标定刹车时,初速度必须要很大, 180 k m / h 180km/h 180km/h 144 k m / h 144km/h 144km/h,不能为 0 0 0,这样车就不动了。因此必须要比较大的初速度,然后再标定刹车,其他的代码差不多。刹车代码和油门有点区别。

brake_calibration.m

%启动前检查车的初速度是否为180
x=0;%初始化刹车
%%刹车的初速度一定要比较高,180km/h、144km/h
for i=1:81
    %该程序非常耗时,如果需要更多更密集的数据,请先测试
    sim('calibration');
    v_temp1(:,i)=vx.data;
    a_temp1(:,i)=ax.data;
    brake_temp1(:,i)=ones(length(vx.data),1)*x;
    %%%%这里是消除奇异性,因为无论brake=1还是2,最后都会导致车的v,a=0;这将导致多值性
    for j=1:length(v_temp1(:,i))
        if v_temp1(j,i)<0.01%如果的车速足够小的话
            brake_temp1(j,i)=0;%那就不要踩了,就让他用摩擦力去制动,这样的话就会消除奇异性
        end        
    end
  
    x=x-0.1;%每做循环, x 是要减0.1
end
a_temp1(1,:)=a_temp1(2,:);%避免初始化的问题,防止数据出现跳跃

%合并,一定要转成行向量再合并,否则会导致合并失败
vbr=v_temp1(:,1)';%要起新的名字,免得油门数据被覆盖
abr=a_temp1(:,1)';
br=brake_temp1(:,1)';
for i=2:length(v_temp1(1,:))
    vbr=[vbr,v_temp1(:,i)'];
    abr=[abr,a_temp1(:,i)'];
    br=[br,brake_temp1(:,i)'];
end

2.4 数据处理

大家可以想想为什么油门刹车它不能写在一份代码里,非要写两份代码。

  因为油门和刹车的初速度是要求不一样,油门的初速度要求从 0 0 0 开始慢慢增大,而刹车要求从 180 180 180 或者 144 144 144 开始逐渐减小到 0 0 0。所以必然要做两个设置,首先要初速度设为 0 0 0 跑一次,然后把初速度改成 180 180 180 或者 144 144 144 才可以再跑一次。所以无论如何油门和刹车的标定都不能写到一份代码里。

  一切准备就绪后,开始跑就行了,跑完之后就检查一下数据,看一下有没有问题。

  把初速度改成 180 180 180,再点 Send to simulink,一定要点,不点就白做了。然后再跑刹车程序,刹车标定要远比油门慢,因为刹车代码的循环多,所以如果有人觉得拿不准的话,建议先少跑几个循环,看一下数据到底对不对,数据对了再多加循环

  看一下第三份数据处理代码:

v2=[v,vbr];
a2=[a,abr];
br2=[tr,br];

F=scatteredInterpolant(v2',a2',br2');%转成列向量
vubr=0:0.05:50;
aubr=-8:0.05:5;%合并刹车的-8到0和油门的0到5
tablebr=zeros(length(vubr),length(aubr));
for i=1:length(vubr)
    for j=1:length(aubr)
        tablebr(i,j)=F(vubr(i),aubr(j));
    end
end

  其实就把前两份代码,[v,vbr][a,abr][tr,br] 合并起来,然后进行拟合,再制作总表。

  总表就是油门刹车合并的总表,还是和以前一样用 2-D look up table 把表附到 Simulink 里,这样把系统打包后就可以用总表了。

在这里插入图片描述

  把里面的变量设置一下,需要当前的速度 v v v 以及期望加速度 a a a 作为输入,输出就是油门和刹车。

在这里插入图片描述


三、油门刹车表定标的应用

  下面看一下怎么用这张表。

3.1 使用标定表进行纵向控制

  比如现在希望期望速度是 10 10 10,首先把 Carsim 的初速度改成 0 0 0,然后 Send to Simulink。使用简单的 PID 控制,在上一讲已经简略地演示过怎么控制纵向速度。就是速度和加速度要相匹配。以现在的模型举例子,比如期望速度是 10 10 10,但实际肯定是从初速度 0 0 0 开始,加速度策略要和期望速度匹配。

3.2 加速度策略与速度匹配

  为了让速度和加速度匹配,需要确保加速度能够根据速度与目标速度之间的差距进行动态调整。理想情况下,初始阶段加速度应较大,以快速提升速度;随着速度接近目标值,加速度应逐渐减小,直至达到目标速度时,加速度归零。这种匹配关系可以实现平稳、无振荡的运动。

  PID (比例-积分-微分) 算法 是自动控制领域常用的算法,可以有效实现加速度的匹配。在PID控制中,期望速度与当前速度的差值作为误差信号输入。PID 控制器根据误差信号计算控制量,并通过调整加速度来实现对速度的精确控制。

  具体来说,PID 控制器包含三个参数:比例 ( P P P)、积分 ( I I I) 和微分 ( D D D)。比例项根据当前误差的大小来调整加速度,积分项用于消除误差的累积,微分项用于预测误差的变化趋势,并提前进行调节。通过调整这三个参数,可以使PID控制器输出合适的加速度信号,满足“初始阶段加速度大,接近目标时加速度小,达到目标时加速度为零”的控制要求。

3.3 模型运行与初步结果分析

  下面来跑一下模型,结果果是这样:

在这里插入图片描述

  可以看到确实有控制效果,但观察结果发现,速度并未精确达到 10 m / s 10m/s 10m/s,而是略低于该值。分析原因,可能是由于速度逐渐接近目标值时,期望速度与实际速度之间的差值逐渐减小,导致 PID 控制器的加速度输出也随之减小,最终无法克服惯性,使速度达到目标值。

3.4 加入 PID 控制器以优化控制效果

  为了解决这一问题,可以适当增加PID控制器中的比例项 ( P P P)。比例项的大小决定了控制器对误差的响应程度。增加比例项可以使控制器在速度接近目标值时,仍保持一定的加速度输出,从而确保速度能够准确达到目标值。

在这里插入图片描述

  在PID控制算法中,比例项 ( P P P) 是基于期望速度与实际速度之间的差值进行计算的。该差值信号乘以比例项后,输出为加速度信号。这种控制方式能够实现匹配的加速度

  注意:比例项的取值会影响控制效果。如果比例项过大,可能导致系统超调或振荡。

  因此,需要对比例项的输出进行限制,例如将其限制在 − 8 -8 8 5 5 5 的范围内,以防止输出过大或过小,从而影响系统的控制精度和稳定性。加入限制后看看结果:

在这里插入图片描述

(1) 比例控制器

  比例项 ( P P P) 在PID控制算法中起着放大加速度信号的作用。当实际速度与期望速度的差距逐渐缩小时,比例项的输出会相应减小,导致加速度输出也逐渐减小,从而避免速度超过期望值。但比例项的取值并非越大越好。过大的比例项会导致系统对误差信号过于敏感,即使是很小的误差也会引起较大的加速度输出,从而造成系统波动和超调,影响控制精度和稳定性。

  此处就不用增益模块了,直接加 PID 模块上去:

在这里插入图片描述

  在PID控制算法中,比例项 ( P P P) 代表对误差信号的直接响应。其输出与误差信号成正比,即误差越大,比例项输出越大。通过调整比例项系数,可以放大或缩小加速度信号,从而控制系统的响应速度。例如,将比例项系数设置为 2 2 2,则输出信号将变为原来的两倍,而将微分项和积分项系数设置为 0 0 0,则忽略微分和积分对控制的影响。

(2) 积分控制器

  下面看一下积分项的作用,先把 I I I 设成 0.1 0.1 0.1,然后把 P P P 设成 2 2 2,看一下仿真效果。

在这里插入图片描述

  观察速度曲线可以发现,系统存在明显的超调现象,但最终能够收敛到 10 m / s 10m/s 10m/s。这说明比例项 ( P P P) 能够有效地响应误差信号,并使速度逐渐接近期望值。但系统在达到稳态时仍存在一定的误差,即实际速度与期望速度之间存在微小的差距。

  为了消除稳态误差,PID控制算法引入了积分项 ( I I I)。积分项的作用是对误差信号进行积分,并将积分值作为输出信号。只要实际速度与期望速度之间的差值不为零,积分项就会持续积分,从而逐渐减小误差,直至消除稳态误差。然而,积分项的引入也可能导致系统超调,即实际速度超过期望值后再逐渐回落。

  积分项系数的取值会影响积分项对控制的影响程度。系数越大,积分作用越强,消除稳态误差的效果越明显,但超调现象也可能更加严重。因此,需要根据实际情况调整积分项系数,以实现最佳的稳态误差消除效果和控制稳定性。

  积分控制器 ( I I I) 在PID控制算法中发挥着重要作用。尽管积分控制器会导致系统超调,但它能够有效地消除稳态误差。这是因为积分控制器会持续对误差信号进行积分,并随着时间推移,积分值会逐渐增大,从而持续减小误差,直至稳态误差消失。

  与比例控制器 ( P P P) 不同,比例控制器的输出仅与当前误差信号成正比。即使比例系数设置得很大,当误差信号足够小,比例控制器的输出也会随之减小,最终失去控制作用。而积分控制器则不受此限制,只要误差存在,积分控制器就会持续工作,直至消除稳态误差。

  然而,积分控制器的缺点是容易导致系统超调,即实际速度超过期望值后再逐渐回落。这是因为积分控制器对误差信号的持续积分会导致输出信号过大,从而使系统响应过度。因此,需要合理设置积分控制器系数,并在必要时与其他控制器配合使用,以避免超调现象。

(3) 微分控制器

  微分控制器 ( D D D) 是PID控制算法的最后一个组成部分,其作用是对误差信号进行微分处理。微分控制器能够预测误差信号的变化趋势,并提前进行调节,从而抑制系统的振荡和超调现象。

  由于实际信号是离散的,无法进行数学意义上的解析微分,因此微分控制器需要进行数值微分处理。数值微分容易引入噪声和振荡,因此需要对微分信号进行滤波处理,以去除噪声并平滑信号。

  滤波参数的选择会影响微分控制器的性能。滤波参数越大,滤波效果越明显,但也会导致微分控制器对误差信号变化的响应延迟。因此,需要根据实际情况调整滤波参数,以实现最佳的滤波效果和控制性能。此处滤波参数写 10 10 10

在这里插入图片描述

下面一下微分器的作用,给数值 0.1 0.1 0.1,跑一下看看效果。

在这里插入图片描述

  微分项在PID控制中的作用是抑制超调现象。当比例项导致系统出现超调时,微分项便开始发挥作用。在实际应用中,比例项之所以会引起超调,是因为信号存在延迟。与仿真环境不同,实际系统中的信号响应并非瞬时完成。无论是刹车、油门操作,还是发动机和电机的启动,都存在一定的响应时间。

  这种延迟导致当比例项作用时,系统可能会产生超调,因为在仿真中假设信号是瞬间到达的,而在实际中则不是这样。因此,微分项在仿真中可能不会显现出其作用,但在实际应用中,它是必要的,以补偿信号延迟带来的影响。

  可以通过模拟来理解这一点,假设从发出油门或刹车信号到电机或制动系统开始响应之间存在 100 m s 100ms 100ms 的延迟,并且速度数据从传感器传到控制系统的延迟为 10 m s 10ms 10ms。这些延迟在实际系统中是常见的,尤其是对于发动机来说,延迟可能会更长,而电机则可能相对快一些。

  把 PID 的微分项 ( D ) (D) (D) 设为 0.1 0.1 0.1,看一下结果:

在这里插入图片描述

  观察系统响应可以发现,在包含微分项的情况下,系统几乎不会出现超调现象。但如果移除微分项并重新运行系统,将会观察到系统开始震荡,并且出现了超调。这表明微分项的主要作用是抑制超调。


四、PID 算法各项的作用

  PID控制器中的三个组成部分——比例( P P P)、积分( I I I)和微分( D D D)——通常是联合使用的。积分项的作用是消除稳态误差,但它也可能导致超调。为了减少这种超调,我们使用微分项。

4.1 比例项

  比例项的作用是加速信号达到目标速度的过程。如果比例系数设置得较大,系统响应会更快,从而迅速接近期望速度。相反,如果比例系数很小,例如 0.001 0.001 0.001,即使加速度很大,系统达到期望速度的过程也会非常缓慢。

  因此,比例项用于调节速度,但过大的比例系数可能导致超调。理论上,比例项本身不会引起超调,但由于实际系统中存在延迟,它可能会导致超调,此时就需要微分项来消除超调。

4.2 积分项

  积分项在控制系统中并不经常使用,尽管它能消除稳态误差,但它可能引起较大的超调,并且消除这些超调相对困难。因此,除非系统误差非常大,否则通常不使用积分项。

  在大多数控制场合,使用PD控制器就足够了。在实际车辆控制中,并不追求速度严格等于某个特定值,只要误差在可接受的范围内即可。过于追求精度在实际情况中并没有太大意义,只要精度达到容忍的范围内就足够了。

4.3 微分项

  关于为什么微分项( D D D)能够抑制超调,这背后的原理相对复杂,涉及到自动控制理论。以下是一个简化的解释:微分项具有预测和提前控制的作用。例如,如果当前速度是 6 6 6,目标速度是 10 10 10,而预测三秒后的速度将达到 12 12 12

  在没有微分项的情况下,系统会根据当前速度( 6 6 6)和目标速度( 10 10 10)之间的差异持续加速,直到达到目标速度。然而,微分项能够预测未来的速度变化。如果当前速度是 6 6 6,而微分项预测的速度将达到 12 12 12,那么它会产生一个提前的减速信号。因为目标速度是 10 10 10,而预测的速度是 12 12 12,这会产生一个负的误差信号( − 2 -2 2),即使当前速度低于目标速度,系统也会提前开始减速,从而抑制超调。

4.4 微分项与积分项的对比

(1) 微分项的预测作用

  微分项能够预测并响应速度变化的趋势,抑制超调。

  如果没有微分项,系统会持续加速,直到当前速度超过目标速度,导致超调。微分项通过提前作用,可以防止这种超调的发生,因为它可以预测并响应速度变化的趋势。

(2) 积分项的滞后作用

  积分项考虑过去的误差累积,对稳态误差有消除作用。

  相反,积分项具有滞后作用。积分项能够消除稳态误差的原因在于,当系统接近目标速度时,比例项的作用变得较弱,因为误差变得很小。积分项则考虑了过去的误差累积,即使当前误差很小,过去的较大误差仍然会影响积分项的输出,从而使用较大的控制作用来消除稳态误差。


五、PID参数整定

5.1 整定顺序

  调整PID控制器的三个参数是一个试错过程,通常遵循一定的顺序。一般来说,首先调整比例参数( P P P),然后调整微分参数( D D D),最后调整积分参数( I I I)。控制精度只需达到一定的范围即可,不必过分追求完全精确。过度追求消除稳态误差可能会导致超调,因为为了消除稳态误差,需要增加积分参数,而为了抑制由此产生的超调,又需要增加微分参数。但这并非最佳做法,因为增加微分参数可能会放大系统中的噪声。

  至于为什么微分参数会放大噪声,这涉及到控制理论中的伯德图(Bode Plot),其中微分项会导致对数幅频曲线在高频段上翘,从而放大高频噪声。这一部分的解释较为复杂,不在此详细展开。

5.2 比例参数的调整

  在调整参数时,只需记住比例参数可以加快系统收敛速度,但可能会由于实际系统中的延迟而导致超调。尽管理论上比例参数本身不会引起超调,但由于延迟的存在,比例参数设置过大可能会导致超调现象。微分参数的作用正是抑制这种由比例参数引起的超调。

  因此,在大多数情况下,仅使用比例和微分参数就足够了。

5.3 积分参数的调整

  积分项的作用在于消除稳态误差,它能够使系统精确地收敛到目标值。但积分项的使用也可能会导致超调,而且这种由积分引起的超调通过微分项来降低是相对困难的。

  虽然微分项能够较容易地降低由比例项引起的超调,但对于积分项引起的超调则效果有限。

5.4 微分参数的调整

  微分项的值不宜过大,因为过大的微分项会放大噪声。因此,当积分项导致超调时,通常需要通过减小比例项来降低超调,但这会使得系统响应变慢,例如,如果比例项仅为 0.1 0.1 0.1,那么加速度会过慢,可能导致系统缓慢收敛,这也不利于控制精度的提高。

  因此,如果系统误差不是特别大,通常不使用积分项,仅使用比例和微分项就足够了,这样既能保证较快的响应速度,又能满足精度要求。或者,可以添加一个非常小的积分项,以避免引起超调,这样在长时间的控制过程中,积分项也能发挥一定作用,使稳态误差逐渐收敛到 0 0 0


六、横纵向控制

6.1 参考轨迹生成

  在实际的自动控制应用中,像给定固定速度(如 10 10 10)这样的简单控制并不多见。更常见的是需要给定一个参考轨迹,让车辆按照这个轨迹行驶。因此,需要进行更复杂的控制策略设计,下面编写一个生成参考轨迹的函数。

planning

function [s,v,a] = fcn(t)
if t<10%设计两端轨迹, t 小于 10 以及 t 大于10
%这两段轨迹会保证它们之间位置速度、加速度都连续。
    s=0.1*t^3/3;
    v=0.1*t^2;
    a=0.2*t;
else
    a=2-0.1*(t-10);
    v=2*t-0.05*(t-10)^2-10;
    s=t^2-0.05*(t-10)^3/3-10*t+100/3;
end

  在设计轨迹时,通常需要确保轨迹的连续性。设计过程通常从加速度开始,然后逐步进行积分以得到速度和位置。假设我们设计了两段轨迹,一段适用于时间 t < 10 t < 10 t<10 的区间,另一段适用于时间 t > 10 t > 10 t>10 的区间,这样的设计可以确保在两段轨迹的连接点处,位置、速度和加速度都是连续的。我们检查设计的轨迹,确认它们是连续的。

6.2 参数调整

  接下来,我们分别查看这两段轨迹,希望模拟一个先加速到最大速度,然后减速到零的过程。通过观察速度曲线,我们发现速度一直在增加,因此仿真时间需要进一步延长。经过反复调试,我们将仿真时间设置为 60 60 60 秒,这看起来是一个比较合适的选择。由于对位置 s s s 也有特定的要求,因此在输出结果中,我们还需要输出车辆的 x x x 坐标,即变量 X o X_o Xo

在这里插入图片描述
  控制算法的实现方式是在速度PID控制的基础上,再加入位置PID控制。下面是具体的实现步骤:

  首先,速度PID控制模块采用“ − + + -++ ++”模式,这意味着它不仅需要处理期望速度与实际速度之间的误差,还需要考虑来自位置控制单元的误差信号。即使实际速度与期望速度相同,如果位置存在差异,系统仍然需要调整。如果期望位置在实际位置之前,系统需要加速;如果期望位置在实际位置之后,系统则需要减速。

  因此,仅仅匹配期望速度和实际速度是不够的,我们还需要将期望位置的误差信号输入到系统中。这意味着我们不仅要连接期望速度和实际速度的误差,还需要创建另一个PID控制器来处理期望位置和实际位置之间的误差,并将其纳入控制环路。

  位置PID的控制输出也应当受到限制,以防止其过大,从而确保位置和速度控制的稳定性。至于加速度,我们可以在速度PID信号中加入积分项 ( I I I),并将加速度信号连接到这个积分项上。这样,一个包含双PID控制器的纵向控制模型就建立完成了,如下图所示。

在这里插入图片描述

运行查看结果,下面分别是位置、速度、加速度曲线:

  总的来说,位置跟踪和速度跟踪还算可以,加速度在前面有点不太好,可以再调一调。这里直接给出比较好参数:

  • 位置PID: P = 1 , I = 0 , D = 0.1 , N = 30 P=1,I=0,D=0.1,N=30 P=1,I=0,D=0.1,N=30
  • 速度PID: P = 1 , I = 0 , D = 0.1 , N = 30 P=1,I=0,D=0.1,N=30 P=1,I=0,D=0.1,N=30

这样调出来的效果比较好。

6.3 模型打包

  这样纵向控制模型就讲完了,最后把模型也打个包:

在这里插入图片描述

  至此,我们已经讨论了纵向控制和横向控制的内容。接下来将探讨横纵向控制。首先移除延迟模块,采取由简入繁的方式,先考虑无延迟的情况,再考虑有延迟的情况。因此,本节是关于纵向控制的第十一节,结合之前的第八节横向控制,在下一节将结合起来讨论横纵向控制。

  在最后一节结束后,这个系列课程将正式完结。虽然还有很多内容没有涉及,比如如何规划、如何估算坡度、如何考虑质量变化对控制的影响等问题,这些内容实际上已经超出了纯粹控制理论的范畴。虽然这些知识也可以讲解,但它们并不完全属于控制领域。

  因此,博主计划将横纵向控制作为基础篇章,后续将更复杂的内容作为专题和进阶篇章进行讲解。对于技术层面来说,横纵向控制的基础知识讲解完成后,基本的学习目标也就达到了。


七、进阶学习

  实际上,如果各位学习到了最后一讲,可能会逐渐意识到对计算速度提升的迫切需求。虽然使用 Matlab 进行仿真是一个不错的选择,但当涉及到实际开发时,Matlab 的计算速度就显得过于缓慢。因此,Matlab 更适合作为学习工具,而不是开发者的软件。对于开发来说,无论愿意与否,最终都不得不转向使用 C++。

  对于没有 C++ 基础的同学来说,可能会感到抵触,因为 C++ 确实是一门难以学习和使用的语言。但无可否认的是,C++ 的执行速度非常快,而这正是我们需要的。特别是当我们想要开发一些真正有意义的项目时,不使用C++ 是不现实的。如果计算速度过慢,那么在无人驾驶等领域,车辆可能已经发生事故,而计算却还未完成,这是完全不可接受的。

  因此,无论从哪个角度来看,学习并使用 C++ 都是必要的。在基础篇章使用 Matlab 完成讲解之后,进阶篇章可能会采用 C++ 和 Matlab 相结合的方式,即在 C++ 中编写代码,同时使用 Matlab 进行仿真,这样的形式更接近实际工程。不过,这些都是未来的计划。


八、总结

  本篇博客详细介绍了自动驾驶控制算法中的纵向控制,从软件设置到标定表的应用,再到PID控制器的整定和实际模型运行,我们共同学习并探讨了如何实现平稳、无振荡的车辆运动。通过调整PID控制器中的比例、积分和微分参数,我们能够精确控制车辆的速度,实现与期望速度相匹配的加速度策略。同时,我们理解到,为了实现更好的控制效果,需要对PID参数进行适当的整定,平衡系统的响应速度和稳定性。最后,我们还探讨了如何将控制算法应用于实际的自动驾驶场景中,以及未来学习计划。

  本篇博客的讲解就到这里,感谢大家阅读。


参考资料

  【基础】自动驾驶控制算法第十一讲 纵向双pid控制


后记:

🌟 感谢您耐心阅读这篇关于 深度解析车辆纵向控制 | 双 PID 控制算法 的技术博客。 📚

🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢

🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀

🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡

🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

心觉:如何重塑高效学习的潜意识(5)终结篇

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作184/1000天 上篇文章讲了如何发挥边学边用的威力及其底层逻辑 到此为止&#xff0c;我们已经系统地把“系统化学习”和“边学边用…

scrapy 爬取微博(五)【最新超详细解析】: 爬取微博文章

1 读取配置参数 爬取微博文章首先需要读取settings.py中的设置的配置变量&#xff0c;然后编写爬虫&#xff0c;读取的配置变量主要有爬取的关键词、时间范围、爬取区域等。 class WeiboSearchSpider(scrapy.Spider):name weibo_searchallowed_domains [weibo.com]settings…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十五章 Linux 文件系统概念

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

Navicat 工具 下载安装

准备工作 下载 下载链接&#xff1a;http://localhost:8080 演示环境 操作系统&#xff1a;windows10 产品&#xff1a;Navicat 版本&#xff1a; 15.0.25 注意&#xff1a;如果需要其他版本可以自行下载。 安装步骤 1、解压&#xff08;如果解压中出现提示威胁要允许&#…

基于CNN+Transformer混合模型实现交通流量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录&#xff1f; 可以使用以下几种方法&#xff1a; 1. IP地址限制&#xff1a;在PHP中&#xff0c;可以通过获取客户端的IP地址&#xff0c;然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中&#xff0c;就禁止登录。 “php $…

洛谷P1789MC生存插火把

洛谷P1789MC生存插火把 这道题有一个小坑&#xff0c;就是火把照亮的地方可能不在数组里&#xff0c;注意要把那一块地方去掉&#xff0c;这道题的出题者把范围都告诉我们了&#xff0c;大大滴降低了这道题的难度 下面是我的代码 #include <stdio.h>int n, m,k ;//一…

HarmonyOS Next系列之水波纹动画特效实现(十三)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

基于ssm+vue的在线家用电器销售系统

摘要 本文介绍了一个基于SSM&#xff08;SpringSpring MVCMyBatis&#xff09;框架与Vue.js技术的在线家用电器销售系统。该系统旨在为用户提供便捷的家用电器购买体验&#xff0c;同时为商家提供一个高效的销售管理平台。系统前端采用Vue.js框架开发&#xff0c;实现了响应式布…

【制作自解压程序】使用7Z制作自解压程序

文章目录 1.前言2.准备压缩包3.准备7zSD.sfx文件4.准备config.txt5.合并文件6.完成 1.前言 自解压程序是利用压缩包制作一个类似于下载程序样式的文件&#xff0c;可以让用户直接点击使用&#xff0c;而不是解压以后去文件中找哪个是启动程序。 2.准备压缩包 首先&#xff0…

【U8+】安装用友U8+16.5后,应用服务管理中缺少加密服务。

【问题描述】 安装用友U8+后,应用服务管理中,没有加密服务。 导致软件无法登录到加密服务器。 【解决方法】 此问题多为CPU所影响: 1、深信服和霆智虚拟机需要开启HOST CPU选项。不开启此选项无法发挥CPU的全部功能,对U8和SQL Server的性能影响很大,所以在U8V16.5中要求开…

SOMEIP_ETS_142: SD_Request_non_existing_Major_Version

测试目的&#xff1a; 验证DUT能够拒绝一个请求不存在的主版本号的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个请求不存在主版本号的SubscribeEventgroup消息时&#xf…

828华为云征文|部署个人文档管理系统 Docspell

828华为云征文&#xff5c;部署个人文档管理系统 Docspell 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Docspell3.1 Docspell 介绍3.2 Docspell 部署3.3 Docspell 使用…

PostgreSQL的学习心得和知识总结(一百五十二)|transaction_timeout:达到事务超时时终止会话

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

影刀---如何进行自动化操作

本文不是广告&#xff0c;没有人给我宣传费&#xff0c;只是单纯的觉得这个软件很好用 感谢大家的多多支持哦 本文 1.基本概念与操作&#xff08;非标准下拉框和上传下载&#xff09;非标准对话框的操作上传对话框、下载的对话框、提示的对话框 2.综合案例3.找不到元素怎么办&a…

从AR眼镜到智能巡检:XR技术的演变与未来潜力

XR&#xff0c;即扩展现实&#xff08;Extended Reality&#xff09;&#xff0c;是一个涵盖了增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&#xff09;和混合现实&#xff08;MR&#xff09;的广泛概念。 从我们最初接触到的手机应用到Hololens&#xff0c;…

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识

关卡任务 闯关任务需要在关键步骤中截图&#xff1a; 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…

图片体积在线压缩神器 可自由设置图片的压缩大小 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网的快速发展&#xff0c;图片作为网页内容的重要组成部分&#xff0c;其优化需求日益迫切。传统的图片压缩方法往往需要在牺牲一定质量的前提下减小体积&#xff0c;而“图片体积在线压缩神器”则致力于在保持图片质量的同时&#xff0c;实现体积的最小化。…

Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.13 perfcounter&#xff08;查看当前 JVM 的 Perf Counter 信息&#xff09;举例1&#xff1a;查看当前 JVM 的 Perf Counter 信息举例2&#xff1a;可以用-d参数打印更多信息 本人其他相关文章链接 二、命令列表 2.1 jvm相关命令 2…

SpringCloud-pom创建Eureka

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…