好用高效的python四元数库-quaternion

这篇具有很好参考价值的文章主要介绍了好用高效的python四元数库-quaternion。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

好用高效的python四元数库-quaternion

一、简介

https://github.com/moble/quaternion

这个库主要是在Numpy的基础上增加一个quaternion的类型,不仅实现了四元数相关操作的numpy实现,同时也将numpy的很多用法拓展到了相关四元数上。并且这个库的核心实现使用c语言实现的,保证了这个库在运算上的较高速度。

在近期进行四元数的学习中,比较了多个库,其中包括Scipy的旋转相关库,以及其他库,最终还是选择了这个库,原因在于其对于numpy的支持,但是由于其说明文档中只有四元数很小一部分的使用说明,但其实这个库所能实现的功能是远大于作者写的说明文档的,故写下这篇中文文档,供自己记录学习。

二、安装

如果是在conda环境下的,最好使用

conda install -c conda-forge quaternion

如果出现了,下载安装后No module name ‘quaternion’,可以适当降低numpy版本,目前numpy-1.20.3适配quater

nion-2022.4.3版本

也可以使用pip

python -m pip install --upgrade --force-reinstall numpy-quaternion

根据Releases · moble/quaternion (github.com)中说明的使用依赖仍然需要安装conda install scipy numba

三、基础用法

import numpy as np
import quaternion

首先构建几个四元数

q1 = np.quaternion(1,2,3,4)
q2 = quaternion.from_float_array([1,2,3,4])

# 生成的都是单位四元数
q3 = quaternion.from_rotation_matrix([[1,2,3],[1,2,3],[1,2,3]])
q4 = quaternion.from_euler_angles([1,2,3])
print(q1,q2,q3,q4)

好用高效的python四元数库-quaternion

四元数叉乘

( w 1 , x 1 , y 1 , z 1 ) ⊗ ( w 2 , x 2 , y 2 , z 2 ) = ( w 1 w 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 , w 1 x 2 + x 1 w 2 + z 1 y 2 − y 1 z 2 , w 1 y 2 + y 1 w 2 + x 1 z 2 − z 1 x 2 , w 1 z 2 + z 1 w 2 + y 1 x 2 − x 1 y 2 ) (w_1,x_1,y_1,z_1) \otimes (w_2,x_2,y_2,z_2) = \begin{matrix} (&w_1w_2-x_1x_2-y_1y_2-z_1z_2,\\&w_1x_2+x_1w_2+z_1y_2-y_1z_2,\\&w_1y_2+y_1w_2+x_1z_2-z_1x_2,\\&w_1z_2+z_1w_2+y_1x_2-x_1y_2&) \end{matrix} (w1,x1,y1,z1)(w2,x2,y2,z2)=(w1w2x1x2y1y2z1z2,w1x2+x1w2+z1y2y1z2,w1y2+y1w2+x1z2z1x2,w1z2+z1w2+y1x2x1y2)

# dot方法这里也是叉乘 
print(np.dot(q1,q2))
print(q1 * q2)
print(np.multiply(q1,q2))

好用高效的python四元数库-quaternion

四元数的模

∣ q ∣ = w 2 + x 2 + y 2 + z 2 \lvert q \rvert = \sqrt{w^2+x^2+y^2+z^2} q=w2+x2+y2+z2

# 计算四元数的模
print(q1.abs())
print(q1.absolute())
print(np.sqrt(q1.norm()))
# 四元数的归一化
print(q1 / q1.abs())
print(q1.normalized())

好用高效的python四元数库-quaternion

四元数的Cayley norm

∥ q ∥ = w 2 + x 2 + y 2 + z 2 \lVert q \rVert = w^2+x^2+y^2+z^2 q=w2+x2+y2+z2

注意四元数的Norm和numpy中的np.linalg.norm方法不同,numpy中是Euclidean norm,而四元数中的norm是Cayley norm

print(q1.norm())

四元数的共轭与逆

四元数的共轭就是让四元数的向量部分取负 q ∗ = ( w , x , y , z ) ∗ = ( w , − x , − y , − z ) q^* = (w,x,y,z)^* = (w,-x,-y,-z) q=(w,x,y,z)=(w,x,y,z)

四元数的逆就是四元数的共轭除以它的Cayley norm q − 1 = q ∗ ∥ q ∥ q^{-1} = \frac{q^*}{\lVert q \rVert} q1=qq

一般用单位四元数,此时它的逆和共轭是相等的

# 四元数求共轭
print(q1.conjugate())
# 四元数求逆
print(q1.inverse())

# 单位四元数的共轭和逆是相等的
q_normolized = q1.normalized()
print(q_normolized.conjugate())
print(q_normolized.conjugate() / q_normolized.norm())

好用高效的python四元数库-quaternion

两个四元数间的旋转量

表示一个方位到另一个方位的旋转量

q = q b e g i n ∗ ∗ q a f t e r q = q_{begin}^* * q_{after} q=qbeginqafter q b e g i n , q a f t e r q_{begin},q_{after} qbegin,qafter是单位四元数)

q = q b e g i n − 1 ∗ q a f t e r q = q_{begin}^{-1} * q_{after} q=qbegin1qafter q b e g i n , q a f t e r q_{begin},q_{after} qbegin,qafter不是单位四元数)

q = q3.conjugate() * q4
print(q)
# 要注意四元数叉乘顺序
print(q * q3)
print(q3 * q)
print(q4)


