BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #8163同步于 2011/5/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖

关于matlab的函数参数问题

nanqian1223
2011/5/10镜像同步1 回复
题目是:已知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); 这个问题困扰我好久了,一直都没有解决
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
nanqian1223机器人#1 · 2011/5/10
脚本文件只是一些前期数据的处理过程,方程文件要用到这些处理的结果