智能车PID的算法推荐

合集下载

智能车PID的算法推荐

智能车PID的算法推荐

PID( Proportional Integral Derivative )控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性(稳定性)好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。

模拟PID控制系统原理框图PID是一种线性控制器,它根据给定值r in(k)与实际输出值y out(k)的差值e(t)构成控制方案,利用运放实现模拟PID的一个例子:式中:以上为典型模拟PID应用例子。

关于各调节器的作用说明:♥比例调节器P1、起调节作用与输出量和给定量的差成正比,有差就有调节作用,所以他的调节结果总是有差存在,这种调节不可消除差,所以叫这种调节为有静差调节;2、但这种调节作用快,能很快减小误差,是最常用的一种调节器!3、积分I调节慢,所以PI是最常用的一种搭配!♥积分调节器I1、是给定量与输出量的差对时间的积分,在电路里就是用给定量与输出量的差给电容充电,只要时间足够长,电容器的电压总会到达给定量,使输出量与给定量的差为零;2、积分调节器是一种无静差调节器,意思是说可调节到给定值,做到精确、准确输出;♥微分控制调节器D1、,这种控制总是以输出量与给定量的差的变化率成正比,差变化越剧烈,调节作用越大,差变化越平稳,调节作用越弱;2、这种微分调节作用,使得输出量平稳而很少波动;3、这种微分调节作用,对输出量的变化、波动产生强烈的阻尼、抑制的作用,就像摩擦力的作用;数字式PID应用:增量式PID的算式为:如果换换成智能车里的方向控制就变为:Pwm_offset=PWMMiddle+PID_P*(error-last_error)+PID_I*(error)+PID_D*(error+pre_error-2*la st_error);其中:error=middle-offset,注意这个公式里的offset应该有正负之分,左右偏移的值互为相反。

这样自然就确定了最后的方向。

智能汽车控制策略及PID算法分析

智能汽车控制策略及PID算法分析

智能汽车控制策略及其PID 算法分析作者:王保磊机电1103-11221077目录背景简介一.智能汽车竞赛简介: (1)系统建立二.控制策略: (1)2.1:理论分析 (2)2.2 : PID 控制规律的离散化 (3)2.3 : matlab 分析 (4)2.4 :系统校正 (9)总结三.总结: (14)一.智能汽车竞赛简介。

全国大学生“飞思卡尔”杯智能汽车竞赛是在规定的模型汽车平台上,使用飞思卡尔半导体公司的 8 位、 16 位微控制器作为核心控制模块,通过增加道路传感器、电机驱动电路以及编写相应软件,制作一个能够自主识别道路的模型汽车,按照规定路线行进,以完成时间最短者为优胜。

因而该竞赛是涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的比赛。

摄像头组比赛规则:采用模拟或数字摄像头对赛道信息进行采集,通过硬件二值化并进行软件信息处理,获得赛道信息,采用规定的舵机和电机控制小车的行走。

相同的赛道,竞速,完成赛道时间短的队伍获胜。

下图为赛道示意图和实际赛道照片。

为保证小车一直沿着黑色引导线快速行驶,系统主要的控制对象是小车的转向和车速。

即应使小车在直道上以最快的速度行驶。

在进入弯道的时刻尽快减速,且角度的转向要适合弯道的曲率,确保小车平滑地转弯,并在弯道中保持恒速。

从弯道进入直道时,小车的舵机要转向至中间,速度应该立即得到提升,直至以最大的速度行进。

为实现上述控制思想,我们采用不同的控制方法来控制小车的转角和速度。

下图为小车的实物模型:二.控制策略。

2.1:理论分析:Ov7620 数字摄像头采集到的赛道信息为采集点灰度值,这些灰度值与设定的阀值进行比较转化为二进制信息,利用这些二进制信息可以确定赛道黑线位置,进而确定小车当前位置及理想通过曲线。

求得理想通过曲线上各点的斜率进而确定赛道类型,通过算法控制电机转速,以保证小车安全通过赛道防止侧翻和打滑。

计算小车的当前位置横坐标值即摄像头视野中线与理想通过曲线与横坐标交点的差值。

pid算法公式详解

pid算法公式详解

pid算法公式详解
PID算法,即比例(proportional)、积分(integral)、微分(derivative)控制算法,是一种应用广泛的控制算法。

它结合了比例、积分和微分三种环节于一体,适用于连续系统的控制。

在工业应用中,它是最广泛算法之一,如四轴飞行器、平衡小车、汽车定速巡航、温度控制器等场景均有应用。

PID算法的公式如下:
\[U(t)=K_p e(t)+K_i\int_{0}^{t}e(\tau)d\tau+K_d frac{de(t)}{dt}\]
其中,
-\(U(t)\)是控制器输出的控制信号;
-\(e(t))是控制器输入的误差信号;
-\(K_p\)、\(K_i\)和\(K_d\)是比例、积分和微分系数;
-(\int_{0}^{t}e(\tau)d\tau)是误差信号的累积值,即积分项;
-(\frac{de(t)}{dt}\)是误差信号的变化率,即微分项。

这个公式描述了PID控制器如何根据当前的误差以及过去的误差来计算出控制信号。

比例项反映了当前误差的大小,积分项反映了过去误差的累积,微分项反映了误差变化的趋势。

通过调整这三个参数,可以实现对系统的精确和快速控制。

智能车PID的算法推荐

智能车PID的算法推荐

PID( Proportional Integral Derivative )控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性(稳定性)好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。

模拟PID控制系统原理框图PID是一种线性控制器,它根据给定值r in(k)与实际输出值y out(k)的差值e(t)构成控制方案,利用运放实现模拟PID的一个例子:式中:以上为典型模拟PID应用例子。

关于各调节器的作用说明:♥比例调节器P1、起调节作用与输出量和给定量的差成正比,有差就有调节作用,所以他的调节结果总是有差存在,这种调节不可消除差,所以叫这种调节为有静差调节;2、但这种调节作用快,能很快减小误差,是最常用的一种调节器!3、积分I调节慢,所以PI是最常用的一种搭配!♥积分调节器I1、是给定量与输出量的差对时间的积分,在电路里就是用给定量与输出量的差给电容充电,只要时间足够长,电容器的电压总会到达给定量,使输出量与给定量的差为零;2、积分调节器是一种无静差调节器,意思是说可调节到给定值,做到精确、准确输出;♥微分控制调节器D1、,这种控制总是以输出量与给定量的差的变化率成正比,差变化越剧烈,调节作用越大,差变化越平稳,调节作用越弱;2、这种微分调节作用,使得输出量平稳而很少波动;3、这种微分调节作用,对输出量的变化、波动产生强烈的阻尼、抑制的作用,就像摩擦力的作用;数字式PID应用:增量式PID的算式为:如果换换成智能车里的方向控制就变为:Pwm_offset=PWMMiddle+PID_P*(error-last_error)+PID_I*(error)+PID_D*(error+pre_error-2*la st_error);其中:error=middle-offset,注意这个公式里的offset应该有正负之分,左右偏移的值互为相反。

这样自然就确定了最后的方向。

PID算法深度技术帖-写给参加飞思卡尔智能车大赛的朋友

PID算法深度技术帖-写给参加飞思卡尔智能车大赛的朋友

PID算法深度技术帖*写给参加飞思卡尔智能车大赛的朋友作者:王玉鹏(郑州轻工业学院)最近很多朋友问我关于PID的算法。

这里我就简单整理了下:PID控制算法是最经典的自动控制算法。

所有《自动控制原理》教材均有大幅篇章介绍。

从数学模型到传递函数,公式推导不厌其烦。

很多‘童鞋’似懂非懂。

下面我就从程序的角度来讲:下面是PID控制系统的原理图PID算法具体分两种:一种是位置式的,一种是增量式的。

在大多数的情况下,执行机构本身没有状态记忆功能,每时每刻都要靠控制信号驱动,如果失去控制信号,执行机构即失去功能。

在这种场合必须采用位置式PID控制算法。

也有一些执行机构具有记忆功能,即使失去驱动信号仍然可以维持原来的状态不变。

