自动控制原理课程设计双轮自平衡智能车行走伺服控制算法.docx
《自动控制原理课程设计双轮自平衡智能车行走伺服控制算法.docx》由会员分享,可在线阅读,更多相关《自动控制原理课程设计双轮自平衡智能车行走伺服控制算法.docx(22页珍藏版)》请在冰豆网上搜索。
自动控制原理课程设计双轮自平衡智能车行走伺服控制算法
自动控制原理课程设计
学院:
班级:
学号:
指导教师:
姓名:
目录
一.引言3
二.系统模型的建立3
三.系统控制的优化6
3.1PID调节参数的优化7
3.2积分分离PID的应用10
四,结语13
双轮自平衡智能车行走伺服控制算法
摘要:
全国第八届“飞思卡尔”智能汽车大赛已经结束。
光电组使用大赛提供的D车模,双轮站立前进,相对于以前的四轮车,双轮车的控制复杂度大大增加。
行走过程中会遇到各种干扰,经过多次的实验,已经找到了一套能够控制双轮车的方法。
双轮机器人已经广泛用于城市作战,排爆,反恐,消防以及空间消防等领域。
实验使用单片机控制双电机的转速,达到了预期的效果。
关键词:
自平衡;智能;控制算法
MotionServoControlAlgorithmforDualWheelIntelligentCar
Abstract:
The8thfreescalecupnationalIntelligentCarcompetitionofhasbeenend.TheledteammustusedDcarwhichhasonly2tires.ItismoredifficulttocontrolprefertocontrolAcarwhichhas4tires.Thereismuchinterferenceonthetrack.Atwo-wheeledrobotshavebeenwidelyusedinurbanwarfare,eod,counter-terrorism,firecontrolandspacefirecontrolandotherfields。
Wehassearchedagoodwaystocontrolit.WeusedMCUtocontrolthespeedofmotorsandgetourgates.
KeyWords:
balancebyself;intelligent;controlalgorithm
一.引言
双轮自平衡车是智能汽车中一个重要的组成部分。
由于其是两轮站立,在很多场合有比四轮车更灵活,更方便控制的特点。
基于双轮车的机器人已经用于在城市作战,排爆,反恐,消防,空间探测等领域。
双轮自平衡车的控制过程与倒立摆相似。
本次研究主要是对双轮车直立的研究。
由于车在前进过程中还可能遇到弯道和路障,所以本文还对整个系统的稳定性做了比较深入的研究。
在理论证明正确的前提下,再次进行仿真验证,仿真验证的结果与实验结果相符合。
二.系统模型的建立
智能汽车竞赛使用的是D车模。
D车模是双电机,双轮的车模。
单电机控制双轮时可以满足车身保持平衡和前进的要求,而之所以使用双电机是为了前进过程中转弯的需要。
本文只讨论跟直立和干扰有关的内容,鉴于此,本文余下内容默认是单电机控制的车模。
自平衡车在没有电机控制的情况下属于不稳定系统,在极小的干扰下,就会偏离平衡位置而失去平衡。
因此,控制系统必须使用反馈控制。
图1是站立在赛道上的双轮车模。
图1站立在赛道上的自平衡双轮车
自平衡双轮车在只研究直立的情况下与倒立摆相似,因此这里将借助倒立摆的研究方式研究双轮车的平衡控制。
控制车模平衡的主观经验。
一般的人通过简单练习就可以让一个直木棒在手指尖上保持直立。
这需要两个条件:
一个是托着木棒的手可以移动;另一个是眼睛可以观察到木棒的倾斜角度和倾斜趋势(角速度)。
通过手掌移动抵消木棒的倾斜角和趋势,从而保持直立。
这两个条件缺一不可,实际上就是控制中的负反馈控制,见图2。
图2在手上不倒的木棍
世界上没有一个天才杂技演员可以蒙着双眼使得木棒在自己指尖上直立,因为没了双眼就没了负反馈的环节。
经过简单的分析可以得到图3所示的控制结构图。
图3不倒的木棍的控制结构图
同样,双轮直立车的控制也是通过负反馈来实现的,与上面保持木棍直立则比较简单。
因为车模有2个轮子着地,车体只会在轮子滚动的防线上发生倾斜。
控制轮子转动,抵消在一个维度上倾斜的趋势便可以保持车体的平衡了。
如图4,5,6所示。
图4车体平衡,车轮静止
图5车体后倾,车轮向后加速
图6车体前倾,车体向前加速
将双轮车简化成高度为L,质量为m的简单倒立摆,它可以放置在左右移动的车轮上。
与空气中的单摆类似,车身偏离平衡位置后要想能迅速的回到平衡位置,车身应该受到与位移方向相反的的回复力。
在平衡点附近,角度θ很小,即有sinθ≈θ。
假设车身偏离平衡角度后,将受到电机产生的与角度成比例的力:
f=mk1θ
(1)
由于重力原因,车身偏离平衡位置后受到的回复力为:
F=mgθ–mk1θ
(2)
从上式中可以看出回复力要想与位移相反,必须有k1>g。
假设外力干扰引起车模产生角速度x(t)。
沿着垂直于车模底盘的方向进行受力分析,可以得到车模倾角与车轮加速度a(t)以及外力干扰加速度x(t)之间的的运动方程。
受力分析如图7所示。
图7车模受力分析
(4)
车模静止不向前运动时,a(t)=0,即:
(5)
对应车模静止时,系统输入输出的传递函数为:
(6)
此时系统具有2个极
。
一个极点位于s平面的右半平面,车模不稳定。
在此处假设
,k1=20用matlab仿真此系统:
Matlab代码如下:
%程序目的:
在没有微分量的情况下仿
%真系统的阶跃响应
%author:
程顺均
%时间:
2013.8.28
sys=tf([1],[10100]);
t=0:
0.01:
3;
figure
(1)
step(sys,t);gridon
仿真截图如图8所示:
图8比例控制系统的阶跃响应
从图来看,与分析结果一样,系统的阶跃响应为等幅振荡,不稳定。
原因是在阶跃响应中没有阻尼,也就是说实际中的车不会倒向一边,而是在平衡位置附近来回震荡。
这显然不是我们需要得到的效果。
因此在系统中我们加入为微分量,也就是阻尼。
在实际中变现为阻碍车模转动的力,类似于摩擦阻力,大小方向与车身角速度有关。
即阻力
(7)
经过拉式变换,得到带阻尼的系统的控制结构图,如图9所示:
图9加入比例微分反馈控制的系统
系统传递函数为:
(8)
此时系统的极点为:
(9)
根据自动控制原理稳定性分析知识知道,只有系统的2个极点都在s平面的左半平面时系统才是稳定的。
因此系统必须满足
。
假设k2=0.5,k1=20。
利用matlab仿真。
仿真代码如下:
%程序目的:
在比例微分控制的情况下仿
%真系统的阶跃响应
%author:
程顺均
%时间:
2013.8.28
sys=tf([1],[1,5,100]);
t=0:
0.01:
3;
figure
(1)
step(sys,t);gridon;
title('比例微分控制时的阶跃响应');
阶跃响应曲线如下:
图10比例微分控制的阶跃响应曲线
从响应的曲线来看比例—微分控制曲线能够比较收敛下来。
在宏观看来,就是车身能够很快到我们需要的角度,而不是一直在设定角度的前后震荡。
研究到此也智能算是解决了直立控制的问题。
在实际中往往有很多干扰因素,例如飞思卡尔竞赛中赛道上就设有比赛道高的路障。
如果稳定性较差的直立车在通过路障的时候,会直接倒下。
假设干扰信号为D(s),D(s)与
的关系为:
(10)
这里我们把路障一类的干扰看成是脉冲干扰,D(s)=1。
仿真参数不变,对干扰进行一次仿真。
仿真代码如下:
%程序目的:
仅在干扰下的输出响应
%author:
程顺均
%时间:
2013.8.28
sys=tf([0.10-10],[0.10.210]);
t=0:
0.2:
10;
figure
(1);
impulse(sys,t);
girdon;
仿真截图如图11所示:
图11系统对脉冲干扰的响应
从仿真的图来看,脉冲干扰会让本来已经稳定的系统来回的震荡,在多次震荡后才回到比较稳定的状态。
因此比例-微分控制的方式能够满足我们的要求。
对于一个系统来讲,能够稳定下来并不是我们追求的最终目标。
接下来将详细研究系统的优化和稳定性。
三.系统控制的优化
飞思卡尔智能汽车竞赛中评比成绩是以在赛道上跑一圈的时间为唯一依据的。
这要求车在保持稳定的前提下以最大的速度前进。
系统的响应时间,抗干扰能力都是需要反复调整的。
快的调整时间,小的超调量,高的稳定性都是我们期望的结果。
3.1PID调节参数的优化
一般的系统我们都需要短的调节时间,小的超调量。
往往我们是不能两方面做到极限,但是通过PID参数的调节,我们可以得到一个满意的调节过程。
为了研究每个参数的意义,先进行单参数的研究。
P一般是作为比例项,决定了系统的部分响应速度。
在这里我们使用一个仿真代码完成这个仿真。
仿真代码见附件1:
Kp的研究
通过改变系统的Kp,可以得到一系列的仿真图。
这里选取4组做研究。
分别为100,400,1000,2000。
仿真图如图12,13,14,15所示。
图12Kp=100时的阶跃响应
图13Kp=400时的阶跃响应
图14Kp=1000时的阶跃响应
图15Kp=2000时的阶跃响应
为了方便对比出他们的不同,这里将他们的响应特征列表出来,如表1所示。
表1Kp对系统性能的影响
Kp
100
400
1000
2000
调节时间
1.5
0.835
1.185
1.37
超调量
5.8%
未超调
11.8%
26.4%
从表的的数据和调整图像来看,Kp的值很小的时候,系统的第一次上升达不到我们需要的值,需要积分项才能弥补。
这不是我们需要的结果。
而当Kp值很大的时候,上升时间缩短,超调量也会增大。
因此Kp值得选择主要影响了系统的响应能力。
Ki的研究
PID中的I是积分项,主要是消除稳态误差。
下面通过4组不同的参数的测试研究其作用。
Ki的值为100,400,1000,2000的时候的值仿真图如图15,16,17,18所示。
图16Ki=100的稳态误差
图17Ki=400的稳态误差
图18Ki=1000的稳态误差
图19Ki=2000的稳态误差
从图像可以看出来,其上升速度和超调量并无太大的差异。
他们的差异主要体现在稳态误差上了。
将四组仿真的稳态误差在1.5S时取值列表得表2。
表2Ki对系统性能的影响
Ki
100
400
1000
3000
稳态误差
5.70%
4.31%
2.44%
0.03%
从表的数据很明显的可以看出,增大Ki值可以减小稳态误差。
但是由于系统会受到一些小的干扰,所以Ki的值也并不是越大越好!
Kd的研究
在PID调节中微分项起预见作用,在系统靠近预期值时可以减小控制输入量,进而减小超调量,增强系统的性能。
下面同样通过4组数据研究Kd值对系统的影响。
Ki分别为10,20,40,60时的仿真图如图20,21,22,23所示。
图20Kd=10的稳态误差
图21Kd=20的稳态误差
图22Kd=40的稳态误差
图23Kd=60的稳态误差
从图上我们已经可以清晰地看出,Kd值的增大可以减小超调量,减少进入稳态前的振荡次数。
下表列出了超调量和进入稳态前的振荡次数表,如表3所示。
Kd
10
20
40
60
超调量
61.6%
43.8%
25.2%
15.9%
进入稳态前的穿越次数
11
5
2
2
从表的数据可以看出,kd的值过小的时候,系统的超调量很大,振荡加剧。
Kd的值越大,系统的超调量越小。
但是由于微分量的对高频噪声具有放大作用。
所以,Kp的值也不是越大越好!
优化的结果
前面研究了每个参数对系统的影响,下面进行一个综合仿真实验,从各方面综合考虑得到一个好的参数组合。
经过反复实验,得到一组参数Kp=1500,Ki=4000.Kd=100。
仿真截图如图24所示。
图24经过优化的系统的阶跃响应
从图24可以看出,系统的响应速度很快,超调量小,稳态误差基本为0。
3.2积分分离PID的应用
在普通的PID控制中引入积分环节的目的,主要是为了消除静态误差,提高控制精度。
但是在过程的启动,结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,致使控制量超时执行机构可能允许的最大动作范围内对应的极限控制量,引起系统较大的超调,甚至引起系统较大的震荡,这在实际控制中是不允许的。
在车模实际运行过程中,单片机控制系统需要不停地的改变输入量,以满足对循迹和调速的要求。
在车模启动和遇到障碍时,积分量都会饱和,这给车模的控制带来了麻烦。
为此,将要研究优化后的PID调节器。
为了防止积分量对系统控制的影响,有积分分离PID调节,抗积分饱和PID调节等。
积分分离PID调节的基本思路是:
当被控量与设定量值偏差较大时,取消积分作用,以避免由于积分作用使使系统稳定性降低,超调量增大;当被控量与设定量接近设定值时,引入积分控制,以便消除静态误差,提供控制精度。
其具体实现步骤如下:
(1)根据实际情况,认为设定阈值ε;
(2)当|error(k)>ε|时,采用PD控制,可避免产生过大的超调,又使系统有较快的响应;
(3)当|error(k)<ε|时,采用PID调节控制,以保证系统的控制精度。
即积分分离的控制算法可表示为
(11)
式中,T为采样时间,β为积分项的开关系数。
β=
(12)
为了清晰的对比出普通PID调节和积分分离PID调节的不同,下面用m语言进行仿真,仿真代码见附件1。
为了得到两者之间的区别,在程序加了一个变量M,这个变量M为0的时候使用积分分离,变量M为1的时候使用积分分离。
在这里,为了得到好的效果,当误差大于或等于6的时候取消积分项,即beta=0;只有当误差值小于1的时候才使用完全的积分项,即beta=1;
积分分离法主要在有干扰的时候起作用,在无干扰的时候,作用并不明显。
为此,在程序里添加了一个干扰项:
ifk<120&k>100
yd(k)=200;%输出期望值
else
yd(k)=40;
end
此干扰项是一个脉冲形式的干扰,在时间运行到100到120的时候,期望输出值突然变得很大yd(k)。
这个干扰是为了模仿一些路障而设置的。
在小车突然撞到一个路障上时小车的倾角发生明显的变化。
由于电机等驱动都有极限,所以为了保护器件,我们在控制程序里面一般会加上保护。
为了接近真实的仿真,在这里我们也加入了保护程序,也就是限制控制输入。
限制保护程序如下:
ifu(k)>=20000
u(k)=20000;
end
ifu(k)<=-20000
u(k)=-20000;
如果使用普通PID,误差在这个时间段内累积很明显,在干扰结束后,误差过很久才能消失。
在真是的系统中,可能系统早已崩溃。
仿真如图12所示。
图12普通PID系统对干扰的响应
从仿真图中可以看出,系统在遇到干扰时响应很迅速,在干扰结束后,需要很长的过渡时间才能过渡。
在普通PID的调节过程中,遇到干扰时,误差项会累积起来,影响系统归正,系统需要花大量的时间来进行调整。
但是长的调整时间会导致系统直接崩溃。
例如,直立车在长时间的电机猛转的情况下,双轮车的速度很快,不能直立。
从这个实验我们看出,普通PID应对干扰的能力很弱。
为此我们将进行积分分离PID的研究。
在上面的仿真程序中,只需要将M改为1,即可使用积分分离PID,仿真截图如图13所示。
图13积分分离PID对干扰的响应
与图12进行对比,可以得到表1。
表1普通PID与积分分离PID抗干扰能力的对比
普通PID
积分分离
干扰后回归原位时间(S)
1.0
0.25
响应的峰值
113.6
114.1
在响应峰值上,两者并无明显差异,这是因为程序中添加保护程序,限制控制输入。
因此2个系统的峰值输出相差不大。
但是从原理来讲,由于普通PID积累了比较大的误差,所以如果不添加保护,普通PID的响应更迅速。
干扰后回归原位的时间上,两者相差很大,这说明积分分离PID在抗干扰的能力上强于普通PID。
在应用与实际系统中的效果也很好,不至于使系统崩溃。
四,结语
双轮自平衡智能车的控制属于典型的自动控制系统。
本文研究了双轮自平衡机器人的系统模型,PID参数的优化以及使用积分分离PID用来抵抗干扰。
总体说来,得到了一个很好的控制方式。
经过实验室的实践,得到了很好的实际效果。
车模能在赛道上快速的前进,能越过障碍,能上下桥。
双轮智能车的控制可以为双轮机器人打下基础。
参考文献
[1]孙亮,双轮自平衡机器人行走伺服控制算法[J],控制工程,2009,16(3):
1。
[2]胡寿松,自动控制原理简明教程(第二版)[M],北京:
科学出版社,2008.2。
[3]刘金琨,先进PID控制matlab仿真(第三版)[M],北京:
电子工业出版社,2011,.3。
[4]飞思卡尔竞赛秘书处,电磁组直立行车参考设计方案[J],2012,3。
附件1:
PID参数研究m程序:
%程序目的:
研究PID参数的作用
%author:
程顺均
%时间:
2013.8.31
%积分分离式PID仿真
clearall;
clearall;
ts=0.005;%控制周期为5ms
sys=tf([1],[15100]);%建立系统
dsys=c2d(sys,ts,'z');
%添加'v'可以让输出的值由元胞数组改为数组直接输出
[num,den]=tfdata(dsys,'v');
u1=0;u2=0;%控制器的输出
y1=0;y2=0;%实际的输出值
error1=0;%上次上次误差
ei=0;%误差积累
Kp=100;
Ki=1500;
Kd=50;
fork=1:
1:
500
time(k)=k*ts;
yd(k)=1;
y(k)=-den
(2)*y1-den(3)*y2+num
(2)*u1+num(3)*u2;
error(k)=yd(k)-y(k);%变化率的计算
ei=ei+error(k)*ts;%误差累积计算
u(k)=Kp*error(k)+Ki*ei+Kd*(error(k)-error1)/ts;%PID控制
ifu(k)>=20000
u(k)=20000;
end
ifu(k)<=-20000
u(k)=-20000;
end
u2=u1;u1=u(k);%记录上次的值
y2=y1;y1=y(k);
error1=error(k);
end
figure
(1);
plot(time,yd,'r',time,y,'b');
gridon;
legend('理想输出','位置跟踪');
附件2:
路障干扰仿真m程序:
%程序目的:
对比积分分离PID和普通PID
%的不同
%author:
程顺均
%时间:
2013.8.31
%积分分离式PID仿真
clearall;
clearall;
ts=0.005;%控制周期为5ms
sys=tf([1],[15100]);%建立系统
dsys=c2d(sys,ts,'z');
%添加'v'可以让输出的值由元胞数组改为数组直接输出
[num,den]=tfdata(dsys,'v');
u1=0;u2=0;%控制器的输出
y1=0;y2=0;%实际的输出值
error1=0;%上次上次误差
ei=0;%误差积累
M=1;%选择是否使用积分分离
Kp=1000;
Ki=3000;
Kd=50;
fork=1:
1:
500
time(k)=k*ts;
ifk<120&k>100
yd(k)=200;%输出期望值
else
yd(k)=40;
end
y(k)=-den
(2)*y1-den(3)*y2+num
(2)*u1+num(3)*u2;
error(k)=yd(k)-y(k);%变化率的计算
ei=ei+error(k)*ts;%误差累积计算
if1==M%使用积分分离
ifabs(error(k))>=6
beta=0;%积分分离
elseifabs(error(k))>=2&abs(error(k))<4
beta=0.2;%积分分离
else
beta=1.0;
end
elseif0==M
beta=1.0;
end
u(k)=Kp*error(k)+beta*Ki*ei+Kd*(error(k)-error1)/ts;%PID控制
ifu(k)>=20000
u(k)=20000;
end
ifu(k)<=-20000
u(k)=-20000;
end
u2=u1;u1=u(k);%记录上次的值
y2=y1;y1=y(k);
error1=error(k);
end
figure
(1);
plot(time,yd,'r',time,y,'b');
gridon;
legend('理想输出','位置跟踪');
附件3:
普通PID算法C语言实现代码:
#include"common.h"
#include"pid.h"
intVV_MAX=4400;//电机PID输出上限
intVV_MIN=2000;//电机PID输出下限
PIDsPID;
voidv_PIDInit()
{
sPID.vi_Ref=0;//速度设定值
sPID.vi_FeedBack=0;//速度反馈值
sPID.vi_PreError=0;//前一次,速度误差,,vi_Ref-vi_FeedBack
sPID.vi_PreDerror=0;//前一次,速度误差之差,d_error-PreDerror;
sPID.v_Kp=20;//d_error第一次偏差500
sPID.v_Ki=14;//error最初反馈值600
sPID.v_Kd=10;//dd_error第二次偏差100
sPID.motor_PreU=2400;//电机控制输出值
}
intv_PIDCalc(