串联机械臂的逆解是一个求解多元非线性方程解的过程。当然,市面上的众多商业臂也都是采用符合pieper准则的构型,可以用解析法或者几何法直接推导出解析式,从而得到封闭解。
而对于不符合peiper准则的臂或者运动学冗余的臂,数值解也是不错的方法。当然,速度肯定是比不上解析法了,而且每次的解只有一个,且每次求解的结果都不一样,当然,好处就是在通用平台上,可以快速搭建机器人系统。
串联机器人运动学方程可写为:
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)(x−x0)+⋯+n!f(n)(x0)(x−x0)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)(x−x0)=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=x0−f’(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=xn−f’(xn)f(xn)
- 举例
f
(
x
)
=
x
3
−
6
x
,
取
x
0
=
1
f(x)=x^3−6x, 取 x_0=1
f(x)=x3−6x,取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=x0−x03−3x026x0−6=−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=x1−x13−3x126x1−6=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=x2−x23−3x226x2−6=−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=x3−x33−3x326x3−6=1.08594×10−10,f(x4)=−6.51564×10−10
- 应用在机器人运动学
给定
p
∈
R
m
p∈ℝ^m
p∈Rm 和初始猜测角度
Θ
0
∈
R
n
\Theta^0∈ℝ^n
Θ0∈Rn(
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]
p−f(Θi)=J(Θi)ΔΘ,J(Θi)=[J1,J2...,Jn]
J
(
Θ
i
)
J(\Theta^i)
J(Θi)为一阶偏导,即为雅可比矩阵。
左右同时左乘
J
−
1
(
Θ
i
)
J^{−1}(\Theta^i)
J−1(Θi) :
J
−
1
(
Θ
i
)
(
p
−
f
(
Θ
i
)
)
=
Δ
Θ
J^{−1}(\Theta^i)(p−f(\Theta^i))=\Delta\Theta
J−1(Θi)(p−f(Θi))=ΔΘ
设
‖
e
‖
<
ε
‖e‖<ε
‖e‖<ε (
ε
ε
ε 为迭代最小误差,如0.001):
e
=
(
p
−
f
(
Θ
i
)
)
e=(p−f(\Theta^i))
e=(p−f(Θ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+J−1(Θ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
- 实现:
- 求解
Θ
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] - 误差项
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=PB−PA=[xb−xayb−yazb−za]
姿态误差:以 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=Rbase2A−1∗Rbase2B
此时的 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}} erotA2B⇒eω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ω=Rbase2A∗eω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