四自由度机械臂逆解中的问题

最近在做四自由度机械臂逆解的时候遇到一个问题,我用的是标准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');

在建立过程中没有考虑到机械臂各个关节存在角度限制,建立模型如图所示

img


但是实际机械臂由于角度限制,应该是下图这样

img


我是按没有角度限制的时候求的逆解,带入正逆解验证的时候也正确

img


1.想请问在不加角度限制时建立的dh求解出来的逆解是否正确。
另一个问题是,在四个角度都存在限制时,我的逆解应该如何处理才能做后只得到一组解下面是四个角度限制和逆解程序

img

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ᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

  1. 当没有考虑到机械臂各个关节存在角度限制时,使用标准DH法求解逆解是正确的。但是,实际机械臂由于角度限制,可能存在无法到达的位置或者姿态,这时需要对逆解进行限制。

  2. 当四个关节都存在角度限制时,可以考虑在求解逆解时加入角度限制的约束条件。具体而言,可以在逆解程序中加入如下的约束条件:

% 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_mint_max分别是每个关节的最小角度和最大角度。如果计算得到的逆解超出了角度限制范围,就将其限制在范围内。

需要注意的是,加入角度限制的约束条件可能会导致求解失败或者得到不稳定的逆解。在实际应用中,需要根据具体情况进行调整和优化。

另外,可以使用数值优化方法(如基于梯度的优化方法)来求解符合角度限制的逆解。这种方法可以通过定义逆解的目标函数和约束条件,使用数学优化算法来求解最优解。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先回答你的第一个问题,没有考虑机械臂各个关节存在角度限制时,用标准DH建立的机械臂模型的逆解结果并不一定正确。因为在实际应用中,机械臂各个关节是受到角度限制的,如果不考虑这些限制,逆解得到的解可能是不合法的,在实际控制中可能会导致机械臂无法运行或者运行异常。因此,在进行逆解求解时应该考虑到机械臂各个关节的角度限制。

对于你的第二个问题,如果机械臂各个关节存在角度限制,你的逆解应该通过限制条件进行筛选。具体做法是,在求解逆解时,先按照正常方法计算出所有可能的解(可以用你的代码实现),然后检查每个解是否在机械臂各个关节角度的限制范围内,如果不在限制范围内就舍弃该解,这样就可以得到符合角度限制的逆解。如果都不符合限制,那么说明该姿态无法达到。

下面是对你的代码中的一些问题的解答:

  1. 你的代码中只列出了四自由度机械臂的一组逆解,实际上一个姿态可能会有多组逆解,因此需要遍历所有可能的解进行筛选。

  2. 在检查逆解是否符合角度限制时,可以根据机械臂各个关节的物理限制进行限制,比如第一关节的限制范围是 [-180,180] 度,第二关节的限制范围是 [-120,120] 度等等,具体限制范围需要查询机械臂的设计资料。

  3. 实际应用中,为了保证机械臂稳定运行,逆解求解需要尽量避免奇异姿态,也就是机械臂在特定姿态下某些关节无法运动,或者一些关节运动范围极限接近。因此在筛选逆解时需要注意这一点。

下面是一个可能的解决方案,思路是遍历所有可能的解,然后检查是否符合角度限制。为了方便,这里假设机械臂各个关节都有相同的限制范围,即 [-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

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7746784
  • 除此之外, 这篇博客: 机器学习-过拟合、正则化、稀疏性、交叉验证概述中的 在机器学习中,我们将模型在训练集上的误差称之为训练误差,又称之为经验误差,在新的数据集(比如测试集)上的误差称之为泛化误差,泛化误差也可以说是模型在总体样本上的误差。对于一个好的模型应该是经验误差约等于泛化误差,也就是经验误差要收敛于泛化误差,根据霍夫丁不等式可知经验误差在一定条件下是可以收敛于泛化误差的。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读: