详解基于罗德里格斯(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 实现 的相关文章

随机推荐

  • 软件工程学习日记(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