版权声明:本文为博主原创文章,未经博主允许不得转载。
博主:shenshikexmu
联系方式:shenshikexmu@163.com
本文的算法来源于* 的回答finding quaternion representing the rotation from one vector to another
问题
如下图,三维空间中的向量 绕着单位向量 旋转 角后,形成 。已知 和 求出代表向量间旋转的四元数。
当知道单位向量
和
角时,这个四元数表示起来很简单。
也就是:
在 和 已知的条件下,角 可以利用 和 内积,也就是 乘计算出来,向量 可以利用 和 外积,也就是 乘计算出来。
设:
方向上的单位向量为
长度为a。于是
。
方向上的单位向量为
长度为b。于是
。
已经为单位向量。
那么有如下关系:
算法1
思路:寻找
和
中间的向量
,这样
与
的夹角是
,
与
的内积方向与
相同。
使
变成单位向量。
于是
变为
function [q] = qUtoV(v1, v2)
%Finding quaternion representing the rotation from one vector to another
nv1 = v1/norm(v1);
nv2 = v2/norm(v2);
if norm(nv1+nv2)==0
q = [0, [1,0,0]];
else
half = (nv1 + nv2)/norm(nv1 + nv2);
q = [nv1*half',cross(nv1, half)]; end end
算法2
这个算法需要一些数学推导了,呵呵,看了*页面,有了四元数的思想,算法1还是很好理解,这个算法2也是想把之前imu的工作结束掉,花了些时间推导了一下。
于是
向量
归一化得到
,正是所要计算的四元数
。
function [q] = qUtoV2(v1, v2)
%Finding quaternion representing the rotation from one vector to another
nv1 = v1/norm(v1);
nv2 = v2/norm(v2);
if norm(nv1+nv2)==0
q = [0, [1,0,0]];
else
q = [norm(nv1)*norm(nv2)+nv1*nv2',cross(nv1, nv2)]; q=q/norm(q); end end