Rodrigues(罗德里格斯)公式的理解与应用(旋转矢量与旋转矩阵的转化)

第一部分 R o d r i g u e s Rodrigues Rodrigues(罗德里格斯)公式描述的是:空间内的任意一个向量 v \textbf{v} v,绕指定的旋转轴 k \textbf{k} k旋转 θ \theta θ角度,得到空间向量 v θ \textbf{v}^{\theta} vθ的过程。 R o d r i g u e s Rodrigues Rodrigues公式利用 v \textbf{v} v k \textbf{k} k θ \theta θ来描述 v θ \textbf{v}^{\theta} vθ

在这里插入图片描述
如图所示,空间内的向量 v \textbf{v} v,绕着 z z z轴旋转 θ \theta θ,得到 v θ \textbf{v}^{\theta} vθ。已知 x x x轴, y y y轴和 z z z轴的方向向量分别是 i \textbf{i} i j \textbf{j} j k \textbf{k} k。约定 < a , b > <\textbf{a},\textbf{b}> <a,b>表示向量 a \textbf{a} a到向量 b \textbf{b} b的夹角。
对于空间向量 v \textbf{v} v可以分解为三个坐标轴上的投影向量的矢量和: v = v x + v y + v z \textbf{v} = \textbf{v}_x + \textbf{v}_y + \textbf{v}_z v=vx+vy+vz
其中:
v y = 0 \textbf{v}_y = \textbf{0} vy=0
v z = ∣ ∣ v ∣ ∣ ⋅ cos ⁡ < k , v > ⋅ k = ∣ ∣ v ∣ ∣ ⋅ ∣ ∣ k ∣ ∣ ⋅ cos ⁡ < k , v > ⋅ k = ( k ⋅ v ) ⋅ k \textbf{v}_z = ||\textbf{v}|| \cdot \cos{<\textbf{k}, \textbf{v}>} \cdot \textbf{k} = ||\textbf{v}|| \cdot ||\textbf{k}|| \cdot \cos<\textbf{k}, \textbf{v}> \cdot \textbf{k} = (\textbf{k} \cdot \textbf{v}) \cdot \textbf{k} vz=vcos<k,v>k=vkcos<k,v>k=(kv)k
v x = ∣ ∣ v ∣ ∣ ⋅ sin ⁡ < k , v > ⋅ i \textbf{v}_x = ||\textbf{v}|| \cdot \sin<\textbf{k}, \textbf{v}> \cdot \textbf{i} vx=vsin<k,v>i
对于 v x \textbf{v}_x vx来说,可以得到以下变换:
∣ ∣ v ∣ ∣ ⋅ sin ⁡ < k , v > = ∣ ∣ v ∣ ∣ ⋅ ∣ ∣ k ∣ ∣ ⋅ sin ⁡ < k , v > = ∣ ∣ k × v ∣ ∣ ||\textbf{v}|| \cdot \sin<\textbf{k}, \textbf{v}> = ||\textbf{v}|| \cdot ||\textbf{k}|| \cdot \sin<\textbf{k}, \textbf{v}> = ||\textbf{k} \times \textbf{v}|| vsin<k,v>=vksin<k,v>=k×v
i = j × k \textbf{i} = \textbf{j} \times \textbf{k} i=j×k,又有 j = k × v ∣ ∣ k × v ∣ ∣ \textbf{j} = \frac{\textbf{k} \times \textbf{v}}{||\textbf{k} \times \textbf{v}||} j=k×vk×v,则 i = 1 ∣ ∣ k × v ∣ ∣ ⋅ k × v × k \textbf{i} = \frac{1}{||\textbf{k} \times \textbf{v}||} \cdot \textbf{k} \times \textbf{v} \times \textbf{k} i=k×v1k×v×k
因此,可以得到: v x = ∣ ∣ k × v ∣ ∣ ⋅ 1 ∣ ∣ k × v ∣ ∣ ⋅ k × v × k = k × v × k \textbf{v}_x = ||\textbf{k} \times \textbf{v}|| \cdot \frac{1}{||\textbf{k} \times \textbf{v}||} \cdot \textbf{k} \times \textbf{v} \times \textbf{k} = \textbf{k} \times \textbf{v} \times \textbf{k} vx=k×vk×v1k×v×k=k×v×k

