首页 > 其他分享 >视觉SLAM十四讲 3.6.2实际的坐标转换的例子

视觉SLAM十四讲 3.6.2实际的坐标转换的例子

时间:2023-09-05 10:45:37浏览次数:46  
标签:q1 四元 Eigen 小萝卜 3.6 p2 SLAM 坐标

在这一讲中,作者没有给出详细的过程,作为初学者还是有点懵。

这道题是有两种解法的

  • 四元数解法
  • 欧拉矩阵解法

四元数解法

假设一个目标点 \(p\)在世界坐标系下的坐标是

\[P_W \]

利用四元数表示旋转,两个小萝卜坐标系下 \(p\) 点坐标有如下公式:

\[p_1 = q_1 * P_w + t_1 \\ p_2 = q_2 * P_w + t_2 \]

以上公式实际上是Eigen的计算公式,经过了运算符重载,实际上,数学表达上与Eigen运算有所不同。
Eigen中四元数表示旋转是

\[q*P \]

数学表达上应该是

\[q*P*q^{-1} \]

因为Eigen使用了运算符重载,减少了编写代码的麻烦。
由以上的坐标变换关系,可以推得:

\[p_2=q_2 ∗q_{1}^{−1} ∗(p_1 −t_1 )+t_2 \]

变换矩阵解法

若使用欧拉矩阵,我们设两个坐标的变换矩阵为T1和T2,有:

\[p_1 = T_1*P_w\\ p_2 = T_2*P_w \]

联立可以得到如下计算公式:

\[p_2 = T_2*T_1^{-1} *p_1 \]

code

void main()
{
    //定义两个小萝卜自身姿态的两个四元数
    Eigen::Quaterniond q1(0.35, 0.2, 0.3, 0.1), q2(-0.5, 0.4, -0.1, 0.2);

    //对两个四元数进行归一化
    q1.normalize();
    q2.normalize();

    //定义两个小萝卜的位置的两个三维坐标
    Eigen::Vector3d t1(0.3, 0.1, 0.1), t2(-0.1, 0.5, 0.3);
    Eigen::Vector3d p1(0.5, 0, 0.2);//用来表示小萝卜一号坐标系下该点坐标(题干给出)
    Eigen::Vector3d p2; //用来表示小萝卜二号坐标系下该点坐标

    // 下面分别用四元数以及变换矩阵得到小萝卜二号的该点观测信息
    // 以下用四元数求解p2坐标
    p2 = q2 * q1.inverse() * (p1 - t1) + t2;//求解p2坐标
    //这里的inverse是相反的意思,也就是求q1的逆矩阵
    //公式为:p2 = q2  * q1^-1 * (p1 - t1) + t2
    cout << "四元数求得的p2坐标" << endl;
    cout << p2.transpose() << endl;//行向量显示,transpose是转置矩阵的意思

    //以下用欧拉矩阵求解p2坐标
    Eigen::Isometry3d T1w(q1), T2w(q2);//欧式变换矩阵Isometry(虽然称为3d,实质上是4*4的矩阵)
    T1w.pretranslate(t1);//设置平移向量,我的理解是加入这个平移向量
    T2w.pretranslate(t2);

    Eigen::Vector3d p3;//用来表示小萝卜二号坐标系下该点坐标(变换矩阵方法)
    p3 = T2w * T1w.inverse() * p1;//求解p3坐标
    cout << "变换矩阵/欧拉矩阵求得的p2坐标" << endl;
    cout << p3.transpose() << endl;
}

以上两个输出结果是一致的。

标签:q1,四元,Eigen,小萝卜,3.6,p2,SLAM,坐标
From: https://www.cnblogs.com/chenxyy/p/17679027.html

相关文章

  • 小谈Qt的坐标系系统 - 3个坐标系,2个变换
    小谈Qt的坐标系系统Qt中有三个坐标系设备坐标系窗口坐标系逻辑坐标系设备坐标系:即Device坐标系。也是物理坐标系。即真实的的物理坐标系。逻辑坐标系:即用户坐标系。也就是说日常大家使用Qt的时候的坐标系。窗口坐标系:这个坐标系是QPainter设置setWindow以后的一个坐......
  • QT坐标系转换(将QPainter左上角为原点的坐标系转换为正常坐标系)
    没有复杂的变换,简单转化窗口坐标系,即可按我们正常熟知的坐标系进行绘图QPainter坐标系以左上角为原点,如下图 在这样的坐标系下绘图,位置这是倒过来的QPainterm_pPainter(this);   m_pPainter.setBrush(Qt::yellow);   m_pPainter.drawRect(0,0,50,50);   m......
  • sketchup 动态组件 旋转 失灵 -- 两个坐标轴不同
    sketchup动态组件旋转失灵 使用sketchup做了一个门,使用了旋转z轴功能,然后把组件门放入另一个组件中,结果只能开门,不能关门,反复重复开门动作反复常识查找谷歌了半天没有结果后来发现 原来时外组件的坐标轴和内组件的坐标轴不一致调整内外组件坐......
  • 【matplotlib基础】--坐标轴
    Matplotlib的坐标轴是用于在绘图中表示数据的位置的工具。坐标轴是图像中的水平和垂直线,它们通常表示为x轴和y轴。坐标轴的作用是帮助观察者了解图像中数据的位置和大小,通常标有数字或标签,以指示特定的值在图像中的位置。1.坐标轴范围Matplotlib绘制图形时,会自动根据X,Y轴......
  • lsd-slam算法安装
    sudoapt-getupdatesudoapt-getinstallqtbase5-devlibqt5opengl5-devsudoapt-getinstalllibqglviewer-dev网址:https://www.cnblogs.com/cc111/p/9382694.html......
  • python3.6使用wordcloud 1.9报错ValueError: Only supported for TrueType fonts
    该版本的wordcloud的源码中显示不兼容python3.6 解决办法:修改wordcloud源码修改前508:box_size=draw.textbox((0,0),word,font=transposed_font,anchor="lt")510:result=occupancy.sample_position(box_size[3]+self.margin,......
  • 坐标文本转图片
    坐标文本格式类似101112341155#脚本文件importmatplotlib.pyplotaspltimportnumpyasnpx=[]y=[]withopen('message.txt','r')asf:datas=f.readlines()fordataindatas:arr=data.split('')x.app......
  • 【HMS Core】华为地图服务与其他地图转换坐标问题
    【关键字】HMS、地图服务、转换坐标【问题描述】有开发者反馈在集成地图服务与其他地图服务位置有偏差,咨询是否可以转化坐标问题【解决方案】华为HMS 地图服务,海外地图采用WGS84GPS坐标系,中国采用GCJ02坐标系。https://developer.huawei.com/consumer/cn/doc/development/HMSCore......
  • 【maven】idea运行项目的时候,因为依赖maven坐标是provided报错NoClassDefFoundError解
    1、查看报错的类的生命周期-基于在idea安装mavenhelper插件  2、在运行maven项目的入口新增配置项 ......
  • google Map经纬度坐标取得方法
        谷歌地图(交通地图)上并没有显示某个地址的经纬度,实际上,我们已经想到了一个办法,可以找到在谷歌地图上任意地点的经度和纬度。 首先打开Google地图,在上面寻找一个地址,然后上下左右移动地图,让这个地址正好处于地图的正中心位置,当您想寻找坐标位置已经处于地图的中心位......