概述
雅克比矩阵
J
(
q
)
J(q)
J(q)是从关节空间向操作空间的速度传递的线性关系,借助于机械原理中的概念,可以理解为广义传动比。
对于
n
n
n个关节的机器人,其雅克比矩阵是
6
×
n
6\times n
6×n阶矩阵。其中前3行代表机器人末端坐标系线速度
v
v
v的传递比;后3行代表对手爪的角速度
ω
\omega
ω的传递比。另一方面,每一列代表相应的关节速度对末端坐标系线速度和角速度的传递比。因此,可将雅克比矩阵分块,即
[
v
ω
]
=
[
J
l
1
J
l
2
⋅
⋅
⋅
J
l
n
J
a
1
J
a
2
⋅
⋅
⋅
J
a
n
]
[
q
1
q
2
q
˙
1
q
˙
2
⋅
⋅
⋅
q
˙
n
]
(1)
\left[ \begin{matrix} v\\ \omega \end{matrix} \right] = \left[ \begin{matrix} J_{l1} & J_{l2} & \cdot\cdot\cdot & J_{ln}\\ J_{a1} & J_{a2} & \cdot\cdot\cdot & J_{an} \end{matrix} \right] \left[ \begin{matrix} q_1\\ q_2\\ \dot q_1\\ \dot q_2\\ \cdot \\ \cdot \\ \cdot \\ \dot q_n\\ \end{matrix} \right] \tag{1}
[vω]=[Jl1Ja1Jl2Ja2⋅⋅⋅⋅⋅⋅JlnJan]⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡q1q2q˙1q˙2⋅⋅⋅q˙n⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(1)
雅克比矩阵的构造
微分运动和广义速度
刚体或坐标系的微分运动包含微分移动矢量 d d d和微分转动矢量 δ \delta δ。前者由沿三个坐标轴的微分移动组成,后者由绕三坐标轴的微分转动组成。将两者合并为6维列矢量 D D D,称为刚体或坐标系的微分运动矢量。 D = [ d δ ] (2) D=\left[ \begin{matrix} d\\ \delta\\ \end{matrix} \right] \tag{2} D=[dδ](2) 相应地,刚体或坐标系的广义速度 V V V是由线速度 v v v和角速度 ω \omega ω组成的6维列矢量。即 V = D ˙ = [ d ˙ δ ˙ ] (3) V=\dot D=\left[ \begin{matrix} \dot d\\ \dot\delta\\ \end{matrix} \right] \tag{3} V=D˙=[d˙δ˙](3) 微分运动矢量D和广义速度V也是相对于某坐标系而言的,在不同坐标系中表达式不同。若坐标系{T}相对于基坐标系的齐次变换矩阵为 T = [ n x o x a x p x n y o y a y p y n z o z a z p z 0 0 0 1 ] = [ n o a p ] (4) T=\left[ \begin{matrix} n_x & o_x & a_x & p_x \\ n_y & o_y & a_y & p_y \\ n_z & o_z & a_z & p_z \\ 0& 0& 0& 1\\ \end{matrix} \right] = \left[ \begin{matrix} n & o & a & p \\ \end{matrix} \right]\tag{4} T=⎣⎢⎢⎡nxnynz0oxoyoz0axayaz0pxpypz1⎦⎥⎥⎤=[noap](4) 则坐标系{T}中的微分运动 T D {^T}D TD和基坐标系中的微分运动 D D D之间的关系为: T D = [ n x n y a x ( p × n ) x ( p × n ) y ( p × n ) z o x o y o z ( p × o ) x ( p × o ) y ( p × o ) z a x a y a z ( p × a ) x ( p × a ) y ( p × a ) z 0 0 0 n x n y a x 0 0 0 o x o y o z 0 0 0 a x a y a z ] D (5) {^T}D = \left[ \begin{matrix} n_x & n_y & a_x & (p\times n)_x & (p\times n)_y & (p\times n)_z \\ o_x & o_y & o_z & (p\times o)_x & (p\times o)_y & (p\times o)_z\\ a_x & a_y & a_z & (p\times a)_x & (p\times a)_y & (p\times a)_z\\ 0& 0& 0& n_x & n_y & a_x\\ 0& 0& 0& o_x & o_y & o_z\\ 0& 0 & 0& a_x & a_y & a_z\\ \end{matrix} \right] D\tag{5} TD=⎣⎢⎢⎢⎢⎢⎢⎡nxoxax000nyoyay000axozaz000(p×n)x(p×o)x(p×a)xnxoxax(p×n)y(p×o)y(p×a)ynyoyay(p×n)z(p×o)z(p×a)zaxozaz⎦⎥⎥⎥⎥⎥⎥⎤D(5) 上式简写为 T D = [ R T − R T S ( p ) 0 R T ] D (6) {^T}D = \left[ \begin{matrix} R^T & -R^TS(p) \\ 0 & R^T\\ \end{matrix} \right] D\tag{6} TD=[RT0−RTS(p)RT]D(6) 其中 R = [ n x o x a x n y o y a y n z o z a z ] (7) R=\left[ \begin{matrix} n_x & o_x & a_x \\ n_y & o_y & a_y \\ n_z & o_z & a_z \end{matrix} \right] \tag{7} R=⎣⎡nxnynzoxoyozaxayaz⎦⎤(7) 反对称矩阵 S ( p ) S(p) S(p)定义为 S ( p ) = [ 0 − p z p y p z 0 p x − p y p x 0 ] (8) S(p)=\left[ \begin{matrix} 0& -p_z & p_y \\ p_z & 0 & p_x \\ -p_y & p_x & 0 \end{matrix} \right] \tag{8} S(p)=⎣⎡0pz−py−pz0pxpypx0⎦⎤(8) 类似的,任意两坐标系{A}和{B}之间微分运动的坐标变换为 B D = [ B R T − A B R T S ( B p B O ) 0 A B R T ] A D (9) {^B}D = \left[ \begin{matrix} {^B}R^T & -{^B_A}R^TS({^B}p_{BO}) \\ 0 & {^B_A}R^T\\ \end{matrix} \right] {^A}D\tag{9} BD=[BRT0−ABRTS(BpBO)ABRT]AD(9)
微分变换法
下面采用构造性的方法,不需要求导而直接构造出
J
l
i
J_{li}
Jli和
J
a
i
J_{ai}
Jai。
以六自由度机械臂为例。
- 首先计算出各连杆变换矩阵 1 0 T {^0_1}T 10T、 2 1 T {^1_2}T 21T、 3 2 T {^2_3}T 32T、 4 3 T {^3_4}T 43T、 5 4 T {^4_5}T 54T、 6 5 T {^5_6}T 65T。
- 然后利用公式 i − 1 i T = [ i i − 1 R T i i − 1 R T i − 1 P B O 0 1 ] (n) {^i_{i-1}}T = \left[ \begin{matrix} {^{i-1}_i}R^T & {^{i-1}_i}R^T {^{i-1}}P_{BO}\\ 0 & 1 \\ \end{matrix} \right] \tag{n} i−1iT=[ii−1RT0ii−1RTi−1PBO1](n)计算得 0 1 T {^1_0}T 01T、 1 2 T {^2_1}T 12T、 2 3 T {^3_2}T 23T、 3 4 T {^4_3}T 34T、 4 5 T {^5_4}T 45T、 5 6 T {^6_5}T 56T。
- 依次计算末端坐标系在各连杆坐标系中的变化矩阵 0 6 T {^6_0}T 06T、 1 6 T {^6_1}T 16T、 2 6 T {^6_2}T 26T、 3 6 T {^6_3}T 36T、 4 6 T {^6_4}T 46T、 5 6 T {^6_5}T 56T。
- 利用公式9计算微分运动变化矩阵。
- 若关节
i
i
i为直线运动,则取微分运动变化矩阵的第三列作为雅克比矩阵的第
i
i
i列;
若关节 i i i为旋转运动,则取微分运动变化矩阵的第六列作为雅克比矩阵的第 i i i列;
对于六自由度机械臂而言,显然取微分运动变化矩阵的第六列作为雅克比矩阵的第 i i i列。
至此,构造出机器人的雅克比矩阵。
MATLAB实现
function J = calJacobi(DH_parameter)
% 计算雅克比矩阵
% DH_parameter:DH参数表;
[dim_row, dim_col] = size(DH_parameter);
J = zeros(6, dim_row);
for i = 1 : dim_row
T = calT(DH_parameter, i - 1, dim_row);
R = T(1:3, 1:3);
P = T(1:3, 4);
DiffM = [R', -R' * antiSymMatrix(P); zeros(3, 3), R'];
J(:, i) = DiffM(:, 6);
end