同理,对于 v θ \textbf{v}^{\theta} vθ也可以分解为 v θ = v x θ + v y θ + v z θ \textbf{v}^{\theta} = \textbf{v}_x^{\theta} + \textbf{v}_y^{\theta} + \textbf{v}_z^{\theta} vθ=vxθ+vyθ+vzθ
其中:
v z θ = v z \textbf{v}_z^{\theta} = \textbf{v}_z vzθ=vz
v x θ = ∣ ∣ v x ∣ ∣ ⋅ cos ⁡ θ ⋅ i = v x ⋅ cos ⁡ θ = k × v × k ⋅ cos ⁡ θ \textbf{v}_x^{\theta} = ||\textbf{v}_x|| \cdot \cos{\theta} \cdot \textbf{i} = \textbf{v}_x \cdot \cos{\theta} = \textbf{k} \times \textbf{v} \times \textbf{k} \cdot \cos{\theta} vxθ=vxcosθi=vxcosθ=k×v×kcosθ
v y θ = ∣ ∣ v x ∣ ∣ ⋅ sin ⁡ θ ⋅ j = ∣ ∣ v ∣ ∣ ⋅ sin ⁡ < k , v > ⋅ k × v ∣ ∣ k × v ∣ ∣ ⋅ sin ⁡ θ = k × v ⋅ sin ⁡ θ \textbf{v}_y^{\theta} = ||\textbf{v}_x|| \cdot \sin{\theta} \cdot \textbf{j} = ||\textbf{v}|| \cdot \sin<\textbf{k}, \textbf{v}> \cdot \frac{\textbf{k} \times \textbf{v}}{||\textbf{k} \times \textbf{v}||} \cdot \sin{\theta} = \textbf{k} \times \textbf{v} \cdot \sin{\theta} vyθ=vxsinθj=vsin<k,v>k×vk×vsinθ=k×vsinθ
因此, v θ = k × v × k ⋅ cos ⁡ θ + k × v ⋅ sin ⁡ θ + ( k ⋅ v ) ⋅ k \textbf{v}^{\theta} = \textbf{k} \times \textbf{v} \times \textbf{k} \cdot \cos{\theta} + \textbf{k} \times \textbf{v} \cdot \sin{\theta} + (\textbf{k} \cdot \textbf{v}) \cdot \textbf{k} vθ=k×v×kcosθ+k×vsinθ+(kv)k

另,由公式( ⋆ \star ) a × b × c = b ( a ⋅ c ) − c ( a ⋅ b ) \textbf{a} \times \textbf{b} \times \textbf{c} = \textbf{b}(\textbf{a}\cdot\textbf{c})-\textbf{c}(\textbf{a}\cdot\textbf{b}) a×b×c=b(ac)c(ab)可以得到:
v θ = v ( k ⋅ k ) cos ⁡ θ − k ( k ⋅ v ) cos ⁡ θ + k × v ⋅ sin ⁡ θ + ( k ⋅ v ) ⋅ k = v ⋅ cos ⁡ θ + k ( k ⋅ v ) ( 1 − cos ⁡ θ ) + k × v ⋅ sin ⁡ θ \textbf{v}^{\theta} = \textbf{v}(\textbf{k}\cdot\textbf{k})\cos\theta-\textbf{k}(\textbf{k}\cdot\textbf{v})\cos\theta + \textbf{k} \times \textbf{v} \cdot \sin{\theta} + (\textbf{k} \cdot \textbf{v}) \cdot \textbf{k} \newline \hspace{0.45cm} = \textbf{v}\cdot\cos\theta + \textbf{k}( \textbf{k}\cdot \textbf{v})(1-\cos\theta)+ \textbf{k}\times \textbf{v}\cdot\sin\theta vθ=v(kk)cosθk(kv)cosθ+k×vsinθ+(kv)k=vcosθ+k(kv)(1cosθ)+k×vsinθ

由此可以得到 R o d r i g u e s Rodrigues Rodrigues公式的结论。

\newline
\newline
第二部分 R o d r i g u e s Rodrigues Rodrigues(罗德里格斯)公式的矩阵描述形式。
上述第一部分主要从原理上证明了, R o d r i g u e s Rodrigues Rodrigues(罗德里格斯)公式的向量表述形式,在实际使用的时候,常用到的是矩阵形式的表述。事实上,矩阵形式的表述也是由向量形式经过展开和推导得来的,下面简单描述一下其中的过程。

