智能车摄像头循迹串级PID控制实战指南
引言
- 智能车比赛中,舵机、摄像头与电机组成的系统是核心控制单元。
- 串级PID控制用于优化系统响应速度和稳定性。
- 本文探讨串级pid系统中的:系统组成、三者输出值的获取、电机pid与舵机pid的简单实现简略介绍、串级PID控制原理。
- 最终可实现对赛道的简单循迹
系统组成
摄像头模块
- 负责赛道信息的采集与处理。
- 通过图像识别获取赛道中心线或边界信息。
- 输出偏差信号给舵机控制模块。
舵机模块
- 根据摄像头提供的偏差信号调整车轮转向。
- 直接影响车辆的行进轨迹。
- 需要快速响应以应对赛道变化。
电机模块
- 控制车辆的前进速度。
- 根据赛道情况和舵机转向调整输出功率。
- 与舵机协同工作以保持车辆稳定性。
简介
本文主要介绍摄像头+舵机+电机配合的整体框架与思路,至于其中细节,只粗略点出,并不会详细解释。
三者输出值的获取方法
1.摄像头图像处理
(1)中线提取方法(此处中线是指图像处理所得的此时在小车的视野里面的中线,即由提取的左右边界线平均所得的中线,并不是实际中线)
1.摄像头得到赛道图片。
2.图像处理得到二值化图像。
3.利用最长白列或者八邻域的方法对图像处理提取出左右边界(用数组存储),利用左右边界得到中线数组(对于最长白列与八邻域,此处不加以讲解,如有需要,可以评论区留言,若人多,我会再发一篇博客,对两种图像处理方法进行讲解)。
2.舵机
(1)角度得出方法
steer = ((servo_pwm_info.duty/(float)PWM_DUTY_MAX*1000/(float)SERVO_MOTOR_FREQ) - 0.5)*90 - 中心角度值
(2)公式介绍:steer为计算所得偏移的角度值;servo_pwm_info.duty为直接获取的舵机此时pwm值;PWM_DUTY_MAX为生成的CCR /(ARR + 1)中ARR不变,使得此时CCR / (ARR + 1)为1时的CCR值;SERVO_MOTOR_FREQ为此时控制舵机的pwm的频率;中心角度值为计算所得steer的参考线。

3.电机
(1)通过编码器与ADC读取,可以得到一定时间内ADC的累计值,通过测量这一段时间t,再通过编码器的参数,即ADC每读取到一个值,编码器转过的角度与轮子周长的换算关系,可得到这一段时间所通过的路程s,s/t 即可得到此时的速度值(说明,这里只是提出一种速度获取方法,实际上,在pid控制中,我们其实并不需要得到速度,只需要一段时间所读取的编码器的值即可)。
电机pid与舵机pid的简单实现简略介绍
1.舵机(此处只采用简单的pid对舵机进行处理,而没有使用对环境适应度更好的模糊pid
,若有需求,可自行下去了解)
2.电机

串级PID控制原理
1.内环与外环设计
(1)外环(位置环):摄像头采集的偏差信号作为输入。
(2)内环(速度环):电机速度反馈作为输入。
(3)通过双环结构实现更精确的控制。

对图文进行详细介绍:
1.将图像处理后所得的中线(由左右边线所得的中线)与赛道的中线(直接可以取整张图像的边线)。

所以舵机pid的Target = 赛道中值偏差 = 赛道边线 - 左右边界所得中线(mid[58])(此处是58,而不是60,是因为采用了滤波的思想)
2.舵机pid的out输入到阿尔曼差速模型(可自行下去了解,此处只展示简单模型与简单实现代码)中去,可得到需要输入到电机pid中的左右电机分别的速度Vl与Vr。

注:模型参考文章:STM32循迹PWM调速及阿克曼舵机转向_阿克曼转向与普通转向区别-CSDN博客
3.得到的Vl与Vr分别作为左右电机pid的Target输入,输出的pwm值进行具体的速度控制。
4.此时测得的转速可再由编码器测得,作为Actual输入到电机pid中,然后车辆的位置与姿态的变化,可再由摄像头得到,图像处理得到的中线可再于赛道中线进行差值。
5.循环反复,即构成了摄像头,舵机,电机之间的串级pid模型,最终完成赛道循迹的功能。
总结
1.通过此篇博客,带领大家一步步的从输出值的获取,来实现分别的pid,分别的处理,最后进行整合,从而形成了串级pid的系统
结语
1.如果由什么问题,欢迎在评论区或者私信我指出
2.如果由什么地方不明白,欢迎在评论区或者私信我指出
3.谢谢大家,如果觉得对你有启发或者是由帮助的话,麻烦点个赞或收藏,你的赞或收藏就是对我最大的鼓励。
更多推荐




所有评论(0)