例如在用步进电机作为执行机构的自动化控制系统中(数控机床最为典型)下面主要针对位置式PID来讲,以加温设备为例,软件采用uc/os-ii嵌入式操作系统环境//采用位置式PID控制算法的任务函数float Set;//设定值float KP;//比例常数float KI;//积分常数float KD;//微分常数float LE=0;//上次误差float SE;//累计误差void TaskSampleCtrl(void *pdata)//采样控制函数{float now,E,DE,out;//定义临时变量while(1){now=SampleAdc();//传感器采样一次E=Set-now; //计算当前误差SE+=E; //计算当前误差的积分值DE=E-LE; //计算当前误差的微分值out=KP*E //计算比例项+KI*SE //计算积分项+KD*DE; //计算微分项CtrlOut(out); //控制执行机构LE=E; //保存误差值以进行下次计算OSTimeDly(25); //心跳20ms 延时0.5s(采样周期)}}PID参数调节:1.如果被控制对象的温度很快达到设定值,并超过设定值很多才回调(此种称为超调),则应该减小KP和KI,降低控制强度;加大KD,抑止超调。

PID算法

PID算法

1.Arduino 智能小车寻迹原理寻迹采用的主要原理就是红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点Arduino 单片机就是以是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。

红外探测器探测距离有限,一般最大不应超过15cm。