首先将上述公式变形如下:
v θ = v ⋅ cos ⁡ θ + k ( k ⋅ v ) ( 1 − cos ⁡ θ ) + k × v ⋅ sin ⁡ θ = v − v + v ⋅ cos ⁡ θ + k ( k ⋅ v ) ( 1 − cos ⁡ θ ) + k × v ⋅ sin ⁡ θ = v − ( 1 − cos ⁡ θ ) v + ( 1 − cos ⁡ θ ) ( k ⋅ v ) k + sin ⁡ θ ⋅ k × v = v + ( 1 − cos ⁡ θ ) ( ( k ⋅ v ) k − v ) + sin ⁡ θ ⋅ k × v = v + ( 1 − cos ⁡ θ ) ( ( k ⋅ v ) k − v ( k ⋅ k ) ) + sin ⁡ θ ⋅ k × v \textbf{v}^{\theta} = \textbf{v}\cdot\cos\theta + \textbf{k}( \textbf{k}\cdot \textbf{v})(1-\cos\theta)+ \textbf{k}\times \textbf{v}\cdot\sin\theta \newline \hspace{0.45cm} = \textbf{v}-\textbf{v}+\textbf{v}\cdot\cos\theta + \textbf{k}( \textbf{k}\cdot \textbf{v})(1-\cos\theta)+ \textbf{k}\times \textbf{v}\cdot\sin\theta \newline \hspace{0.45cm} = \textbf{v} - (1-\cos\theta)\textbf{v} + (1-\cos\theta)(\textbf{k}\cdot \textbf{v})\textbf{k} + \sin\theta\cdot\textbf{k}\times\textbf{v} \newline \hspace{0.45cm} = \textbf{v} + (1-\cos\theta)((\textbf{k}\cdot\textbf{v})\textbf{k} - \textbf{v}) + \sin\theta\cdot\textbf{k}\times\textbf{v} \newline \hspace{0.45cm} = \textbf{v} + (1-\cos\theta)((\textbf{k}\cdot\textbf{v})\textbf{k} - \textbf{v}(\textbf{k}\cdot\textbf{k})) + \sin\theta\cdot\textbf{k}\times\textbf{v} \newline vθ=vcosθ+k(kv)(1cosθ)+k×vsinθ=vv+vcosθ+k(kv)(1cosθ)+k×vsinθ=v(1cosθ)v+(1cosθ)(kv)k+sinθk×v=v+(1cosθ)((kv)kv)+sinθk×v=v+(1cosθ)((kv)kv(kk))+sinθk×v

由公式( ⋆ \star ) a × b × c = b ( a ⋅ c ) − c ( a ⋅ b ) \textbf{a} \times \textbf{b} \times \textbf{c} = \textbf{b}(\textbf{a}\cdot\textbf{c})-\textbf{c}(\textbf{a}\cdot\textbf{b}) a×b×c=b(ac)c(ab)可以得到:
v θ = v + ( 1 − cos ⁡ θ ) ( k × k × v ) + sin ⁡ θ ⋅ k × v \textbf{v}^{\theta} = \textbf{v} + (1-\cos\theta)(\textbf{k}\times\textbf{k}\times\textbf{v}) + \sin\theta\cdot\textbf{k}\times\textbf{v} vθ=v+(1cosθ)(k×k×v)+sinθk×v

