robot.ikine函数得到的结果为空

robot.ikine函数得到的结果为空

ML1=Link([0, 0.4967, 0, 0, 0],'modified');
ML2=Link([-pi/2, 0.18804, 0.2, 3*pi/2, 0],'modified');
ML3=Link([0, 0.17248, 0.79876, 0, 0],'modified');
ML4=Link([0, 0.98557, 0.25126, 3*pi/2, 0],'modified');
ML5=Link([0, 0, 0, pi*2, 0],'modified');
ML6=Link([0, 0, 0, pi*2, 0],'modified');
robot=SerialLink([ML1 ML2 ML3 ML4 ML5 ML6],'name','Fanuc M20ia');

%给定末端执行器的初始位置
p1=[0.617222144   0.465154659  -0.634561241  -0.254420286
    -0.727874557  0.031367208  -0.684992502  -1.182407321
    -0.298723039  0.884673523   0.357934776  -0.488241553
    0             0             0             1];
p2=[-0.504697849   -0.863267623   -0.007006569   0.664185871
    -0.599843651    0.356504321   -0.716304589   -0.35718173
    0.620860432    -0.357314539   -0.697752567   2.106929688
    0               0              0             1 ];
robot.display();
init_ang=robot.ikine(p1);
targ_ang=robot.ikine(p2);

这样得到的init_ang和targ_ang是0x0的空变量,为什么?是MATLAB版本的问题吗?我是MATLAB R2022b

问题在于ikine方法不能保证总是能找到有效的解。当这种情况发生时,它会返回一个空的结果。
试试使用额外参数以及提供一个初始解:

% 提供一个接近目标姿态的初始解
init_guess = [0, -pi/4, 0, 0, 0, 0];

% 调整 ikine 参数,例如增加迭代次数
options = {'ilimit', 1000, 'alpha', 1e-6, 'stol', 1e-4, 'lambd', 0.1};

init_ang = robot.ikine(p1, init_guess, options);
targ_ang = robot.ikine(p2, init_guess, options);
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    可能的原因是输入的参数不符合函数的要求,或者机器人模型存在问题导致无法计算逆运动学解。具体的解决方案如下:

    1. 确认输入参数是否正确。robot.ikine函数需要输入机器人模型、末端位姿以及关节角度的初始猜测值。机器人模型需要提前建立并定义好。末端位姿可以直接给出或者从机器人的运动学模型中计算得到。关节角度的初始猜测值可以是一个向量或者一个矩阵。

    2. 如果输入参数正确无误,可以尝试调整IK解算器的参数。robot.ikine函数的默认解算器为'puma',也可以选择其他解算器,如'pinv'、'QD'等。可以通过修改解算器参数、设置约束条件等方式,尝试得到合适的IK解。

    3. 如果依然无法得到IK解,可以尝试使用其他IK求解函数。MATLAB提供了许多IK求解函数,如robot.ikcon、robot.ikunc等。这些函数可能适用于某些特殊的问题场景,可以尝试使用它们来得到IK解。

    4. 如果以上方法均无法解决问题,则有可能是机器人模型存在问题。可以检查机器人模型中的DH参数、连杆长度、旋转矩阵等参数是否正确定义,并与实际机器人模型进行对比。也可以尝试重新建立机器人模型,或者使用其他模型来计算IK解。

    下面是一个简单的示例代码,用于构建一个机器人模型,并计算其IK解:

    % 定义机器人模型
    L1 = Link('d', 0, 'a', 0, 'alpha', pi/2);
    L2 = Link('d', 0, 'a', 1, 'alpha', 0);
    L3 = Link('d', 0, 'a', 1, 'alpha', 0);
    L4 = Link('d', 0, 'a', 0, 'alpha', pi/2);
    L5 = Link('d', 0, 'a', 0, 'alpha', -pi/2);
    L6 = Link('d', 0, 'a', 0, 'alpha', 0);
    
    robot = SerialLink([L1 L2 L3 L4 L5 L6]);
    
    % 定义末端位姿和初始猜测值
    T = transl(1, 1, 1) * rpy2tr(pi/2, pi/3, pi/4);
    q0 = [0, 0, 0, 0, 0, 0];
    
    % 计算IK解
    [q, info] = robot.ikine(T, q0);
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^