先理解下面这个博客
我们可以发现复数的乘法可以表示旋转,所以从复数推导而来的四元数也可以表示旋转(为什么可以表示旋转这里不做推导)我们只要会用即可。
如何使用四元数表示旋转
理解SLAM中的四元数基础知识_半不闲居士的博客-优快云博客_四元数实部
转换关系
一、旋转矩阵,旋转向量,单位四元数的相互转换总结_旋转向量和旋转矩阵转换_Li feilong的博客-优快云博客
四元数---旋转矩阵(q,R)
q转R:
q=(s,v)
那么:
R转q:
四元数、欧拉角、旋转矩阵、旋转向量之间的转换_欧拉旋转_泠山的博客-优快云博客
旋转向量---旋转矩阵(θn,R)
旋转向量转旋转矩阵:
罗戈里格斯公式
旋转矩阵转旋转向量
使用求特征值1的特征向量就是对应的旋转向量,再将其归一化即可:
四元数--旋转向量(q,θn)
b站搜索:四元数的简单通俗用法(Eigen和python)--只喝白开水
点P绕轴axis旋转角度theta(具体查看B站视频):
#include <Eigen/Dense>
#include <iostream>
#include <cmath>
using namespace Eigen;
using namespace std;
#define _MATH_DEFINES_DEFINED
int main(){
Vector3f point{1.0, 1.0, 0}; //要进行旋转的向量是(1,1,0)
//将向量转化为四元数的形式
Quaternionf p;
p.vec() = point;
p.w() = 0;
//这两行是旋转的轴和角度:绕axis旋转45度
float theta = 45.0 / 180 * 3.14159265358979323846;
Vector3f axis{0,0,1};
//利用公式得到旋转用的四元数(类似于旋转矩阵)
Quaternionf q{cos(theta/2), sin(theta/2) * axis[0], sin(theta/2) * axis[1], sin(theta/2) * axis[2]};
cout<<q.matrix()<<endl;
//利用旋转四元数对一开始的坐标四元数进行q*p*q^-1操作,得到结果
Quaternionf p_new = q * p * q.inverse();
cout<<p_new.matrix()<<endl<<endl;
//将结果转化为三维坐标
Vector3f point_new=p_new.vec();
cout<<point_new<<endl;
return 0;
}