罗德里格斯公式(Rodrigues Formula)

罗德里格斯公式(Rodrigues’s Formula)

摘要:罗德里格斯公式推导过程。主要参考Krasjet的文档,写的非常详细,如果想看更加详细的过程,建议去看看文档。这里主要做了简洁浓缩,方便快速查看。

一、轴角(Axis-Angle)的介绍

采用一个旋转轴u和一个旋转角度θ来刻画旋转。

比如:
我们有一个经过原点的(如果旋转轴不经过原点我们可以先将旋转轴平移到原点,进行旋转,再平移回原处)旋转轴 u = ( 𝑥 , 𝑦 , 𝑧 ) T u = (𝑥, 𝑦, 𝑧) ^{T} u=(x,y,z)T ,我们希望将一个向量 v v v,沿着这个旋转轴旋转 θ θ θ 度,变换到 v ′ v ′ v
在这里插入图片描述
为了消除旋转轴 u 模长这个多余的自由度,我们可以规定旋转轴 u 的模长为 ∥ u ∥ = 𝑥 2 + 𝑦 2 + 𝑧 2 = 1 ∥u∥ =\sqrt{𝑥 2 + 𝑦 2 + 𝑧 2 } = 1 u=x2+y2+z2 =1,也就是说 u 是一个单位向量。

二、旋转的分解

我们可以将 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
在这里插入图片描述

2.1 平行量的旋转

平行量的旋转,前后不变
v ′ ∥ = v ∥ v ′∥ = v ∥ v=v
v ∥ v ∥ v 其实就是 v 在 u 上的正交投影 (Orthogonal Projection),根据正交投影的公式,我们可以得出:
v ∥ = ( u ⋅ v ) u v ∥ = (u · v)u v=(uv)u

2.2 垂直量的旋转

v ⊥ v ⊥ v正交于 u u u 的 ,这个旋转可以看做是平面内的一个旋转。因为旋转不改变 v ⊥ 的长度,所以路径是
一个圆。下面是这个旋转的示意图,右侧的为俯视图。
在这里插入图片描述
现在,3D 的旋转就被我们转化为了 2D 平面上的旋转。由于在这个平面上我们只有一个向量 v ⊥ v ⊥ v ,用它来表示一个旋转是不够的,我们还需要构造一个同时正交于 u u u v ⊥ v ⊥ v 的向量 w w w,这个可以通过叉乘来获得:
w = u × v ⊥ ∥ w ∥ = ∥ u × v ⊥ ∥ = ∥ u ∥ . ∥ v ⊥ ∥ . s i n ( π / 2 ) = ∥ v ⊥ ∥ w = u × v ⊥ \\ ∥w∥ = ∥u × v ⊥ ∥=∥u ∥.∥ v ⊥ ∥. sin(π/2)=∥ v ⊥ ∥ w=u×vw=u×v=u.v.sin(π/2)=v
也就是说, w w w v ⊥ v ⊥ v 的模长是相同的,所以,w 也位于圆上。
有了这个新的向量 w w w,就相当于我们在平面内有了两个坐标轴。
我们现在可以把 v ′ ⊥ v ′⊥ v 投影到 w w w v ⊥ v ⊥ v 上,将其分解为 v 𝑣 ′ v_{𝑣} ′ vv v 𝑤 ′ v_{𝑤} ′ vw 。使用一点三角学的知识我们就能得到:
v ′ ⊥ = v 𝑣 ′ + v 𝑤 ′ = c o s ( θ ) v ⊥ + s i n ( θ ) w = c o s ( θ ) v ⊥ + s i n ( θ ) ( u × v ⊥ ) v ′⊥ = v_{𝑣} ′ + v_{𝑤} ′ = cos( θ )v ⊥ + sin( θ )w = cos( θ )v ⊥ + sin( θ )(u × v ⊥ ) v=vv+vw=cos(θ)v+sin(θ)w=cos(θ)v+sin(θ)(u×v)

三、旋转的合成

将上面的两个结果组合就可以获得:
v ′ = v ′ ∥ + v ′ ⊥ = v ∥ + c o s ( θ ) v ⊥ + s i n ( θ ) ( u × v ⊥ ) v ′ = v ′∥ + v ′⊥ = v ∥ + cos( θ )v ⊥ + sin( θ )(u × v ⊥ ) v=v+v=v+cos(θ)v+sin(θ)(u×v)
由之前的结论,知:
v ∥ = ( u ⋅ v ) u v ∥ = (u · v)u v=(uv)u
v ∥ v ∥ v可以得到 v ⊥ v ⊥ v
v ⊥ = v − v ∥ = v − ( u ⋅ v ) u v ⊥ = v - v ∥ = v - (u · v)u v=vv=v(uv)u
变换叉乘 u × v ⊥ u × v ⊥ u×v得:
u × v ⊥ = u × ( v − v ∥ ) = u × v − u × v ∥ = u × v u × v ⊥ = u × (v − v ∥ ) = u × v − u × v ∥ = u × v u×v=u×(vv)=u×vu×v=u×v

最终组合结果可以变化为:
v ′ = c o s ( θ ) v + ( 1 − c o s ( θ ) ) ( u ⋅ v ) u + s i n ( θ ) ( u × v ) v ′ = cos( θ )v + (1 − cos( θ ))(u · v)u + sin( θ )(u × v) v=cos(θ)v+(1cos(θ))(uv)u+sin(θ)(u×v)
这也就是罗德里格斯公式(Rodrigues’s Formula):
3D 空间中任意一个 v v v 沿着单位向量 u u u 旋转 θ θ θ 角度之后的 v ′ v ′ v 为:
v ′ = c o s ( θ ) v + ( 1 − c o s ( θ ) ) ( u ⋅ v ) u + s i n ( θ ) ( u × v ) v ′ = cos( θ )v + (1 − cos( θ ))(u · v)u + sin( θ )(u × v) v=cos(θ)v+(1cos(θ))(uv)u+sin(θ)(u×v)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值