Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 一个函数输出一个包含38个元素的向量,而Simulink将其作为一个元素,这怎么可能呢?_Matlab_Simulink - Fatal编程技术网

Matlab 一个函数输出一个包含38个元素的向量,而Simulink将其作为一个元素,这怎么可能呢?

Matlab 一个函数输出一个包含38个元素的向量,而Simulink将其作为一个元素,这怎么可能呢?,matlab,simulink,Matlab,Simulink,在下面的Simulink模型中,我解释的函数输出是一个包含38个元素的向量。我有两个具有相同输出的函数,其中一个工作正常(desiredtrajectory_sim.m),但另一个不正常(desiredtrajectory.m)。 任何建议。谢谢 这是Simulink模型 function [desired_state] = desiredtrajectory_sim(in) t = in(1); Sf = [ 1; 2; pi/4]; dSf = [0;0;0]; Pf = [ 0.1*t;

在下面的Simulink模型中,我解释的函数输出是一个包含38个元素的向量。我有两个具有相同输出的函数,其中一个工作正常(desiredtrajectory_sim.m),但另一个不正常(desiredtrajectory.m)。 任何建议。谢谢

这是Simulink模型

function [desired_state] = desiredtrajectory_sim(in)
t = in(1);
Sf = [ 1; 2; pi/4];
dSf = [0;0;0];

Pf = [ 0.1*t; 0; 0.5*sin(0.03*pi*t) + 2; 0; 0.01*pi*t ; 0];
dPf = [ 0.1; 0; 0.5*0.03*pi*cos(0.03*pi*t); 0; 0.01*pi; 0];

pf = Sf(1); qf = Sf(2); betaf = Sf(3);
xf = Pf(1); yf = Pf(2); zf = Pf(3);
phif = Pf(4); thetaf = Pf(5); psif = Pf(6);

rf  = sqrt(pf^2 + qf^2 - 2*pf*qf*cos(betaf));         
h1 =  sqrt(0.5*(pf^2 + qf^2 - 0.5*rf^2));
h2 =  sqrt(0.5*(rf^2 + pf^2 - 0.5*qf^2));
h3 =  sqrt(0.5*(qf^2 + rf^2 - 0.5*pf^2));                   
alpha1  = acos((4*(h1^2+h2^2)-9*pf^2)/(8*h1*h2));
alpha2  = acos((4*(h1^2+h3^2)-9*qf^2)/(8*h1*h3));
Rot = RPYtoRot_ZXY(phif, thetaf, psif);
r1 = Rot*[2/3*h1;0;0];
r2 = Rot*[2/3*h2*cos(alpha1);2/3*h2*sin(alpha1);0];
r3 = Rot*[2/3*h3*cos(alpha2);-2/3*h3*sin(alpha2);0];
pos_des1 = [xf;yf;zf] + r1;
pos_des2 = [xf;yf;zf] + r2;
pos_des3 = [xf;yf;zf] + r3;

omega = [0 -sin(psif) cos(thetaf)*cos(psif);...
     0 -cos(psif) cos(thetaf)*sin(psif);...
     1     0         -sin(thetaf)]*dPf(4:6);

vel_des1 =  dPf(1:3) + cross(omega, r1);
vel_des2 =  dPf(1:3) + cross(omega, r2);
vel_des3 =  dPf(1:3) + cross(omega, r3);
acc_des = [0;0;0];

desired_state1 = [pos_des1;vel_des1;acc_des];
desired_state2 = [pos_des2;vel_des2;acc_des];
desired_state3 = [pos_des3;vel_des3;acc_des];

desired_state = [desired_state1;desired_state2;desired_state3; psif; 0; Pf; 
Sf]
size(desired_state)
end
这是Simulink块和错误消息 正如您所注意到的,总线只提供一个元素,而前一个总线提供38个元素,尽管它们具有相同的输出

function [desired_state] = desiredtrajectory(in)%(t, pos)
tm= in(1)
pos = in(2:10);
syms t xf yf zf phif thetaf psif pf qf betaf

rf  = sqrt(pf^2+qf^2-2*pf*qf*cos(betaf));

              h1 =  sqrt(0.5*(pf^2+qf^2-0.5*rf^2));
              h2 =  sqrt(0.5*(rf^2+pf^2-0.5*qf^2));
              h3 =  sqrt(0.5*(qf^2+rf^2-0.5*pf^2));

alf1  = acos((4*(h1^2+h2^2)-9*pf^2)/(8*h1*h2));
alf2  = acos((4*(h1^2+h3^2)-9*qf^2)/(8*h1*h3)); 

Rot = RPYtoRot_ZXY(phif, thetaf, psif);
eps = [Rot*[2/3;0;0]+[xf;yf;zf]
   Rot*[2/3*h2*cos(alf1);2/3*h2*sin(alf1);0]+[xf;yf;zf]
   Rot*[2/3*h2*cos(alf2);-2/3*h3*sin(alf2);0]+[xf;yf;zf]];

 X  = [ xf yf zf phif thetaf psif pf qf betaf];

 Sf = [ 1; 2; pi/4];
 dSf = [0;0;0];

Pf = [ 0.1*t; 0; 0.5*sin(0.03*pi*t) + 2; 0; 0.01*pi*t ; 0];
dPf = [ 0.1; 0; 0.5*0.03*pi*cos(0.03*pi*t); 0; 0.01*pi; 0];

qd = [Pf; Sf];
qddot = [dPf; dSf];

jac = jacobian(eps,X);
%%%%%%%%%%%%%
pf = Sf(1); qf = Sf(2); betaf = Sf(3);
xf = Pf(1); yf = Pf(2); zf = Pf(3);
phif = Pf(4); thetaf = Pf(5); psif = Pf(6);

x1=pos(1);
y1=pos(2);
z1=pos(3);
x2=pos(4);
y2=pos(5);
z2=pos(6);
x3=pos(7);
y3=pos(8);
z3=pos(9);

qpf=[(x1+x2+x3)/3;...
 (y1+y2+y3)/3;...
 (z1+z2+z3)/3;...
 atan2((2*z1/3-z2/3-z3/3),(2*y1/3-y2/3-y3/3)); ...
 -atan2((2*z1/3-z2/3-z3/3),(2*x1/3-x2/3-x3/3)); ...
 atan2((2*y1/3-y2/3-y3/3),(2*x1/3-x2/3-x3/3))];

 qsf=[sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2); ...
 sqrt((x1-x3)^2+(y1-y3)^2+(z1-z3)^2); ...
 acos((pf^2+qf^2-rf^2)/(2*pf*qf))];

 q = [qpf;qsf];
 %%%%%%%%%%%%%
 %%%pos_desired%%%%%%%
 pos_des =  eval(eps);
 pos_des =subs(pos_des,t,tm);
 jacval  =  eval(jac);

 qd = eval(qd);%subs(qd,t,tm);
 q  = eval(q);
 qe = qd - q;
 qddot = eval(qddot);%subs(qddot,t,tm);
 kappa=0.2*eye(9);
 qrefdot = qddot + kappa*qe;

 vel_des = jacval*qrefdot;
 vel_des = subs(vel_des,t,tm);
 acc_des = zeros(3,1);

 yaw = 0;
 yawdot = 0;
 % =================== Your code ends here ===================

 desired_state1 = [pos_des(1:3);vel_des(1:3);acc_des];
 desired_state2 = [pos_des(4:6);vel_des(4:6);acc_des];
 desired_state3 = [pos_des(7:9);vel_des(7:9);acc_des];
 Pf = subs(Pf,t,tm);
 Sf = subs(Sf,t,tm);
 format short
 digits(3);
 desired_state = vpa([desired_state1;desired_state2;desired_state3; psif; 0; 
 Pf; Sf])
 size(desired_state)
 end

