四元数表示向量V1到V2的旋转

来源:互联网 发布:mac安装axure出错 编辑:程序博客网 时间:2024/06/06 01:34

版权声明:本文为博主原创文章,未经博主允许不得转载。

博主:shenshikexmu

联系方式:shenshikexmu@163.com

本文的算法来源于stackoverflow 的回答finding quaternion representing the rotation from one vector to another

问题

如下图,三维空间中的向量v1绕着单位向量u旋转θ角后,形成v2。已知v1v2求出代表向量间旋转的四元数。

这里写图片描述
当知道单位向量uθ角时,这个四元数表示起来很简单。
q=cosθ2+sinθ2u
也就是:
q0=cosθ2
q1=sinθ2u.x
q2=sinθ2u.y
q3=sinθ2u.z

v1v2已知的条件下,角θ可以利用v1v2内积,也就是乘计算出来,向量u可以利用v1v2外积,也就是×乘计算出来。

设:
v1方向上的单位向量为nv1长度为a。于是v1=anv1
v2方向上的单位向量为nv2长度为b。于是v2=bnv2
u已经为单位向量。
那么有如下关系:
v1v2=abcosθ
v1×v2=absinθu

算法1

这里写图片描述
思路:寻找v1v2中间的向量half,这样v1half的夹角是θ2v1half的内积方向与u相同。
使half变成单位向量。
half=v1+v2/norm(v1+v2)
于是
nv1half=cosθ2
nv1×half=sinθ2u

q=cosθ2+sinθ2u变为
q=nv1half+nv1×half

function [q] = qUtoV(v1, v2)        %Finding quaternion representing the rotation from one vector to anothernv1 = 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)];endend

算法2

这个算法需要一些数学推导了,呵呵,看了stackoverflow页面,有了四元数的思想,算法1还是很好理解,这个算法2也是想把之前imu的工作结束掉,花了些时间推导了一下。
v1v2=abcosθ
v1×v2=absinθu
于是
v1v2+ab=abcosθ+1=2abcos2θ2
v1×v2=absinθu=absinθu=2absinθ2cosθ2u
向量[2abcos2θ2,2absinθ2cosθ2u] 归一化得到[cosθ2,sinθ2u],正是所要计算的四元数q

function [q] = qUtoV2(v1, v2) %Finding quaternion representing the rotation from one vector to anothernv1 = 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);endend

1 0
原创粉丝点击