首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求单位中两个四元数的相对旋转

如何求单位中两个四元数的相对旋转
EN

Stack Overflow用户
提问于 2019-07-13 22:44:55
回答 1查看 818关注 0票数 1

我试着用两个IMU分别得到上臂和下臂之间的夹角。我校准了两个imu,并使用四元数来获得Unity 3D中上臂和下臂对象的全局方向。

Qimu1 =来自位于下臂的imu的四元数

Qimu2 =来自上臂上的imu的四元数。

我在Unity中创建了两个对象来表示上臂和下臂。其中,下臂是上臂的子对象,并且使用角色关节连接到上臂。

这是上臂的脚本:

代码语言:javascript
复制
if (Input.GetKeyDown(KeyCode.Space))
        {
            Qstart2 = Qimu2;
        }

        transform.localRotation = Qstart2 * Quaternion.Inverse(Qimu2);

Lowerarm脚本:

代码语言:javascript
复制
if (Input.GetKeyDown(KeyCode.Space))
        {
            Qstart1 = Qimu1;
        }

        Qimu1new = Qstart1 * Quaternion.Inverse(Qimu1);
        Quaternion Qdiff = Quaternion.Inverse(Qimu1new) * Qimu2;
        transform.localRotation = Qdiff;

我想要获得的是在Unity3D中使用2个IMU的手臂运动的可视表示。现在,如果我保持我的肘部伸展,脚本工作。但是,只要我开始弯曲我的肘部,下臂对象就开始围绕同一轴连续旋转。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-14 23:14:31

我们可以使用一些代数来计算下臂变换的相对旋转:

公式Qstartx * Quaternion.Inverse(Qimux)提供该部位相对于躯干的旋转:

代码语言:javascript
复制
upper arm's rotation relative to body = Qstart2 * Quaternion.Inverse(Qimu2)
lower arm's rotation relative to body = Qstart1 * Quaternion.Inverse(Qimu1)

我们知道,由于下臂是上臂的孩子:

代码语言:javascript
复制
lower arm's rotation relative to body 
    = upper arm's rotation relative to body * lowerArmTransform.relativeRotation

通过替换,我们可以确定:

代码语言:javascript
复制
Qstart1 * Quaternion.Inverse(Qimu1) 
    = (Qstart2 * Quaternion.Inverse(Qimu2)) * lowerArmTransform.relativeRotation

Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2))乘以左边的两边

代码语言:javascript
复制
Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qstart1 
* Quaternion.Inverse(Qimu1) 
    = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) 
      * ( Qstart2 * Quaternion.Inverse(Qimu2) )
      * lowerArmTransform.relativeRotation

Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * ( Qstart2 * Quaternion.Inverse(Qimu2) )取消:

代码语言:javascript
复制
Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qstart1 
* Quaternion.Inverse(Qimu1) 
    = lowerArmTransform.relativeRotation

Qimu1new = Qstart1 * Quaternion.Inverse(Qimu1);开始,我们可以得出这样的结论:

lowerArmTransform.relativeRotation = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qimu1new;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57020163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档