对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头2.Arduino 寻迹模块简介3.Arduino pwm 调速4.PID算法5.PID 算法与寻迹6.代码:.#include "pid.h"....#ifdef ARDUINO_DEBUG..int debugLeftSpeed;..int debugRightSpeed;..uint8_t debugIrs = 0;..#endif....const float motorSpeed = 140; //小车输出速度..const int IR_PIN[] = {A0, A1, A2, A3, A4}; //寻迹板引脚定义..const int IN_A1 = 7; //..const int IN_A2 = 6; //..const int IN_B1 = 5; //..const int IN_B2 = 4; //..const int _pwmLeftPin = 10;//左边 pwm 引脚..const int _pwmRightPin = 11;//右边 pwm 引脚..pid_t pid;..float pidValue = 0; //pid 值..bool turnFlag = false;....void setup(void)..{..int i;....//设置引脚功能..pinMode(IN_A1, OUTPUT); ..pinMode(IN_A2, OUTPUT); ..pinMode(IN_B1, OUTPUT); ..pinMode(IN_B2, OUTPUT); ....//设置寻迹板引脚为 INPUT..for (i = 0; i < 5; i++) { .pinMode(IR_PIN[i], INPUT);..}......pid.sampleTime = SAMPLE_TIME;//初始化采样时间..pid.Kp = KP_VALUE;..pid.Ki = KI_VALUE;..pid.Kd = KD_VALUE;..pid.error = 0;..pid.previous_error = 0;....Serial.begin(115200);//设置波特率..delay(5000);//延时 5s....analogWrite(_pwmLeftPin, motorSpeed );.analogWrite(_pwmRightPin, motorSpeed ); ....goForward();//小车向前行驶....return;..}........../**..获取寻迹板红外数据..*/..uint8_t getIrData(void)..{..int i, j;..uint8_t level;..uint8_t temp;..uint8_t irs[9] = {0};....//获取10组数据..for (j = 0; j < 9; j ++) {....for (i = 0; i < 5; i++) {..level = digitalRead(IR_PIN[i]); ..if (level) {..bitSet(irs[j], i);//设置对应位为1 ..} else {..bitClear(irs[j], i);//设置对应为0 .}..}..}....//对所有的数据进行排序..for (i = 0; i < 9 - 1; i ++) {..for (j = 0; j < 9 - i - 1; j ++) { ..if (irs[j] > irs[j + 1]) {..temp = irs[j];..irs[j] = irs[j + 1];..irs[j + 1] = temp;..}..}..}...#ifdef ARDUINO_DEBUG..debugIrs = irs[4];..#endif....//返回中间值..return irs[4];..}..../**..计算误差值..@param irs :获取的寻迹传感器的值..*/..int calcErrorByIrsValue(uint8_t irs) ..{..int curError = pid.error;....switch (irs) {..case B11110: curError = -8; break; ....case B10000:..case B11000: curError = -7; break; ....case B11100: curError = -6; break; ..case B11101: curError = -4; break; ..case B11001: curError = -2; break; ....case B00000:..case B11011: curError = 0; break; ...case B10011: curError = 2; break;..case B10111: curError = 4; break;..case B00111: curError = 6; break;....case B00011:..case B00001: curError = 7; break;....case B01111: curError = 8; break;..case B11111: curError = pid.error > 0 ? 9 : - 9; break; ..}....return curError;..}...../**..排序函数..*/..void _sortData(int *p, int n)..{..int temp;..int i, j;....for (i = 0; i < n - 1; i ++) {..for (j = 0; j < n - i - 1; j ++) { ..if (p[j] > p[j + 1]) {..temp = p[j];..p[j] = p[j + 1];..p[j + 1] = temp;..}..}..}....return;..}....../**..计算误差值..*/..void calcCurrentError(void) ..{..int i;..uint8_t irs;.float sum = 0;..int errorData[10];....//获取 10组数据..for (i = 0; i < 10; i ++) {..irs = getIrData();..errorData[i] = calcErrorByIrsValue(irs); ..}...._sortData(errorData, 10);....for (i = 1; i < 10 - 1; i ++) {..sum += errorData[i];..}...pid.error = sum / 8;....return;..}....void turnRight(void)..{..digitalWrite(IN_A1, LOW); ..digitalWrite(IN_A2, HIGH); ..digitalWrite(IN_B1, HIGH); ..digitalWrite(IN_B2, LOW); ..}....void turnLeft(void)..{..digitalWrite(IN_A1, HIGH); ..digitalWrite(IN_A2, LOW); ..digitalWrite(IN_B1, LOW); ..digitalWrite(IN_B2, HIGH); ..}....void goForward(void)..{..digitalWrite(IN_A1, HIGH); ..digitalWrite(IN_A2, LOW); ..digitalWrite(IN_B1, HIGH); ..digitalWrite(IN_B2, LOW); ..}.../**..小车控制函数..@param pidValue : 计算出来的 pid 值..@param turnFlag : 方向标志..*/..void motorControl(float pidValue, bool turnFlag)..{....int leftMotorSpeed = 0;..int rightMotorSpeed = 0;....//根据 pid 的值调整小车左右电机的速度..leftMotorSpeed = constrain((motorSpeed + pidValue), -255, 255); ..rightMotorSpeed = constrain((motorSpeed - pidValue), -255, 255); ...//当转弯标志被设置时,则需要使用左边与右边的轮子正转与反转来调整,提高调整速度..if (turnFlag) {..//按照较大的 pwm 值进行调整,速度最快,左边速度与右边速度一致..if (abs(leftMotorSpeed) > abs(rightMotorSpeed)) {..leftMotorSpeed = abs(leftMotorSpeed);..rightMotorSpeed = leftMotorSpeed;..} else {..rightMotorSpeed = abs(rightMotorSpeed);..leftMotorSpeed = rightMotorSpeed;..}..} else {..//当速度为正时,则取原值,当速度为负时,则取相反数,保持 pwm 的值为正值..leftMotorSpeed = leftMotorSpeed > 0 ? leftMotorSpeed : -leftMotorSpeed; ..rightMotorSpeed = rightMotorSpeed > 0 ? rightMotorSpeed : -rightMotorSpeed; ..}....analogWrite(_pwmLeftPin, leftMotorSpeed ); ..analogWrite(_pwmRightPin, rightMotorSpeed); ....#ifdef ARDUINO_DEBUG..debugLeftSpeed = leftMotorSpeed ;..debugRightSpeed = rightMotorSpeed;..#endif....return;..}..../***..计算 pid 的值.*/..bool calculatePid(float *pValue)..{..float P = 0;..static float I = 0 ;..float D = 0 ;..static unsigned long lastTime = 0; ..unsigned long now = millis();..int timeChange = now - lastTime; ....//没有到达采样时间..if (timeChange < pid.sampleTime) { ..return false;..}...P = pid.error;//错误值..I = I + pid.error;//积累误差..D = pid.error - pid.previous_error;//计算错误的变化率....*pValue = (pid.Kp * P) + (pid.Ki * I) + (pid.Kd * D) + 1; ..*pValue = constrain(*pValue, -motorSpeed,motorSpeed);....pid.previous_error = pid.error;..lastTime = now;....return true;..}....#if ARDUINO_DEBUG..void print_debug()..{..int i;..String irs2bin = String(debugIrs, 2); ..int len = irs2bin.length();..if (len < 5) {..for (i = 0; i < 5 - len; i++) {..irs2bin = "0" + irs2bin;..}..}....Serial.print("IRS : ");..Serial.print(irs2bin);..Serial.print(" ML:");..Serial.print(debugLeftSpeed);..Serial.print(" MR:");..Serial.print(debugRightSpeed);..Serial.print(" ERROR:");..Serial.print(pid.error, OCT);..Serial.println();..}..#endif..../**..计算运动方向..*/..void calcDirection(void)..{....if (pid.error >= 7 && pid.error <= 9) {..turnLeft();..turnFlag = true;..} else if (pid.error >= -9 && pid.error <= -7) { ..turnRight();..turnFlag = true;..} else {..goForward();..turnFlag = false;..}....return;..}....void loop(void)..{..bool ok;..float pidValue;....//计算错误值..calcCurrentError();..//计算 pid 的值..ok = calculatePid(&pidValue);..if (ok) {..calcDirection();//计算小车运动方向..motorControl(pidValue, turnFlag);//控制电机..}....//delay(500);....#if ARDUINO_DEBUG ..print_debug(); ..delay(1000); ..#endif....return;..}.。

