clear all; close all; ts=0.001; a = 2; % 椭圆长轴 b = 1; % 椭圆短轴 c = sqrt(a^2 - b^2); % 焦距 theta = pi/4; % 椭圆与x轴的夹角 for k=1:1:2001 t = (k-1)*pi*ts; r = a * (1 - (c/a)^2 * cos(t)); xd(k) = r * cos(t + theta); yd(k) = r * sin(t + theta); thd(k) = atan2(yd(k), xd(k)); 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 20:41:00 浏览: 77
opencv椭圆拟合长短轴比
5星 · 资源好评率100%
以上代码是一个基于椭圆轨迹的控制器实现代码,但是缺少了控制器的具体实现。如果要使控制器稳定地跟踪椭圆轨迹,需要在代码中添加控制器的具体实现。
一种可能的方法是使用PD控制器,其中比例增益kp和微分增益kd需要根据实际情况进行调整。具体来说,可以将控制器实现代码修改为如下形式:
```
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);
e1(k) = cos(q(3)) * ce1(k) + sin(q(3)) * ce2(k);
e2(k) = -sin(q(3)) * ce1(k) + cos(q(3)) * ce2(k);
e3(k) = ce3(k);
de1(k) = (e1(k) - e1_old) / ts;
de2(k) = (e2(k) - e2_old) / ts;
de3(k) = (e3(k) - e3_old) / ts;
u1(k) = kp * e1(k) + kd * de1(k);
u2(k) = kp * e2(k) + kd * de2(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;
U=u+[L1*[e1(k);e2(k);e3(k)]+L2*[ce1(k);ce2(k);ce3(k)]];
u=[u1(k);u2(k)];
q=q+B*u;
e1_old = e1(k);
e2_old = e2(k);
e3_old = e3(k);
end
```
其中,e1、e2、e3分别表示位置误差、e1_old、e2_old、e3_old分别表示上一时刻的误差,de1、de2、de3分别表示误差变化率,kp、kd分别表示比例增益和微分增益,u1、u2分别表示控制器输出的两个控制量。通过PD控制器对位置误差进行控制,可以使控制器稳定地跟踪椭圆轨迹。
需要注意的是,以上代码仅供参考,具体实现需要根据实际情况进行调整和优化。同时,也需要进行系统测试和验证,以确保控制器的稳定性和可靠性。
阅读全文