【自动驾驶】控制算法(十)深度解析车辆纵向控制 | Carsim 油门刹车标定表的制作

news2024/9/23 7:32:32

写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页:清流君_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 va 曲线,然后做拟合。

  比如当油门恒定为 0.3 0.3 0.3 时,和时间的关系是直线,这样进行仿真就可以得到车速 v v v 和时间 t t t 的关系,以及车辆加速度 a a a 和时间 t t t 的关系。
在这里插入图片描述

  因为都和时间相关,所以 v 、 a v、a va 可以合并,假设在油门等于 0.3 0.3 0.3 时, t = 0.1 s t=0.1s t=0.1s 时,得到 v 、 a 1 v_、a_1 va1 t = 0.2 s t=0.2s t=0.2s 时,得到 v 2 、 a 2 v_2、a_2 v2a2,如此下去,这样就可以在 v − a v-a va 二维坐标里得到一系列点,将点连成线,就会得到 v − a v-a va 曲线,一般 v − a v-a va 曲线长这样:
在这里插入图片描述
  速度越高,加速度就越差,这也是因为第九节所讲的,因为 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 va 曲线必然不一样。

1.2 油门控制曲面模型的构建

  使用不同的油门做实验,得到 v − a v- a va 曲线,把这一系列 v − a v-a va 曲线合并在一起,就可以得到三维曲面:
在这里插入图片描述

  选不同油门,就会得到不同曲线,把曲线全部拟合在一块,就会变成曲面:
在这里插入图片描述
  这样就得到了油门和 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 va 曲线,根据曲线拟合得到表格,这就是刹车的标定表。

  至此,理论部分就讲完了,接下来到实践部分看一下该怎么标定油门和刹车,把第九节所讲的模型准备好。


三、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 导到工作空间里。变量的名字就起 vxax,当跑模型时,会将模型输出存到 vxax 变量里,然后点保存。

3.2 标定油门与刹车

  一切准备就绪后就可以写标定算法了。

thr = 1;%  thr 和 Simulink 模型里的 thr 名字一定要一致
sim('calibration');%调用 Simulink 函数,括号里是模型名字

  这两行代码是通过 Matlab 调用 Simulink 最简单的语法,实现两者之间的联动。

  开始运行就会把 thr = 1 传到 Simulink 模型里,跑完一遍后会把 vxax 传进来。

   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 va、油门都是矩阵形式存储的,把他们合并变成一列向量:

%合并
%一定要转成行向量再合并,否则会导致合并失败
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 va 以及油门。然后进行拟合,当然这里和右边的不一样, 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 油门刹车标定表的制作 的技术博客。 📚

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

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

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

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

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

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

相关文章

7款国内AI搜索引擎大全网站

与传统搜索引擎相比,AI搜索引擎利用先进的自然语言处理、机器学习和深度学习技术,提供更加精准和个性化的搜索服务。小编就来和大家分享国内免费的AI搜索引擎网站,方便大家体验使用。 AI搜索引擎网站大全:https://www.bgrdh.com/f…

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders(输出控制器)3、Layout(日志格式化器) 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商

在当今数字化时代,物联网(IoT)正迅速成为连接我们生活各个方面的无形纽带,越来越多的日常物品被赋予了智能功能,从灯泡到插座,从门锁到家电设备,这些设备正在改变我们与家庭环境的互动方式。 随着智能产品的普及&…

*C++:string

一.STL简介 1.STL STL(standard template libaray- 标准模板库 ) : 是 C 标准库的重要组成部分 ,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 。 2.STL六大组件 二.标准库里的string类 标准string库网址&#xff1…

【AI算法岗面试八股面经【超全整理】——NLP】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

Crack道路裂缝检测数据集——目标检测数据集

【Crack道路裂缝检测数据集】共3684张。 目标检测数据集,标注文件为YOLO适用的txt格式。已划分为训练、验证集。 图片分辨率:224*224 类别:crack Crack道路裂缝检测数据集 数据集描述 该数据集是一个专门用于训练和评估基于YOLO&#xff0…