模糊PID控制算法在智能小车中的研究与应用

模糊PID控制算法在智能小车中的研究与应用

模糊PID控制算法在智能小车中的研究与应用一、本文概述随着科技的快速发展和智能化水平的提高,智能小车在各个领域的应用越来越广泛,如无人驾驶、物流运输、环境监测等。

然而,智能小车的运动控制是一个复杂的问题,需要解决路径规划、避障、速度控制等多个方面的问题。

其中,速度控制是智能小车运动控制的核心问题之一。

传统的PID控制算法在速度控制方面有着广泛的应用,但由于其对于系统参数变化的敏感性,使得其在实际应用中往往难以达到理想的控制效果。

因此,本文提出了一种基于模糊PID控制算法的智能小车速度控制方法,旨在提高智能小车的运动控制精度和稳定性。

本文首先对模糊PID控制算法的基本原理和特点进行了介绍,然后详细阐述了模糊PID控制算法在智能小车速度控制中的应用方法。

在此基础上,通过实验验证了模糊PID控制算法在智能小车速度控制中的有效性和优越性。

本文的研究工作不仅为智能小车的运动控制提供了一种新的方法,同时也为模糊PID控制算法在其他领域的应用提供了有益的参考。

接下来,本文将从模糊PID控制算法的基本原理、智能小车的运动控制模型、模糊PID控制算法在智能小车速度控制中的应用方法、实验结果与分析等方面展开详细的阐述。

二、模糊PID控制算法的基本原理模糊PID控制算法是一种结合了模糊逻辑和传统PID控制算法的控制策略。

该算法利用模糊逻辑处理PID控制中的非线性、不确定性和复杂性问题,从而提高了系统的鲁棒性和控制精度。

模糊逻辑是一种基于模糊集合和模糊推理的控制系统设计方法。

在模糊逻辑中,变量不再局限于具体的数值,而是可以在一定的范围内取任意值,这种变量被称为模糊变量。

模糊逻辑通过模糊集合和模糊运算,能够处理不确定性、非线性和不精确性等问题,使系统更加适应复杂环境。

PID控制算法是一种经典的闭环控制算法,由比例(P)、积分(I)和微分(D)三个部分组成。

PID控制器通过比较实际输出与期望输出的偏差,根据偏差的大小和方向,调整控制量以实现系统的稳定控制。

PID算法原理及调整规律

PID算法原理及调整规律

PID算法原理及调整规律一、PID算法简介在智能车竞赛中,要想让智能车根据赛道的不断变化灵活的行进,PID算法的采用很有意义。

首先必须明确PID算法是基于反馈的。

一般情况下,这个反馈就是速度传感器返回给单片机当前电机的转速。

