罗德里格斯公式简要介绍

一、罗德里格斯公式(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…

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

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

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

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

Kafka 入门笔记

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

leetcode:买卖股票最佳时机二

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

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 精度直接丢了 原本的数据…

MogaNet实战:使用MogaNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文:https://arxiv.org/pdf/2211.03295.pdf 作者多阶博弈论交互这一全新视角探索了现代卷积神经网络的表示能力。这种交互反映了不同尺度上下文中变量间的相互作用效…

时域和离散域的重要转换器

自然界的模拟信号都是连续信号,也就是我们常说的时域信号,而我们的计算机只能处理离线的数字量信号,但是我们的闭环控制系统都是由离散域和时域所组成的,这里的离散域包括我们的计算机微控制器,时域包括我们的被控对象…

2024.2.3 作业

1、实现单向循环链表的头插头删尾插尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef int datatype; typedef struct node {//数据域int data;//指针域struct node *next; }*Linklist; Linklist create() {Linklist s(Linklist)mallo…

linux应用 进程间通信之信号量(POSIX)

1、前言 1.1 定义 POSIX信号量是一种用于同步进程之间对共享资源访问的机制。它允许进程在访问共享资源之前进行互斥和同步操作&#xff0c;以确保数据的一致性和正确性。POSIX信号量通常由一个整数值表示&#xff0c;可以进行原子增减操作&#xff0c;以及等待和通知操作。 …

【Python网络编程之DHCP服务器】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之DHCP服务器 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2.1 D…

线性时间非比较类排序之计数排序

计数排序 计数排序由 HaroldH.Seward 于1954年提出&#xff0c;它是一种非基于比较的排序算法&#xff0c;通过辅助数组来确定各元素的最终位置。因为在排序过程中不存在元素之间的比较和交换操作&#xff0c;所以当待排序数组为整数且数组内数据的范围较小时&#xff0c;其优…

计算x的平方根x含负数和复数cmath.sqrt(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算x的平方根 x含负数和复数 cmath.sqrt(x) cmath.sqrt(-4)输出的结果是&#xff1f; import cmath import math a 4 print("【显示】a ",a) print("【执行】math.sqrt(a)&…

有状态DHCPv6快速模式配置及EUI-64介绍

正文共&#xff1a;1024 字 15 图&#xff0c;预估阅读时间&#xff1a;3 分钟 我们现在已经熟悉了IPv6的地址架构&#xff08;IPv6地址架构一本通&#xff09;&#xff0c;掌握了IPv6地址的手工配置方式&#xff08;IPv6从入门到精通&#xff09;和DHCPv6有状态地址配置&#…

openssl3.2 - osslsigncode工程的学习

文章目录 openssl3.2 - osslsigncode工程的学习概述笔记工程库地址工程的编译osslsigncodeM工程文件列表osslsigncodeM工程搭建细节原始工程实现的改动自己封装的包含openssl和curl的实现osslsigncodeM工程命令行的用法备注 - VS2019调试环境备注 - 如果要单步openssl的API学学…

第六篇:MySQL图形化管理工具

经过前五篇的学习&#xff0c;对于数据库这门技术的理解&#xff0c;我们已经在心中建立了一个城堡大致的雏形&#xff0c;通过命令行窗口&#xff08;cmd&#xff09;快速上手了【SQL语法-DDL-数据定义语言】等相关命令 道阻且长&#xff0c;数据库技术这一宝藏中还有数不清的…