项目经历
_我参加的是恩智浦智能车竞赛。它主要是制作一辆以摄像头为传感器的自动寻迹小车。
我在这个项目中主要负责电路的设计以及图像处理程序的编写。
整体上划分为机械与硬件,嵌入式平台设计,转向与转速控制,图像处理,测试与验证
整个系统采用了分层的设计,分为
1.机械与硬件层,主要是电路板以及车模的机械结构调整
2.嵌入式平台层,实现任务的调度,嵌入式软件系统的初始化,硬件驱动
3.控制与图像层,使用PID算法进行转速转向控制,对图像进行处理为转向服务,主要实现图像的处理,寻找中线,以及与Matlab2011a和VS2010配合实现对算法的快速仿真验证,大大提高开发效率
分层的目的是为了简化系统的复杂度,做到局部可控,便于后期的维护
电路设计方面
我们分为了两个部分,
一个是控制板,他放置摄像头,并引出线来连接各个硬件,
二是驱动板,用于放置电机驱动芯片,编码器接口等。
功率越大的器件,越靠近电源供电的话,那对整个系统工作的影响就越小。
大功率器件的电源和地最好贴着走,不要包含小功率的器件。
基本公式
U=IR
P=U^2/R=UI
电阻
电阻虽然标识是100欧,但是实际它是有一定精度的
它的最大电压由功率和阻值来决定
二极管
U<0,也就是对二极管加反向电压,电流为0,相当于开路
U>0,会有一定的压降比如0.7V左右,相当于短路
串并联
串联各元器件处电流处处相等,并联电压相等
实际中,导线也是有阻抗的
功率越大的器件,越靠近电源供电的话,那对整个系统工作的影响就越小。
PWM是一个交变电流,根据电磁感应定律,会产生交变磁场,所以大功率器件的电源线要贴着布线。
嵌入式平台的搭建
在任务调动上采用的是while循环中执行图像处理和舵机转角的控制,在定时器中断中进行电机的控制。
驱动层上的设计.h负责接口,.c负责实现
图像处理的验证
如果等所有代码都完成了,再进行验证测试的话,如果一旦出现问题,再返工重新设计,尽可能的将验证测试提前,越早期发现错误,那风险也就越低。但是嵌入式系统软件和一般软件系统不太一样,因为要与实物配合才能进行测试验证。我们将代码中比较重要的控制算法分出来,不等到硬件全部制作完再去验证,而是在matlab中进行测试验证
使用matlab的交叉编译来将编写的C语言图像处理算法在matlab中进行测试,之后再烧到单片机中进行真实赛道的测试
mex交叉编译的原理就是将matlab中输入的参数传递给我们编写的C语言代码,之后运行C语言代码后,再将结果返回到matlab中
算法思路是
- 判断有没有出界,如果出界,则不做处理,保持原来的方向偏差不变,否则开始寻找新的中线
- 逐行扫,先寻找中间位置,然后向左右寻找左右边界
- 根据左右边界计算左右边界的斜率变化,然后递推得到最终的左右边界值
- 根据左右边界,计算中线
- 将中线做均值滤波
- 滤波后的中线,映射到实际的物理坐标上(单位为cm)
- 根据速度,计算三个中线偏差值
三个中线偏差值为远偏差,中偏差以及近偏差
远偏差用于识别入弯出弯,并进行减速控制
中偏差用于转向控制。
速度来调整远偏差与中偏差的边界
PID算法
分析建模
系统的输入对象是PWM,输出是车速
以电机转速为例,当前值是由编码器测出的,目标值是我们设定的,这样就会的到一个偏差e
假设速度是从0开始到目标值
设一个周期即单位时间速度的变化为x,这一周期的偏差为e
x=u-c
u=kp*e
可以看出随着时间流逝,e会逐渐的小,变化率也会逐渐减小,直至为0
(x+c)/kp=e,可以看出,当x=0,也就是速度不变的时候,e始终不为0,也就是始终都不能达到目标值
这个误差就叫做静差
所以要把这个静差补上,就需要使用积分环节,它相当于速度比预定的低就加速,速度比预定的高就减速
当只有比例时是不会发生速度超过目标值的,但是加上比例环节后就有可能超过目标值,超出的部分叫做超调。
即过大的积分环节比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏
增大积分时间I有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。
增大比例系数一般会加快系统响应
增加微分环节,因为当超出目标值时,e为负数,其导数为负数,所以就往反方向减小
微分环节主要作用是在响应过程中抑制偏差向任何方向的变化”
“微分常数不能过大,否则会使响应过程提前制动,延长调节时间”
测试使用的是串口打印调试