声明:应部分读者的要求,本书第9章增加“机器人神经网络自适应控制”一节,图序、公式序顺延。
9.7 机器人神经网络自适应控制机器人学科是一门迅速发展的综合性前沿学科,受到工业界和学术界的高度重视。
机器人的核心是机器人控制系统,从控制工程的角度来看,机器人是一个非线性和不确定性系统,机器人智能控制是近年来机器人控制领域研究的前沿课题,已取得了相当丰富的成果。
机器人轨迹跟踪控制系统的主要目的是通过给定各关节的驱动力矩,使得机器人的位置、速度等状态变量跟踪给定的理想轨迹。
与一般的机械系统一样,当机器人的结构及其机械参数确定后,其动态特性将由动力学方程即数学模型来描述。
因此,可以采用自动控制理论所提供的设计方法,采用基于数学模型的方法设计机器人控制器。
但是在实际工程中,由于机器人是一个非线性和不确定性系统,很难得到机器人精确的数学模型。
采用神经网络,可实现对机器人动力学方程中未知部分的精确逼近,从而实现无需建模的控制。
本节讨论如何利用神经网络控制和李雅普诺夫(Lyapunov )方法设计机器人轨迹跟踪控制的问题,以及如何分析控制系统的稳定性和收敛性。
9.7.1 机器人动力学模型及其结构特性n 关节机械手动态方程可表示为:()()()(),d ++++=M q qV q q q G q F q ττ (9.30) 其中,n R ∈q 为关节转动角度向量,()M q 为n n ⨯维正定惯性矩阵,(),V q q为n n ⨯维向心哥氏力矩,()G q 为1⨯n 维惯性矩阵,()F q 为1⨯n 维摩擦力,d τ为未知有界的外加干扰,nR ∈τ为各个关节运动的转矩向量,即控制输入。
机器人动力学系统具有如下动力学特性: 特性1:惯量矩阵M(q)是对称正定阵且有界;特性2:矩阵(),V q q有界; 特性3:()()2,-M q C q q是一个斜对称矩阵,即对任意向量ξ,有 ()()()2,0T-=ξM q C q qξ (9.31)特性4:未知外加干扰d τ满足d d b ≤τ,d b 为正常数。
9.7.2 传统控制器的设计及分析 定义跟踪误差为:()()()d t t t =-e q q (9.32)定义误差函数为:=+∧r ee (9.33) 其中0>∧=∧T。
则d =-++∧qr q e ()()()()()d d d d d d d dq =-+∧=+∧-=+∧++++-=+∧-++∧+++-=--++MrM q q e M q e M M qe Vq G F ττM qe Vr V q e G F ττVr τf τ (9.34)其中,f 为包含机器人模型信息的非线性函数。
f 表示为()()()d d =+∧++∧++f x M qe V q e G F (9.35) 在实际工程中,()Mq ,(),V q q,()G q 和()F q 往往很难得到精确的结果,导致模型不确定项()f x 为未知。
为了设计控制器,需要对不确定项()f x 进行逼近,假设ˆf为f 的逼近值。
设计控制律为 ˆv=+τf K r (9.36) 将控制律式(9.36)代入式(9.34),得()()0ˆv dv d v =---++=-+++=-++Mr Vr f K r f τK V r f τK V r ς (9.37)其中f 为针对f 的逼近误差,ˆ=-f f f ,0d=+ςf τ 。
如果定义Lyapunov 函数12TL =r Mr (9.38) 则()011222T T T T T v L =+=-+-+r Mr r Mr r K r r M V r r ς0T T vL =-r ςr K r 这说明在v K 固定条件下,控制系统的稳定依赖于0ς,即ˆf 对f 的逼近精度及干扰dτ的大小。
9.7.3 基于RBF 神经网络逼近的机器人控制1.基于RBF 网络的逼近算法已经证明,采用RBF 网络可以实现对任意连续函数的精确逼近。
因此,可以采用RBF 网络实现对不确定项f 的逼近。
在RBF 网络结构中,取[]T nx x x ,....,21=X 为网络的输入向量。
设RBF 网络的径向基向量[]T mh h ,,1 =H ,其中h j 为高斯基函数: 2j 2-h exp(-),1,2,2j jj m b==X C . (9.39)其中网络第j 个结点的中心矢量为[]jn j j c c ,,1 =C ,n i ,,2,1 =。
假设存在权值W ,逼近函数()f x 的理想RBF 网络输出为:()()=+f Wh x εx (9.40)其中W 网络的权向量,[]12,n h h h =h ,()εx 为逼近误差,()()N<εx εx 。
考虑式(9.35),针对()f x 中包含的信息,逼近函数()f x 的RBF 网络输入取:TT T T T d dd ⎡⎤=⎣⎦X e eq q q (9.41)2.基于RBF 网络的控制器和自适应律设计定义RBF 神经网络的实际输出为:()()ˆˆT =fx W h x (9.42) 取ˆ=-WW W (9.43) 控制律和自适应律设计为:()ˆT v=+-τW h x K r v (9.44) ()ˆT =WFh x r (9.45) 其中F 为对称正定阵,0T=>F F 。
将式(9.40)、式(9.42)和式(9.44)代入式(9.34),得()()()()1T v m d v m =-+++++=-++Mr K V r W φx ετv K V r ς (9.46) 其中()()1Td =+++ςWh x ετv ,v 为用于克服神经网络逼近误差ε和干扰d τ的鲁棒项。
将鲁棒项v 设计为:()()N d b sgn ε=-+v r (9.47)其中sgn 为符号函数。
()1sgn 0010>⎧⎪==⎨⎪-<⎩r r r r (9.48)3. 稳定性及收敛性分析针对n 个关节的神经网络控制,定义Lyapunov 函数为:()11122T T L tr -=+r Mr W F W (9.49) 其中()tr ⋅为矩阵的迹,其定义为:设A 是n 阶方阵,则称A 的主对角元素的和为A 的迹,记作()tr A 。
则()112T T T L tr -=++r Mr r Mr W F W将式(9.46)代入上式,得()()()1122T T T T T v md L tr -=-+-+++++r K r r M V r W F W hr r ετv (9.50) 将式(9.31)和式(9.45)代入上式,得()T T v dL =-+++r K r r ετv 下面分两种情况进行讨论。
(1)不考虑鲁棒项,取0=v ,则()()2minT T v d v N d L K b ε=-++≤-++r K r r ετr r 如果要使0L≤ ,则需要满足: ()min /N d v b K ε≥+r (9.51)如果满足0L≤ ,由于0L >,且M(q)有界,则由L 表达式可知,()t r 、W 和ˆW 都有界。
由()t r 有界可知,跟踪误差()t e 及其导数()t e都有界,从而q 和q 有界,且跟踪误差()t e 及其导数()t e 的收敛值随神经网络逼近误差上界N ε和干扰上界d b 的增大而增大,并可通过增大v K 的值达到任意小。
(2)考虑鲁棒项,v 取式(9.47),则()()()()0T T T T d d d N d b ε++=++=+-+≤r ετv r ετr v r ετr0T vL ≤-≤r K r 由于0L >,且M(q)有界,则()t r 、W 和ˆW 为有界。
由于2T v L =-r K r ,又由于式(9.46)的右边信号都有界,则r有界,L 有界,则根据Barbalat 引理,L 趋近于零,即()t r 趋近于零,从而可得出()t e 和()t e趋近于零。
9.7.4 仿真实例选二关节机器人力臂系统,其动力学模型为:()()()()d ++++=M q qV q,q q G q F q ττ (9.52) 其中123223223222cos cos ()cos p p p q p p q p p q p +++⎡⎤=⎢⎥+⎣⎦M q ,3223122312sin ()sin (,)sin 0p qq p qq q p q q --+⎡⎤=⎢⎥⎣⎦V q q 41512512cos cos()()cos()p g q p g q q p g q q ++⎡⎤=⎢⎥+⎣⎦G q ,()()0.02sgn =F q q ,()()0.2sin 0.2sin Td t t =⎡⎤⎣⎦τ。
取[][]212345,,,, 2.9,0.76,0.87,3.04,0.87p p p p p kgm ==p 。
RBF 网络高斯基函数参数的取值对神经网络控制的作用很重要,如果参数取值不合适,将使高斯基函数无法得到有效的映射,从而导致RBF 网络无效。
故c 按网络输入值的范围取值,取0.20b =,网络的初始权值取零,网络输入取[]d d d =z e eq qq 。
系统的初始状态为[]0.0900.090-,两个关节的位置指令分别为()10.1sin d q t =,()20.1sin d q t =,控制参数取{}50,50v diag =K ,{}25,25diag =F ,{}5,5diag ∧=,在鲁棒项中,取0.20N ε=,0.10d b =。
采用Simulink 和S 函数进行控制系统的设计,M=1时为不考虑鲁棒项,仿真结果如图9-25、图9-26和图9-27所示。
图9-25 关节1和关节2的位置跟踪(M=1)图9-26 关节1和关节2的控制输入(M=1)图9-27 函数f及其逼近ˆf(M=1)Simulink主程序:chap9_5sim.mdl位置指令子程序:chap9_5input.m function [sys,x0,str,ts] = spacemodel(t,x,u,flag) switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 1,sys=mdlDerivatives(t,x,u);case 3,sys=mdlOutputs(t,x,u);case {2,4,9}sys=[];otherwiseerror(['Unhandled flag = ',num2str(flag)]); endfunction [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 6;sizes.NumInputs = 0;sizes.DirFeedthrough = 0;sizes.NumSampleTimes = 1;sys = simsizes(sizes);x0 = [];str = [];function sys=mdlOutputs(t,x,u)qd1=0.1*sin(t);d_qd1=0.1*cos(t);dd_qd1=-0.1*sin(t);qd2=0.1*sin(t);d_qd2=0.1*cos(t);dd_qd2=-0.1*sin(t);sys(1)=qd1;sys(2)=d_qd1;sys(3)=dd_qd1;sys(4)=qd2;sys(5)=d_qd2;sys(6)=dd_qd2;控制器子程序:chap9_5ctrl.mfunction [sys,x0,str,ts] = spacemodel(t,x,u,flag) switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 1,sys=mdlDerivatives(t,x,u);case 3,sys=mdlOutputs(t,x,u);case {2,4,9}sys=[];otherwiseerror(['Unhandled flag = ',num2str(flag)]); endfunction [sys,x0,str,ts]=mdlInitializeSizes global node c b Fainode=7;c=0.1*[-1.5 -1 -0.5 0 0.5 1 1.5;-1.5 -1 -0.5 0 0.5 1 1.5;-1.5 -1 -0.5 0 0.5 1 1.5;-1.5 -1 -0.5 0 0.5 1 1.5;-1.5 -1 -0.5 0 0.5 1 1.5];b=0.20;Fai=5*eye(2);sizes = simsizes;sizes.NumContStates = 2*node;sizes.NumDiscStates = 0;sizes.NumOutputs = 3;sizes.NumInputs = 11;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 0;sys = simsizes(sizes);x0 = zeros(1,2*node);str = [];ts = [];function sys=mdlDerivatives(t,x,u) global node c b Faiqd1=u(1);d_qd1=u(2);dd_qd1=u(3);qd2=u(4);d_qd2=u(5);dd_qd2=u(6);q1=u(7);d_q1=u(8);q2=u(9);d_q2=u(10);q=[q1;q2];e1=qd1-q1;e2=qd2-q2;de1=d_qd1-d_q1;de2=d_qd2-d_q2;e=[e1;e2];de=[de1;de2];r=de+Fai*e;qd=[qd1;qd2];dqd=[d_qd1;d_qd2];dqr=dqd+Fai*e;ddqd=[dd_qd1;dd_qd2];ddqr=ddqd+Fai*de;z=[e;de;qd;dqd;ddqd];for j=1:1:nodeh1(j)=exp(-norm(z(1)-c(:,j))^2/(b*b));h2(j)=exp(-norm(z(2)-c(:,j))^2/(b*b)); endF=25*eye(2);for i=1:1:nodesys(i)=F(1,1)*h1(i)*r(1);sys(i+node)=F(2,2)*h2(i)*r(2);endfunction sys=mdlOutputs(t,x,u)global node c b Faiqd1=u(1);d_qd1=u(2);dd_qd1=u(3);qd2=u(4);d_qd2=u(5);dd_qd2=u(6);q1=u(7);d_q1=u(8);q2=u(9);d_q2=u(10);q=[q1;q2];e1=qd1-q1;e2=qd2-q2;de1=d_qd1-d_q1;de2=d_qd2-d_q2;e=[e1;e2];de=[de1;de2];r=de+Fai*e;W_f1=[x(1:node)]';W_f2=[x(node+1:node*2)]';qd=[qd1;qd2];dqd=[d_qd1;d_qd2];ddqd=[dd_qd1;dd_qd2];z=[e;de;qd;dqd;ddqd];for j=1:1:nodeh1(j)=exp(-norm(z(1)-c(:,j))^2/(b*b));h2(j)=exp(-norm(z(2)-c(:,j))^2/(b*b)); endfn=[W_f1*h1';W_f2*h2'];Kv=50*eye(2);M=2;if M==1tol=fn+Kv*r; %Adaptive RBF Control elseif M==2epN=0.20;bd=0.10;v=-(epN+bd)*sign(r);tol=fn+Kv*r-v; %Robust adaptive RBF Control elseif M==3tol=Kv*r; %PD Controlendfn_norm=norm(fn);sys(1)=tol(1);sys(2)=tol(2);sys(3)=fn_norm;被控对象子程序:chap9_5plant.mfunction [sys,x0,str,ts]=s_function(t,x,u,flag)switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 1,sys=mdlDerivatives(t,x,u);case 3,sys=mdlOutputs(t,x,u);case {2, 4, 9 }sys = [];otherwiseerror(['Unhandled flag = ',num2str(flag)]);endfunction [sys,x0,str,ts]=mdlInitializeSizesglobal p gsizes = simsizes;sizes.NumContStates = 4;sizes.NumDiscStates = 0;sizes.NumOutputs = 5;sizes.NumInputs =3;sizes.DirFeedthrough = 0;sizes.NumSampleTimes = 0;sys=simsizes(sizes);x0=[0.09 0 -0.09 0];str=[];ts=[];p=[2.9 0.76 0.87 3.04 0.87];g=9.8;function sys=mdlDerivatives(t,x,u)global p gM=[p(1)+p(2)+2*p(3)*cos(x(3)) p(2)+p(3)*cos(x(3));p(2)+p(3)*cos(x(3)) p(2)];V=[-p(3)*x(4)*sin(x(3)) -p(3)*(x(2)+x(4))*sin(x(3));p(3)*x(2)*sin(x(3)) 0];G=[p(4)*g*cos(x(1))+p(5)*g*cos(x(1)+x(3));p(5)*g*cos(x(1)+x(3))];dq=[x(2);x(4)];F=0.02*sign(dq);told=[0.2*sin(t);0.2*sin(t)];tol=u(1:2);S=inv(M)*(tol-V*dq-G-F-told);sys(1)=x(2);sys(2)=S(1);sys(3)=x(4);sys(4)=S(2);function sys=mdlOutputs(t,x,u)global p gM=[p(1)+p(2)+2*p(3)*cos(x(3)) p(2)+p(3)*cos(x(3));p(2)+p(3)*cos(x(3)) p(2)];V=[-p(3)*x(4)*sin(x(3)) -p(3)*(x(2)+x(4))*sin(x(3));p(3)*x(2)*sin(x(3)) 0];G=[p(4)*g*cos(x(1))+p(5)*g*cos(x(1)+x(3));p(5)*g*cos(x(1)+x(3))];dq=[x(2);x(4)];F=0.02*sign(dq);told=[0.2*sin(t);0.2*sin(t)];qd1=sin(t);d_qd1=cos(t);dd_qd1=-sin(t);qd2=sin(t);d_qd2=cos(t);dd_qd2=-sin(t);qd1=0.1*sin(t);d_qd1=0.1*cos(t);dd_qd1=-0.1*sin(t);qd2=0.1*sin(t);d_qd2=0.1*cos(t);dd_qd2=-0.1*sin(t);q1=x(1);d_q1=dq(1);q2=x(3);d_q2=dq(2);q=[q1;q2];e1=qd1-q1;e2=qd2-q2;de1=d_qd1-d_q1;de2=d_qd2-d_q2;e=[e1;e2];de=[de1;de2];Fai=5*eye(2);dqd=[d_qd1;d_qd2];dqr=dqd+Fai*e;ddqd=[dd_qd1;dd_qd2];ddqr=ddqd+Fai*de;f=M*ddqr+V*dqr+G+F;f_norm=norm(f);sys(1)=x(1);sys(2)=x(2);sys(3)=x(3);sys(4)=x(4);sys(5)=f_norm;绘图子程序:chap9_5plot.mclose all;figure(1);subplot(211);plot(t,x1(:,1),'r',t,x1(:,2),'b');xlabel('time(s)');ylabel('position tracking for link 1'); subplot(212);plot(t,x2(:,1),'r',t,x2(:,2),'b');xlabel('time(s)');ylabel('position tracking for link 2'); figure(2);subplot(211);plot(t,tol1(:,1),'r');xlabel('time(s)');ylabel('control input of link 1'); subplot(212);plot(t,tol2(:,1),'r');xlabel('time(s)');ylabel('control input of link 2');figure(3);plot(t,f(:,1),'r',t,f(:,2),'b');xlabel('time(s)');ylabel('f and fn');。