详解基于罗德里格斯(Rodrigues)公式由旋转向量到旋转矩阵的 Python 实现

2023-11-17

旋转向量 rotation vector

任何一个旋转都可以通过一个 旋转轴 加一个 旋转角 进行描述, 即围绕 旋转轴 旋转一个 旋转角. 此时可以通过一个 旋转向量 来描述这组 旋转轴旋转角 .

旋转向量 的方向与 旋转轴 一致, 旋转向量 的长度等于 旋转角 的大小.

特别注意:

  1. 此处 旋转角 的单位为 弧度.
  2. 旋转向量不等于欧拉角, 旋转向量可以看做是绕着旋转轴一次性完成旋转, 而欧拉角则是绕着当前坐标系的坐标轴依次旋转.

旋转矩阵 rotation matrix

任何一个旋转运动都可以通过一个 3 × 3 3\times3 3×3旋转矩阵 R R R 进行描述. 旋转矩阵是一个单位正交矩阵(unit orthogonal matrix), 具有以下性质:

d e t ( R ) = 1 R T = R − 1 det(R)=1 \\ R^{T}=R^{-1} det(R)=1RT=R1

罗德里格斯公式 Rodrigues’ formula

R = cos ⁡ ( θ ) I + ( 1 − cos ⁡ ( θ ) ) n n T + sin ⁡ ( θ ) n ∧ R=\cos (\theta )I + (1 - \cos(\theta))nn^{T}+\sin(\theta)n^{\wedge} R=cos(θ)I+(1cos(θ))nnT+sin(θ)n

式中, R R R 表示 3 × 3 3\times3 3×3的旋转矩阵, θ \theta θ 为旋转角(单位: 弧度rad), n n n 为旋转向量除以 θ \theta θ 后得到的向量(有些文献也直接叫做旋转向量), n ∧ n^{\wedge} n表示 n n n对应的反对称矩阵, 如下所示:
n = [ x y z ] T n ∧ = [ 0 − z y z 0 − x − y x 0 ] n= \begin{bmatrix}x & y & z \end{bmatrix}^{T} \\ n^{\wedge}=\begin{bmatrix} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{bmatrix} n=[xyz]Tn= 0zyz0xyx0

基于 Python 和 NumPy 实现 Rodrigues 公式

