返回信息流题目是:已知30个点坐标(x,y,z),这30个点左边都在一个平面上,平面方程为未知。
暂且设为ax+by+cz+d=0;其中的a,b,c,d为未知量,x,y,z分别为6个未知量x1,x2,x3,x4,x5,x6的线性组合。最后需要通过最小二乘法,求出这10个未知量。为了表达方便,令a,b,c,d分别为x7,x8,x9,x10
我现在有两个m文件,一个函数文件,一个脚本文件
%脚本文件
data=xlsread('sample data.xls');
q1=data(:,1);q2=data(:,2);q3=data(:,3);q4=data(:,4);%用于求末端执行器到极坐标系的旋转矩阵R
p1=data(:,5);p2=data(:,6);p3=data(:,7);s=data(:,10);
a11=2*(q1.^2+q2.^2)-1;
a12=2*(q2.*q3-q1.*q4);
a13=2*(q2.*q4+q1.*q3);
a21=2*(q2.*q3-+q1.*q4);
a22=2*(q1.^2+q3.^2)-1;
a23=2*(q3.*q4-q1.*q2);
a31=2*(q2.*q4-q1.*q3);
a32=2*(q3.*q4+q1.*q2);
a33=2*(q1.^2+q4.^2)-1;
%求取末端执行器到机器人基坐标系的旋转矩阵
for i=1:30
R60{i,1}=[a11(i) a12(i) a13(i);a21(i) a22(i) a23(i);a31(i) a32(i) a33(i)];%所求旋转矩阵
%disp( R60{1,i})
end
for i=1:30
P{i,1}=[p1(i) p2(i) p3(i)]';%末端执行器坐标原点在基坐标系中的位置
%disp( P{i,1})
end
%求取末端执行器到机器人基坐标系的齐次矩阵
for i=1:30
T60{i,1}=[R60{i,1} P{i,1};0 0 0 1];%末端执行器到基坐标的齐次变化矩阵
end
%求取传感器坐标系中的点在基坐标系下的坐标
syms x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 real %x1=dx,x2=dy,x3=dz,x4=cos(alfa),x5=cos(beta),x6=cos(gama);
x=[x1 x2 x3 x4 x5 x6 x7 x8 x9 x10];
for i=1:30
%Ts6=[1 0 0 x1;0 1 0 x2;0 0 1 x3;0 0 0 1];%传感器坐标系相对于机器人末端执行器的齐次变化矩阵
%Qs{1,i}=[s(i)*x4 s(i)*x5 s(i)*x6 1]';%传感器坐标系下平面上点的坐标
%Qs6{i,1}=Ts6* Qs{1,i}
Qs6{i,1}=[s(i)*x4+x1;s(i)*x5+x2;s(i)*x6+x3;1];
%disp(Qs6{1,i})
end
for i=1:30
Q0{i,1}=T60{i,1}*Qs6{i,1};
H(i,1)=Q0{i,1}(1); % H是30*3的列向量,每一项都是x1,x2...x6和常数的线性组合
X(i,1)=vpa(H(i,1)); %X是平面方程中的x变量
H(i,2)=Q0{i,1}(2);
Y(i,1)=vpa(H(i,2)); %Y是平面方程中的y变量
H(i,3)=Q0{i,1}(3);
Z(i,1)=vpa(H(i,3)); %Z是平面方程中的z变量
end
x0=[0.5 0.5 0.5 0.5 0.5 0.5 1 1 1 1];
y=lsqnonlin(@myfun,x0); %调用函数
%函数文件
function f=myfun(y)
K=1:30;
y = evalin('base', 'x');
X1= evalin('base', 'X');
Y1=evalin('base', 'Y');
Z1=evalin('base', 'Z');
f=y(7)*X1(K,1)+y(8)*Y1(K,1)+y(9)*Z1(K,1)+y(10);
end
程序运行结果如下
??? Undefined function or method 'full' for input arguments of type 'sym'.
Error in ==> snls at 159
fvec = full(fval);
Error in ==> lsqncommon at 149
[xC,FVAL,LAMBDA,JACOB,EXITFLAG,OUTPUT,msgData]=...
Error in ==> lsqnonlin at 241
[xCurrent,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
Error in ==> process at 51
y=lsqnonlin(@myfun,x0);
这个问题困扰我好久了,一直都没有解决
这是一条镜像帖。来源:北邮人论坛 / matlab / #8163同步于 2011/5/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖
关于matlab的函数参数问题
nanqian1223
2011/5/10镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复