引入公式( † \dagger ) a × b = Ab \textbf{a}\times\textbf{b}=\textbf{A}\textbf{b} a×b=Ab,其中 a \textbf{a} a b \textbf{b} b是空间中的两个向量, A \textbf{A} A是向量 a \textbf{a} a的“叉积矩阵”:
A = [ 0 − a z a y a z 0 − a x − a y a x 0 ] \textbf{A} = \left[ \begin{matrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \\ \end{matrix} \right] A=0azayaz0axayax0
因此, k × v = Kv \textbf{k}\times\textbf{v}=\textbf{K}\textbf{v} k×v=Kv,其中 K \textbf{K} K k \textbf{k} k的“叉积矩阵”,则 k × k × v = K 2 v \textbf{k}\times\textbf{k}\times\textbf{v} = \textbf{K}^2\textbf{v} k×k×v=K2v

由此可以得到:
v θ = v + ( 1 − cos ⁡ θ ) ( k × k × v ) + sin ⁡ θ ⋅ k × v = v + ( 1 − cos ⁡ θ ) ⋅ K 2 v + sin ⁡ θ ⋅ Kv = Rv \textbf{v}^{\theta} = \textbf{v} + (1-\cos\theta)(\textbf{k}\times\textbf{k}\times\textbf{v}) + \sin\theta\cdot\textbf{k}\times\textbf{v} \newline \hspace{0.45cm}=\textbf{v}+(1-\cos\theta)\cdot\textbf{K}^2\textbf{v}+ \sin\theta\cdot\textbf{K}\textbf{v} \newline \hspace{0.45cm}=\textbf{R}\textbf{v} vθ=v+(1cosθ)(k×k×v)+sinθk×v=v+(1cosθ)K2v+sinθKv=Rv
其中: R = I + K sin ⁡ θ + K 2 ( 1 − cos ⁡ θ ) \textbf{R}=\textbf{I}+\textbf{K}\sin\theta+\textbf{K}^2(1-\cos\theta) R=I+Ksinθ+K2(1cosθ)

则上述 v θ = v + sin ⁡ θ ⋅ Kv + ( 1 − cos ⁡ θ ) ⋅ K 2 v \textbf{v}^{\theta} = \textbf{v} + \sin\theta\cdot\textbf{K}\textbf{v} + (1-\cos\theta)\cdot\textbf{K}^2\textbf{v} vθ=v+sinθKv+(1cosθ)K2v是矩阵描述形式。

\newline
\newline
第三部分:旋转矩阵与旋转向量的转化
由上述两个部分的阐述,可以得知,若一个空间矢量,围绕给定的方向轴旋转一个角度得到一个新的空间矢量,可以通过罗德里格斯公式来描绘,旋转前后两个矢量之间的相对关系。

由此可以设想,对于任意空间矢量 v \textbf{v} v,可以在笛卡尔坐标系下分别绕三个坐标轴 i \textbf{i} i j \textbf{j} j k \textbf{k} k旋转不同的角度:俯仰角 p i t c h pitch pitch,偏航角 y a w yaw yaw,翻滚角 r o l l roll roll,则对于每一次相对单个坐标轴的旋转,都存在一个可以通过罗格里德斯公式来描述的旋转矩阵:
R p i t c h = I + sin ⁡ θ ⋅ K i + ( 1 − cos ⁡ θ ) ⋅ K i 2 \textbf{R}_{pitch}=\textbf{I}+\sin\theta\cdot\textbf{K}_i+(1-\cos\theta)\cdot\textbf{K}_i^2 Rpitch=I+sinθKi+(1cosθ)Ki2
R y a w = I + sin ⁡ θ ⋅ K j + ( 1 − cos ⁡ θ ) ⋅ K j 2 \textbf{R}_{yaw}=\textbf{I}+\sin\theta\cdot\textbf{K}_j+(1-\cos\theta)\cdot\textbf{K}_j^2 Ryaw=I+sinθKj+(1cosθ)Kj2
R r o l l = I + sin ⁡ θ ⋅ K k + ( 1 − cos ⁡ θ ) ⋅ K k 2 \textbf{R}_{roll}=\textbf{I}+\sin\theta\cdot\textbf{K}_k+(1-\cos\theta)\cdot\textbf{K}_k^2 Rroll=I+sinθKk+(1cosθ)Kk2
则两个空间矢量间的矩阵 R = R p i t c h R y a w R r o l l \textbf{R}=\textbf{R}_{pitch}\textbf{R}_{yaw}\textbf{R}_{roll} R=RpitchRyawRroll

由于空间平面可以由平面内的任意一点和平面的法向量唯一确定,则空间中两个法向量之间的关系,可以由罗德里格斯变换外加一个坐标系平移矢量联系起来时,则这两个平面也遵从相同的联系。这是在机器视觉中极为重要的应用。

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
当然可以,以下是使用罗德里格斯公式求解七自由度机械臂逆解的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轴旋转函数、雅可比矩阵计算函数。您可以根据自己的具体机械臂参数和需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值