复现KDL:使用Msnhnet实现串联机器人运动数值逆解(一)

串联机械臂的逆解是一个求解多元非线性方程解的过程。当然,市面上的众多商业臂也都是采用符合pieper准则的构型,可以用解析法或者几何法直接推导出解析式,从而得到封闭解。
符合peiper准则的puma560机械臂
而对于不符合peiper准则的臂或者运动学冗余的臂,数值解也是不错的方法。当然,速度肯定是比不上解析法了,而且每次的解只有一个,且每次求解的结果都不一样,当然,好处就是在通用平台上,可以快速搭建机器人系统。
7轴冗余机械臂kuka iiwa
串联机器人运动学方程可写为:
p = f ( Θ ) , Θ = [ θ 1 , θ 2 . . . θ n ] T p=f(\Theta), \Theta=[\theta_1,\theta_2...\theta_n]^T p=f(Θ),Θ=[θ1,θ2...θn]T
现已知 p p p ,求每个关节的转角 Θ \Theta Θ ,由于 f ( Θ ) f(\Theta) f(Θ)带有三角函数,是一个典型的多元非线性问题。可选用Newton Raphson迭代法作为求解方案。

1、Newton Raphson迭代法
把函数 f ( x ) f(x) f(x) x 0 x_0 x0 点某邻域内进行泰勒展开:
f ( x ) = f ( x 0 ) + f ’ ( x 0 ) ( x − x 0 ) 1 ! + ⋯ + f ( n ) ( x 0 ) ( x − x 0 ) n n ! + R n ( x ) f(x)=f(x_0)+\frac{f’(x_0)(x−x_0)}{1!}+⋯+\frac{f^{(n)}(x_0)(x−x_0)^n}{n!}+R_n(x) f(x)=f(x0)+1!f(x0)(xx0)++n!f(n)(x0)(xx0)n+Rn(x)
取线性部分(泰勒展开前两项),令其等于0作为 f ( x ) = 0 f(x)=0 f(x)=0 的近似方程:
f ( x 0 ) + f ’ ( x 0 ) ( x − x 0 ) = 0 f(x_0)+f’(x_0)(x−x_0)=0 f(x0)+f(x0)(xx0)=0
f ’ ( x 0 ) ≠ 0 f’(x_0)≠0 f(x0)=0, 则其解为:
x 1 = x 0 − f ( x 0 ) f ’ ( x 0 ) x_1=x_0−\frac{f(x_0)}{f’(x_0)} x1=x0f(x0)f(x0)
得到迭代关系式:
x n + 1 = x n − f ( x n ) f ’ ( x n ) x_{n+1}=x_n−\frac{f(x_n)}{f’(x_n)} xn+1=xnf(xn)f(xn)
- 举例
f ( x ) = x 3 − 6 x , 取 x 0 = 1 f(x)=x^3−6x, 取 x_0=1 f(x)=x36x,x0=1
在这里插入图片描述

x 1 = x 0 − x 0 3 − 6 x 0 3 x 0 2 − 6 = − 2 3 , f ( x 1 ) = 100 27 x_1=x_0−x_0^3−\frac{6x_0}{3x_0^2}−6=−\frac{2}{3}, f(x_1)=\frac{100}{27} x1=x0x033x026x06=32,f(x1)=27100

x 2 = x 1 − x 1 3 − 6 x 1 3 x 1 2 − 6 = 8 63 , f ( x 2 ) = 0.759857 x_2=x_1−x_1^3−\frac{6x_1}{3x_1^2}−6=\frac{8}{63}, f(x_2)=0.759857 x2=x1x133x126x16=638,f(x2)=0.759857

x 3 = x 2 − x 2 3 − 6 x 2 3 x 2 2 − 6 = − 0.000688086 , f ( x 3 ) = 0.00412852 x_3=x_2−x_2^3−\frac{6x_2}{3x_2^2}−6=−0.000688086,f(x_3)=0.00412852 x3=x2x233x226x26=0.000688086,f(x3)=0.00412852

x 4 = x 3 − x 3 3 − 6 x 3 3 x 3 2 − 6 = 1.08594 × 1 0 − 10 , f ( x 4 ) = − 6.51564 × 1 0 − 10 x_4=x_3−x_3^3−\frac{6x_3}{3x_3^2}−6=1.08594×10^{−10},f(x_4)=−6.51564×10^{−10} x4=x3x333x326x36=1.08594×1010,f(x4)=6.51564×1010

- 应用在机器人运动学
给定 p ∈ R m p∈ℝ^m pRm 和初始猜测角度 Θ 0 ∈ R n \Theta^0∈ℝ^n Θ0Rn( m m m 为空间自由度, n n n 为关节数):
p = f ( Θ ) = f ( Θ i ) + ∂ f ∂ Θ ∣ Θ i ( Θ − Θ i ) + R n ( Θ ) p=f(\Theta)=f(\Theta^i)+\frac{\partial{f}}{\partial{\Theta}}|_{\Theta^i}(\Theta−\Theta^i)+R_n(\Theta) p=f(Θ)=f(Θi)+ΘfΘi(ΘΘi)+Rn(Θ)
可写成:
p − f ( Θ i ) = J ( Θ i ) Δ Θ , J ( Θ i ) = [ J 1 , J 2 . . . , J n ] p−f(\Theta^i)=J(\Theta^i)\Delta\Theta , J(\Theta^i)=[J_1,J_2...,J_n] pf(Θi)=J(Θi)ΔΘ,J(Θi)=[J1,J2...,Jn]
J ( Θ i ) J(\Theta^i) J(Θi)为一阶偏导,即为雅可比矩阵。
左右同时左乘 J − 1 ( Θ i ) J^{−1}(\Theta^i) J1(Θi) :
J − 1 ( Θ i ) ( p − f ( Θ i ) ) = Δ Θ J^{−1}(\Theta^i)(p−f(\Theta^i))=\Delta\Theta J1(Θi)(pf(Θi))=ΔΘ
‖ e ‖ < ε ‖e‖<ε e<ε ( ε ε ε 为迭代最小误差,如0.001):
e = ( p − f ( Θ i ) ) e=(p−f(\Theta^i)) e=(pf(Θi))

