罗德里格斯公式附图推导,理解

罗德里格斯公式,将3D旋转表达成了 ( n ∧ , θ ) (n^{\wedge}, \theta) (n,θ)的形式,一般记作 ω = θ ∗ n = ( ω x , ω y , ω z ) T \omega = \theta * n = \left(\omega_{x}, \omega_{y}, \omega_{z}\right)^{T} ω=θn=(ωx,ωy,ωz)T
两种表达:
R = [ I + ( 1 − cos ⁡ ( θ ) ) ∗ N 2 + sin ⁡ ( θ ) ∗ N ] R = [I+(1-\cos (\theta)) * N^{2}+\sin (\theta) * N] R=[I+(1cos(θ))N2+sin(θ)N]

R = cos ⁡ ( θ ) ∗ I + ( 1 − cos ⁡ ( θ ) ) ∗ n ∗ n T + sin ⁡ ( θ ) ∗ n R = \cos (\theta) * I+(1-\cos (\theta)) * n * n^{T}+\sin (\theta) * n R=cos(θ)I+(1cos(θ))nnT+sin(θ)n

一,基础准备

1. 旋转矩阵

R = [ r x x r x y r x z r y x r y y r y z r z x r z y r z z ] R=\left[\begin{array}{lll}{r_{x x}} & {r_{x y}} & {r_{x z}} \\ {r_{y x}} & {r_{y y}} & {r_{y z}} \\ {r_{z x}} & {r_{z y}} & {r_{z z}}\end{array}\right] R=rxxryxrzxrxyryyrzyrxzryzrzz
R矩阵是标准正交矩阵,用于基向量之间的刚性变换。满足

  • R T R = R − 1 R = E R^{T} R=R^{-1} R=E RTR=R1R=E
  • ∣ R ∣ = 1 |R|=1 R=1

2. 旋转向量

用一个单位向量n和旋转角度 θ \theta θ来表示旋转的过程。默认向量是列向量

n = [ n 1 n 2 n 3 ] n=\left[\begin{array}{l}{n_{1}} \\ {n_{2}} \\ {n_{3}}\end{array}\right] n=n1n2n3

  • n 1 2 + n 2 2 + n 3 2 = 1 n_{1}^{2}+n_{2}^{2}+n_{3}^{2}=1 n12+n22+n32=1

3. 向量叉积

在这里插入图片描述
图片来源:https://www.mathsisfun.com/algebra/vectors-cross-product.html
两个向量的叉积可以写成一个反对称矩阵与一个向量的点积
a = [ a 1 a 2 a 3 ] a=\left[\begin{array}{l}{a_{1}} \\ {a_{2}} \\ {a_{3}}\end{array}\right] a=a1a2a3

a ∧ = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] = A a^{\wedge}=\left[\begin{array}{ccc}{0} & {-a_{3}} & {a_{2}} \\ {a_{3}} & {0} & {-a_{1}} \\ {-a_{2}} & {a_{1}} & {0}\end{array}\right]=A a=0a3a2a30a1a2a10=A

a × b = [ a 2 b 3 − a 3 b 2 − a 1 b 3 + a 3 b 1 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] ∗ [ b 1 b 2 b 3 ] = A ∗ a a \times b=\left[\begin{array}{c}{a_{2} b_{3}-a_{3} b_{2}} \\ {-a_{1} b_{3}+a_{3} b_{1}} \\ {a_{1} b_{2}-a_{2} b_{1}}\end{array}\right]=\left[\begin{array}{ccc}{0} & {-a_{3}} & {a_{2}} \\ {a_{3}} & {0} & {-a_{1}} \\ {-a_{2}} & {a_{1}} & {0}\end{array}\right] *\left[\begin{array}{l}{b_{1}} \\ {b_{2}} \\ {b_{3}}\end{array}\right]=A * a a×b=a2b3a3b2a1b3+a3b1a1b2a2b1=0a3a2a30a1a2a10b1b2b3=Aa
所以两个向量叉积可以写成一个反对称矩阵与向量的点积 乘积
a × b = a ∧ ∗ b a \times b=a^{\wedge} * b a×b=ab

