计算力矩法是机器人控制中较常用的方法,该方法基于机器人模型中各项的估计值进行控制律的设计。
7.1 系统描述机器人机械手的模型为:
(7.20)
其中为正定质量惯性矩阵,为哥氏力、离心力,为重力。
7.2 控制律设计当不知道机器人的惯性参数时,根据计算力矩法,取控制律为
(7.21)
其中、和为利用惯性参数估计值计算出的和的估计值。
则闭环系统方程式(7.20)为
(7.22)
即
(7.23)
其中。
若惯性参数的估计值使得可逆,则闭环系统方程式(7.23)可写为
(7.24)
定义
其中。
取滑动面
其中,为正对角矩阵。则
取
(7.25)
式中为待设计的向量。则
(7.26)
选取
(7.27)
其中。则
由式(7.21)和式(7.25),得滑模控制律为
(7.28)
其中。
由控制律式(7.28)可知,若参数估计值越准确,则越小,越小,滑膜控制产生的抖振越小。
7.3 仿真实例选二关节机器人力臂系统,其动力学模型为:
其中,。取
其中。
机械臂的实际物理参数值见表7-1。
表7-1 双机械臂物理参数
1kg
1m1/2m1/12kg3kg1m2/5kg0-7/129.81采用滑模控制律式(7.28),取位置指令分别为。仿真结果如图7-9和7-10所示。
图7.9 双力臂位置跟踪
图7.10 双力臂控制输入
仿真程序:
Simulink主程序:chap7_4sim.mdl
控制律子程序:chap7_4ctrl.m
function [sys, x0,str,ts]= chap7_1ctrl(t,x,u,flag)switch flagcase 0[sys,x0,str,ts]=mdlInitializeSizes;case 3sys=mdlOutputs(t,x,u);case {2,4,9}sys=[];otherwiseerror(['Unhandled flag = ',num2str(flag)]);endfunction [sys,x0,str,ts] = mdlInitializeSizesglobal nmnnmn = 25*eye(2);sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 2;sizes.NumInputs = 6;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);x0 =[];str =[];ts = [0 0];function sys = mdlOutputs(t,x,u)global nmnqd1 = u(1);dqd1 = -pi*sin(pi*t);ddqd1 = -pi^2*cos(pi*t);qd2 = u(2);dqd2 = pi*cos(pi*t);ddqd2 = -pi^2*sin(pi*t)ddqd = [ddqd1;ddqd2];dqd = [dqd1;dqd2];ddqd = [ddqd1;ddqd2];q1=u(3);dq1=u(4);q2=u(5);dq2=u(6);dq=[dq1;dq2];e1 = qd1-q1;e2 = qd2-q2;e=[e1;e2];de1 = dqd1 - dq1;de2 = dqd2 - dq2;de = [de1;de2];alfa = 6.7;beta = 3.4;epc = 3.0;eta = 0;m1 = 1;l1 = 1;lc1 = 1/2;I1 = 1/12;g = 9.8;e1 = m1*l1*lc1-I1-m1*l1^2;e2 = g/l1;M = [alfa+2*epc*cos(q2)+2*eta*sin(q2),beta+epc*cos(q2)+eta*sin(q2);beta+epc*cos(q2)+eta*sin(q2),beta];C = [(-2*epc*sin(q2)+2*eta*cos(q2))*dq2,(-epc*sin(q2)+eta*cos(q2))*dq2;(epc*sin(q2) - eta*cos(q2))*dq1,0];G = [ epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)+(alfa-beta+e1)*e2*cos(q1);epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)];M0 = 0.6*M;C0 = 0.6*C;G0 = 0.6*G;s = de+nmn*e;d_up = 30;xite = 0.10;d = (d_up+xite)*sign(s);v = ddqd +nmn*de+d;tol = M0*v+C0*dq+G0;sys(1) =tol(1);sys(2) =tol(2);被控对象子程序:chap7_4plant.m
function [sys, x0,str,ts]= chap7_1plant(t,x,u,flag)switch flagcase 0[sys,x0,str,ts]=mdlInitializeSizes;case 1sys =mdlDerivatives(t,x,u);case 3sys=mdlOutputs(t,x,u);case {2,4,9}sys=[ ];otherwiseerror(['Unhandled flag = ',num2str(flag)]);endfunction [sys,x0,str,ts] = mdlInitializeSizessizes = simsizes;sizes.NumContStates = 4;sizes.NumDiscStates = 0;sizes.NumOutputs = 4;sizes.NumInputs = 2;sizes.DirFeedthrough = 0;sizes.NumSampleTimes = 0;sys = simsizes(sizes);x0 =[0;0;0;0];str =[];ts = [];function sys = mdlDerivatives(t,x,u)q1 = x(1);dq1 = x(2);q2 = x(3);dq2 = x(4);dq = [dq1;dq2];% The model is given by Slotine and Weiping Li(MIT 1987)alfa = 6.7;beta = 3.4;epc = 3.0;eta = 0;m1 = 1;l1 = 1;lc1 = 1/2; I1=1/12;g = 9.8;e1 = m1*l1*lc1-I1-m1*l1^2;e2 = g/l1;M = [alfa+2*epc*cos(q2)+2*eta*sin(q2),beta+epc*cos(q2)+eta*sin(q2);beta+epc*cos(q2)+eta*sin(q2),beta];C = [(-2*epc*sin(q2)+2*eta*cos(q2))*dq2,(-epc*sin(q2)+eta*cos(q2))*dq2;(epc*sin(q2) - eta*cos(q2))*dq1,0];G = [ epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)+(alfa-beta+e1)*e2*cos(q1);epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)];tol(1)=u(1);tol(2)=u(2);ddq = inv( M )*( tol'-C*dq-G );sys(1) =x(2);sys(2) =ddq(1);sys(3) =x(4);sys(4) =ddq(2);function sys = mdlOutputs(t,x,u)sys(1) = x(1);sys(2) = x(2);sys(3) = x(3);sys(4) = x(4);绘图子程序:chap7_4plot.m
close all;t = out.t.Data;y1 = out.y1.Data;y2 = out.y2.Data; tol = out.tol.Data;figure(1);subplot(211);plot(t,y1(:,1),'r',t,y1(:,2),'b','linewidth',2);xlabel('time(s)');ylabel('Angle tracking of joint 1');subplot(212);plot(t,y2(:,1),'r',t,y2(:,2),'b','linewidth',2);xlabel('time(s)');ylabel('Angle tracking of joint 2');figure(2);subplot(211);plot(t,tol(:,1),'r','linewidth',2);xlabel('time(s)');ylabel('Control input 1');subplot(212);plot(t,tol(:,2),'r','linewidth',2);xlabel('time(s)');ylabel('Control input 2');