我有陀螺仪+加速度计在每个时间周期T的数据。
使用C++,我想要计算对象在每个时刻的旋转-它可以围绕它的轴旋转。我读到用四元数(而不是欧拉角)来表示系统的旋转是很方便的。
如何将角速度(从陀螺仪)转换为四元数表示?我认为为了做到这一点,我需要用数值方法来求解微分方程。
发布于 2010-09-27 09:47:26
你说的是Slerp吗?(球面线性插值)
请参阅Jonathan Blow的文章"“,其中有C++的示例源代码……
http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/
发布于 2010-09-29 03:20:30
陀螺仪中的每个样本都代表一个小旋转:
rot_x = angV_x * timestep
rot_y = angV_y * timestep
rot_z = angV_z * timestep如果生成的旋转很小,则可以通过取旋转角度的一半直接将其转换为四元数:
// for small rotations, quick & dirty quaternion is sufficient
// (note: all angles *must* be in radians!)
float k = timestep * 0.5;
quaternion raw_delta_Q(1.0, angV_x*k, angV_y*k, angV_z*k); // unnormalized!
// combine rotation for current timestep with orientation state
estimated_orient_Q *= raw_delta_Q; // multiply by unnormalized delta
estimated_orient_Q *= 1 / norm(estimated_orient_Q); // then renormalize it!如果您的旋转大于几度,或者如果您需要最大的精度,则需要更密切地关注如何获得四元数。
编辑:请注意,上面的代码假设*=被定义为通过四元数和实数标量进行四元数乘法。这些函数的某种形式(以及明显的构造函数)将出现在任何合理的四元数库中。
发布于 2010-09-27 09:48:24
什么语言?例如,对于Python,cgkit有一个漂亮的quat模块(从旋转矩阵初始化的四元数,而不是“角速度”,但想必你可以从后者构建前者?)euclid.py有一个四元数类的Python源代码,包括从旋转矩阵和其他方式构建它的类方法。
https://stackoverflow.com/questions/3800581
复制相似问题