注意: 此处rot_vector使用的是列向量.

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : rodrigues.py
@Time : 2023/06/08 14:21:32
@Author : KRISNAT
@Version : 0.0
@Contact : krisnat.ton@gmail.com
@License : (C)Copyright 2023, KRISNAT.
@Desc : None
'''

import cv2
import numpy as np


def rodrigues(rot_vector):
    """"""

    theta = np.linalg.norm(rot_vector)
    rot_vector = np.array(rot_vector).reshape(3, 1) / theta

    K = np.asanyarray(
        [
            [0, -rot_vector[2, 0], rot_vector[1, 0]],
            [rot_vector[2, 0], 0, -rot_vector[0, 0]],
            [-rot_vector[1, 0], rot_vector[0, 0], 0]
        ]
    )

    return np.asanyarray(np.cos(theta)*np.eye(3) + (1 - np.cos(theta))*rot_vector*rot_vector.T + np.sin(theta) * K )


if __name__ == '__main__':
    print(f"Rodrigues by NumPy: ")
    print(rodrigues(rot_vector=np.asanyarray([0.0955415182750808, 0.0475064330746053,0.0485482885665371])))
    print(f"Rodrigues by OpenCV funtion: ")
    print(cv2.Rodrigues(np.asanyarray([0.0955415182750808, 0.0475064330746053,0.0485482885665371]))[0])
    

运行结果: 使用NumPy编写的 Rodrigues 公式计算旋转矩阵的结果与调用 OpenCV 的函数计算结果一致, 验证了代码的正确性.

在这里插入图片描述


收集整理和创作不易, 若有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解基于罗德里格斯(Rodrigues)公式由旋转向量到旋转矩阵的 Python 实现 的相关文章

  • 获取 .wav 文件长度或持续时间

    我正在寻找一种方法来找出 python 中音频文件 wav 的持续时间 到目前为止我已经了解了 pythonwave图书馆 mutagen pymedia pymad我无法获取 wav 文件的持续时间 Pymad给了我持续时间 但它不一致
  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • IndexError:索引 10 超出尺寸为 10 的轴 0 的范围

    我正在以数字方式为 x 网格和 x 向量以及时间网格设置网格 但我再次设置了一个数组x 位置 只能在 0 到 20 之间并且t 时间 将从 0 到 1000 以便求解热方程 但每次我想要 例如 我将步数设置为 10 时 都会收到错误 Tra
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • Spark 和 Python 使用自定义文件格式/生成器作为 RDD 的输入

    我想问一下 Spark 中输入的可能性 我可以看到从http spark apache org docs latest programming guide html http spark apache org docs latest pro
  • python中basestring和types.StringType之间的区别?

    有什么区别 isinstance foo types StringType and isinstance foo basestring 对于Python2 basestring是两者的基类str and unicode while type
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • 为什么 __dict__ 和 __weakref__ 类从未在 Python 中重新定义?

    类创建似乎从来没有re 定义 dict and weakref class属性 即 如果它们已经存在于超类的字典中 则它们不会添加到其子类的字典中 但始终re 定义 doc and module class属性 为什么 gt gt gt c
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • 软件工程学习日记(4)----面向数据流的设计方法

    用面向数据流的方法设计下列系统的软件结构 问题回顾 为方便储户 某银行拟开发计算机储蓄系统 储户填写的存款单或取款单由业务员输入系统 如果是存款 系统记录存款人姓名 住址 存款类型 存款日期 利率等信息 并印出存款单给储户 如果是取款 系统
  • 四元组与旋转矩阵

    转自 https blog csdn net linuxheik article details 49129927 引用 四元组与旋转矩阵 2011 09 22 17 13 39 分类 DirectX资料 举报 字号 订阅 下载LOFTER
  • halcon起步

    halcon起步 安装 软件介绍 安装 下载地址 管理员方式运行 选择安装 否 复制dll文件 D Program Files MVTec HALCON 12 0 bin x64 win64 重启计算机 软件介绍 打开药品识别例程 导出为c
  • vue3报错:‘xxxx‘is declared but its value is never read.Vetur(6133)

    原因 因为vue3不支持vetur了 解决办法 1 禁用或者删除vscode中的vetur扩展 2 下载Vue Language Features 3 重新打开项目 完美解决
  • 医学图像相关的数据集

    医学图像相关的数据集 1 Camelyon 乳腺病理 数据集获取 参考 博文地址 相关文章推荐 预处理
  • Qt QString字符串分割、截取的3种方法

    Qt QString字符串分割 截取 在做项目中不可避免的会使用到一串字符串中的一段字符 因此常常需要截取字符串 有两种方式可以解决这个问题 方法一 QString分割字符串 QString date dateEdit toString y
  • Log4Net使用实例(VS2008 App)

    准备工作 首先要去http logging apache org log4net 下载log4net的源代码 将log4net sln载入Visual Studio NET 编译后可以得到log4net dll 也可以直接在网上搜索下载别人
  • CI/CD(持续集成/持续交付/持续部署)

    CICD流程图 代码管理仓库gitlab gitlab是个私有的代码管理仓库 可以运行在企业内部的网络中 使企业开发人员可以保持代码的私有性 同时也方便自行管理代码 gitlab有很多CI功能 但是通常还是采用Jenkins 原因就是Jen
  • 淘宝用户日志数据集的用户行为分析与用户分群

    文章目录 数据集描述 一 数据清洗 1 读取并查看数据基本信息和数据的完整性 2 查看数据集中行的重复情况并删除 3 处理缺失值 4 合并month和day列组成时间类型的date列 5 划分子数据集 二 数据分析 1 访问量与访客量的情况
  • 嵌入式开发4(I.MX6U串口实验与ubuntu串口调试助手)

    在学习正点原子6UL嵌入式开发板的时候 串口UART是一个很重要的点 在以后的实验中会经常遇到 但是教学中是在windows环境下搭建ubuntu虚拟机来编译代码的 串口调试助手使用的是windows版本的 而我是安装了双系统 所以研究了一
  • visual studio中配置OpenCVsharp

    只能在线下载 每次新建项目就要下载一次 没找到离线下载的方式 很可恶 visual studio2019 C 语言 配置OpenCVsharp当前最新版 4 6 0 在浏览界面搜索OpenCVsharp 下载OpenCVsharp4和对应r
  • unity 路径

    IOS Application dataPath Application xxxxxxxx xxxx xxxx xxxx xxxxxxxxxxxx xxx app Data Application streamingAssetsPath A
  • 使用 .net + blazor 做一个 kubernetes 开源文件系统

    背景 据我所知 目前 kubernetes 本身或者其它第三方社区都没提供 kubernetes 的文件系统 也就是说要从 kubernetes 的容器中下载或上传文件 需要先进入容器查看目录结构 然后再通过 kubectl cp 指令把文
  • linux系统 在python3.6/CUDA 11环境下安装tensorflow 1.15

    今天在实验室服务器 3090 上跑别人用tensorflow写的代码 CPU使用率飙高 吓得我赶紧停了QAQ 后来发现是因为GPU无法使用 其原因是官网中cuda11 X 仅支持tf2 X 不支持tf1 X 通过查阅资料 参考大佬的方法 最
  • 力扣-912题 排序数组(C++)- 快排必须烂熟于心

    题目链接 https leetcode cn com problems sort an array 题目如下 class Solution public vector
  • vue3中百度地图的使用

    在vue3中使用百度地图 vue3 百度地图 文章目录 在vue3中使用百度地图 前言 一 百度地图在vue3中的引入 二 页面内容 注意事项 三 异步加载文件 四 图 前言 具体为百度地图引入 如何使用点位和自定义点位信息窗口 提示 以下
  • 2015蓝桥杯——密文搜索

    题目描述 标题 密文搜索 福尔摩斯从X星收到一份资料 全部是小写字母组成 他的助手提供了另一份资料 许多长度为8的密码列表 福尔摩斯发现 这些密码是被打乱后隐藏在先前那份资料中的 请你编写一个程序 从第一份资料中搜索可能隐藏密码的位置 要考
  • Dockerfile命令集

    Dockerfile与docker build命令 1 什么是Dockerfile 1 1 Dockerfile 1 2 docker build命令 1 3 Dockerfile相关指令描述 2 Dockerfile命令详情 2 1 FR
  • Java基础 —— 异常

    目录 异常的概念及分类 异常的处理try catch finally 异常抛出throw s 自定义异常 异常的概念及分类 什么是异常 异常是指在程序的运行过程中发生的一些不正常事件 比如 除0溢出 数组下标越界 所要读取的文件不存在 异常
  • 详解基于罗德里格斯(Rodrigues)公式由旋转向量到旋转矩阵的 Python 实现

    文章目录 旋转向量 rotation vector 旋转矩阵 rotation matrix 罗德里格斯公式 Rodrigues formula 基于 Python 和 NumPy 实现 Rodrigues 公式 旋转向量 rotation