第二幅图显示了第二个函数的输出是标量-块输出处的维度是1-而不是您认为的38

也就是说,函数的输出与您认为的不同

该错误是因为
选择器
块期望其输入为38维,而实际并非如此

要确定为什么您认为正在发生的事情实际上并不是正在发生的事情,您可以使用编辑器在m代码中设置断点,运行模型,然后逐步检查代码,以确定当您希望它以其他方式输出时,为什么它会给出标量输出

另一种方法是使用假输入数据从MATLAB命令行运行函数。差不多

tmp = desiredtrajectory(randn(10,1))
在这里是合适的

答案是,
desiredtrajectory
输出
desired\u状态
,这是一个符号变量。是的,它包含38个元素的向量,但Simulink将对象本身视为标量

但真正的问题是,不能将符号变量传播到Simulink信号中。您需要输出为数值向量

克服这一问题的一种方法是

desired_state = double(desired_state);
在文件末尾,将符号对象强制转换为double,该double将包含38个元素


(然而,我们还不清楚为什么要首先使用符号数学,我建议如果不使用它,它会更好,而且肯定更有效。)

第二幅图像显示,第二个函数的输出是标量-块输出的维度是1-而不是你认为的38

也就是说,函数的输出与您认为的不同

该错误是因为
选择器
块期望其输入为38维,而实际并非如此

要确定为什么您认为正在发生的事情实际上并不是正在发生的事情,您可以使用编辑器在m代码中设置断点,运行模型,然后逐步检查代码,以确定当您希望它以其他方式输出时,为什么它会给出标量输出

另一种方法是使用假输入数据从MATLAB命令行运行函数。差不多

tmp = desiredtrajectory(randn(10,1))
在这里是合适的

答案是,
desiredtrajectory
输出
desired\u状态
,这是一个符号变量。是的,它包含38个元素的向量,但Simulink将对象本身视为标量

但真正的问题是,不能将符号变量传播到Simulink信号中。您需要输出为数值向量

克服这一问题的一种方法是

desired_state = double(desired_state);
在文件末尾,将符号对象强制转换为double,该double将包含38个元素


(但不清楚为什么您首先要使用符号数学,我建议如果您不使用它,它会更好,而且肯定更有效。)

请发布图片并将代码上载到Stack Overflow。不要期望人们从其他网站下载代码。请发布图片并将代码上载到Stack Overflow。不要期望人们从其他网站下载代码。