clear all; close all; ts=0.001; for k=1:1:2001 xd(k)=cos((k-1)*pi*ts); yd(k)=sin((k-1)*pi*ts); thd(k)=ts*pi*(k-1)+pi/2; end for k=1:1:2001 u1(k)=0;u2(k)=0; e1(k)=0;e2(k)=0; e3(k)=0; end y0=[1;0;pi/2]; M=20; for i=0:1:M i pause(0.01); for k=1:1:2001 if k==1 q=y0; end xp(k)=q(1); yp(k)=q(2); th(k)=q(3); qd=[xd(k);yd(k);thd(k)]; ce1(k)=qd(1)-q(1); ce2(k)=qd(2)-q(2); ce3(k)=qd(3)-q(3); u=[u1(k);u2(k)]; B=ts*[cos(q(3)) 0 sin(q(3)) 0 0 1]; L1=10*[cos(q(3)) sin(q(3)) 0; 0 0 1]; L2=L1; cond=norm(eye(2)-L1*B); U=u+L1*[e1(k);e2(k);e3(k)]+L2*[ce1(k);ce2(k);ce3(k)]; u1(k)=U(1); u2(k)=U(2); u=[u1(k);u2(k)]; q=q+B*u; e1(k)=cos(k*ts*pi)-q(1); e2(k)=sin(k*ts*pi)-q(2); e3(k)=ts*k*pi+pi/2-q(3); end figure(1); hold on; plot(xd,yd,'r',xp,yp,'b'); xlabel('xd xp');ylabel('yd,yp'); j=i+1; times(j)=j-1; e1i(j)=max(abs(ce1)); e2i(j)=max(abs(ce2)); e3i(j)=max(abs(ce3)); end figure(2); plot(xd,yd,'r',xp,yp,'b'); xlabel('xd xp');ylabel('yd,yp'); figure(3); plot(times,e1i,'*-r',times,e2i,'o-b',times,e3i,'o-k'); title('Change of maximum absolute value of error1,error2 and angle with times i'); xlabel('times');ylabel('e1,e2 and angle');
时间: 2024-03-27 10:42:13 浏览: 73
bfsk.zip_All Clear_SNRdB_bfsk snr matlab_waitbar
这段代码实现了一个基于时间比例和 PID 控制的机器人轨迹跟踪控制器。其中,期望轨迹是一个以原点为中心的圆形,通过计算圆形上的点的 x 和 y 分量来作为期望输出。控制器使用 PID 控制器来计算控制信号,其中包括比例项、积分项和微分项,用来根据误差和误差积分来调整控制信号,使得机器人能够沿着期望轨迹运动。
具体地,代码首先定义了时间步长间隔 ts 和期望轨迹的 x 和 y 分量 xd 和 yd,以及期望轨迹上点的角度 thd。然后,我们定义了初始控制器输出信号 u1 和 u2,以及误差 e1、e2 和 e3。接着,我们选择机器人的初始状态 y0,然后使用时间比例和 PID 控制器来控制机器人沿着期望轨迹移动,计算出机器人的实际位置 xp 和 yp、角度 th,以及误差 ce1、ce2 和 ce3。最后,我们绘制出期望轨迹和实际轨迹,并记录误差随时间变化的情况。
需要注意的是,这段代码可能存在一些问题,例如控制器参数的选择和误差积分的计算方式等。如果需要使用该代码进行控制器设计,建议进行充分的测试和验证,以获得最佳的控制效果。
阅读全文