Python 如何获得两个四元数之间的角度?

Python 如何获得两个四元数之间的角度?,python,quaternions,coordinate-systems,euler-angles,Python,Quaternions,Coordinate Systems,Euler Angles,我在大腿和小腿上使用惯性测量装置,尝试获得所有自由度(x、y、z或屈曲、内收、旋转)下的膝关节角度。该公司提供的一种算法将加速度计、陀螺仪和磁强计数据中的9DOF转换为每个传感器的四元数 我希望使用给定的四元数获得大腿和小腿传感器之间的x、y和z(膝关节)角度。 我对四元数非常陌生,我正在尝试通过python了解实现这一点的方法,但也在概念上理解它。免责声明:我自己对四元数非常陌生,但在“接近”四元数方面做了一些工作。以下是我有限的知识加上一些谷歌搜索的结果。看起来它确实应该做到这一点 因此,听

我在大腿和小腿上使用惯性测量装置,尝试获得所有自由度(x、y、z或屈曲、内收、旋转)下的膝关节角度。该公司提供的一种算法将加速度计、陀螺仪和磁强计数据中的9DOF转换为每个传感器的四元数

我希望使用给定的四元数获得大腿和小腿传感器之间的x、y和z(膝关节)角度。

我对四元数非常陌生,我正在尝试通过python了解实现这一点的方法,但也在概念上理解它。

免责声明:我自己对四元数非常陌生,但在“接近”四元数方面做了一些工作。以下是我有限的知识加上一些谷歌搜索的结果。看起来它确实应该做到这一点

因此,听起来您试图解决的问题可以表述如下:

  • 给定两个四元数(分别表示大腿和小腿的三维方向)
  • …计算两个四元数之间的三维角度差
  • 。。。用欧拉角表示角差
要获得3D角度差,它本身就是一个四元数,只需将一个四元数乘以另一个四元数的共轭()

然后需要将四元数转换为Euler角度(围绕X、Y、Z旋转)。据我所知,你需要用传统的方法,使用

示例代码,使用库:

将四元数导入为pyq
输入数学
#创建大腿和小腿的假设方向
#我们使用(轴,度)符号,因为它是这里最直观的
#大腿完全垂直,轻微旋转
四元数(轴=[0.0,0.0,-1.0],度=-5)
#小腿稍微偏离垂直方向,朝另一个方向旋转。
四元数(轴=[0.1,-0.2,-0.975],度=10)
#获取这两个方向之间的3D差异
qd=q_上共轭*q_下共轭
#从这个差分四元数计算欧拉角
φ=数学常数2(2*(qd.w*qd.x+qd.y*qd.z),1-2*(qd.x**2+qd.y**2))
θ=math.asin(2*(qd.w*qd.y-qd.z*qd.x))
psi=数学常数2(2*(量子点w*qd.z+qd.x*qd.y),1-2*(量子点y**2+qd.z**2))
#结果:
#φ=1.16度
#θ=-1.90度
#磅/平方英寸=-14.77度
注意事项:

  • 我还没有亲自验证这一点的正确性,但它确实看起来应该是正确的
  • 当然,您需要确认每个角度(φ、θ、psi)的实际方向和符号是否符合您的预期
  • 在维基百科的文章中(在他们的C示例代码中),他们对计算θ的
    asin
    调用添加了一点修正。我不确定是否需要这样做。但如果θ真的是内收,我猜你不用担心90度以上的角度;-)
我认为你可以简单地将四元数Q1和Q2应用于参考向量X、Y、Z,然后计算它们之间的角度。比如:

X1 = Q1*X*conj(Q1);
Y1 = Q1*Y*conj(Q1);
Z1 = Q1*Z*conj(Q1);

X2 = Q2*X*conj(Q2);
Y2 = Q2*Y*conj(Q2);
Z2 = Q2*Z*conj(Q2);


DiffAngleX = acos(dot(X1,X2));
DiffAngleY = acos(dot(Y1,Y2));
DiffAngleZ = acos(dot(Z1,Z2));

你能提供更多关于你想做什么的信息吗(也许是一些代码行)?您的输入和输出是什么(列表、整数、浮点、数组…?)“大腿和小腿传感器之间的x、y和z(膝关节)角度”到底是什么