旋转矩阵转化成四元数的三种算法
来源:互联网 发布:.hp文件是什么数据库 编辑:程序博客网 时间:2024/05/18 13:47
版权声明:本文为博主原创文章,未经博主允许不得转载。
博主:shenshikexmu
联系方式:shenshikexmu@163.com
旋转矩阵的两种表示
看到旋转矩阵有两种表现方式,左乘矩阵、右乘矩阵(两矩阵互为转置,本质是一样的)。在 Gait-Tracking-With-x-IMU 中,旋转矩阵为左乘矩阵。在秦永元的惯性导航中,旋转矩阵为右乘矩阵。
设
左乘矩阵:
a∗Rleft=b 右乘矩阵:
Rright∗a′=b′ 旋转矩阵的性质:
由于旋转矩阵的逆矩阵与转置矩阵相同,在处理时一定要搞清楚是左乘矩阵,还是右乘矩阵。
本文算法操作的都为左乘旋转矩阵。
从四元数到左乘旋转矩阵
四元数
也看到两种四元数表达方式,旋转角度在前,和在后,本文的四元数旋转角度为第一项,也就是
四元数
左乘旋转矩阵为:
在Gait-Tracking-With-x-IMU 中,四元数转旋转矩阵matlab代码,如下:
function R = quatern2rotMat(q) [rows cols] = size(q); R = zeros(3,3, rows); R(1,1,:) = 2.*q(:,1).^2-1+2.*q(:,2).^2; R(1,2,:) = 2.*(q(:,2).*q(:,3)+q(:,1).*q(:,4)); R(1,3,:) = 2.*(q(:,2).*q(:,4)-q(:,1).*q(:,3)); R(2,1,:) = 2.*(q(:,2).*q(:,3)-q(:,1).*q(:,4)); R(2,2,:) = 2.*q(:,1).^2-1+2.*q(:,3).^2; R(2,3,:) = 2.*(q(:,3).*q(:,4)+q(:,1).*q(:,2)); R(3,1,:) = 2.*(q(:,2).*q(:,4)+q(:,1).*q(:,3)); R(3,2,:) = 2.*(q(:,3).*q(:,4)-q(:,1).*q(:,2)); R(3,3,:) = 2.*q(:,1).^2-1+2.*q(:,4).^2;end
代码中的计算和旋转矩阵一样,其中q(:,1)代
旋转矩阵转四元数
算法1
算法出自秦永元的惯性导航,由于其书中是右乘矩阵,在此改成左乘矩阵。
设旋转矩阵
根据四元数与旋转矩阵对应关系,可列方程:
从上述方程可解得
确定
上式中,
算法2
论文New Method for Extracting the Quaternion from a Rotation Matrix的算法。
算法先把左乘旋转矩阵
矩阵可转化为
可以看出,
在Gait-Tracking-With-x-IMU 中,旋转矩阵转四元数matlab代码,如下:
function q = rotMat2quatern(R) %wiki URL: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#cite_note-5 % paper URL: http://arc.aiaa.org/doi/pdf/10.2514/2.4654 [row col numR] = size(R); q = zeros(numR, 4); K = zeros(4,4); for i = 1:numR K(1,1) = (1/3) * (R(1,1,i) - R(2,2,i) - R(3,3,i)); K(1,2) = (1/3) * (R(2,1,i) + R(1,2,i)); K(1,3) = (1/3) * (R(3,1,i) + R(1,3,i)); K(1,4) = (1/3) * (R(2,3,i) - R(3,2,i)); K(2,1) = (1/3) * (R(2,1,i) + R(1,2,i)); K(2,2) = (1/3) * (R(2,2,i) - R(1,1,i) - R(3,3,i)); K(2,3) = (1/3) * (R(3,2,i) + R(2,3,i)); K(2,4) = (1/3) * (R(3,1,i) - R(1,3,i)); K(3,1) = (1/3) * (R(3,1,i) + R(1,3,i)); K(3,2) = (1/3) * (R(3,2,i) + R(2,3,i)); K(3,3) = (1/3) * (R(3,3,i) - R(1,1,i) - R(2,2,i)); K(3,4) = (1/3) * (R(1,2,i) - R(2,1,i)); K(4,1) = (1/3) * (R(2,3,i) - R(3,2,i)); K(4,2) = (1/3) * (R(3,1,i) - R(1,3,i)); K(4,3) = (1/3) * (R(1,2,i) - R(2,1,i)); K(4,4) = (1/3) * (R(1,1,i) + R(2,2,i) + R(3,3,i)); [V,D] = eig(K); %p = find(max(D)); %q = V(:,p)'; q(i,:) = V(:,4)'; q(i,:) = [q(i,4) q(i,1) q(i,2) q(i,3)]; endend
算法3
终于要到这篇博客要讲的算法了,这算法在我接触四元数1年左右才知道,让我甚是羞愧,但理解了算法的思想却让我叫好。由于是同事没有说明从哪里找到的,出处不详。他只是把这算法调成和算法2的结果一样,所以我判断他并不知道算法具体操作方式(思想他可能理解)。
算法3旋转矩阵转四元数matlab代码,如下:
function q = rotMat2qRichard(R)vX=R(1,:);vY=R(2,:);qX = qUtoV(vX,[1,0,0]);y= qMultiVec(vY, qX);qY = qUtoV(y,[0,1,0]);qx=[-qX(1),qX(2:4)];qy=[-qY(1),qY(2:4)];q =qMultiQ(qx,qy);end
function [qq]=qMultiQ(p,q) %p*qqq=[... p(1) * q(1) - p(2) * q(2) - p(3) * q(3) - p(4) * q(4)... ,p(2) * q(1) + p(1) * q(2) - p(4) * q(3) + p(3) * q(4)... ,p(3) * q(1) + p(4) * q(2) + p(1) * q(3) - p(2) * q(4)... ,p(4) * q(1) - p(3) * q(2) + p(2) * q(3) + p(1) * q(4) ];end
function q = qUtoV(v1, v2) %two vetor rotation to quaternionsnv1 = 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
function [vector]=qMultiVec(vec,q) %sensor frame to world framex = q(2);y = q(3);z = q(4);w = q(1);vecx = vec(1);vecy = vec(2);vecz = vec(3);x_ = w * vecx + y * vecz - z * vecy;y_ = w * vecy + z * vecx - x * vecz;z_ = w * vecz + x * vecy - y * vecx;w_ = -x * vecx - y * vecy - z * vecz;vector = [x_ * w + w_ * -x + y_ * -z - z_ * -y ... , y_ * w + w_ * -y + z_ * -x - x_ * -z ... , z_ * w + w_ * -z + x_ * -y - y_ * -x ... ];end
算法思想
1 左乘旋转矩阵,把旋转前x轴向量[1,0,0],转化到旋转后x轴 向量
2 先计算一个四元数
3 四元数
4 从形式上看,
5关于四元数表示向量旋转算法,请看本人博客四元数表示向量V1到V2的旋转。
- 旋转矩阵转化成四元数的三种算法
- 矩阵旋转的算法
- 旋转矩阵的算法
- 欧拉角与旋转矩阵的互相转化
- 旋转字符串的三种算法
- 旋转字符串的三种算法
- 旋转向量与旋转矩阵相互转化
- 关于矩阵旋转算法的实现
- 算法研究(一) 旋转字符串的三种算法
- 算法研究(一) 旋转字符串的三种算法
- 旋转矩阵算法
- 旋转矩阵算法
- 矩阵旋转算法
- 双色球旋转矩阵算法
- 旋转矩阵及旋转向量相互转化 Rodrigues矩阵
- 算法系列-----矩阵(三)-------------矩阵的子矩阵
- OpenCV--旋转向量与旋转矩阵相互转化
- 图像旋转算法原理-- 旋转矩阵
- PL/SQL Developer连接本地Oracle 11g 64位数据库
- Codeforces735D Taxes
- PLsql developer 中文乱码
- csdn积分获取标准
- 一个从文本文件插入到数据库的代码
- 旋转矩阵转化成四元数的三种算法
- Linux下tslib交叉编译的问题
- malloc实现
- 第0篇博客
- assert的使用方法以及extern的使用
- android 实现类似于textview下划线效果
- 按钮兼容IE8的pug和less代码
- 路由配置与管理——静态路由配置与管理
- Android Studio中模拟器中关于VT-x is disabled in BIOS错误的解决方案(有图)