罗德里格斯公式简要介绍

一、罗德里格斯公式(Rodrigues’ rotation formula)是一个用于计算绕任意轴旋转向量的数学公式。它是由欧仁·罗德里格斯(Olinde Rodrigues)在1840年提出的。这个公式在三维空间中描述了一个向量绕着单位向量旋转θ角度后的结果。

设v是一个待旋转的三维向量,k是单位旋转轴(必须是单位向量),θ是旋转角度(通常以弧度为单位),则v绕k旋转θ角度后的向量v’可以通过罗德里格斯公式计算得到:

v’ = v * cos(θ) + (k × v) * sin(θ) + k * (k ⋅ v) * (1 - cos(θ))

其中:

  • v’ 是旋转后的向量。

  • cos 和 sin 分别表示余弦和正弦函数。

  • × 表示向量叉乘。

  • ⋅ 表示向量点乘。

罗德里格斯公式是由以下几个部分组成的:

  1. v * cos(θ):v 在旋转轴平行方向的分量,在旋转中不会改变。

  2. (k × v) * sin(θ):v 在垂直于旋转轴的平面上的分量,绕轴旋转后的分量。

  3. k * (k ⋅ v) * (1 - cos(θ)):v 在旋转轴方向上的分量,这部分分量在旋转中增强了旋转轴方向的分量。

在图形学、机器人技术、航空航天和其他需要旋转向量的领域中,罗德里格斯公式是一种简单而有效的计算工具。此外,罗德里格斯公式也常被用来构造旋转矩阵或四元数,这在实现三维旋转时非常有用。

二、从轴角变换到旋转矩阵可以使用罗德里格斯公式进行转换

罗德里格斯公式可以用来从轴角表示(axis-angle representation)转换到旋转矩阵。轴角表示是一种描述旋转的方式,它使用一个单位旋转轴 k 和旋转角度 θ 来表示三维空间中的旋转。

给定单位旋转轴 k = (kx, ky, kz).T和旋转角度 θ,可以通过罗德里格斯旋转公式构造对应的旋转矩阵 R:

R = I + sin(θ) * K + (1 - cos(θ)) * K^2;

有的教材也写成:

R = cos(θ) * I + sin(θ) * K + (1 - cos(θ)) * (k * k.T),其中k = (kx, ky, kz).T为列向量

这两个公式其实是一样的。

这里:

  • I 是单位矩阵。

  • K 是根据旋转轴 k 定义的反对称矩阵。其形式如下:

K = \begin{vmatrix}0 &-kz &ky \\ kz &0 &-kx \\ -ky &kx &0 \end{vmatrix}

  • K^2 表示矩阵 K 与自身的矩阵乘积。

将 K 和 K^2 计算出来并代入上述公式,就可以得到完整的旋转矩阵 R。这个矩阵可以用来作用于任意向量 v,即通过矩阵-向量乘法 Rv 来实现向量 v 绕轴 k 旋转 θ 角度的效果。

python案例

R = I + sin(θ) * K + (1 - cos(θ)) * K^2;

import numpy as np
# 这边没有转变成列向量,因为不需要,之后都是大K的计算
k = np.array([1, 0, 0])
# x轴旋转90度
theta = np.pi / 2
K = np.array([[0, -k[2], k[1]],[k[2], 0, -k[0]],[-k[1], k[0], 0]])
K_squared = np.dot(K, K)
# 通过罗德里格斯公式计算旋转矩阵
R = np.eye(3) + (1 - np.cos(theta)) * K_squared + np.sin(theta) * K
print(np.round(R, 5))

R = cos(θ) * I + sin(θ) * K + (1 - cos(θ)) * (k * k.T)

import numpy as np
# 这边特意把k转变成列向量
k = np.array([1, 0, 0]).reshape((-1, 1))
theta = np.pi / 2
K = np.array([[0, -k[2][0], k[1][0]],[k[2][0], 0, -k[0][0]],[-k[1][0], k[0][0], 0]])
# K_squared = np.dot(K, K)
print(k, k.T)
K_squared = np.dot(k, k.T)
print(K_squared)
R = np.cos(theta) * np.eye(3) + (1 - np.cos(theta)) * K_squared + np.sin(theta) * K
print(np.round(R, 5))

结果都是一样的,最多就是精度有所差别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶:容器(Containers)list常用接口详解

介绍完了vector类的相关内容后,接下来进入新的篇章,容器list介绍: 文章目录 1.list的初步介绍2.list的定义(constructor)3.list迭代器( iterator )4.string的三种遍历4.1迭代器4.2范围for循环 5…

BatchNorm介绍:卷积神经网络中的BN

一、BN介绍 1.原理 在机器学习中让输入的数据之间相关性越少越好,最好输入的每个样本都是均值为0方差为1。在输入神经网络之前可以对数据进行处理让数据消除共线性,但是这样的话输入层的激活层看到的是一个分布良好的数据,但是较深的激活层…

MyBatis执行流程

MyBatis是一个流行的Java持久层框架,它封装了JDBC操作,使开发者可以通过XML或注解的方式映射SQL语句,并将POJO与数据库表之间进行映射。了解MyBatis的执行流程,可以帮助开发者更好地理解其内部工作机制,优化代码并解决…

企业微信自动推送机器人的应用与价值

