写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。
🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒
若您觉得内容有价值,还请评论告知一声,以便更多人受益。
转载请注明出处,尊重原创,从我做起。
👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜
在这里,您将收获的不只是技术干货,还有思维的火花!
📚 系列专栏:【运动控制】系列,带您深入浅出,领略控制之美。🖊
愿我的分享能为您带来启迪,如有不足,敬请指正,让我们共同学习,交流进步!
🎭 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 🌟
感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~
文章目录
- 引言
- 一、油门标定原理
- 1.1 油门与速度、加速度的关系
- 1.2 油门控制曲面模型的构建
- 二、油门标定表的制作流程
- 2.1 传统方法的局限性
- 2.2 基于深度学习的标定方法
- 2.3 数据采集与拟合
- 三、Carsim 油门标定实操与优化
- 3.1 准备工作与模型搭建
- 3.2 标定油门与刹车
- 3.3 数据采集与处理
- 3.4 标定表的建立与拟合
- 3.5 标定表在Simulink中的使用
- 3.6 速度与加速度控制
- 3.7 速度与加速度的匹配性分析
- 四、刹车标定
- 4.1 刹车标定表的制作方法
- 4.2 刹车标定数据的采集与拟合
- 4.3 刹车标定表的测试与优化
- 五、总结
- 参考资料
引言
各位小伙伴们大家好,本篇博客是自动驾驶控制算法第十节,内容整理自 B站知名up主 忠厚老实的老王 的视频,作为博主的学习笔记,分享给大家共同学习。
在讲第十节之前,希望大家已经把第九节的一切准备工作都准备好了,包括 Carsim 道路设置、输入输出设置、变速器设置、电机设置。具体参见:
【自动驾驶】控制算法(九)深度解析车辆纵向控制 | 从算法基础到 Carsim 仿真实践
本篇博客讲解讲油门刹车标定表的制作,是纵向控制的核心内容,也是一块比较麻烦的内容。
一、油门标定原理
1.1 油门与速度、加速度的关系
油门标定表的制作可以用下图来简单解释一下:
当给恒定油门时,车就会跑,就会输出速度 v v v 以及加速度 a a a 出来,因此找到油门和 v v v、 a a a之间的对应关系,即油门标定表,是本篇博客的目的,准确的说法是做实验采不同的油门得到不同油门下的 v − a v-a v−a 曲线,然后做拟合。
比如当油门恒定为
0.3
0.3
0.3 时,和时间的关系是直线,这样进行仿真就可以得到车速
v
v
v 和时间
t
t
t 的关系,以及车辆加速度
a
a
a 和时间
t
t
t 的关系。
因为都和时间相关,所以
v
、
a
v、a
v、a 可以合并,假设在油门等于
0.3
0.3
0.3 时,
t
=
0.1
s
t=0.1s
t=0.1s 时,得到
v
、
a
1
v_、a_1
v、a1,
t
=
0.2
s
t=0.2s
t=0.2s 时,得到
v
2
、
a
2
v_2、a_2
v2、a2,如此下去,这样就可以在
v
−
a
v-a
v−a 二维坐标里得到一系列点,将点连成线,就会得到
v
−
a
v-a
v−a 曲线,一般
v
−
a
v-a
v−a 曲线长这样:
速度越高,加速度就越差,这也是因为第九节所讲的,因为
P
=
M
⋅
ω
P=M\cdot \omega
P=M⋅ω,当速度很大时,力矩必然不会很大。无论是
0.3
0.3
0.3 的油门,还是
0.7
0.7
0.7 的油门,或是
1
1
1 的油门,得到的
v
−
a
v- a
v−a 曲线必然不一样。
1.2 油门控制曲面模型的构建
使用不同的油门做实验,得到
v
−
a
v- a
v−a 曲线,把这一系列
v
−
a
v-a
v−a 曲线合并在一起,就可以得到三维曲面:
选不同油门,就会得到不同曲线,把曲线全部拟合在一块,就会变成曲面:
这样就得到了油门和
f
(
a
,
v
)
f( a ,v)
f(a,v) 之间的函数关系,但函数关系并不是显式的,而是拟合的曲面。通过做大量实验,得到了大量
(
v
,
a
,
t
h
r
)
(v,a,thr)
(v,a,thr) 的三维点,然后通过三维的点进行拟合,得到
t
h
r
=
f
(
v
,
a
)
thr=f(v,a)
thr=f(v,a) 的关系。
二、油门标定表的制作流程
得到的函数 t h r = f ( v , a ) thr=f(v,a) thr=f(v,a) 被称为 模型。这一术语源自深度学习领域,因为其原理与深度学习极其相似:给定输入变量 v v v 和 a a a,模型就能拟合出油门的输出。这种方式是数据驱动的,基于统计意义下的拟合,与深度学习的理念如出一辙。目前许多标定表的制作已经采用了深度学习方法,而非传统手段。
2.1 传统方法的局限性
接下来,谈谈传统方法的一些缺点。首先,实验要求路面必须平坦且较长,且车辆需进行直线行驶,方向盘不得有动作。而在实际驾驶中,方向盘难免会有轻微的抖动,这使得实验条件过于严苛。此外,传统方法无法解决车辆质量变化的问题。
前面提到,对于乘用车而言,由于载人的重量相对固定,问题尚不突出。但对于货运车辆,货物重量可能是车辆自重的数倍。如果在空载状态下制作一张标定表,如何使其在满载时也能适用呢?一个容易想到的方法是分别在空载、 1 / 4 1/4 1/4 负载、 1 / 2 1/2 1/2 负载和满载时进行标定,得到不同的标定表,并通过插值法来适应不同装载情况。但这种方法操作繁琐,且实验不易进行。
2.2 基于深度学习的标定方法
目前,有一种基于深度学习模型的新型标定方法。该方法将速度 v v v、加速度 a a a 以及车辆质量 m m m 作为特征,通过神经网络进行训练。首先,建立一个离线模型,类似于空载时的标定。然后,通过在线更新,即利用深度学习进行实时更新,以适应不同质量下的标定需求。由于标定表是实时更新的,它能随着车辆质量的变化而相应调整。
百度提出了一种解决方案,该方案无需估算质量,也无需严苛的道路条件,如道路必须笔直等。只需驾驶大约 20 20 20 分钟,利用这些数据即可完成标定表的制作。
由于对深度学习的了解尚不深入,目前还无法详细讲解基于深度学习的标定方法。待未来深入学习后,再进行相关讲解。本篇博客仍将采用传统方法进行标定,因为这种方式更易于上手。
2.3 数据采集与拟合
模型做好后就可以写标定表,把 v v v 和 a a a 从从小到大排列,第三个元素就是 f ( v , a ) f(v,a) f(v,a),比如 f ( 0 , 0 ) , f ( 0.01 , 0.01 ) f(0,0),f(0.01,0.01) f(0,0),f(0.01,0.01) 这样的数据,然后根据模型算出来,填在上面,这就是标定表。
刹车和油门一样,就是不同的刹车会导致不同的
v
−
a
v -a
v−a 曲线,根据曲线拟合得到表格,这就是刹车的标定表。
至此,理论部分就讲完了,接下来到实践部分看一下该怎么标定油门和刹车,把第九节所讲的模型准备好。
三、Carsim 油门标定实操与优化
3.1 准备工作与模型搭建
来到 Carsim 模型,由于要标定刹车,所以在模型输入中不仅要把油门弄上去,还要把刹车的制动压力弄上去,作为输入。
点击 Send to Simulink
,先标油门,再标刹车,所以刹车先给
0
0
0 。
模型输出的两个增益是单位换算,因为输出的是车速 ( k m / h ) (km/h) (km/h) 和重力加速度 g g g。所以要换算成 m / s m/s m/s 和 m / s 2 m/s^2 m/s2,车速换算增益为 1 / 3.6 1/ 3.6 1/3.6,加速度换算增益为 9.8 9.8 9.8,一些准备就绪,开始标定。
首先把油门输入改为变量 thr
,用 to workspace
模块把 Carsim 输出的
v
x
v_x
vx 和
a
x
a_x
ax 导到工作空间里。变量的名字就起 vx
和 ax
,当跑模型时,会将模型输出存到 vx
和 ax
变量里,然后点保存。
3.2 标定油门与刹车
一切准备就绪后就可以写标定算法了。
thr = 1;% thr 和 Simulink 模型里的 thr 名字一定要一致
sim('calibration');%调用 Simulink 函数,括号里是模型名字
这两行代码是通过 Matlab 调用 Simulink 最简单的语法,实现两者之间的联动。
开始运行就会把 thr = 1
传到 Simulink 模型里,跑完一遍后会把 vx
和 ax
传进来。
0.001 0.001 0.001 秒采样本太密,改成 0.1 0.1 0.1 秒采样本。一般用 0.1 0.1 0.1 秒采集样本,密度就已经足够了,不需要特别密的样本,因为样本越密话,速度也就越慢。
3.3 数据采集与处理
上面两行代码实际上只是演示,把这两行代码注释掉,再清除一下工作区,然后开始写代码:
thr=0;%初始化油门
for i=1:11
%该程序非常耗时,因为要不停地去调用 Simlink 模型去算,如果需要更多更密集的数据,请先测试
sim('calibration');%首先运行叫 Simlink 模型
v_temp(:,i)=vx.data;%把 VX 以及 AX 以油门都记录下来,保存到变量里
a_temp(:,i)=ax.data;
thr_temp(:,i)=ones(length(vx.data),1)*thr;%ones 就是元素都是一的矩阵。
%长度是和 v x data 一样的列向量。然后元素都是1
thr=thr+0.1;%每一次循环结束之后,油门都会增加0.1
end
运行代码测试一下,此程序要耗一点时间,如果电脑性能不行的话,要做好心理准备,而且在跑之前一定要先清除工作区。
运行完之后,看一下速度、加速度以及油门:
矩阵每一列对应不同油门所跑的速度和加速度数据,一共是 11 11 11 列,第一列对应油门为 0 0 0,第二列对应油门为 0.1 0.1 0.1,第三列对应油门 0.2 0.2 0.2 ,以此类推。
3.4 标定表的建立与拟合
所有的 v 、 a v、a v、a、油门都是矩阵形式存储的,把他们合并变成一列向量:
%合并
%一定要转成行向量再合并,否则会导致合并失败
v=v_temp(:,1)';%先把 v、a 和油门的第一列拉出来。注意第一列是列向量,所以必须先转成横向
a=a_temp(:,1)';
tr=thr_temp(:,1)';
for i=2:length(a_temp(1,:))%写循环,合并起来
v=[v,v_temp(:,i)'];%把v_temp的第二列先转置变成第二行,然后拼到 v 里,如此循环
a=[a,a_temp(:,i)'];
tr=[tr,thr_temp(:,i)'];
%这样就会把v_temp、a_temp 以及 thr_temp直接变成很长的行向量。
end
运行一下,发现确实变成了很长的行向量:
然后进行拟合:
%拟合
F=scatteredInterpolant(v',a',tr');%转成列向量
%Matlab 自带的三维散点拟合函数
%建立标定表
vu=0:0.1:50;%认为 v 的最大速度不能超过50,也就是 180 公里每小时。
au=0:0.1:5;
table=zeros(length(vu),length(au));%先建立表,行是 v 的长度列是 a 的长度,
for i=1:length(vu)
for j=1:length(au)
table(i,j)=F(vu(i),au(j));
end
end
运行程序。看一下合并后的表,是一系列油门这样的组合:
但是油门有超过 1 1 1 的。当然这也是可理解的,因为拟合自然会拟合出极端情况,比如速度是 50 m / s 50m/s 50m/s,并且加速度是 5 m / s 2 5m/s^2 5m/s2,此时油门肯定超过 1 1 1 了。不过没关系,有这张表后再加限制,当油门超过 1 1 1 时,强行让油门变成 1 1 1 即可。
3.5 标定表在Simulink中的使用
做好表后回到 Simulink,首先搜索 lookup table
,选择 2-D Lookup table
二维查表模块:
参数按照下图填写:
这样就设置完了,看一下标定表长什么样:
大致看一下,其实拟合效果一般,在启动阶段波动比较剧烈,其实不应该把启动阶段的数据给拟合进去,因为启动阶段很不稳定,要把平稳运行阶段的数据进行拟合,要做一些数据处理,把那些比较奇怪的数据把给去掉。
3.6 速度与加速度控制
不过这张表也够用,来看一下这张表该怎么用,比如想要控制车以加速度 a = 1 a=1 a=1 运动,搭建这样的模型:
把 1 1 1 输入到加速度端,运行看一下结果:
有点不太稳定,不过还好,确实是以 1 1 1 的加速度行驶的。可能是因为标定表有点拉胯,没有做数据处理,可能会记录一些奇怪的点,这样拟合会很受影响。
再看一下,把加速度 改为 3 3 3,再跑一遍,可以看到结果:
刚开始还可以保持 a = 3 a=3 a=3 ,但到后面就变得很奇怪了,这应该是已经超出了电机的加速能力。到后面油门肯定超过 1 1 1 了,所以就变成这么奇怪的样子,事实上油门最多也就是 1 1 1。
可以看一下油门信号,看是不是超过 1 1 1 了。
可以看到确实超过 1 1 1 了。可以看到超过 1 1 1 后,在仿真中没有做限制,为什么就是在超过一之后,加速度曲线变得非常奇怪,这是因为标定表插值的拟合就是以 0 0 0 到 1 1 1 的油门为基本数据进行拟合的,没有拟合过超过 1 1 1 这样的数据,所以当油门超过 1 1 1 后就变得很不准确,只能大概拟合。
所以要给油门加限制,不能超过 1 1 1,但也不能小于 0 0 0。为了避免代数环,再加上延迟模块:
再来跑一下
可以看到只能在 3 3 3 这儿,维持很短一段时间就下降了,这就是为电机的加速能力没有办法维持在这么高速的情况下还能维持那么高的加速度,所以就会变成这样。
加速度控制看完了,看一下速度控制:
一般纵向控制用的最多的就是速度控制,把速度设为 10 10 10,但加速度不能随便设,一般根据期望速度和实际速度相减,把相减的信号输到加速度信号里,不能直接把车的加速度拉过来。下面看一下速度变化:
速度控制还可以,至少一直稳定在 10 10 10 不变。
3.7 速度与加速度的匹配性分析
如果直接把车辆当前加速度拉过来,作为标定表查表的加速度,行不行?
控制结果会非常差。因为速度和加速度不匹配。
速度与加速度相匹配的概念可以这样理解:在车辆行驶过程中,速度与加速度需要协调一致,以实现预定的行驶目标。下面举个具体的例子来说明这一点:
假设规划的目标速度是 10 10 10 公里/小时,希望车辆能够以这个速度稳定行驶。那么,什么是与之匹配的加速度呢?由于初始速度为 0 0 0,因此必须有一个较大的加速度来使车辆从静止状态开始加速。在加速过程中,加速度应逐渐减小,最理想的情况是当车辆速度达到 10 10 10 公里/小时时,加速度恰好降至 0 0 0,即车辆不再加速,而是保持匀速行驶。这意味着,在速度未达到 10 10 10 公里/小时之前,车辆应持续加速,即存在一个正向的加速度。
然而,车辆的实际加速度可能并不完全符合这一理想模式。也就是说,车辆的实际加速度可能不会一开始就很大,然后逐渐减小至 0 0 0。如果车辆的实际加速度与规划的速度不匹配,就会出现问题。
有人可能会认为,如果车辆的速度目标是 10 10 10 公里/小时,那么车辆应该保持匀速运动,即加速度为 0 0 0。因此,他们可能会直接在控制表中设定速度为 10 10 10,加速度为 0 0 0。
但这样做的话,结果往往是非常不理想的,因为车辆可能根本达不到 10 10 10 公里/小时的速度。原因在于这种设定没有考虑到速度与加速度的匹配问题。初始速度为 0 0 0,要想达到 10 10 10 公里/小时的速度,必须有加速度作用。但如果加速度立即设为 0 0 0,车辆就无法加速,这就产生了矛盾。
因此,无论是进行速度控制还是加速度控制,都必须确保速度与加速度相匹配,不能随意设定。例如,如果速度设定为 10 10 10 公里/小时,而加速度设定为 5 5 5 公里/小时,这是不合理的。如果车辆要以 10 10 10 公里/小时的匀速行驶,加速度应该为 0 0 0。设定加速度为 5 5 5 公里/小时,会导致自相矛盾的情况。
同样,也不能仅仅根据速度目标设定速度,而将加速度简单地设为 0 0 0。需要考虑车辆从 0 0 0 加速到 10 10 10 公里/小时的客观过程。因此,匹配的加速度应该是在速度差距较大时较大,随着速度接近目标值而逐渐减小,直到速度达到目标值时变为 0 0 0。
因此,在上述例子中,可以使用目标速度与当前速度的差值作为加速度的输入信号,这样就能实现速度与加速度的匹配,从而显著提高控制效果。
四、刹车标定
4.1 刹车标定表的制作方法
油门标定完成后,下面介绍刹车标定表的制作方法,其实刹车标定表和油门标定表非常类似,不过右几点东西需要改一下。
首先在模型里先把 2-D Lookup table
二维查表模块删掉,油门设为
0
0
0,给刹车创建新的变量 bake
。
在 Carsim 的 Procedures
设置里,将初速度改成
180
k
m
/
h
180km/h
180km/h。
因为在刹车标定时,油门始终是 0 0 0,不可能一边踩油门一边踩刹车,这样车肯定就烧坏了。所以当踩刹车时,油门肯定是 0 0 0,但如果初速度也是 0 0 0 的话,就没法标了。
所以必须给车很大的初速度,最好选择控制所允许的最大初速度,从最快的速度制动到
0
0
0,这样制动可以覆盖所有的速度。设置好后,点 Send to Simulink
即可。
把代码写一下,油门标定代码和刹车标定代码几乎一模一样。
在这里要说一下,如果觉得控制效果不是很好的话,可以把油门步长设置得比较细一点,从 0.1 0.1 0.1 变成 0.01 0.01 0.01,每 0.01 0.01 0.01 就是标意思,这样循环就是从 1 1 1 到 101 101 101 了,而不是从 1 1 1 到 11 11 11 了,这样会比较准,但会跑得非常慢。
4.2 刹车标定数据的采集与拟合
下面看一下刹车标定代码,和油门标定代码类似:
brake=0.1;%初始化刹车
for i=1:80%输入实际上是制动压力,一般来说1就代表1MPa,最多不会超过 8MPa
%该程序非常耗时,如果需要更多更密集的数据,请先测试
sim('calibration');
v_temp(:,i)=vx.data;
a_temp(:,i)=ax.data;
brake_temp(:,i)=ones(length(vx.data),1)*brake;
brake=brake+0.1;%每 0.1 增加一次刹车
end
%合并,一定要转成行向量再合并,否则会导致合并失败
vbr=v_temp(:,1)';%记得要起个新的名字,免得和油门的油门变量搞混。
abr=a_temp(:,1)';
br=brake_temp(:,1)';
for i=2:length(a_temp(1,:))
vbr=[vbr,v_temp(:,i)'];
abr=[abr,a_temp(:,i)'];
br=[br,brake_temp(:,i)'];
end
%
%拟合
F=scatteredInterpolant(vbr',abr',br');%转成列向量
vubr=0:0.05:50;
aubr=-8:0.05:0;%注意从-8开始,写成单调递增形式,模型 f 给算出来之后,当在做表时,必须保证 v 和 a 都单调递增。
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
为什么刹车不能超过 8 M P a 8MPa 8MPa 呢?
因为现在的车都有 ABS 防抱死系统,就是刹车不允许踩得特别深,会发生很多危险,即不允许车轮抱死,所以刹车一般到 8 就已经到极限了,再大的话防抱死系统就开始工作了。
代码跑完后进行合并,合并是 80 个数据进行合并 v 、 a v、a v、a 以及油门。然后进行拟合,当然这里和右边的不一样, v 仍然是从 0 到50,每 0.05 取。
跑完后看一下表:
得到的标定表很大,竖着的是速度 从 0 0 0 到 50 m / s 50m/s 50m/s。横着的是加速度从 − 8 m / s 2 - 8m/s^2 −8m/s2 到 0 0 0 。
接下来的操作就很简单了,找二维查找表,把得到的标定表输进去。下面看一下标定表的数值分布:
4.3 刹车标定表的测试与优化
测试一下,比如想以 − 3 - 3 −3 的加速度制动,连接图如下:
把速度连上去,看一下结果:
结果就是这样的,以 − 3 - 3 −3 的加速度进行制动,直到停车之后加速度变为 0 0 0。
或者也可以像油门一样,给目标速度是 0 0 0,用实际速度和目标速度相减,作为加速度信号,这样也可以进行制动。
五、总结
在完成了 Carsim 模型中的油门和刹车标定后,能够更精确地控制车辆的加速和减速过程。通过采集不同油门和刹车条件下的速度和加速度数据,并使用这些数据建立标定表,我们能够在Simulink模型中实现更精确的速度和加速度控制。油门标定表的建立使得我们能够根据期望的速度和加速度,通过查表的方式得到相应的油门开度,从而实现速度控制。
通过油门和刹车标定,能够实现更精确的车辆控制,提高行驶的安全性和舒适性。同时,还要注意速度和加速度之间的匹配,以确保控制效果达到预期。
本篇博客就讲到模型和代码,谢谢大家的收看,下期再见。
参考资料
【基础】自动驾驶控制算法第十讲 油门刹车标定表的制作
后记:
🌟 感谢您耐心阅读这篇关于 Carsim 油门刹车标定表的制作 的技术博客。 📚
🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢
🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀
🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡
🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