简单的说,就是用这个反馈跟预设值进行比较,如果转速偏大,就减小电机两端的电压;相反,则增加电机两端的电压。

顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微分(Differential)。

在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。

要想搞懂PID算法的原理,首先必须先明白P,I,D各自的含义及控制规律:比例P:比例项部分其实就是对预设值和反馈值差值的发大倍数。

举个例子,假如原来电机两端的电压为U0,比例P为0.2,输入值是800,而反馈值是1000,那么输出到电机两端的电压应变为U0+0.2*(800-1000)。

从而达到了调节速度的目的。

显然比例P越大时,电机转速回归到输入值的速度将更快,及调节灵敏度就越高。

从而,加大P值,可以减少从非稳态到稳态的时间。

但是同时也可能造成电机转速在预设值附近振荡的情形,所以又引入积分I解决此问题。

积分I:顾名思义,积分项部分其实就是对预设值和反馈值之间的差值在时间上进行累加。

当差值不是很大时,为了不引起振荡。

可以先让电机按原转速继续运行。

当时要将这个差值用积分项累加。

当这个和累加到一定值时,再一次性进行处理。

从而避免了振荡现象的发生。

可见,积分项的调节存在明显的滞后。

而且I值越大,滞后效果越明显。

微分D:微分项部分其实就是求电机转速的变化率。

也就是前后两次差值的差而已。

也就是说,微分项是根据差值变化的速率,提前给出一个相应的调节动作。

可见微分项的调节是超前的。

并且D值越大,超前作用越明显。

可以在一定程度上缓冲振荡。

比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

智能车PID的算法推荐PID( Proportional Integral Derivative )控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性(稳定性)好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。

模拟PID控制系统原理框图PID是一种线性控制器,它根据给定值r in(k)与实际输出值y out(k)的差值e(t)构成控制方案,利用运放实现模拟PID的一个例子:式中:以上为典型模拟PID应用例子。

关于各调节器的作用说明:♥比例调节器P1、起调节作用与输出量和给定量的差成正比,有差就有调节作用,所以他的调节结果总是有差存在,这种调节不可消除差,所以叫这种调节为有静差调节;2、但这种调节作用快,能很快减小误差,是最常用的一种调节器!3、积分I调节慢,所以PI是最常用的一种搭配!♥积分调节器I1、是给定量与输出量的差对时间的积分,在电路里就是用给定量与输出量的差给电容充电,只要时间足够长,电容器的电压总会到达给定量,使输出量与给定量的差为零;2、积分调节器是一种无静差调节器,意思是说可调节到给定值,做到精确、准确输出;♥微分控制调节器D1、,这种控制总是以输出量与给定量的差的变化率成正比,差变化越剧烈,调节作用越大,差变化越平稳,调节作用越弱;2、这种微分调节作用,使得输出量平稳而很少波动;3、这种微分调节作用,对输出量的变化、波动产生强烈的阻尼、抑制的作用,就像摩擦力的作用;数字式PID应用:增量式PID的算式为:如果换换成智能车里的方向控制就变为:Pwm_offset=PWMMiddle+PID_P*(error-last_error)+P ID_I*(error)+PID_D*(error+pre_error-2*last_e rror);其中:error=middle-offset,注意这个公式里的offset应该有正负之分,左右偏移的值互为相反。

这样自然就确定了最后的方向。

PWMMiddle为舵机正向时的值。

转换成智能车里的速度控制信息就变为:pwmtemp=PWMDTY23+PID_P*(error-last_err or)+PID_I*(error)+PID_D*(error+pre_error-2* last_error);其中error=speed_v(期望速度)-infrared_value7(即时速度);PWMDTY23是PWM中的静态参数。

即速度等于零(或者是等于某个安全速度)的参数。

由上述代码中,speed_v表示标准速度(期望速度),infrared_value7表示经编码器计算出的即时速度值,通过计算它们的差值error,再利用增量PID控制算法计算出pwmtemp,再对pwmtemp进行处理,最后PID程序处理的结果是给出一个PWM信号,而这个信号就是驱动电机的,当error大,即标准速度和即时速度相差的比较多时,pwmtemp的绝对值相对比较大,则给电机的PWM信号相对较大,这样电机转速相对较快;反之,电机转速则相对较慢。