随着科技的快速发展,企业微信自动推送机器人已经成为了企业数字化转型的重要工具。这种机器人可以自动推送消息、执行任务、提供服务,为企业带来了许多便利。本文将探讨企业微信自动推送机器人的应用和价值。 一、企业微信自动推送机器人的应用 企业微信…

无人机飞行控制系统功能,多旋翼飞行控制系统概述

飞行控制系统存在的意义 行控制系统通过高效的控制算法内核,能够精准地感应并计算出飞行器的飞行姿态等数据,再通过主控制单元实现精准定位悬停和自主平稳飞行。 在没有飞行控制系统的情况下,有很多的专业飞手经过长期艰苦的练习&#xff0…

「数据结构」串

串的定义和实现 串的定义 串: 即字符串,零个或多个字符组成的有限序列串的长度:串中字符的个数n空串:n0时的串子串:串中任意多个连续的字符组成的子序列主串:包含子串的串字符在主串中的位置:字符在串中的…

【Docker进阶】镜像制作-用Dockerfile制作镜像(一)

进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作用dockerfile制作镜像dockerfile是什么dockerfile格式为什么需要dockerfileDockerfile指令集合FROMMAINTAINERLABELCOPYENVWORKDIR 用dockerfile制作镜像 用快照制作镜像的缺陷: 黑盒不可重复臃肿 docker…

嵌入式大厂面试题(1)—— CVTE

从本篇开始将会更新历年来各个公司的面试题与面经,题目来自于网上各个平台以及博主自己遇到的,如果大家有所帮助,帮忙点点赞和关注吧! 岗位:嵌入式软件工程师。 面试时间:20分钟。 面试 1 、简历中写了做过…

Kafka 入门笔记

课程地址 概述 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ) 发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接受感兴趣的消息 消息队列 消息队…

HCIA-Datacom实验指导手册:4.3 实验三:网络地址转换配置实验

HCIA-Datacom实验指导手册:4.3 实验三:网络地址转换配置实验 一、实验介绍:二、 思考题与附加内容 一、实验介绍: NAT的作用: 1、很大程度提高网络安全性。 2、控制内外网网络联通性问题。 特点: 1&#…

JDK 11 vs JDK 8:探索Java的新特性和改进

随着技术的不断进步,Java开发工具包(JDK)也在不断演变,为开发者带来更高效、更安全的编程体验。在这篇文章中,我们将重点探讨JDK11相较于JDK 8所引入的一些新特性和改进,以便您能够更好地了解Java的最新发展…

leetcode:买卖股票最佳时机二

思路: 使用贪心算法:局部最优是将买卖过程中产生的正数进行相加,进而使得最后结果最大(全局最优)。 price [7,1,5,10,3,6,4] -6,4,5,-7,3,-2 正数相加就得到了最大 代码实现: 1.循环中下标从1开始 …

大数据的基础探索之大数据时代

前言:大数据已经是大势所趋,在这个网络时代能够不断地整合资源的人本身也是一种能力拥有者,在这个时代,如果一个人可以掌握数据分析工具,利用好云计算的能力,对于自己的个人而言来说都是一个极其重要的参与…

【PyTorch】张量(Tensor)的生成

PyTorch深度学习总结 第一章 Pytorch中张量(Tensor)的生成 文章目录 PyTorch深度学习总结一、什么是PyTorch?二、张量(Tensor)1、张量的数据类型2、张量生成和信息获取 总结 一、什么是PyTorch? PyTorch是一个开源的深度学习框架,基于Python…

20240212请问如何将B站下载的软字幕转换成为SRT格式?

20240212请问如何将B站下载的软字幕转换成为SRT格式? 2024/2/12 12:47 百度搜索:字幕 json 转 srt json srt https://blog.csdn.net/a_wh_white/article/details/120687363?share_token2640663e-f468-4737-9b55-73c808f5dcf0 https://blog.csdn.net/a_w…

上位机图像处理和嵌入式模块部署(利用python开发软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 开发windows和linux软件的时候,大家一般都是习惯于用c/c语言进行开发,但是目前来说很多的开发板都是支持python语言开发的。…

RK3588平台开发系列讲解(视频篇)RKMedia 数据流向

文章目录 一、 获取RKMedia模块通道中的数据二、RKMedia的数据源和接收者三、模块通道绑定API调用 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKMedia是RK提供的一种多媒体处理方案,可实现音视频捕获、音视频输…

服务治理中间件-Eureka

目录 简介 搭建Eureka服务 注册服务到Eureka 简介 Eureka是Spring团队开发的服务治理中间件,可以轻松在项目中,实现服务的注册与发现,相比于阿里巴巴的Nacos、Apache基金会的Zookeeper,更加契合Spring项目,缺点就是…

前端vue 数字 字符串 丢失精度问题

1.问题 后端返回的数据 是这样的 一个字符串类型的数据 前端要想显示这个 肯定需要使用Json.parse() 转换一下 但是 目前有一个问题 转换的确可以 showId:1206381711026823172 有一个这样的字段 转换了以后 发现 字段成了1206381711026823200 精度直接丢了 原本的数据…

MySQL监控Innodb信息

Innodb监控 Innodb由于支持事务操作,是mysql中使用最多的存储引擎,所以如何监控Innodb存储引擎以进行性能优化是在使用mysql过程中遇到最多的,那么如何进行监控呢? show engine -- 显示innodb存储引擎状态的统计和配置信息show en…