二,公式推导

1.符号说明与图例

名称符号
旋转向量 n n n
旋转向量的反对称矩阵形式 n ∧ o r N n^{\wedge} or N norN
旋转角度 θ \theta θ
旋转点P
OP向量 v v v
v旋转 θ \theta θ后的向量 v ′ v^{'} v
v在旋转平面的投影 v ⊥ v_{\perp} v
v在旋转轴的投影 v ∥ v_{\parallel} v
v旋转 θ \theta θ后旋转平面的分量 v ⊥ ′ v_{\perp}^{'} v
v旋转 θ \theta θ后在n的分量 v ∥ ′ v_{\parallel}^{'} v
w向量,垂直与n向量与v向量的平面, w与n向量与v向量都正交
v方向的单位向量$\frac{v}{\leftv\right

在这里插入图片描述

2. 公式推导

空间中的一个点P,构成向量 v = O P → v=\overrightarrow{O P} v=OP ,则分解后有

v = v ⊥ + v ∥ v = v_{\perp} + v_{\parallel} v=v+v
同理旋转后的向量 v ′ = v ⊥ ′ + v ∥ ′ v' = v_{\perp}^{'} + v_{\parallel}^{'} v=v+v
显然 v ∥ = v ∥ ′ v_{\parallel} = v_{\parallel}^{'} v=v
所以 v ′ = v ⊥ ′ + v ∥ v^{'} = v_{\perp}^{'} + v_{\parallel} v=v+v
定义一个向量w
w = n × v w=n \times v w=n×v
根据几何意义,w的模长就是黄色阴影的的面积。即
∣ w ∣ = ∣ n × v ∣ |w|=|n \times v| w=n×v
这部分面积也可以看成平行四边形面积公式底乘以高,因为n向量的模长是1,高就是 ∣ v ⊥ ∣ |v_{\perp}| v
所以 ∣ w ∣ = ∣ n × v ∣ = ∣ v ⊥ ∣ |w|=|n \times v|=|v_{\perp}| w=n×v=v
而由于 n × w n \times w n×w v ⊥ v_{\perp} v方向相反
至此我们可以用n与v向量表示出v的两个投影的分量,即
v ⊥ = − n × w = − n × ( n × v ) v_{\perp}=-n \times w=-n \times(n \times v) v=n×w=n×(n×v)

v ∥ = v − v ⊥ = v + n × ( n × v ) v_{\parallel}=v-v_{\perp}=v+n \times(n \times v) v=vv=v+n×(n×v)
我们现在讲v’表示出来
v ⊥ ′ = ∣ v ⊥ ∣ ∗ [ cos ⁡ ( θ ) ∗ v ⊥ ∣ v ⊥ ∣ + sin ⁡ ( θ ) ∗ w ∣ w ∣ ] = cos ⁡ ( θ ) ∗ v ⊥ + sin ⁡ ( θ ) ∗ ∣ v ⊥ ∣ ∗ w ∣ w ∣ = cos ⁡ ( θ ) ∗ v ⊥ + sin ⁡ ( θ ) ∗ w \begin{aligned} v_{\perp}^{\prime} &=\left|v_{\perp}\right| *\left[\cos (\theta) * \frac{v_{\perp}}{\left|v_{\perp}\right|}+\sin (\theta) * \frac{w}{|w|}\right] \\ &=\cos (\theta) * v_{\perp}+\sin (\theta) *\left|v_{\perp}\right| * \frac{w}{|w|} \\ &=\cos (\theta) * v_{\perp}+\sin (\theta) * w \end{aligned} v=v[cos(θ)vv+sin(θ)ww]=cos(θ)v+sin(θ)vww=cos(θ)v+sin(θ)w

v ⊥ ′ = cos ⁡ ( θ ) ∗ v ⊥ + sin ⁡ ( θ ) ∗ w \begin{aligned} v_{\perp}^{\prime} = \cos (\theta) * v_{\perp}+\sin (\theta) * w \end{aligned} v=cos(θ)v+sin(θ)w
将上式子带入
v ′ = v / / + v ⊥ ′ = ( v − v ⊥ ) + cos ⁡ ( θ ) ∗ v ⊥ + sin ⁡ ( θ ) ∗ w = v + ( cos ⁡ ( θ ) − 1 ) ∗ v ⊥ + sin ⁡ ( θ ) ∗ w = v + ( 1 − cos ⁡ ( θ ) ) ∗ n × ( n × v ) + sin ⁡ ( θ ) ∗ n × v = v + ( 1 − cos ⁡ ( θ ) ) ∗ n ∧ ∗ ( n ∧ ∗ v ) + sin ⁡ ( θ ) ∗ n ∧ ∗ v = v + ( 1 − cos ⁡ ( θ ) ) ∗ N ∗ N ∗ v + sin ⁡ ( θ ) ∗ N ∗ v = v + ( 1 − cos ⁡ ( θ ) ) ∗ N 2 ∗ v + sin ⁡ ( θ ) ∗ N ∗ v = [ I + ( 1 − cos ⁡ ( θ ) ) ∗ N 2 + sin ⁡ ( θ ) ∗ N ] ∗ v \begin{aligned} v^{\prime} &=v_{/ /}+v_{\perp}^{\prime} \\ &=\left(v-v_{\perp}\right)+\cos (\theta) * v_{\perp}+\sin (\theta) * w \\ &=v+(\cos (\theta)-1) * v_{\perp}+\sin (\theta) * w \\ &=v+(1-\cos (\theta)) * n \times(n \times v)+\sin (\theta) * n \times v \\ &=v+(1-\cos (\theta)) * n^{\wedge} * (n^{\wedge} * v)+\sin (\theta) * n^{\wedge} * v \\ &=v+(1-\cos (\theta)) * N * N * v+\sin (\theta) * N * v \\ &=v+(1-\cos (\theta)) * N^{2} * v+\sin (\theta) * N * v \\ &=\left[I+(1-\cos (\theta)) * N^{2}+\sin (\theta) * N\right] * v \end{aligned} v=v//+v=(vv)+cos(θ)v+sin(θ)w=v+(cos(θ)1)v+sin(θ)w=v+(1cos(θ))n×(n×v)+sin(θ)n×v=v+(1cos(θ))n(nv)+sin(θ)nv=v+(1cos(θ))NNv+sin(θ)Nv=v+(1cos(θ))N2v+sin(θ)Nv=[I+(1cos(θ))N2+sin(θ)N]v

至此我们就可以得到:
v ′ = [ I + ( 1 − cos ⁡ ( θ ) ) ∗ N 2 + sin ⁡ ( θ ) ∗ N ] ∗ v v^{'} = [I+(1-\cos (\theta)) * N^{2}+\sin (\theta) * N]* v v=[I+(1cos(θ))N2+sin(θ)N]v
所以 R = [ I + ( 1 − cos ⁡ ( θ ) ) ∗ N 2 + sin ⁡ ( θ ) ∗ N ] R = [I+(1-\cos (\theta)) * N^{2}+\sin (\theta) * N] R=[I+(1cos(θ))N2+sin(θ)N]
有些地方习惯用n来表示,那么继续推导
n ∗ n T = [ n 1 2 n 1 n 2 n 1 n 3 n 1 n 2 n 2 2 n 2 n 3 n 1 n 3 n 2 n 3 n 3 2 ] n * n^{T}=\left[\begin{array}{ccc}{n_{1}^{2}} & {n_{1} n_{2}} & {n_{1} n_{3}} \\ {n_{1} n_{2}} & {n_{2}^{2}} & {n_{2} n_{3}} \\ {n_{1} n_{3}} & {n_{2} n_{3}} & {n_{3}^{2}}\end{array}\right] nnT=n12n1n2n1n3n1n2n22n2n3n1n3n2n3n32

n ∧ = N = [ 0 − n 3 n 2 n 3 0 − n 1 − n 2 n 1 0 ] n^{\wedge}=N=\left[\begin{array}{ccc}{0} & {-n_{3}} & {n_{2}} \\ {n_{3}} & {0} & {-n_{1}} \\ {-n_{2}} & {n_{1}} & {0}\end{array}\right] n=N=0n3n2n30n1n2n10

N ∗ N = [ − n 2 2 − n 3 2 n 1 n 2 n 1 n 3 n 1 n 2 − n 1 2 − n 3 2 n 2 n 3 n 1 n 3 n 2 n 3 − n 1 2 − n 2 2 ] N * N=\left[\begin{array}{ccc}{-n_{2}^{2}-n_{3}^{2}} & {n_{1} n_{2}} & {n_{1} n_{3}} \\ {n_{1} n_{2}} & {-n_{1}^{2}-n_{3}^{2}} & {n_{2} n_{3}} \\ {n_{1} n_{3}} & {n_{2} n_{3}} & {-n_{1}^{2}-n_{2}^{2}}\end{array}\right] NN=n22n32n1n2n1n3n1n2n12n32n2n3n1n3n2n3n12n22

n ∗ n T = I + N ∗ N n * n^{T}=I+N * N nnT=I+NN

N ∗ N = n ∗ n T − I N * N=n * n^{T}-I NN=nnTI
带入 R = [ I + ( 1 − cos ⁡ ( θ ) ) ∗ N 2 + sin ⁡ ( θ ) ∗ N ] R = [I+(1-\cos (\theta)) * N^{2}+\sin (\theta) * N] R=[I+(1cos(θ))N2+sin(θ)N]可以得到

R = cos ⁡ ( θ ) ∗ I + ( 1 − cos ⁡ ( θ ) ) ∗ n ∗ n T + sin ⁡ ( θ ) ∗ n R = \cos (\theta) * I+(1-\cos (\theta)) * n * n^{T}+\sin (\theta) * n R=cos(θ)I+(1cos(θ))nnT+sin(θ)n

三,公式理解和深入

罗德里格斯公式,将3D旋转表达成了 ( n ∧ , θ ) (n^{\wedge}, \theta) (n,θ)的形式,一般记作 ω = θ ∗ n = ( ω x , ω y , ω z ) T \omega = \theta * n = \left(\omega_{x}, \omega_{y}, \omega_{z}\right)^{T} ω=θn=(ωx,ωy,ωz)T

这是一种非常简洁和简单的表示形式,但是这不是一个奇异的变换。主要原因有两点

  • 旋转 θ \theta θ和旋转 θ + 2 π \theta + 2\pi θ+2π表达了相同的旋转
  • ( n ∧ , θ ) (n^{\wedge}, \theta) (n,θ) ( − n ∧ , − θ ) (-n^{\wedge}, -\theta) (n,θ)也表达了相同的旋转
    但是这样的好处在于,对于非常小的旋转,罗德里格斯公式可以表示成
    R ( ω ) = R ( n ∧ , θ ) ≈ I + s i n ( θ ) ∗ N ≈ I + θ ∗ N = [ 1 − θ ∗ n 3 θ ∗ n 2 θ ∗ n 3 1 − θ ∗ n 1 − θ ∗ n 2 θ ∗ n 1 1 ] = [ 1 − ω z ω y ω z 1 ω x − ω y ω x 1 ] R(\omega) = R(n^{\wedge}, \theta) \approx I + sin(\theta) * N \\ \approx I + \theta * N \\=\left[\begin{array}{ccc}{1} & {-\theta * n_{3}} & {\theta * n_{2}} \\ {\theta *n_{3}} & {1} & {-\theta * n_{1}} \\ {-\theta * n_{2}} & {\theta *n_{1}} & {1}\end{array}\right] \\\\ = \left[\begin{array}{ccc}{1} & {-\omega_{z} } & {\omega_{y}} \\ {\omega_{z} } & {1} & {\omega_{x} } \\ {-\omega_{y} } & {\omega_{x} } & {1}\end{array}\right] R(ω)=R(n,θ)I+sin(θ)NI+θN=1θn3θn2θn31θn1θn2θn11=1ωzωyωz1ωxωyωx1
    这个式子给出了,非常漂亮的的 ω \omega ω与R之间的线性的关系。
    我们也可以写成, R v ≈ v + w × v Rv \approx v + w \times v Rvv+w×v,这样我们只需要简单的求导,就可以得到v
    ∂ R v ∂ ω = − v = [ 0 z − y − z 0 x y − x 0 ] \frac{\partial \boldsymbol{R} \boldsymbol{v}}{\partial \boldsymbol{\omega}}=-{v}=\left[\begin{array}{ccc}{0} & {z} & {-y} \\ {-z} & {0} & {x} \\ {y} & {-x} & {0}\end{array}\right] ωRv=v=0zyz0xyx0

四,极限的方式简洁推导罗德里格斯公式

叫做exponential twist(Murray, Li, and Sastry 1994), 旋转 θ \theta θ角度,等价于旋转k次 θ / k \theta/k θ/k角度。
R ( n ∧ , θ ) = lim ⁡ k → ∞ ( I + 1 k ( θ ∗ N ) ) k = e θ ∗ N R(n^{\wedge}, \theta) = \lim _{k \rightarrow \infty}\left(\boldsymbol{I}+\frac{1}{k}(\theta *N)\right)^{k} = e^{\theta *N} R(n,θ)=klim(I+k1(θ))k=eθN

e θ ∗ N = I + ( θ ∗ N ) + ( θ ∗ N ) 2 2 + ( θ ∗ N ) 3 3 ! + . . . e^{\theta *N} = I + (\theta *N) + \frac{(\theta *N)^{2}}{2} + \frac{(\theta *N)^{3}}{3!} + ... eθN=I+(θN)+2(θN)2+3!(θN)3+...
因为 N k + 2 = − N k , k > 0 N^{k+2} = -N^{k}, k>0 Nk+2=Nk,k>0
所以
e θ ∗ N = I + ( θ − θ 3 3 ! + . . . ) ∗ N + ( θ 2 2 − θ 3 4 ! + . . . ) ∗ N 2 = I + s i n θ ∗ N + ( 1 − c o s θ ) ∗ N 2 e^{\theta *N} = I + (\theta - \frac{\theta^{3}}{3!}+...)*N + (\frac{\theta^{2}}{2} - \frac{\theta^{3}}{4!}+...)*N^{2} \\ = I+sin{\theta}*N + (1-cos{\theta})*N^{2} eθN=I+(θ3!θ3+...)N+(2θ24!θ3+...)N2=I+sinθN+(1cosθ)N2

  • 26
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
当然可以,以下是使用罗德里格斯公式求解七自由度机械臂逆解的MATLAB程序。请注意,这是一个简单的示例程序,需要根据您的具体情况进行修改和调整。 ```matlab % 七自由度机械臂逆解程序(使用罗德里格斯公式) % 机械臂参数 L1 = 1; % 第一段臂长 L2 = 2; % 第二段臂长 L3 = 3; % 第三段臂长 L4 = 4; % 第四段臂长 L5 = 5; % 第五段臂长 L6 = 6; % 第六段臂长 L7 = 7; % 第七段臂长 % 目标末端执行器位姿 Rd = [1, 0, 0; 0, 1, 0; 0, 0, 1]; % 目标末端执行器旋转矩阵 pd = [1; 2; 3]; % 目标末端执行器位置向量 % 初始关节角度 q0 = [0; 0; 0; 0; 0; 0; 0]; % 迭代求解逆解 q = q0; for i = 1:100 % 迭代次数 % 计算当前末端执行器位姿 T = forward_kinematics(q, L1, L2, L3, L4, L5, L6, L7); R = T(1:3, 1:3); p = T(1:3, 4); % 计算误差 eR = 0.5 * (Rd' * R - R' * Rd); % 旋转矩阵误差 ep = pd - p; % 位置向量误差 % 计算雅可比矩阵 J = jacobian(q, L1, L2, L3, L4, L5, L6, L7); % 计算关节角度增量 dq = pinv(J) * [ep; eR(1, 3); eR(2, 1); eR(3, 2)]; % 更新关节角度 q = q + dq; end % 输出逆解 disp(q); % 正向运动学函数 function T = forward_kinematics(q, L1, L2, L3, L4, L5, L6, L7) T01 = dh_transform(0, pi/2, 0, q(1)); T12 = dh_transform(L1, 0, 0, q(2)); T23 = dh_transform(L2, 0, 0, q(3)); T34 = dh_transform(L3, 0, 0, q(4)); T45 = dh_transform(L4, pi/2, 0, q(5)); T56 = dh_transform(L5, -pi/2, 0, q(6)); T67 = dh_transform(L6, 0, 0, q(7)); T7E = eye(4); T7E(1:3, 1:3) = rotx(-pi/2); T = T01 * T12 * T23 * T34 * T45 * T56 * T67 * T7E; end % DH参数转换函数 function T = dh_transform(a, alpha, d, theta) T = [cos(theta), -sin(theta)*cos(alpha), sin(theta)*sin(alpha), a*cos(theta); sin(theta), cos(theta)*cos(alpha), -cos(theta)*sin(alpha), a*sin(theta); 0, sin(alpha), cos(alpha), d; 0, 0, 0, 1]; end % 旋转矩阵绕x轴旋转函数 function R = rotx(theta) R = [1, 0, 0; 0, cos(theta), -sin(theta); 0, sin(theta), cos(theta)]; end % 旋转矩阵绕y轴旋转函数 function R = roty(theta) R = [cos(theta), 0, sin(theta); 0, 1, 0; -sin(theta), 0, cos(theta)]; end % 旋转矩阵绕z轴旋转函数 function R = rotz(theta) R = [cos(theta), -sin(theta), 0; sin(theta), cos(theta), 0; 0, 0, 1]; end % 雅可比矩阵计算函数 function J = jacobian(q, L1, L2, L3, L4, L5, L6, L7) T01 = dh_transform(0, pi/2, 0, q(1)); T12 = dh_transform(L1, 0, 0, q(2)); T23 = dh_transform(L2, 0, 0, q(3)); T34 = dh_transform(L3, 0, 0, q(4)); T45 = dh_transform(L4, pi/2, 0, q(5)); T56 = dh_transform(L5, -pi/2, 0, q(6)); T67 = dh_transform(L6, 0, 0, q(7)); T7E = eye(4); T7E(1:3, 1:3) = rotx(-pi/2); T02 = T01 * T12; T03 = T02 * T23; T04 = T03 * T34; T05 = T04 * T45; T06 = T05 * T56; T07 = T06 * T67; z0 = [0; 0; 1]; z1 = T01(1:3, 3); z2 = T02(1:3, 3); z3 = T03(1:3, 3); z4 = T04(1:3, 3); z5 = T05(1:3, 3); z6 = T06(1:3, 3); p0 = [0; 0; 0]; p1 = T01(1:3, 4); p2 = T02(1:3, 4); p3 = T03(1:3, 4); p4 = T04(1:3, 4); p5 = T05(1:3, 4); p6 = T06(1:3, 4); p7 = T07(1:3, 4); J = [cross(z0, p7-p0), cross(z1, p7-p1), cross(z2, p7-p2), cross(z3, p7-p3), cross(z4, p7-p4), cross(z5, p7-p5), cross(z6, p7-p6); z0, z1, z2, z3, z4, z5, z6]; end ``` 该程序使用罗德里格斯公式迭代求解七自由度机械臂的逆解,其中包括正向运动学函数、DH参数转换函数、旋转矩阵绕x轴旋转函数、旋转矩阵绕y轴旋转函数、旋转矩阵绕z轴旋转函数、雅可比矩阵计算函数。您可以根据自己的具体机械臂参数和需求进行修改和调整。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值