其他分享
首页 > 其他分享> > 三轴机械臂/三自由度四足单腿DH正逆运动学及matlab验证

三轴机械臂/三自由度四足单腿DH正逆运动学及matlab验证

作者:互联网

实物模型

在这里插入图片描述

DH建立坐标系以及正逆运动学推导

在这里插入图片描述

Matlab验证

clear;
clc;
a1=-9.57*0.001;alpha1=pi/2;
a2=-59.2*0.001;
a3=-77*0.001;d3=44.6*0.001;
% 建立连杆系
%  theta    关节角度
%  d        连杆偏移量
%  a        连杆长度
%  alpha    连杆扭角
%  sigma    旋转关节为0,移动关节为1
%  mdh      标准的D&H为0,否则为1
%  offset   关节变量偏移量
%  qlim     关节变量范围[min max]
L1=Link([0 0 a1 alpha1 0]);
L2=Link([0 0 a2 0 0]);
L3=Link([0 d3 a3 0 0 0]);

% 机器人模型对象建立
Leg=SerialLink([L1 L2 L3],'name','single_leg');

xlim([-40,40])
ylim([-40,40])
zlim([0,60])
[theta1,theta2,theta3]=leg_ik(-0.023577,-0.0446,0.1); %单位米
% Leg.display;
theta=[theta1 theta2 theta3];
Leg.plot(theta);
% Leg.teach();

function [theta1,theta2,theta3] = leg_ik(end_x,end_y,end_z)
% 连杆偏置,注意正负,跟建立的坐标系有关
a1=-9.57*0.001;
a2=-59.2*0.001;
a3=-77*0.001;  d3=44.6*0.001;

L1 = sqrt(end_x^2+end_y^2);
Phi_1 = atan2(end_y,end_x);
% fprintf('Phi1=%f\n',Phi_1/pi*180);
% fprintf('atan2(d3/L1,sqrt(1-(d3/L1)^2)) = %f\n',atan2(d3/L1,sqrt(1-(d3/L1)^2))/pi*180);
theta1_1 = atan2(d3/L1,sqrt(1-(d3/L1)^2))+Phi_1 ;
theta1_2 = atan2(d3/L1,-sqrt(1-(d3/L1)^2))+Phi_1 ;
% fprintf('theat1_1=%f\t,theat1_2=%f\n',theta1_1/pi*180,theta1_2/pi*180);
theta1=theta1_2;
fprintf('theat1=%f\n',theta1/pi*180);

m=end_x*cos(theta1)+end_y*sin(theta1)-a1;
n=end_z;
% fprintf('m=%f,n=%f\n',m,n);
k=0.5*(m*m+n*n+a2*a2-a3*a3);
% fprintf('k=%f\n',k);
is_big =((m*a2)^2+(n*a2)^2) - k^2;
% fprintf('is_big =%f\n',is_big);
L2 = sqrt((n*a2)^2+(m*a2)^2);
% fprintf('L2=%f\n',L2);
Phi_2 = atan2(m*a2,n*a2);
% fprintf('Phi_2=%f\n',Phi_2/pi*180);
theta2_1 = atan2(k/L2,sqrt(1-(k/L2)^2))-Phi_2 ;
theta2_2 = atan2(k/L2,-sqrt(1-(k/L2)^2))-Phi_2;
% fprintf('theat2_1=%f,theat2_2=%f\n',theta2_1/pi*180,theta2_2/pi*180);
theta2 = theta2_1;
fprintf('theat2=%f\n',theta2/pi*180);

theta3= asin((end_z-a2*sin(theta2))/a3 ) - theta2;
fprintf('theat3=%f\n',theta3/pi*180);

% 运动学正解验算
x_test = a3*cos(theta1)*cos(theta2+theta3)+d3*sin(theta1)+a2*cos(theta1)*cos(theta2)+a1*cos(theta1);
y_test = a3*sin(theta1)*cos(theta2+theta3)-d3*cos(theta1)+a2*sin(theta1)*cos(theta2)+a1*sin(theta1);
z_test = a3*sin(theta2+theta3)+a2*sin(theta2);
fprintf('x_test=%f\t,y_test=%f\t,z_test=%f\n',x_test,y_test,z_test);
end

结果

在这里插入图片描述
在这里插入图片描述
通过正解验算逆解结果,发现跟输入完全吻合。

注意

这里有一个小坑,就是偏置a,开始的时候我以为是距离量,默认是正值,结果就一直逆解不正确,最后发现a(d也是一样)跟坐标系有关,要看第i-1坐标系到第i个坐标系的变换,是有正负号的,这一点坑了我好久,谨记!

标签:四足,theta2,单腿,theta1,end,DH,a2,fprintf,d3
来源: https://blog.csdn.net/blue_skyLZW/article/details/119304321