python - 在 Python 中重新实现 Eigen 旋转矩阵到四元数的转换
问题描述
为了一致性,我想在 python 中重新实现从旋转矩阵到 Cpp Eigen 库的四元数的转换。
Cpp 实现可以在这里找到,下面你可以找到我的 python 实现:
def rotationMatrixToQuaternion3(m):
#q0 = qw
t = np.matrix.trace(m)
q = np.asarray([0.0, 0.0, 0.0, 0.0], dtype=np.float64)
if(t > 0):
t = np.sqrt(t + 1)
q[0] = 0.5 * t
t = 0.5/t
q[1] = (m[2,1] - m[1,2]) * t
q[2] = (m[0,2] - m[2,0]) * t
q[3] = (m[1,0] - m[0,1]) * t
else:
i = 0
if (m[1,1] > m[0,0]):
i = 1
if (m[2,2] > m[i,i]):
i = 2
j = (i+1)%3
k = (j+1)%3
t = np.sqrt(m[i,i] - m[j,j] - m[k,k] + 1)
q[i] = 0.5 * t
t = 0.5 / t
q[0] = (m[k,j] - m[j,k]) * t
q[j] = (m[j,i] + m[i,j]) * t
q[k] = (m[k,i] + m[i,k]) * t
return q
以下是一些示例结果:
rotation matrix:
[[-0.00998882 0.01194957 -0.99987871]
[ 0.49223613 -0.87032691 -0.01531875]
[-0.8704044 -0.49232944 0.00281153]]
python implemnation - qw, qx, qy, qz:
[-0.68145553 -0.18496647 0.68613542 0. ]
eigen:
-0.686135 -0.174997 -0.681456 0.184966
rotation matrix:
[[ 0.01541426 0.02293597 -0.9996181 ]
[ 0.49081359 -0.87117607 -0.01242048]
[-0.87112825 -0.49043469 -0.02468582]]
python implemnation - qw, qx, qy, qz:
[-0.17288173 0.18580601 -0.67658628 0. ]
eigen:
-0.686135 -0.174997 -0.681456 0.184966
rotation matrix:
[[ 0.03744363 -0.01068005 -0.99924167]
[ 0.48694091 -0.87299945 0.02757743]
[-0.87263195 -0.48760425 -0.02748771]]
python implemnation - qw, qx, qy, qz:
[-0.18503815 0.17105894 -0.67232212 0. ]
eigen:
-0.672322 -0.185038 -0.696048 0.171059
帮助将不胜感激!谢谢,约翰内斯
解决方案
推荐阅读
- docker - 从 gitlab 运行器上的 docker 容器访问存储库的问题
- css - 响应式网站无法根据宽度工作
- objective-c - Objective-C 中通常用于 Swift 的可空性相关属性是否也适用于 ObjC-ObjC 调用?
- python - 测试必须通过调用委托来调用的函数
- java - 在一个对象上嵌套同步块
- python - docker-compose 将主机上的文件内容更改同步到安装在 docker 容器上的卷
- python - 如何使用 qyery 返回无在 Django 列表视图上获取外键的名称
- python - 正则表达式匹配一个字符串及其周围的 2 个字符
- html - 如何为最近的祖先提供 XPath?
- ios - Ionic IOS 谷歌登录移动“location.protocol”科尔多瓦