罗德里格斯公式及其推导

罗德里格斯公式及其推导



罗格里格斯公式,将3D旋转表达成了 ( n ∧ , θ ) (n^∧,θ) (n,θ)的形式,一般记作
ω = θ ∗ n = ( ω x , ω y , ω z ) T ω = θ*n=(ω_x,ω_y,ω_z)^T ω=θn=(ωx,ωy,ωz)T
两种表达式
R = [ I + ( 1 − c o s ( θ ) ) ∗ N 2 + s i n ( θ ) ∗ N ] R =[I + (1 - cos(θ)) * N^2 + sin(θ) * N] R=[I+(1cos(θ))N2+sin(θ)N]
R = c o s ( θ ) ∗ I + ( 1 − c o s ( θ ) ) ∗ n ∗ n T + s i n ( θ ) ∗ n ∧ R =cos(θ) * I + (1 - cos(θ)) * n * n^T + sin(θ) * 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{matrix} 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{matrix}\right] R= rxxryxrzxrxyryyrzyrxzryzrzz
R矩阵是标准正交矩阵,用于基向量之间的刚性变换,且满足:

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

2. 旋转向量

旋转过程用一个单位向量n和旋转角度θ来表示。设旋转向量为:
n = [ n 1 n 2 n 3 ] n= \left[\begin{matrix} n_1 \\ n_2 \\ n_3 \end{matrix}\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. 向量叉积及反对称矩阵

a × b = a ∗ b ∗ s i n ( θ ) a × b = a*b*sin(θ) a×b=absin(θ)
叉积为矢量,长度为两个向量相夹的面积,方向与两个向量垂直。如下图:
在这里插入图片描述
我们设置向量
a = [ a 1 a 2 a 3 ] a= \left[\begin{matrix} a_1 \\ a_2 \\ a_3 \end{matrix}\right] a= a1a2a3
a的反对称矩阵为:
a ∧ = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] = A a^∧ = \left[\begin{matrix} 0 & -a_3 &a_2\\ a_3 & 0 & -a_1\\ -a_2 & a_1 & 0 \end{matrix}\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 ∧ ∗ b a × b= \left[\begin{matrix} a_2b_3 - a_3b_2 \\ -a_1b_3 + a_3b_1 \\ a_1b_2 - a_2b_1 \end{matrix}\right]=\left[\begin{matrix} 0 & -a_3 &a_2\\ a_3 & 0 & -a_1\\ -a_2 & a_1 & 0 \end{matrix}\right]*\left[\begin{matrix} b_1 \\ b_2 \\ b_3 \end{matrix}\right] = a^∧*b a×b= a2b3a3b2a1b3+a3b1a1b2a2b1 = 0a3a2a30a1a2a10 b1b2b3 =ab

二、公式推导

1. 符号说明与图例

名称符号
旋转向量 n n n
反对称矩阵 n ∧ o r N n^∧ or N norN
旋转角度 θ θ θ
旋转点 P P P
O P OP OP向量 v v v
v v v旋转 θ θ θ后的向量 v ′ v^{'} v
v v v在旋转平面的投影 v ⊥ v_⊥ v
v v v在旋转轴的投影 v ∥ v_∥ v
v v v旋转 θ θ θ后旋转平面的分量 v ⊥ ′ v^{'}_⊥ v
v v v旋转 θ θ θ后旋转轴 n n n的分量 v ∥ ′ v^{'}_∥ v
w w w向量,垂直于 n n n v v v所在的平面,且与 n n n v v v均正交 w w w
在这里插入图片描述

2. 推导

假定空间中一个点 P P P,构成向量 v = O P → v=\overrightarrow{OP} v=OP &,对其进行分解:
v = v ⊥ + v ∥ v=v_⊥ + v_∥ v=v+v
同理旋转后的向量:
v ′ = v ⊥ ′ + v ∥ ′ v^{'}=v^{'}_⊥ + v^{'}_∥ v=v+v
显然:
v ∥ = v ∥ ′ v_∥=v^{'}_∥ v=v
所以有:
v ′ = v ⊥ ′ + v ∥ v^{'}=v^{'}_⊥ + v_∥ v=v+v
又向量 w w w满足:
w = n × v w=n×v w=n×v
那么:
∣ w ∣ = ∣ n × v ∣ |w|=|n×v| w=n×v
由于 ∣ w ∣ |w| w代表黄色平行四边形阴影面积,而面积计算也可以使用 ∣ n ∣ ∗ ∣ v ⊥ ∣ |n|*|v_⊥| nv,而 n n n为单位向量,所以有
∣ w ∣ = ∣ n × v ∣ = ∣ v ⊥ ∣ |w|=|n×v|=|v_⊥| w=n×v=v
由于 n × w n×w n×w v ⊥ v_⊥ v相反,我们可以用 n n n v v v表示出 v ⊥ v_⊥ v v ∥ v_∥ v,即:
v ⊥ = − n × w = − n × ( n × v ) v_⊥=-n×w=-n×(n×v) v=n×w=n×(n×v)
v ∥ = v − v ⊥ = v + n × ( n × v ) v_∥=v - v_⊥=v+n×(n×v) v=vv=v+n×(n×v)
由于 v ⊥ v_⊥ v与向量 w w w合成即为 v ⊥ ′ v^{'}_⊥ v,所以有:
v ⊥ ′ = v ⊥ + w = c o s ( θ ) ∗ v ⊥ + s i n ( θ ) ∗ w v^{'}_⊥ = v_⊥ + w = cos(θ)*v_⊥ + sin(θ) * w v=v+w=cos(θ)v+sin(θ)w
将上式带入有:
  v ′ = v ∥ + v ⊥ ′ = ( v − v ⊥ ) + c o s ( θ ) ∗ v ⊥ + s i n ( θ ) ∗ w = v + ( c o s ( θ ) − 1 ) ∗ v ⊥ + s i n ( θ ) ∗ w = v + ( 1 − c o s ( θ ) ) ∗ n ∧ ∗ ( n ∧ ∗ v ) + s i n ( θ ) ∗ n ∧ ∗ v = v + ( 1 − c o s ( θ ) ) ∗ N ∗ N ∗ v + s i n ( θ ) ∗ N ∗ v = [ I + ( 1 − c o s ( θ ) ) ∗ N 2 + s i n ( θ ) ∗ N ] ∗ v \begin{aligned} \ 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 \\ & = [I + (1- cos(θ))*N^2 +sin(θ) *N ]*v \end{aligned}  v=v+v=(vv)+cos(θ)v+sin(θ)w=v+(cos(θ)1)v+sin(θ)w=v+(1cos(θ))n(nv)+sin(θ)nv=v+(1cos(θ))NNv+sin(θ)Nv=[I+(1cos(θ))N2+sin(θ)N]v
所以有:
R = [ I + ( 1 − c o s ( θ ) ) ∗ N 2 + s i n ( θ ) ∗ N ] R=[I + (1- cos(θ))*N^2 +sin(θ) *N ] R=[I+(1cos(θ))N2+sin(θ)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 1 2 n 3 n 3 2 ] n*n^T = \left[\begin{matrix} n_1^2 & n_1n_2 & n_1n_3\\ n_1n_2 & n_2^2 & n_2n_3\\ n_1n_3 & n_12n_3 & n_3^2 \end{matrix}\right] nnT= n12n1n2n1n3n1n2n22n12n3n1n3n2n3n32
n ∧ = [ 0 − n 3 n 2 n 3 0 − n 1 − n 2 n 1 0 ] = N n^∧ = \left[\begin{matrix} 0 & -n_3 &n_2\\ n_3 & 0 & -n_1\\ -n_2 & n_1 & 0 \end{matrix}\right] = N n= 0n3n2n30n1n2n10 =N
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 1 2 n 3 − n 1 2 − n 2 2 ] N*N = \left[\begin{matrix} -n_2^2-n_3^2 & n_1n_2 & n_1n_3\\ n_1n_2 & -n_1^2-n_3^2 & n_2n_3\\ n_1n_3 & n_12n_3 & -n_1^2-n_2^2 \end{matrix}\right] NN= n22n32n1n2n1n3n1n2n12n32n12n3n1n3n2n3n12n22
n ∗ n T = I + N ∗ N n*n^T = I + N*N nnT=I+NN
将上式带入表达式一,则有:
R = c o s ( θ ) ∗ I + ( 1 − c o s ( θ ) ) ∗ n ∗ n T + s i n ( θ ) ∗ n ∧ R =cos(θ) * I + (1 - cos(θ)) * n * n^T + sin(θ) * n^∧ R=cos(θ)I+(1cos(θ))nnT+sin(θ)n

三、公式应用及深入理解

罗德里格斯旋转公式用于旋转三维空间的向量.它需要知道旋转轴和旋转角度。
罗德里格斯旋转公式,将3D旋转表示成绕空间中某一旋转轴 n n n旋转角度 θ θ θ的形式,一般记作:
q = θ ∗ n = [ q x q y q z ] q=θ*n= \left[\begin{matrix} q_x \\ q_y \\ q_z \end{matrix}\right] q=θn= qxqyqz
式中, θ = ∣ q ∣ = q x 2 + q y 2 + q z 2 θ=|q|=\sqrt{q_x^2+q_y^2+q_z^2} θ=q=qx2+qy2+qz2
这种表示形式非常简洁,但存在奇异问题,主要在于:

  1. 旋转角度为 θ θ θ θ + 2 k π θ+2kπ θ+2的结果是一样的;
  2. ( n , θ ) (n,θ) (n,θ) ( − n , − θ ) (-n,-θ) (n,θ)的结果是一样的;

对于非常小的旋转,旋转矩阵 R R R和罗德里格斯向量 q q q存在线性关系,推导如下:
  R ( q ) = R ( n , θ ) = I + ( 1 − c o s ( θ ) ) ∗ N 2 + s i n ( θ ) ∗ N ≈ I + s i n ( θ ) ∗ N ≈ I + θ ∗ N = I + q ∧ = [ 1 − q z q y q z 1 − q x − q y q x 1 ] \begin{aligned} \ R(q) & = R(n,θ)\\ & = I + (1- cos(θ))*N^2 +sin(θ) *N \\ & ≈ I + sin(θ) *N \\ & ≈ I +θ *N\\ & = I +q^∧ \\ & = \left[\begin{matrix} 1 & -q_z &q_y\\ q_z & 1 & -q_x\\ -q_y & q_x & 1 \end{matrix}\right] \end{aligned}  R(q)=R(n,θ)=I+(1cos(θ))N2+sin(θ)NI+sin(θ)NI+θN=I+q= 1qzqyqz1qxqyqx1

四、极限方式推导

一次性绕旋转轴 n n n旋转角度 θ θ θ,等价于绕旋转轴 n n n旋转 k k k次,每次旋转角度为 θ / k θ/k θ/k
因此:
R ( n , θ ) = lim ⁡ k → + ∞ ( I + 1 k ∗ θ ∗ N ) k = e θ ∗ N R(n,θ) = \lim_{k\rightarrow+\infty}(I + \frac{1}{k}*θ*N)^k=e^{θ*N} R(n,θ)=k+lim(I+k1θN)k=eθN
而:
e θ ∗ N = I + ( θ ∗ N ) + ( θ ∗ N ) 2 2 ! + ( θ ∗ N ) 3 3 ! + ⋯ e^{θ*N}=I + (θ*N) + \frac{(θ*N)^2}{2!}+ \frac{(θ*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 ! − ( θ ) 4 4 ! + ⋯ ) ∗ N 2 = I + s i n ( θ ) ∗ N + ( 1 − c o s ( θ ) ) ∗ N 2 ] \begin{aligned}e^{θ*N} &= I + (θ - \frac{(θ)^3}{3!} + ⋯)* N + (\frac{(θ)^2}{2!} - \frac{(θ)^4}{4!} + ⋯)* N^2 \\ &= I + sin(θ) * N + (1 - cos(θ)) * N^2] \end{aligned} eθN=I+(θ3!(θ)3+N+(2!(θ)24!(θ)4+N2=I+sin(θ)N+(1cos(θ))N2]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值