Bonjour,
Pour résumer , j'utilise le code MATLAB d'une thèse de master sur un hexapode robotique .Or le code présente un problème , il y présente une fonction qui n'est pas définie ( la fonction "PGI_hexapode"), Le code de cette fonction n'est pas mentionné dans le mémoire .J'ai essayé de joindre le rédacteur de la thèse , mais il n'est plus joignable ( la thèse date de 2006)
Voici l'erreur que j'aiLa fonction "PGI_hexapode" n'est que sur une ligne du code . Celle-làCode:Undefined function or variable 'PGI_hexapode'.Pouvez-vous m'aider car ce code permet de faire le bon choix des servos .Ce qui est très important car je ne dois pas me tromper sur ça .Code:[art,Qhex,Phex] = PGI_hexapode(pos,HD,dRcorps,Qcorps);
Merci
Voici le code en intégralité
Code:clear all; clc; close all; digits(25); %-------------------------------% % Initialisation des parametres %-------------------------------% % Force de contact au pattes syms NAvGx NAvGy NAvGz real ; NAvG = [NAvGx; NAvGy; NAvGz]; syms NCeDx NCeDy NCeDz real ; NCeD = [NCeDx; NCeDy; NCeDz]; syms NArGx NArGy NArGz real ; NArG = [NArGx; NArGy; NArGz]; %-------------------------------% %-------------------------------% % Reaction corps-coxa syms RBCAvGx RBCAvGy RBCAvGz real; RBCAvG = [RBCAvGx; RBCAvGy; RBCAvGz]; syms RBCCeDx RBCCeDy RBCCeDz real; RBCCeD = [RBCCeDx; RBCCeDy; RBCCeDz]; syms RBCArGx RBCArGy RBCArGz real; RBCArG = [RBCArGx; RBCArGy; RBCArGz]; syms MBCAvGx MBCAvGy MBCAvGz real; MBCAvG = [MBCAvGx; MBCAvGy; MBCAvGz]; syms MBCCeDx MBCCeDy MBCCeDz real; MBCCeD = [MBCCeDx; MBCCeDy; MBCCeDz]; syms MBCArGx MBCArGy MBCArGz real; MBCArG = [MBCArGx; MBCArGy; MBCArGz]; %-------------------------------% % Reaction femur-tibia syms RFTAvGx RFTAvGy RFTAvGz real; RFTAvG = [RFTAvGx; RFTAvGy; RFTAvGz]; syms RFTCeDx RFTCeDy RFTCeDz real; RFTCeD = [RFTCeDx; RFTCeDy; RFTCeDz]; syms RFTArGx RFTArGy RFTArGz real; RFTArG = [RFTArGx; RFTArGy; RFTArGz]; syms MFTAvGx MFTAvGy MFTAvGz real; MFTAvG = [MFTAvGx; MFTAvGy; MFTAvGz]; syms MFTCeDx MFTCeDy MFTCeDz real; MFTCeD = [MFTCeDx; MFTCeDy; MFTCeDz]; syms MFTArGx MFTArGy MFTArGz real; MFTArG = [MFTArGx; MFTArGy; MFTArGz]; %-------------------------------% % Reaction coxa-femur syms RCFAvGx RCFAvGy RCFAvGz real ; RCFAvG = [RCFAvGx; RCFAvGy; RCFAvGz]; syms RCFCeDx RCFCeDy RCFCeDz real; RCFCeD = [RCFCeDx; RCFCeDy; RCFCeDz]; syms RCFArGx RCFArGy RCFArGz real; RCFArG = [RCFArGx; RCFArGy; RCFArGz]; syms MCFAvGx MCFAvGy MCFAvGz real; MCFAvG = [MCFAvGx; MCFAvGy; MCFAvGz]; syms MCFCeDx MCFCeDy MCFCeDz real; MCFCeD = [MCFCeDx; MCFCeDy; MCFCeDz]; syms MCFArGx MCFArGy MCFArGz real; MCFArG = [MCFArGx; MCFArGy; MCFArGz]; %-------------------------------% % PGI %-------------------------------% g = 9.806E-3; prec = [eps;eps;eps].*rand(3,1); % Bras de levier en module des longueurs a = [0,80,100]; b = [0,0,0]; alpha = [pi/2,0,0]; for o = 1:3 HD(:,:,o) = [a;b;alpha]; end % Position des centre de masse dans les repere des membrures oCDMcorps = [0;0;0]; %oCDMtibia = [23;0;0]; oCDMtibia = [50;0;0]; oCDMfemur = [40;0;0]; oCDMcoxa = [0;0;0]; dRtibia(:,:) = [a(3);b(3);0]; dRfemur = [a(2);b(2);0]; dRcoxa = [a(1);b(1);0]; dRcorps = [106,0,-106;45,-118,45;0,0,0]; %-------------------------------% % PGI_hexapode %-------------------------------% % Position des extremite des pattes cas =1; if cas == 1 % Orthogonal pos = [106,0,-106;125,-198,125;-100,-100,-100]; elseif cas == 2 % extreme ortho pos = dRcorps + [0,0,0;150.71,-150.71,150.71;-70.711,-70.711,-70.711]; elseif cas == 3 % extreme total pos = dRcorps + [106,0,-106;106.57,-150.71,106.57;-70.711,-70.711,-70.711]; end %-------------------------------% Qcorps = eye(3); % Orientation du corps [art,Qhex,Phex] = PGI_hexapode(pos,HD,dRcorps,Qcorps); mTibia = 47; mFemur = 62; mCoxa = 75; mCorps = 580 + 413; mtot = 6*(mTibia+mFemur+mCoxa)+mCorps Wcoxa = Qcorps*[0;0;-mCoxa*g]; Wfemur = Qcorps*[0;0;-mFemur*g]; Wtibia = Qcorps*[0;0;-mTibia*g]; Wcorps = Qcorps*[0;0;-mCorps*g]; Wtot = Wcorps + 6*(Wcoxa+Wfemur+Wtibia); %-------------------------------% % Position des centre de masse dans le repere global LBcdmCAvG = Qcorps*dRcorps(:,1); LBcdmCCeD = Qcorps*dRcorps(:,2); LBcdmCArG = Qcorps*dRcorps(:,3); % Femur LCFcdmAvG = Phex(:,:,2,1)*oCDMfemur; LCFcdmCeD = Phex(:,:,2,2)*oCDMfemur; LCFcdmArG = Phex(:,:,2,3)*oCDMfemur; LFcdmTAvG = Phex(:,:,2,1)*(dRfemur-oCDMfemur); LFcdmTCeD = Phex(:,:,2,2)*(dRfemur-oCDMfemur); LFcdmTArG = Phex(:,:,2,3)*(dRfemur-oCDMfemur); LFAvG = Phex(:,:,2,1)*dRfemur; LFCeD = Phex(:,:,2,2)*dRfemur; LFArG = Phex(:,:,2,3)*dRfemur; % Tibia LFTcdmAvG = Phex(:,:,3,1)*oCDMtibia; LFTcdmCeD = Phex(:,:,3,2)*oCDMtibia; LFTcdmArG = Phex(:,:,3,3)*oCDMtibia; LTcdmNAvG = Phex(:,:,3,1)*(dRtibia-oCDMtibia); LTcdmNCeD = Phex(:,:,3,2)*(dRtibia-oCDMtibia); LTcdmNArG = Phex(:,:,3,3)*(dRtibia-oCDMtibia); LTAvG = Phex(:,:,3,1)*(dRtibia); LTCeD = Phex(:,:,3,2)*(dRtibia); LTArG = Phex(:,:,3,3)*(dRtibia); %-------------------------------% % Systeme d’equation %-------------------------------% % Globale %-------------------------------% % Force sur dirrection Z seulement NAvG(1:2) = [0;0]; NCeD(1:2) = [0;0]; NArG(1:2) = [0;0]; RBCAvG(1:2) = [0;0]; RBCCeD(1:2) = [0;0]; RBCArG(1:2) = [0;0]; RCFAvG(1:2) = [0;0]; RCFCeD(1:2) = [0;0]; RCFArG(1:2) = [0;0]; RFTAvG(1:2) = [0;0]; RFTCeD(1:2) = [0;0]; RFTArG(1:2) = [0;0]; % Moment en X et Y seulement MBCAvG(3) = 0; MBCCeD(3) = 0; MBCArG(3) = 0; MCFAvG(3) = 0; MCFCeD(3) = 0; MCFArG(3) = 0; MFTAvG(3) = 0; MFTCeD(3) = 0; MFTArG(3) = 0; % Contraintes globales SFGLOB = (Wcorps + 6*(Wcoxa + Wfemur + Wtibia) + NAvG + NCeD + NArG); SMGLOB = (cross(LBcdmCAvG+LFAvG+LTAvG,NAvG) + cross(LBcdmCCeD+LFCeD+LTCeD,NCeD) + cross(LBcdmCArG+LFArG+LTArG,NArG) + cross(LBcdmCAvG,Wcoxa) + cross(LBcdmCCeD,Wcoxa) + cross(LBcdmCArG,Wcoxa) + cross(LBcdmCAvG+LCFcdmAvG,Wfemur) + cross(LBcdmCCeD+LCFcdmCeD,Wfemur) + cross(LBcdmCArG+LCFcdmArG,Wfemur) + cross(LBcdmCAvG+LFAvG+LFTcdmAvG,Wtibia) + cross(LBcdmCCeD+LFCeD+LFTcdmCeD,Wtibia) + cross(LBcdmCArG+LFArG+LFTcdmArG,Wtibia)); % Resolution pour force de contact en Z n = solve(SFGLOB(3),SMGLOB(1),SMGLOB(2)); NAvGz = eval(n.NAvGz); NCeDz = eval(n.NCeDz); NArGz = eval(n.NArGz); check = NAvGz+NCeDz+NArGz; %-------------------------------------------------------------------% % Autres equations de contrainte interne % Corps B %-------------------------------% % Somme force SFB = RBCAvG + RBCCeD + RBCArG + Wcorps + 3*(Wcoxa + Wfemur + Wtibia) + prec; % Somme moment (bras de levier au cdm) SMB = (cross(LBcdmCAvG,RBCAvG) + cross(LBcdmCCeD,RBCCeD) + cross(LBcdmCArG,RBCArG) + MBCAvG + MBCCeD + MBCArG) + prec; %-------------------------------% % Patte %-------------------------------% % Coxa C % Somme force SFCAvG = (-RBCAvG + RCFAvG + Wcoxa) + prec; SFCCeD = (-RBCCeD + RCFCeD + Wcoxa) + prec; SFCArG = (-RBCArG + RCFArG + Wcoxa) + prec; % Somme moment (bras de levier au cdm) SMCAvG = (-MBCAvG + MCFAvG) + prec; SMCCeD = (-MBCCeD + MCFCeD) + prec; SMCArG = (-MBCArG + MCFArG) + prec; %-------------------------------% % Femur F % Somme force SFFAvG = (-RCFAvG + RFTAvG + Wfemur) + prec; SFFCeD = (-RCFCeD + RFTCeD + Wfemur) + prec; SFFArG = (-RCFArG + RFTArG + Wfemur) + prec; % Somme moment (bras de levier au cdm) SMFAvG = (cross(-LCFcdmAvG,-RCFAvG) + cross(LFcdmTAvG,RFTAvG) - MCFAvG + MFTAvG) + prec; SMFCeD = (cross(-LCFcdmCeD,-RCFCeD) + cross(LFcdmTCeD,RFTCeD) - MCFCeD + MFTCeD) + prec; SMFArG = (cross(-LCFcdmArG,-RCFArG) + cross(LFcdmTArG,RFTArG) - MCFArG + MFTArG) + prec; %-------------------------------% % Tibia T % Somme force SFTAvG = (-RFTAvG + NAvG + Wtibia) + prec; SFTCeD = (-RFTCeD + NCeD + Wtibia) + prec; SFTArG = (-RFTArG + NArG + Wtibia) + prec; % Somme moments (bras de levier au cdm) SMTAvG = (cross(-LFTcdmAvG,-RFTAvG) - MFTAvG + cross(LTcdmNAvG,NAvG))+ prec; SMTCeD = (cross(-LFTcdmCeD,-RFTCeD) - MFTCeD + cross(LTcdmNCeD,NCeD))+ prec; SMTArG = (cross(-LFTcdmArG,-RFTArG) - MFTArG + cross(LTcdmNArG,NArG))+ prec; %-------------------------------% % Resolution %-------------------------------% sol = solve(SFB(3),SMB(1),SMB(2),SFCAvG(3),SMCAvG(1),SMCAvG(2),SFFAvG(3),SMFAvG(1),SMFAvG(2),SFTAvG(3),SMTAvG(1),SMTAvG(2),SFCCeD(3),SMCCeD(1),SMCCeD(2),SFFCeD(3),SMFCeD(1),SMFCeD(2),SFTCeD(3),SMTCeD(1),SMTCeD(2),SFCArG(3),SMCArG(1),SMCArG(2),SFFArG(3),SMFArG(1),SMFArG(2),SFTArG(3),SMTArG(1),SMTArG(2)); NAvGz = eval(sol.NAvGz); NCeDz = eval(sol.NCeDz); NArGz = eval(sol.NArGz); check = NAvGz+NCeDz+NArGz; MBCAvGx = eval(sol.MBCArGx); MBCCeDx = eval(sol.MBCCeDx); MBCArGx = eval(sol.MBCAvGx); MBCArGy = eval(sol.MBCArGy); MBCCeDy = eval(sol.MBCCeDy); MBCArGy = eval(sol.MBCAvGy); MCFAvGx = eval(sol.MCFArGx); MCFCeDx = eval(sol.MCFCeDx); MCFArGx = eval(sol.MCFAvGx); MCFAvGy = eval(sol.MCFArGy); MCFCeDy = eval(sol.MCFCeDy); MCFArGy = eval(sol.MCFAvGy); MFTAvGx = eval(sol.MFTArGx); MFTCeDx = eval(sol.MFTCeDx); MFTArGx = eval(sol.MFTAvGx); MFTAvGy = eval(sol.MFTAvGy); MFTCeDy = eval(sol.MFTCeDy); MFTArGy = eval(sol.MFTArGy); RBCArGz = eval(sol.RBCArGz); RBCCeDz = eval(sol.RBCCeDz); RBCAvGz = eval(sol.RBCAvGz); RCFAvGz = eval(sol.RCFAvGz); RCFCeDz = eval(sol.RCFCeDz); RCFArGz = eval(sol.RCFArGz); RFTAvGz = eval(sol.RFTAvGz); RFTCeDz = eval(sol.RFTCeDz); RFTArGz = eval(sol.RFTArGz); MCFAvG_patte = Phex(:,:,2,1)'*MCFAvG; subs(MCFAvG_patte) MCFCeD_patte = Phex(:,:,2,2)'*MCFCeD; subs(MCFCeD_patte) MCFArG_patte = Phex(:,:,2,3)'*MCFArG; subs(MCFArG_patte) %-------------------------------% affichage = 1; if affichage == 1 figure; hold on; plot3([LBcdmCAvG(1),LBcdmCCeD(1),LBcdmCArG(1),LBcdmCAvG(1)],[LBcdmCAvG(2),LBcdmCCeD(2),LBcdmCArG(2),LBcdmCAvG(2)],[LBcdmCAvG(3),LBcdmCCeD(3),LBcdmCArG(3),LBcdmCAvG(3)],'k-'); plot3([0, LBcdmCAvG(1), LBcdmCAvG(1)+LFAvG(1), LBcdmCAvG(1)+LFAvG(1)+LTAvG(1)],[0, LBcdmCAvG(2), LBcdmCAvG(2)+LFAvG(2), LBcdmCAvG(2)+LFAvG(2)+LTAvG(2)],[0, LBcdmCAvG(3), LBcdmCAvG(3)+LFAvG(3), LBcdmCAvG(3)+LFAvG(3)+LTAvG(3)],'o-b'); plot3([0, LBcdmCCeD(1), LBcdmCCeD(1)+LFCeD(1), LBcdmCCeD(1)+LFCeD(1)+LTCeD(1)],[0, LBcdmCCeD(2), LBcdmCCeD(2)+LFCeD(2), LBcdmCCeD(2)+LFCeD(2)+LTCeD(2)],[0, LBcdmCCeD(3), LBcdmCCeD(3)+LFCeD(3), LBcdmCCeD(3)+LFCeD(3)+LTCeD(3)],'o-r'); plot3([0, LBcdmCArG(1), LBcdmCArG(1)+LFArG(1), LBcdmCArG(1)+LFArG(1)+LTArG(1)],[0, LBcdmCArG(2), LBcdmCArG(2)+LFArG(2), LBcdmCArG(2)+LFArG(2)+LTArG(2)],[0, LBcdmCArG(3), LBcdmCArG(3)+LFArG(3), LBcdmCArG(3)+LFArG(3)+LTArG(3)],'o-g'); % Femur plot3(LBcdmCAvG(1)+LCFcdmAvG(1), LBcdmCAvG(2)+LCFcdmAvG(2),LBcdmCAvG(3)+LCFcdmAvG(3),'xk'); plot3(LBcdmCCeD(1)+LCFcdmCeD(1), LBcdmCCeD(2)+LCFcdmCeD(2),LBcdmCCeD(3)+LCFcdmCeD(3),'xk'); plot3(LBcdmCArG(1)+LCFcdmArG(1), LBcdmCArG(2)+LCFcdmArG(2),LBcdmCArG(3)+LCFcdmArG(3),'xk'); % Tibia plot3(LBcdmCAvG(1)+LFAvG(1)+LFTcdmAvG(1),LBcdmCAvG(2)+LFAvG(2)+LFTcdmAvG(2), LBcdmCAvG(3)+LFAvG(3)+LFTcdmAvG(3),'xk'); plot3(LBcdmCCeD(1)+LFCeD(1)+LFTcdmCeD(1),LBcdmCCeD(2)+LFCeD(2)+LFTcdmCeD(2),LBcdmCCeD(3)+LFCeD(3)+LFTcdmCeD(3),'xk'); plot3(LBcdmCArG(1)+LFArG(1)+LFTcdmArG(1),LBcdmCArG(2)+LFArG(2)+LFTcdmArG(2),LBcdmCArG(3)+LFArG(3)+LFTcdmArG(3),'xk'); xlabel('X'); ylabel('Y'); zlabel('Z'); axis equal; % view(3) view([0,0,180]); % Affichage du cercle de contact [cC,r] = cercle3pts(pos(1:2,:)'); t = 0:0.01:2*pi+0.01; for o = 1:size(t,2) x(o) = cC(1) + r*cos(t(o)); y(o) = cC(2) + r*sin(t(o)); end plot3(x,y,ones(1,size(x,2))*pos(3,1),'c-'); plot3(cC(1),cC(2),pos(3,1),'c+'); % Affichage du cercle d’ancrage [cA,r] = cercle3pts(dRcorps(1:2,:)'); t = 0:0.01:2*pi+0.01; for o = 1:size(t,2) x(o) = cA(1) + r*cos(t(o)); y(o) = cA(2) + r*sin(t(o)); end plot3(x,y,ones(1,size(x,2))*pos(3,1),'m-'); plot3(cA(1),cA(2),pos(3,1),'m+'); distCentre = norm(cA-cC) end
-----