Δ Θ = Θ i + 1 − Θ i \Delta\Theta=\Theta^{i+1}-\Theta^{i} ΔΘ=Θi+1Θi
得到:
Θ i + 1 = Θ i + J − 1 ( Θ i ) e \color{red}{\Theta^{i+1}=\Theta^i+J^{-1}(\Theta^i)e } Θi+1=Θi+J1(Θi)e
如果雅可比矩阵不是方阵或机器人位于奇异点,此时用雅可比矩阵的伪逆 J † ( Θ i ) J^†(\Theta^i) J(Θi) .伪逆进行计算.可写成:
Θ i + 1 = Θ i + J † ( Θ i ) e \color{red}{\Theta^{i+1}=\Theta^i+J^†(\Theta^i)e } Θi+1=Θi+J(Θi)e
- 实现:

  1. 求解 Θ i \Theta^{i} Θi 处雅克比矩阵:
    Θ i = [ θ 1 i , θ 2 i . . . θ n i ] \Theta^{i}=[\theta_1^i,\theta_2^i...\theta_n^i] Θi=[θ1i,θ2i...θni]为单位角速度或线速度1时,每个关节对末端的速度旋量
    J i = T w i s t i = [ v x i , v y i , v z i , r x i , r y i , r z i ] T J ( Θ i ) = [ J 1 , J 2 . . . , J n ] J_i=Twist_i=[v_{x_i},v_{y_i},v_{z_i},r_{x_i},r_{y_i},r_{z_i}]^T \\J(\Theta^i)=[J_1,J_2...,J_n] Ji=Twisti=[vxi,vyi,vzi,rxi,ryi,rzi]TJ(Θi)=[J1,J2...,Jn]
  2. 误差项 e e e 的求取:

    e = [ e p e ω ] = [ Δ x Δ y Δ z Δ r x Δ r y Δ r z ] e=[\begin{matrix}e_p&e_\omega\end{matrix}]=[\begin{matrix}\Delta x&\Delta y&\Delta z&\Delta rx&\Delta ry&\Delta rz\end{matrix}] e=[epeω]=[ΔxΔyΔzΔrxΔryΔrz]
    位置误差: e p = P B − P A = [ x b − x a y b − y a z b − z a ] e_p=P_B−P_A=[\begin{matrix}x_b−x_a&y_b−y_a&z_b−z_a\end{matrix}] ep=PBPA=[xbxaybyazbza]
    姿态误差:以 A A A为参考, A A A B B B的姿态误差
    e r o t A 2 B = R b a s e 2 A − 1 ∗ R b a s e 2 B e_{rot_{A2B}}=R_{base2A}^{−1}∗R_{base2B} erotA2B=Rbase2A1Rbase2B
    此时的 e r o t A 2 B e_{rot_{A2B}} erotA2B 需要把旋转矩阵表示成轴角的形式:
    e r o t A 2 B ⇒ e ω A 2 B e_{rot_{A2B}} \Rightarrow e_{\omega_{A2B}} erotA2BeωA2B
    最后将 e ω A 2 B e_{ω_{A2B}} eωA2B得转换到基于基座标 b a s e base base 为参考的姿态误差:
    e ω = R b a s e 2 A ∗ e ω A 2 B e_ω=R_{base2A}∗e_{ω_{A2B}} eω=Rbase2AeωA2B

- 代码实现:源码

int Chain::ikNewton(const Frame &desireFrame, VectorXSDS &outJoints, int maxIter, double eps)
{

    if(outJoints.mN != _numOfJoints)
    {
        return -2;
    }

    Frame frame;
    Twist dtTwist;
    MatSDS jac(_numOfJoints,6);

    for (int i = 0; i < maxIter; ++i)
    {

        frame = fk(joints);

        dtTwist = Frame::diff(frame, desireFrame);  

        if(dtTwist.closeToEps(eps))
        {

            outJoints = joints;
            return i;
        }

        jacobi(jac,joints);

        MatSDS dtJoints = jac.pseudoInvert()*dtTwist.toMat(); 

        for (int i = 0; i < joints.mN; ++i)
        {
            joints[i] = joints[i] + dtJoints[i];
        }
    }
    return -1;
}

- 结果:
对比Msnhnet实现和KDL实现,使用puma560机器人模型,分别测试约20万组点,在0点开始迭代,结果如下。Msnhnet成功率为96.02%, 单次求解速率为114us,KDL成功率为96.11%,单次求解速率为135us。(Win10 I7 10700KF)
在这里插入图片描述
在这里插入图片描述
- 后续:
后面会采用trac_ik的求解方案进行优化,欢迎继续关注。

- 最后
欢迎关注Msnhnet框架,它是一个深度学习推理框架,也会慢慢变成一个机器人+视觉一体的框架
Msnhnet
知乎介绍

机器人学建模、规划与控制.Bruno Siciliano
现代机器人学:机构、规划与控制. Kevin M. Lynch.
机器人操作的数学导论.李泽湘
机器人学导论。John J. Craig

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值