由此可以看出,PID算法主要的功能是,在闭环系统中,利用即时速度的反馈,使得即时速度逼近标准速度的时间尽量变短,这样小车就可以根据路径识别得出的速度标准值,及时调整自己的速度,以适应各种路况。

例如,小车正在直道上行进,而且直道的时速应该是各种赛道中最快的,当系统的路径识别算法察觉到前方出现弧度大的弯道后,系统会根据事先调试的结果,给出大弧度弯道的速度标准值,然后PID算法根据速度标准值speed_v和即时速度反馈值infrared_value7对电机的输入信号PWM进行及时调整,反映到实际中,就是小车及时减速并顺利通过弯道。

在增量式PID处理的过程中,有一个步骤需要注意,即在算完△u(k)后,需要把它赋值给电机控制对应的PWM通道信号,这时要判断该△u(k)的值,如果它小于0,则把PWM信号赋值为0,如果它大于PWM信号的最大值,即大于PWM整个周期所对应的数值时,要把PWM 信号赋值为该最大值。

在上述控制里面没有关于轨迹偏离信息,实际上就处理不了有关由于轨道偏移而导致的速度变化问题。

那么,怎么样才能将加进来。

这里就要考虑speed_v这个标准速度(期望速度),即:speed_v= speed-offset(i)*x这样,我们的期望值就成了一个随着偏移量变化而变化的参数。

余下的问题就是对有关参数进行整定了。

一定要测试加实际运行来调整。

对于速度问题可以考虑两个要点:方向制动和正向处理(不加反向制动),在返向制动里要考虑计算出来的值为负数。

1.2.反向制动算法要使赛车在较短的时间完成比赛,速度自然越高越好,显然速度太高弯道是过不去的,如果以弯道的极限速度匀速跑,又浪费了直道的时间。

所以最佳的策略是直道以较高的速度跑,到弯道时再尽快将速度降下来。

在入弯减速时如果只靠赛道的摩擦阻力效果显然是不够理想的。

为此我们引入反向制动算法。

由于MC33886芯片集成的H桥驱动电路本身就具有反向制动功能,所以不需外加硬件电路。

反向制动流程图如图:在制动时,电机反向电动势对整个系统电路造成的冲击,从而引起单片机工作不稳定,电流过大导致电机过热、电机频繁换向导致电刷打火剧烈导致电机寿命缩短等一系列问题都是需要考虑的。

1.3.速度控制策略1、为了达到好的速度控制效果,对速度进行闭环控制是必须的。

这里所说的速度控制策略是指设定速度的确定方法——设定速度主要由道路与直道的偏差来决定,道路越接近直道,设定速度越高,反之越低。

车模行驶中的最低速度是这样确定的:令车模以较低的速度匀速行使,在保证无犯规行为出现的前提下,逐渐提高匀速行使的速度,直到车模出现犯规行为,此速度再减去一个安全量,即为所需的最低速度。

简单的说,变速行使的最低速度等于匀速行使的最高速度。

(一般发生在弯道最急的地方)车模行驶中的最高速度是这样确定的:在确定最低速度以后,加入变速策略,不断提高最高速度的设定值,直到模型车出现犯规行为,此速度再减去一个安全量,即为所需的最高速度。

(一般发生在直道最长的地方)车模行驶过程中难免出现“失去道路”的情况,对此需要采取一定的安全策略,防止赛车“盲跑”而导致犯规。

2、针对本文所研究的智能车来说,车体速度是大惯性的被控对象。

算法输出的控制量只能对电机输出力进行控制。

而有一定负载时电机的输出力无论对车轮的转速还是车体的形式速度都是不成正比的,车在刚开始启动的时候速度是零,而电机的输出可能很大;车在匀速行驶的时候速度很快,而电机的输出可能并不是很大。

而且电池电量、车体重量都会对车速造成影响。

因此只有用闭环才能对车速进行良好的控制。

在车轮对地面不打滑的情况下车体的速度和后轮的转动速度是成正比的。

因此我们可以直接用光电码盘对后轮的转速进行控制。

