罗德里格斯公式推导

转载:http://www.cnblogs.com/jingrui/p/9712461.html

官网:https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula

罗德里格斯(Rodrigues)旋转方程(改进)

结合了上面博主的博客进行了修改,向量没学好初亏在眼前啊。

此公式有2种形式,故而也有2种推导方法。具体的推导过程如下

 

一、条件

定义向量k是旋转轴的单位矢量,图中初始向量v绕k轴旋转Θ角得vrot

二、说明

所谓推导旋转方程,实则求出一个旋转矩阵R,使得vrot=Rv。所以我们要做的就是找出vrot与v之间的关系,并用矩阵来表示。

三、推导

1. 推导一

对v进行向量分解: v = v⊥+ v//

由点乘的投影几何意义可得: v// = (v • k)k         (v•k为标量,所以再乘k得到一个矢量)

根据向量减法可得:   v⊥= v - v// 

由旋转过程平行向量不变得:  vrot //= v//

为计算方便,对vrot⊥进行向量分解:vrot⊥=a+b

由图中的向量关系可得:b= cosΘ v⊥      a=sinΘ k x v   

以下是a向量的求解过程:

b向量就是:

综上可得:vrot = vrot⊥+vrot //

        = a + b + v//

        = sinΘ k x v  + cosΘ v⊥ + (v • k)k

        = sinΘ k x v  + cosΘ (v - v//)+ (v • k)k

        = sinΘ k x v  + cosΘ (v - (v • k)k)+ (v • k)k

        = cosΘ v + (1 - cosΘ )(v • k)k + sinΘ k x v

显然:到此步,我们还无法将其用矩阵来表示,所以需要对 (v • k)k 和 k x v 进行矩阵转换

由点乘的交换律和结合律得(v • k)k=k •(v • k)=k • (kτ • v)=k•kτ•v  ,其中的向量都是列向量

对于k x v可用叉乘矩阵来化简为Kv

 

所以,cosΘ v + (1 - cosΘ )(v • k)k + sinΘ k x v

   = cosΘ v + (1 - cosΘ )kkτv + sinΘKv

   =( cosΘ I + (1 - cosΘ )kkτ + sinΘK ) v                  

     =Rv

所以,旋转矩阵R=cosΘ I + (1 - cosΘ )kkτ + sinΘK,其中I为单位矩阵。

 

2.推导二

与推导一相比推导二的不同主要在于用叉乘去表示一些数据

用叉乘来表示v⊥可得:v⊥= -k x (k x v)

所以联立推导一中各式得: vrot = vrot⊥+ vrot //

              = a + b + v//

              = sinΘ k x v  + cosΘ v⊥ + v - v⊥

              = sinΘ k x v - cosΘk x (k x v) + v + k x (k x v)

              = v + (1 - cosΘ)k x (k x v) + sinΘ k x v

              = v + (1 - cosΘ)K2v + sinΘ Kv     (叉乘矩阵表示)

              =(I +  (1 - cosΘ)K2 + sinΘ K) v

              =Rv

从而得出第二种表达式R=I +  (1 - cosΘ)K2 + sinΘ K

显然,第二种表达式更为简便,在计算的过程中涉及的参数更少,所以这也是在进行旋转操作时常用的公式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值