利用四元数计算两个坐标系之间的平滑过渡

四个月前刚研究了四元数,这周正好就在项目中用上了。看来深入钻研相关的知识点还是有莫大的好处的。

项目中的应用场景是,已知一个起始的用户坐标系UCS1,和一个终止的用户坐标系UCS2,如何求出一系列的中间坐标系,使得它们在UCS1和UCS2直接平滑的过渡?
(UCS1在这里是机器人手部的起始位置,UCS2是手部的目标位置,因为目前我只使用简单的反向动力学算法来求机器人的关节位置,所以需要计算初始和终止位置的过渡坐标系。将来用上运动规划的模块,这个就不再需要了。不过,这仍然是一个具有普适意义的好题目。例如UCS1可以看成是摄像机的初始坐标系,UCS2是摄像机的终止坐标系,我们可以求一个平滑的相机过渡路径。)
 
最简单的做法,坐标系的原点可以逐步的平移过去。那坐标系的旋转如何逐步过渡呢?答案是使用四元数的插值(interpolation)。
 
前文得知,坐标系的旋转矩阵表达可以和四元数表达互相转换。所以我们有如下解决问题的伪代码:
 1 UCS GetInterpolationMatrix(UCS& ucs1, UCS& ucs2, double t)
 2 {
 3     Matrix m1 = UCS1.GetMatrix();
 4     Matrix m2 = UCS2.GetMatrix();
 5     Vector p1 = m1.GetT();
 6     Vector p2 = m2.GetT();
 7     Quaternion q1 = m1.GetQ();
 8     Quaternion q2 = m2.GetQ();
 9     
10     Matrix m;
11     Vector     p = p1 * (1 - t) + p2 * t;
12     Quaternion q = q1 * (1 - t) + q2 * t;
13     m.SetT(p);
14     m.SetQ(q);  
15     
16     return UCS(m);          
17 }

这个函数接受两个待插值UCS和一个数值t,将t在0和1之间变化,就可以得到一系列过渡的UCS。

值得注意的是,两个四元数的插值还有很多种方法,本文只是展示了最简单并且可用的一个方法。

转载于:https://www.cnblogs.com/kaige/p/use_quaternion_interpolation_for_coordinate_system_smooth_transitioning.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值