对于这样一个大惯性系统,我们选用PID 和棒棒相结合的办法进行速度控制。

回路的设定值由经验值确定。

考虑到速度控制通道的时间滞后比较小,因此采用PID控制方案,并在进行加减速控制时,引入了“棒棒控制”。

U(k+1)=U(K)+P1*e(k)+P2*(e(k)–e(k-1))+P 3*((e(k)–e(k-1)–(e(k-1)–e(k-2)));公式4 3 PID的公式其中第一项为积分项;第二项为比例项;第三项为微分项。

考虑到被控对象(车体速度)本身是一个大的积分环节,公式中可以将第一项省略,即采用PD控制。

上式分析:(e(k)–e(k-1)–(e(k-1)–e(k-2))= (e(k)–2e(k-1)+e(k-2))棒棒控制体现在哪?E为误差。

同时设定误差门限,在误差比较大的时候采用大输出控制电机,将误差在最短时间内减小到所要求的范围,这就是棒棒控制的思想。

电机控制策略,其实就是对模型车速度的控制策略,它是继路径识别之后非常重要的策略,直接关系到整个模型车比赛的性能。

速度控制得当,小车才能以最好的状态,在最短的时间完成比赛路程。

1.4.速度PID算法在计算机控制系统中,数字PID控制算法通常又分为位置式PID和增量式PID。

本次设计中,我们采用增量式PID。

增量型算法与位置型算法相比,具有以下优点:增量型算法不需要做累加,增量的确定仅与最近几次偏差采样值有关,计算精度对控制量的计算影响较小,而位置型算法要用到过去偏差的累加值,容易产生大的累加误差;增量型算法得出的是控制量的增量,而位置型算法的输出是控制量的全量输出,误动作影响大;采用增量型算法,易于实现手动到自动的无冲击切换。

在实际应用中,采样的反馈值y(k)即为脉冲累加器中的PACN32中的脉冲数,预设门限值A在参数整定时根据实际情况调节,输出u(k ) 并不能直接用来控制电机,需要将其转换为控制PWM占空比,然后用增大或减小PWM占空比的方法来实现对电机的加减速的控制。

换句话说,在求偏差量时,实际上用的是每20ms电机转过的齿轮数和实际期望电机转过的齿轮数,通过二者的差值,再乘以相应的系数,即KP、KI、KD的协调控制,计算出相应的PWM占空比,实际上用的是PWMDTY的值。

本设计中综合考虑各种因素,最后选用的采样周期为20ms,即每20ms对电机进行一次PID 调节。

由于在程序中,对图像的采集使用的是PH口的中断程序,因此,PID采样周期的选择实际上是受限制与图像采集,因为每行的扫描周期为64μs,有效扫描时间为52μs,采用的是隔行扫描的方式,即每隔6行采集一行图像的信息,如果在每行之间加入PID调节的话,那么处理PID子程序的时间必须控制在64*5=320μs之内,另外图像采集只是采集了奇场中的行数,在偶场中没有采集,因此PID子程序的执行是不均匀的,并没有达到预期的效果,同时还可能会影响到视频采集,因此,经过分析,最终决定将PID的采样周期定为20ms,即当进行一次场采集进行一次PID调节。

而且经过最终的检验,这样能够满足对速度控制的需要。

电机调速本作品采用增量式的PI控制。

增量式PI算法:pwm=Kp*(errork0-errork1)/100+Ki*error k0/100+pwm;1.6.舵机控制1.6.1. 舵机转角的决策由于CCD图像传感器的应用,大大提高了车的前瞻性。

经测量,本系统预测距离可达1米以上。

但是,考虑到各部件延时严重且具有很大不确定性,所以预测距离越远,控制算法就会越复杂。

综合各种因素考虑,我们最终将预测距离定在80~100cm。

黑线中心位置轨迹中包含着两方面的信息,一方面是反映前方道路趋势的信息,另一方面是反映车体与轨道偏离程度的信息。

经过反复试验,我们发现,前者可以通过计算黑线的斜率来很好的描述。

而后者,恰恰就是屏幕最下端黑线的位置。

最后用这二者的线性组合得到舵机转角。

相关文档
最新文档