[笔记]某变频器,功能列表及参数表

产品代号:INVT GOODDRIVE,这家公司我的产品我似乎在特检院看到过?或者在某个地铁建设工地看到过。是深圳的。 1.产品功能点: 变频锥形电机控制、抱闸转矩验证?抱闸反馈零位检测行程限位超载防护轻载升速(…

机器学习课程学习周报十三

机器学习课程学习周报十三 文章目录 机器学习课程学习周报十三摘要Abstract一、机器学习部分1. 文生图模型概述2. Stable Diffusion概述3. ControlNet概述4. 概率论复习(二) 总结 摘要 本周的学习内容涵盖了文生图模型、Stable Diffusion、ControlNet以…

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说,需要根据实际场景和使用的需要,使用不同厂家,不同型号的DDR,虽然原理上大同小异,但是还是有一些细节上的需要注意的地方,接触一个新的DDR芯片,首先就是需要找到对应的datashee…

Mybatis 返回 Map 对象

一、场景介绍 假设有如下一张学生表: CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(100) NOT NULL COMMENT 姓名,gender varchar(10) NOT NULL COMMENT 性别,grade int NOT NULL COMMENT 年级,PRIMARY KEY (id) ) ENGINEInnoD…

LeetCode讲解篇之238. 除自身以外数组的乘积

文章目录 题目描述题解思路题解代码 题目描述 题解思路 对于该题,我们可以先使用一个循环记录所有非零元素的乘积结果和非零元素的个数 如果非零元素个数为0,则非零元素的乘积除以数组对应位置的数字就是除自身以外的数组的乘积如果非零元素个数为1&am…

新质农业——水肥一体化技术

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

【人工智能学习】8_人工智能其他通用技术

知识图谱 在看影视剧或小说时,若其中的人物很多、人物关系复杂,我们一般会用画人物关系图谱来辅助理解人物关系。那什么是知识图谱呢? 知识是人类对信息进行处理之后的认识和理解;对数据和信息的凝练、总结后的成果。 将信息转…

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同 前言 假设有如下表结构与数据,class_id表示班级,需求:现在要按照班级分组,每个班级的学生进行年龄从小到大排序 一、ROW_NUMBER()函数 ROW_NUM…

YOLO航拍车辆和行人识别

YOLO航拍车辆和行人识别 图片数量9695,标注为xml和txt格式; class:car,pedestrian,truck,bus 用于yolo,Python,目标检测,机器学习,人工智能,深度学…

软件测试分类篇(下)

目录 一、按照测试阶段分类 1. 单元测试 2. 集成测试 3. 系统测试 3.1 冒烟测试 3.2 回归测试 4. 验收测试 二、按照是否手工测试分类 1. 手工测试 2. 自动化测试 3. 手工测试和自动化测试的优缺点 三、按照实施组织分类 1. α测试(Alpha Testing) 2. β测试(Beta…

图像放大效果示例【JavaScript】

实现效果&#xff1a; 当鼠标悬停在小图&#xff08;缩略图&#xff09;上时&#xff0c;大图&#xff08;预览图&#xff09;会随之更新为相应的小图&#xff0c;并高亮当前悬浮的小图的父元素。 代码&#xff1a; 1. HTML部分 <!DOCTYPE html> <html lang"z…

Nginx简介;Nginx安装

一&#xff0c;Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协议下发行。是一个高性能的HTTP和反向代理web服务器 &#xff0c;同时也提供了IMAP/POP3/SMTP服务。 其特点是占有内存少…

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在灰度图像中使用霍夫变换查找圆形。 该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。 例子&#xff1a; #include <opencv2/imgp…

【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲 1.1 为第三方的类添加方法: 扩展函数 1.1 为第三方的类添加方法: 扩展函数 Kotlin 的主题之一是与现有代码的平滑集成 即使是纯 Kotlin 项目,也是构建在 Java 库之上的 如 JDK、Android 框架和其他第三方框架 而当你将 Kotlin 集成到 Java 项目中时 你还要处理尚未或不…