第四章 控制算法软件设计
系统的软件设计由三大部分组成:1、小车的状态信息检测;2、控制算法;3、执行控制。其中,状态信息检测部分包括道路信息检测、速度检测;道路信息检测由CMOS摄像头视频信号采集和处理两部分组成。利用了单片机MC9S12DG128的ATD模块、ECT模块、PWM模块、外部中断和SCI串口模块等。开发工具是Metrowerks的Code Warrior IDE V4.5编译器,主要用C语言进行代码的编写,其中模糊控制算法用汇编语言编写。调试工具使用清华大学摩托罗拉MCU应用开发中心的DBM调试套件。同时,在调试过程中利用了无线串口通信模块等。
4.1 软件主流程
在系统上电后,进行视频信号的采集,然后对采集的数据进行处理和计算,给出控制量,一个控制周期为30ms。
当一场视频信号采集完成后,进行黑线的获取,根据黑线位置,控制舵机转向和计算出赛道大致曲率,结合实时检测的速度值进行控制直流电机转速从而达到控制速度的目的。
程序主流程图如下图:

图 4-1
4.2、赛道情况检测
4.2.1、CMOS摄像头视频信号采集
在前一章,就其硬件电路已经进行了介绍。视频信号通过视频信号分离电路LM1881,分离出奇偶场同步信号和行同步信号。当需要采集图像时,首先判断奇偶场同步信号的起始作为一场信号的开始,然后利用单片机MC9S12DG128B的外部中断检测行同步信号进行一行的AD转换,获得视频信号,直到一场结束。通过实验,我们在单片机不超频的情况下(即BUS_CLOCK=24MHz),一行能够获得50个点,这已经满足我们的控制要求。在横向获取行数时,我们采用隔行获取,同时,我们为了缩短控制周期,我们只取最前面的十行最为控制的有效信息。这样,我们的控制周期得到了尽量的缩短,但同时也不影响控制要求。
视频信号采集流程图如下图:

图4-2
在实验过程中,我们利用单片机串口把图象信息传到PC机用串口调试助手显示出来,为此可以更加直观进行分析和比较。以下为获取到的直道、左弯道和右弯道的图象信息:

图4-3 直道

图4-4 左弯道

图4-4 右弯道
4.2.2、图象信息的处理
在对以上获取的10X50图象,进行黑线的提取以及计算赛道的曲率。
4.2.2.1、黑线信息的提取
对于黑线信息的提取,采用前后像素点阈值比较法来获取。主要把每行50列的信息分解为3部分进行处理,即前10列为一部分,后十列为一部分,其余为一部分,这样做的原因在于使黑线不至于被漏检,同时也达到快速检测到黑线,其算法流程图如下:

图4-4 黑线提取
4.2.2.2、赛道大致曲率的计算
对于赛道大致曲率的计算,采用了动态取出黑线位置,过滤了无黑线信息的数据,然后根据公式:
曲率=有效的第一行黑线位置-2X有效的中间行黑线位置+有效最后一行黑线位置
采用动态计算曲率是为了避免当摄像头失去黑线位置时产生计算曲率出错,从而影响小车整体速度的提高或者造成小车速度过快而冲出赛道的危险。
在进行动态取曲率的同时,也进行失去黑线行数的计数,这也为速度控制做好准备。
4.2.3、用光电管探测赛道实现对舵机转向控制的算法

图4-5 光电管排列图
先对光电管建立数学模型:以10个光电管的中心为坐标原点,设10个光电管从左到右的坐标值如图4-6所示

图4-6 光电管坐标设定值
小车给定前进方向为直线方向,即给定值为坐标原点0,因此偏差e(k)正比于黑线位置坐标值,设为E。考虑到黑线宽度和转弯时可能有多个光电管落在黑线上方,此时偏差值取其坐标平均值。如果偏离黑线,则输入上一次的输入值,以保证小车尽可能回到赛道上。
算法流程:将光电管的坐标设定值放到一个数组TAB1,读取PORTB和PORTA的信息,将它放到别一个数组里面TAB2。对TAB2按从左到右进行判0,第几位为0就把它对应在TAB1的第几位值放到第三个数组TAB3里面。这样就把黑线的所在位置提取出来了。如前面所说,可能有多个光电管同时落在黑线上,所以我们对提取出来的黑线位置要加以判断。怎样来判断呢?很简单,只需计算一下TAB3中有几个数就行了。如果TAB3中没有数,则说明没有检测到黑线,这时应把偏差值设为上一次的偏差值E;如果TAB3中只有一个数,则把这个数乘以2就得出E;如果TAB3中有一个以上的数,则把它的第一个数和最后一个数相加得出E。把E送到PID控制环节就可以得出舵机的转向角度。由于我们只用了比例环节,所以只需把E乘上一个比例系数K就可以了。上述算法的软件流程图如图4-7所示

图4-7
4.3、速度检测
速度的检测采用自制的反射式光电测速装置,小车车轮每转动一圈,走过路程为16.7CM(记为L),同时产生64个脉冲(记为M),利用单片机的ECT脉冲累加寄存器PA0在每隔25ms时间(记为T)内累加脉冲数(记为N)计算出当前小车速度(记为V)。因为每采集一个图象,时间为25ms,为此,不必专门的设置定时中断来进行脉冲数的获取。计算公式如下:

4.4、控制策略
通过以上获得了赛道基本信息和速度信息后,将根据这些信息作出决策,进行方向和速度的控制,按照规定行驶。
其控制流程图如下:

图4-8 控制流程图
4.4.1、方向控制策略
因为从图象信息的采集到黑线的提取这个过程,需要大约为25ms的纯滞后时间,这为控制小车及时转向造成了滞后,会发生响应迟钝。在这里采用模糊控制算法,将有效的袮补这一缺陷。
模糊控制是指模糊理论在控制技术上的应用。它用语言变量代替数学变量或两者结合应用;用模糊条件语句来刻画变量间的函数关系;用模糊算法来刻画复杂关系,是具有模拟人类学习和自适应能力的控制系统。因为小车本身由于重量、机械结构的偏差和在行驶过程中的震动,导致我们在建立车体的数学模型时有很大的困难,而S12 自带了模糊控制指令,使我们利用模糊控制算法十分方便。

4.4.2、小车速度控制
模糊控制器结构如下图:

图4-8 模糊控制器结构
如图4-4,本系统的模糊控制器采用了双输入单输出的基本模糊控制结构,包括模糊化,知识库,模糊推理,解模糊化和输入输出量化等部分。e和&分别为控制偏差和偏差变化率,E和EC
分别为和经过输入量化后的语言变量,V为模糊控制器输出语言变量, v为经过输出量化后的实际输出值。在我们取得的图象信息中,我们取前面的十行作为控制量,因为在一幅图象中,最前的信息将对小车的控制最具指向性。
。
前轮转向角度的输出是通过对舵机PWM输入信号的调制脉宽进行控制的。脉宽从4162微秒至4838微秒对应舵机轴旋转在-45度到45度,转向机构将舵机的转角传递到前轮的方向转角。忽略舵机的动态响应过程,在舵机处于稳态时,脉宽与前轮的方向转角存在一一对应的映射关系。因此模糊控制器的输出就是控制舵机的脉冲宽度,论域为4162~4838微秒,输出将论域定为0~676微秒,即对应舵机向左或右打45度,本设计中采用的是黑线的直接变化量作为偏差输入,在给PWM模块设置脉宽时加上4162的偏移量。
4.4.1.2、确定各语言变量和定义模糊量
模糊语言变量论域为:


分别为和经过输入量化后的语言变量,V为模糊控制器输出语言变量, v为经过输出量化后的实际输出值。在我们取得的图象信息中,我们取前面的十行作为控制量,因为在一幅图象中,最前的信息将对小车的控制最具指向性。
4.4.1.1、模糊控制输入、输出量的确定
模糊控制器的设计首先要确定输入量和输出量的论域及其维数。
对于舵机的控制,我们采用前面十行中的第三行作为控制信息,将此行每次变化值作为误差变量e,其基本论域为(0,50);前后误差变量差作为误差变化率&,其基本论域为(-50,50);输出语言变量v的基本论域为前轮转向角度的输出是通过对舵机PWM输入信号的调制脉宽进行控制的。脉宽从4162微秒至4838微秒对应舵机轴旋转在-45度到45度,转向机构将舵机的转角传递到前轮的方向转角。忽略舵机的动态响应过程,在舵机处于稳态时,脉宽与前轮的方向转角存在一一对应的映射关系。因此模糊控制器的输出就是控制舵机的脉冲宽度,论域为4162~4838微秒,输出将论域定为0~676微秒,即对应舵机向左或右打45度,本设计中采用的是黑线的直接变化量作为偏差输入,在给PWM模块设置脉宽时加上4162的偏移量。
4.4.1.2、确定各语言变量和定义模糊量
模糊语言变量论域为:
E:{NB,NS,Z,PS,PB};
EC:{ NB,NS,Z,PS,PB };
V:{LB,LM,LS,M,RS,RM,RB};

图4-9 偏差隶属度函数图

图4-10 偏差变化率隶属度函数图
输出语言变量V的论域中取语言值各语言值“左大”(LB),“左中”(LM) ,“左小” (LS) ,“中间”(M) ,“右小” (RS),“右中”(RM), “右大”(RB)七种。隶属函数均采用线性函数。
4.4.1.3、模糊控制规则
模糊控制的输入量进行模糊化时将输入量取5个模糊等级,各部分的输出取7个模糊等级。
规则表如下:
其中,在输入语言变量E和EC的论域中取语言值“负大”(NB), “负小”(NB),“零”(Z),“正小”(PS), “正大”(PB)五种,各语言值的定义分别由图4-9和图4-10给出的E和EC的隶属函数曲线来描述。和EC分别为和经过输入量化后的语言变量,V为模糊控制器输出语言变量, v为经过输出量化后的实际输出值。分别为和经过输入量化后的语言变量,V为模糊控制器输出语言变量, v为经过输出量化后的实际输出值。
4.4.1.4、输入、输出量量化处理和反模糊化
在本设计当中,模糊控制输入采用的是直接黑线偏差,为此这个不用经过量化;偏差变化率存在了负数,为此,我们把其通过加上50这个基本数,令其能够符合S12内部模糊控制指令的规定。作为输出后的值,范围同样是可以达到0~255,为了对应上舵机控制的PWM调制范围0~676,则取输出论域为0~170,然后再乘于量化因子3即可得到所需要的控制量。
对于反模糊化,这些都是S12模糊控制的规定。
4.4.2、小车速度控制
在本次比赛中,速度作为直接排名的标准,因此,速度就是小车的“生命线”。速度固然越快越好,但快也要使小车能被控制得住,这样,才能最终取得好成绩。综观赛道复杂程度,弯道要比上届复杂得多,直道大为减少,同时增加了坡度。对此,怎样才能综合分配号各段车速呢?经过实际的测试,主要有几个关键的地方:第一、小车上坡需要达到一定的速度才能成功爬坡;第二、下坡速度必需控制好,以免下坡速度过快而冲出赛道;第三、直道入弯道前速度需要减慢,以免冲出赛道。
所以,小车当前速度的检测使相当的重要。同样,也采用bang-bang控制算法,进行小车速度的闭环控制,同时,也加上限速处理。在图4-4中可以看到,首先是判断采集到图象信息失去黑线程度有多高,如高达到一定程度,则马上进行减速。这样做的原因是安装在小车上的摄像头具有超前性,当遇到弯道时特别是急弯,摄像头容易失去图象信息,利用这个特点,小车从直道到弯道时可以有效快速的进行减速。当图象信息中失去黑线信息很少或没有失去,则说明此时小车处于直道或曲率较大的弯道中,这时,就可以通过计算得到的曲率进行速度的分档调速。
小车运动是通过直流电机带动的,直流电机是用电机专用驱动芯片MC33886进行驱动,是通过调制10KHz频率的PWM的占空比来调节驱动芯片输出电压值,从而进行小车速度快慢的控制。


