前言
网上有关小车的文章太少了,而且非常不系统。要么制作繁杂的一笔,要么就是标准库一大堆看不懂的函数。
小车采用STM32CUBEMX结合keil开发。用到的配件也非常简单,其中算法很少,唯一一个也是PID抄的网上的,只需要知道怎么去用就好了。
小车用到的配件很少。ublox第十代定位,hmc5883l电子指南针,还有小车自带的L298N电机驱动.
开发
配件部分
hmc5883l
这个配件的存在其实相当于小车的眼睛。网路上很多都用到了MPU6050,但是我不知道他是干什么的,测算出欧拉角,我觉得唯一有用的是偏航角。但是我有了定位经纬度,以及指南针,我需要这个偏航角干啥。
在学习这个配件过程中,其实更加重要的是查阅资料的能力以及阅读手册的能力。
这里放上链接HMC5883L中文手册
这个配件首先需要I2C的一定相关知识。其次就是HAL有关I2C的一些相关函数。
在阅读的时候其实很多我都看不懂。但是我能知道的就是,我应该在哪一个位置读取我需要的数据
所以配置函数我直接cv,读取的寄存器后数据处理,也是cv。我连高斯单位都不知道,我怎么知道磁场强度怎么转换为方向角。
所以关于指南针代码 可以直接从我github拿,能用就行。
UBLOX第十代定位
这个是串口通信,用于提供当前经纬度。
唯一注意的是,串口数据有点多,所以我这里没有采用中断,用的是DMA。
至于报文解析,这个我找的网络资料,一个一个去查,哪里到哪里是经纬度。
详情参考这文章UBX 协议报文整理_ubx协议-CSDN博客,代码也在github。
L298N电机部分
其实电机部分没有什么要讲的,就是pwm信号输出。
主要问题是部分优化。以及搞清楚左转右转就行了
算法部分
PID算法
我不知道这个算法的积分微分数学。我只需要知道他怎么去用就行了。
PID控制器是一种广泛应用于控制系统的算法,它通过调整比例(P)、积分(I)、和微分(D)这三个参数来控制系统的输出,以达到期望的目标。以下是对每个参数的具体说明,结合了你的小车加速到100 m/s的例子:
### 1. **比例控制(P)**
比例控制用来根据当前的误差调整控制输出,误差是目标值与当前值的差异。例如,当你的小车需要加速到每秒100米时,误差就是当前速度与100 m/s之间的差距。如果P值很大,相当于高档起步,这时误差会迅速放大控制输出,小车会迅速接近目标速度。
然而,这也意味着初期的加速度会很大,可能导致系统不稳定或振荡。例如,起步过猛会让速度快速飙升到目标值甚至超过。这种快速反应有好处,但也可能带来超调和系统震荡。相反,如果P值较小,就像低档起步,虽然响应速度慢一些,但系统会更加稳定,减小振荡的可能性。
### 2. **微分控制(D)**
微分控制主要用来抑制由于比例控制带来的振荡问题。它通过检测误差的变化速度来调节控制输出,从而减缓系统的过冲。例如,当小车接近100 m/s时,如果P值很大,小车会有很大的加速度,很容易超过目标速度,比如达到120 m/s,然后由于过冲又会迅速减速到80 m/s,形成震荡。
微分控制的作用就像我们看到车速接近目标值时,会提前减小油门,这样当小车速度到达100 m/s时,加速度也会被减小,避免过大的超调和来回振荡。
### 3. **积分控制(I)**
积分控制用于修正系统的长期偏差。比如在路面摩擦力增大时,单靠P和D控制可能无法完全补偿变化,小车会在80 m/s速度处匀速,而达不到预期的100 m/s。积分控制会根据误差的累计来调整控制量,逐渐增加推力,从而让小车能够继续加速并最终达到目标速度。它补偿了由于系统持续误差而导致的不足,从而确保系统能在各种条件下实现目标。
通过P、I、D的结合,PID控制器可以使小车在各种情况下迅速且平稳地达到目标速度,减少震荡,克服环境变化的影响,使系统表现得更加平稳和精准。
还有在小车方向角问题,pid算法有一个问题
如果小车在5°前行,如果突然便宜到355,此时pid算法中的error需要重新优化
原本error公式是 error = setpoint -测量值
此时是-350,按照逻辑小车将会绕路转一大圈。这是很不对的
所以我写了一个函数
这个函数有点绕。其实我这个就是在计算两个角度的差值delta.如果这个差值大于180 或小于-180此时小车就会绕路,要采用另一条路线
代码优化描述:
`getTurnRaw` 函数用于计算两个角度 `point` 和 `raw` 之间的差值 `delta`,并调整该差值使其保持在 `-180°` 到 `180°` 之间。如果 `delta` 超过 `180°`,函数将差值减去 `360°`,使其保持在合理的范围内。同样,如果 `delta` 小于 `-180°`,函数会将差值加上 `360°`,防止小车绕路。
解释说明:
- `getTurnRaw` 函数的目的是计算并规范角度差值,使其始终保持在 `-180°` 到 `180°` 之间。这是为了避免小车在选择路径时出现不必要的绕路。
- `PIDController_Update` 函数中的 `error` 表示当前的误差值,实际上就是期望角度(`setpoint`)与实际角度(`measurement`)之间的差值。这个差值可以是正的,也可以是负的,取决于小车的位置和目标的关系。
- 在 PID 控制中,误差的含义是灵活的。它不仅是数字大小的对错,更重要的是在控制系统中的作用。这个误差可以是 `-350`,也可以是 `10`,这取决于你的角度计算方式和系统实际需要处理的情况。