q3New = 2 * q3
print(q3New)
q = q3New.inverse() * q4
print(q.normalized())

好用高效的python四元数库-quaternion

四元数点乘

用于度量两个四元数的相似性,和向量的点乘类似,两四元数点乘绝对值越大其代表的旋转约相似,点乘趋近于-1或者1,都意味着相似,因为 ( 1 , 0 , 0 , 0 ) (1,0,0,0) (1,0,0,0) ( − 1 , 0 , 0 , 0 ) (-1,0,0,0) (1,0,0,0)的意义是当旋转角为360度的整数倍时,方位没有改变

# 在quaternion库中没有对应的方法
def quatDot(q1,q2):
    return np.abs((q1.w * q2.w + q1.x * q2.x + q1.y * q2.y + q1.z * q2.z) / q1.absolute()*q2.absolute() )

四、参考

四元数基础 - 圣骑士wind - 博客园 (cnblogs.com)

四元数的基本运算_飘零过客的博客-CSDN博客_四元数运算文章来源地址https://www.toymoban.com/news/detail-417423.html

到了这里,关于好用高效的python四元数库-quaternion的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 四元数,旋转矩阵,欧拉角互转(python)

    运行代码之前需要安装pyquaternion和scipy。 pip install pyquaternion pip install scipy 代码之前放下面,main函数有使用的方式

    2024年02月12日
    浏览(42)
  • 欧拉角,四元数和旋转矩阵互转代码【python版】

    欧拉角以 Roll、Pitch、Yaw 的顺序表示 四元数以[ q w q_w q w ​ , q x q_x q x ​ , q y q_y q y ​ , q z q_z q z ​ ]的顺序表示 代码包括了 欧拉角与四元数互转 , 旋转矩阵与四元数互转 , 欧拉角与旋转矩阵互转 ,输入参数均为 np.array 形式 代码内置了角度制和弧度制😃😃 当时因为这块

    2023年04月22日
    浏览(50)
  • 转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

    由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄明白之后干脆写一篇文章,给人方便同时于己方便,后续如有扩充或变动也方便添加。 假设有两个向量 a 1 = ( x 1 , y 1 , z 1 ) a_1 = (x_1, y_1, z_1) a 1 ​ = ( x 1 ​ , y 1 ​ , z 1 ​

    2024年02月03日
    浏览(77)
  • 《动手学机器人学》7.2.4姿态之间的互相转换,Python&&C++支持四元数,欧拉角旋转矩阵、轴角

    本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 上一节小鱼带你一起学习了四种姿态表示方式,这节课我们就利用相关的开源库,来完成姿态的不同表示方式之间的转

    2024年02月02日
    浏览(45)
  • 四元数

    传入一个向量,使物体旋转,如: 值得注意的是:Unity中组件Transform的Rotation实际上是Quaternion类型的 与上面功能类似,但更为简洁,如: 线性插值,与Mathf.Lerp差不多。 与transform.LookAt类似的是都是将其正方向指向目标方向,但是LookRotation可以做的跟更好 如: 值得注意的是:

    2024年02月15日
    浏览(33)
  • 四元数计算

    两个四元数相乘得到一个新的四元数,代表两个旋转量的叠加,相当于旋转 注意:旋转相对的坐标系,是物体自身坐标系 例如绕 自身y轴 转20度: 如果绕自身y轴转40度,那么就再乘一个q: 四元数乘向量返回一个新向量, 可以将指定向量旋转对应四元数的旋转量,相当于旋

    2024年02月09日
    浏览(41)
  • 四元数的理解

    一共三个虚维度来描述空间,实数则在第四个维度,垂直于全部三个虚数轴 四元数可以优雅的描述并计算三维旋转 “四维右手法则” 两个复数Z和W相乘,把z当成一个函数,对w施加某种旋转和拉伸 左边的数作为一种函数,去变换右边的数 原则上将,把所有二维旋转的集合映

    2024年01月18日
    浏览(38)
  • Unity之四元数计算

    模拟飞机发射不同类型子弹的方法,单发,双发,扇形,环形 用3D数学知识实现摄像机跟随效果 1.摄像机在人物斜后方,通过角度控制倾斜率 2.通过鼠标滚轮控制摄像机距离人物的距离(有最大最小限制) 3.摄像机看向任务头顶上方的一个位置(可调节) 4.Vector3.Lerp实现相机

    2024年01月19日
    浏览(42)
  • ROS系列——使用python的transforms3d、numpy库实现四元数、旋转矩阵、欧拉角、轴角等的相互转换

    pip3 install transforms3d 四元数模块在transforms3d.quaternions里,直接导入即可使用 2.1.1四元数转旋转矩阵 2.1.2 旋转矩阵转四元数 2.2.1 四元数转轴角 2.2.2 轴角转四元数 四元数模块在transforms3d.euler里,直接导入即可使用 3.1.1 固定轴欧拉角转四元数 3.1.2 四元数转固定轴欧拉角 3.2.1 固定

    2024年02月07日
    浏览(90)
  • 数学概率 | 旋转矩阵、欧拉角、四元数

    目录 一,旋转矩阵 二维旋转矩阵 三维旋转矩阵 二,欧拉角 三,四元数 四,矩阵、欧拉角、四元数相互转换 四元数转矩阵 矩阵转四元数 欧拉角转矩阵 矩阵转欧拉角 欧拉角转四元数 四元数转欧拉角 二维旋转矩阵 R() =  推导,以二维平面为例旋转:  = cos( + ) = coscos - si

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包