一个四元数的小python包
tinyquaternion的Python项目详细描述
四元数tinyquaternion
一个用于四元数的小python模块
作者:Reza Ahmadzadeh-2019
一。安装
克隆存储库。对于单独的项目,您需要将tinyQuaternion.py
文件复制到源文件夹中,并按如下方式导入模块:
fromtinyQuaternionimportQuaternion
唯一的依赖项是numpy
,因此按如下方式导入:
importnumpyasnp
2.文档
2.1定义四元数
在这个包中,有两种方法可以定义四元数:
- 使用4D数组表示四元数的元素
q=[w,x,y,z]
。使用numpy的ndarray
定义数组。
q=Quaternion(q=np.array([0.,0.,1.,0.]))>>>qQuaternion(0.0,0.0,1.0,0.0)
-
用轴角表示。在表示旋转的弧度时,要使用滚动条表示旋转轴和滚动条。
q=Quaternion(a=np.pi/3,n=np.array([0.,0.,1.]))qQuaternion(0.8660254037844387,0.0,0.0,0.49999999999999994)
2.2条。四元数元素
每个四元数是一个向量q=[w,x,y,z]
,包含四个元素w
、x
、y
、z
。四元数的每个元素都可以按如下方式检索:
q.wq.xq.yq.z
示例:
>>>q.w0.8660254037844387>>>q.x0.0>>>q.y0.0>>>q.z0.49999999999999994>>>
2.3条。标量和矢量部分
要检索四元数的标量部分,w
使用scalar
方法如下:
q.scalar
要检索四元数的向量部分,[x,y,z]
使用vector
方法如下:
q.vector
示例:
>>>q.scalar0.8660254037844387>>>q.vectorarray([0.,0.,0.5])>>>
2.4条。震级
得到四元数的范数或大小,如下所示:
q.magnitude
示例
>>>q.magnitude1.0
2.5条。检查四元数是否规范化
要查看四元数是否规范化,可以使用is_unit()
方法。如果四元数的大小等于1,则返回True
,否则返回False
。
q.is_unit()
示例:
>>>q.is_unit()True
2.6条。正常化
要规范化四元数,请使用normalized
方法。
q.normalized
示例:
>>>q.normalizedQuaternion(0.8660254037844387,0.0,0.0,0.49999999999999994)
2.7条。共轭
要检索四元数的共轭q=[w,x,y,z]
作为q*=[w,-x,-y,-z]
,请使用conjugate
方法,如下所示:
q.conjugate
示例:
>>>q.conjugateQuaternion(0.8660254037844387,-0.0,-0.0,-0.49999999999999994)
2.8条。逆
要检索四元数的逆,请使用inverse
方法,如下所示:
q.inverse
示例:
>>>q.inverseQuaternion(0.8660254037844387,-0.0,-0.0,-0.49999999999999994)
2.9条。从四元数中提取轴角
提取四元数的轴角形式,采用如下方法:
q.axisangle()
示例:
>>>q.axisangle()(array([0.,0.,1.]),1.0471975511965974)
请记住,这不等于我们在上面定义的原始四元数。主要原因是我们对原来的四元数做了一些运算。
2.10条。主要业务
# additionq1.add(q2)# subtractionq1.sub(q2)# multiplicationq1.mul(q2)# divisionq1.div(q2)
示例:
>>>q1=Quaternion(np.array([1.,0.,0.,0.]))>>>q2=Quaternion(np.array([0.,0.,0.,1.]))>>>q1.add(q2)Quaternion(1.0,0.0,0.0,1.0)>>>q1.sub(q2)Quaternion(1.0,0.0,0.0,-1.0)>>>q1.mul(q2)Quaternion(0.0,0.0,0.0,1.0)>>>q1.div(q2)Quaternion(0.0,0.0,0.0,-1.0)
注意,这些操作不会隐式地执行规范化。
2.11条。四元数对数
要获取四元数的对数,请执行
q.log
示例:
>>>q=Quaternion(np.array([0.,1.,0.,0.]))>>>qQuaternion(0.0,1.0,0.0,0.0)>>>q.logQuaternion(0.0,1.5707963267948966,0.0,0.0)
2.12条。四元数exp
要获得四元数的指数,请执行
q.exp
示例:
>>>q=Quaternion(np.array([0.,1.,0.,0.]))>>>qQuaternion(0.0,1.0,0.0,0.0)>>>q.expQuaternion(0.5403023058681398,0.8414709848078965,0.0,0.0)
2.13条。使用四元数(轴角)< EH3>三维空间中的旋转点
q.rotatePoint(p)
示例:
该点应使用3d numpy数组定义如下:
>>>q=Quaternion(a=np.pi/3,n=np.array([0.,0.,1.]))>>>p=np.array([1.,2.,-1.])>>>q.rotatePoint(p)array([-1.23205081,1.8660254,-1.])
三。教程
3.1条。使用四元数旋转
代码可以在test
文件夹中找到。首先导入所有必需的软件包:
importnumpyasnpfromtinyQuaternionimportQuaternionfromplotCubeimportplot_cube
要执行此测试,我们首先使用测试文件夹中提供的函数plotCube.py
绘制多维数据集。
# plot the initial cubep1=np.array([0.,0.,0.])p2=np.array([0.,.1,0.])p3=np.array([2.,0.,0.])p4=np.array([0.,0.,.1])cube1=[(p1[0],p1[1],p1[2]),(p2[0],p2[1],p2[2]),(p3[0],p3[1],p3[2]),(p4[0],p4[1],p4[2])]plot_cube(cube1)
这将生成以下多维数据集:
现在,我们定义一个已知的四元数。假设,我们想要绕y轴旋转90度。四元数将如下所示:
# define a known quaternionq=Quaternion(a=np.pi/2,n=np.array([0.,1.,0.]))
通过使用{{CD6>}和^ {CD5>}关键字,我们通过定义旋转的角度和轴来告诉我们表示四元数的函数。
现在,我们使用四元数通过方法rotatePoint
旋转每个点,如下所示:
# rotate the cubep1r=q.rotatePoint(p1)p2r=q.rotatePoint(p2)p3r=q.rotatePoint(p3)p4r=q.rotatePoint(p4)
并绘制旋转的立方体
cube2=[(p1r[0],p1r[1],p1r[2]),(p2r[0],p2r[1],p2r[2]),(p3r[0],p3r[1],p3r[2]),(p4r[0],p4r[1],p4r[2])]plot_cube(cube2)
现在让我们使用四元数执行两个旋转。我们考虑指定一个新的旋转,然后将其与上一个旋转合并。 我们以前的旋转大约是Y轴90度。对于这个,我们想要绕X轴旋转90度。四元数将如下所示:
q2=Quaternion(a=np.pi/2,n=np.array([1.,0.,0.]))# rotate about x by 90
现在,我们应该把这两个四元数结合起来。规则是“第一轮应该是最后一轮”,所以我们可以写
q=q2.mul(q)
这个四元数具有y轴的旋转效应,然后是x轴的旋转。
现在执行旋转:
p1r=q.rotatePoint(p1)p2r=q.rotatePoint(p2)p3r=q.rotatePoint(p3)p4r=q.rotatePoint(p4)
并绘制旋转的立方体:
cube3=[(p1r[0],p1r[1],p1r[2]),(p2r[0],p2r[1],p2r[2]),(p3r[0],p3r[1],p3r[2]),(p4r[0],p4r[1],p4r[2])]plot_cube(cube3)