最近在做四自由度机械臂逆解的时候遇到一个问题,我用的是标准dh建立的机械臂,机械臂建立如下
% theta d a alpha
a1=0.101;a2=0.605;a3=0.2844;a4=0.4844;
L(1) = Link([0 0 a1 pi/2]);
L(2) = Link([0 0 a2 0]);
L(3) = Link([0 0 a3 0]);
L(4) = Link([0 0 a4 0]);
robot = SerialLink(L,'name','robot');
在建立过程中没有考虑到机械臂各个关节存在角度限制,建立模型如图所示
function [q] = ikine1(T)
a1=0.101;a2=0.605;a3=0.2844;a4=0.4844;
px=T(1,4);
py=T(2,4);
pz=T(3,4);
nx=T(1,1);
ny=T(2,1);
nz=T(3,1);
ax=T(1,3);
ay=T(2,3);
az=T(3,3);
ox=T(1,2);
oy=T(2,2);
oz=T(3,2);
t11=-atan2(py,-px)+atan2(0,+sqrt(px^2+py^2));
t12=-atan2(py,-px)+atan2(0,-sqrt(px^2+py^2));
t14_1=px*cos(t11)-a1+py*sin(t11)-ny*a4*sin(t11)-nx*a4*cos(t11);
t14_2=px*cos(t12)-a1+py*sin(t12)-ny*a4*sin(t12)-nx*a4*cos(t12);
t24_1=pz-a4*nz;
t24_2=pz-a4*nz;
flag1=4*a2^2*a3^2-(t14_1^2+t24_1^2-a2*a2-a3*a3)^2;
if flag1<0
flag1=-flag1;
end
flag2=4*a2^2*a3^2-(t14_2^2+t24_2^2-a2*a2-a3*a3)^2;
if flag2<0
flag2=-flag2;
end
t31=atan2(sqrt(flag1),t14_1^2+t24_1^2-a2*a2-a3*a3);
t32=atan2(-sqrt(flag1),t14_1^2+t24_1^2-a2*a2-a3*a3);
t33=atan2(sqrt(flag2),t14_2^2+t24_2^2-a2*a2-a3*a3);
t34=atan2(-sqrt(flag2),t14_2^2+t24_2^2-a2*a2-a3*a3);
t21=atan2(-a3*t14_1*sin(t31)+t24_1*(a3*cos(t31)+a2),t14_1*(a3*cos(t31)+a2)+a3*t24_1*sin(t31));
t22=atan2(-a3*t14_1*sin(t32)+t24_1*(a3*cos(t32)+a2),t14_1*(a3*cos(t32)+a2)+a3*t24_1*sin(t32));
t23=atan2(-a3*t14_2*sin(t33)+t24_2*(a3*cos(t33)+a2),t14_2*(a3*cos(t33)+a2)+a3*t24_2*sin(t33));
t24=atan2(-a3*t14_2*sin(t34)+t24_2*(a3*cos(t34)+a2),t14_2*(a3*cos(t34)+a2)+a3*t24_2*sin(t34));
t11_1=nx*cos(t11)+ny*sin(t11);
t11_2=nx*cos(t12)+ny*sin(t12);
t21_1=nz;
t21_2=nz;
t41=atan2(t21_1,t11_1)-t21-t31;
t42=atan2(t21_1,t11_1)-t22-t32;
t43=atan2(t21_2,t11_2)-t23-t33;
t44=atan2(t21_2,t11_2)-t24-t34;
q=[t11,t21,t31,t41;
t11,t22,t32,t42;
t12,t23,t33,t43;
t12,t24,t34,t44]*180/pi;
for i=1:4
for j=1:4
if q(i,j)<-180
q(i,j)=q(i,j)+360;
end
if q(i,j)>180
q(i,j)=q(i,j)-360;
end
end
end
end
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
当没有考虑到机械臂各个关节存在角度限制时,使用标准DH法求解逆解是正确的。但是,实际机械臂由于角度限制,可能存在无法到达的位置或者姿态,这时需要对逆解进行限制。
当四个关节都存在角度限制时,可以考虑在求解逆解时加入角度限制的约束条件。具体而言,可以在逆解程序中加入如下的约束条件:
% t_min和t_max分别是每个关节的最小角度和最大角度
if t(j) < t_min(j)
t(j) = t_min(j);
elseif t(j) > t_max(j)
t(j) = t_max(j);
end
其中,j
表示当前处理的关节编号,t_min
和t_max
分别是每个关节的最小角度和最大角度。如果计算得到的逆解超出了角度限制范围,就将其限制在范围内。
需要注意的是,加入角度限制的约束条件可能会导致求解失败或者得到不稳定的逆解。在实际应用中,需要根据具体情况进行调整和优化。
另外,可以使用数值优化方法(如基于梯度的优化方法)来求解符合角度限制的逆解。这种方法可以通过定义逆解的目标函数和约束条件,使用数学优化算法来求解最优解。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先回答你的第一个问题,没有考虑机械臂各个关节存在角度限制时,用标准DH建立的机械臂模型的逆解结果并不一定正确。因为在实际应用中,机械臂各个关节是受到角度限制的,如果不考虑这些限制,逆解得到的解可能是不合法的,在实际控制中可能会导致机械臂无法运行或者运行异常。因此,在进行逆解求解时应该考虑到机械臂各个关节的角度限制。
对于你的第二个问题,如果机械臂各个关节存在角度限制,你的逆解应该通过限制条件进行筛选。具体做法是,在求解逆解时,先按照正常方法计算出所有可能的解(可以用你的代码实现),然后检查每个解是否在机械臂各个关节角度的限制范围内,如果不在限制范围内就舍弃该解,这样就可以得到符合角度限制的逆解。如果都不符合限制,那么说明该姿态无法达到。
下面是对你的代码中的一些问题的解答:
你的代码中只列出了四自由度机械臂的一组逆解,实际上一个姿态可能会有多组逆解,因此需要遍历所有可能的解进行筛选。
在检查逆解是否符合角度限制时,可以根据机械臂各个关节的物理限制进行限制,比如第一关节的限制范围是 [-180,180] 度,第二关节的限制范围是 [-120,120] 度等等,具体限制范围需要查询机械臂的设计资料。
实际应用中,为了保证机械臂稳定运行,逆解求解需要尽量避免奇异姿态,也就是机械臂在特定姿态下某些关节无法运动,或者一些关节运动范围极限接近。因此在筛选逆解时需要注意这一点。
下面是一个可能的解决方案,思路是遍历所有可能的解,然后检查是否符合角度限制。为了方便,这里假设机械臂各个关节都有相同的限制范围,即 [-180,180] 度。
function [q] = ikine2(T)
a1=0.101;a2=0.605;a3=0.2844;a4=0.4844;
px=T(1,4);
py=T(2,4);
pz=T(3,4);
nx=T(1,1);
ny=T(2,1);
nz=T(3,1);
ax=T(1,3);
ay=T(2,3);
az=T(3,3);
ox=T(1,2);
oy=T(2,2);
oz=T(3,2);
t11=-atan2(py,-px)+atan2(0,+sqrt(px^2+py^2));
t12=-atan2(py,-px)+atan2(0,-sqrt(px^2+py^2));
t14_1=px*cos(t11)-a1+py*sin(t11)-ny*a4*sin(t11)-nx*a4*cos(t11);
t14_2=px*cos(t12)-a1+py*sin(t12)-ny*a4*sin(t12)-nx*a4*cos(t12);
t24_1=pz-a4*nz;
t24_2=pz-a4*nz;
flag1=4*a2^2*a3^2-(t14_1^2+t24_1^2-a2*a2-a3*a3)^2;
if flag1<0
flag1=-flag1;
end
flag2=4*a2^2*a3^2-(t14_2^2+t24_2^2-a2*a2-a3*a3)^2;
if flag2<0
flag2=-flag2;
end
t31=atan2(sqrt(flag1),t14_1^2+t24_1^2-a2*a2-a3*a3);
t32=atan2(-sqrt(flag1),t14_1^2+t24_1^2-a2*a2-a3*a3);
t33=atan2(sqrt(flag2),t14_2^2+t24_2^2-a2*a2-a3*a3);
t34=atan2(-sqrt(flag2),t14_2^2+t24_2^2-a2*a2-a3*a3);
t21=atan2(-a3*t14_1*sin(t31)+t24_1*(a3*cos(t31)+a2),t14_1*(a3*cos(t31)+a2)+a3*t24_1*sin(t31));
t22=atan2(-a3*t14_1*sin(t32)+t24_1*(a3*cos(t32)+a2),t14_1*(a3*cos(t32)+a2)+a3*t24_1*sin(t32));
t23=atan2(-a3*t14_2*sin(t33)+t24_2*(a3*cos(t33)+a2),t14_2*(a3*cos(t33)+a2)+a3*t24_2*sin(t33));
t24=atan2(-a3*t14_2*sin(t34)+t24_2*(a3*cos(t34)+a2),t14_2*(a3*cos(t34)+a2)+a3*t24_2*sin(t34));
t11_1=nx*cos(t11)+ny*sin(t11);
t11_2=nx*cos(t12)+ny*sin(t12);
t21_1=nz;
t21_2=nz;
t41=atan2(t21_1,t11_1)-t21-t31;
t42=atan2(t21_1,t11_1)-t22-t32;
t43=atan2(t21_2,t11_2)-t23-t33;
t44=atan2(t21_2,t11_2)-t24-t34;
q_all=[t11,t21,t31,t41;
t11,t22,t32,t42;
t12,t23,t33,t43;
t12,t24,t34,t44]*180/pi;
% 遍历所有解,判断是否符合角度限制
q=[];
for i=1:size(q_all,1)
flag=true;
for j=1:size(q_all,2)
if q_all(i,j)<-180 || q_all(i,j)>180
flag=false; % 角度超出限制
break;
end
end
if flag
q=[q;q_all(i,:)]; % 符合限制,添加解
end
end
end
需要注意的是,这里只考虑了机械臂各个关节有相同限制范围的情况,如果各个关节限制范围不同,需要修改遍历过程中的角度限制检查。此外,这里的代码也没有考虑奇异姿态的问题,需要在实际应用中进行改进。
如果我的回答解决了您的问题,请采纳!
机械臂运动学逆解
非常详细,可以借鉴下
https://blog.csdn.net/qq_39777417/article/details/96133017