• 视觉slam十四讲课后习题ch3-7


    题目回顾:

    设有小萝卜一号和小萝卜二号位于世界坐标系中,小萝卜一号的位姿为:q1=[0.35,0.2,0.3,0.1],
    t2=[0.3,0.1,0.1]^T (q的第一项为实部。请你把q归一化后在进行计算)。这里的q和t的表达的是Tcw,也就是世界到相机的变换关系。小萝卜二号的位姿为q2=[-0.5,0.4,-0.1,0.2],t=[-0.1,0.5,0.3]^T.现在,小萝卜一号看到某个点在自身的坐标系下,坐标为p=[0.5,0,0.2]^T ,求该向量在小萝卜二号坐标系下的坐标,请编程实现此事。
    解:
    pw:某个点在世界坐标系下的坐标
    T_1w :表示世界坐标系到小萝卜一号坐标系的变换关系
    T_2w:表示世界坐标系到小萝卜二号坐标系的变换关系
    P2 :表示该点在小萝卜二号坐标系下的坐标(即为所求)
    单位四元数到旋转矩阵R的变化关系可参考书上55页。之后变换矩阵T=[R t]
    [0 1]
    由变换关系可列出下面的式子:
    p = T_1w * Pw 可解出来pw
    p2=T_2W*pW 带入上式解出来的Pw即可求出来p2

    具体代码实现如下:

     1 #include<iostream>
     2 #include<Eigen/Core>
     3 
     4 //包含几何模块
     5 #include<Eigen/Geometry>
     6 using namespace std;
     7 
     8 int main(int argc,char **argv)
     9 {
    10     /*变量定义*/
    11     Eigen::Quaterniond Q1(0.2,0.3,0.1,0.35); //四元数的表示(w ,x,y,z)
    12     Eigen::Quaterniond Q2(0.4,-0.1,0.2,-0.5);
    13     Eigen::Vector3d t1(0.3,0.1,0.1);
    14     Eigen::Vector3d t2(-0.1,0.5,0.3);
    15     Eigen::Vector3d p(0.5,0,0.2);   //在一号小萝卜下的坐标
    16     Eigen::Vector3d pw ;            //世界坐标
    17     Eigen::Vector3d p2;             //求在二号小萝卜的坐标 p2
    18 
    19    /*欧氏变换矩阵使用Eigen::Isometry */
    20     Eigen::Isometry3d T_1w = Eigen::Isometry3d::Identity();
    21     Eigen::Isometry3d T_2w = Eigen::Isometry3d::Identity();
    22     
    23     /*归一化*/
    24     Q1.normalize();
    25     Q2.normalize();
    26 
    27     /*输出归一化参数*/
    28 //    cout<<"Q1 is "<<Q1.x()<<endl<<Q1.y()<< endl <<Q1.z()<< endl<<Q1.w()<<endl;
    29 //    cout<<"Q2 is "<<Q2.x()<<endl<<Q2.y()<< endl <<Q2.z()<< endl<<Q2.w()<<endl;
    30 
    31     cout<<"after normalize; "<< endl << Q2.coeffs()<<endl;
    32 
    33     /*设置变换矩阵的参数*/
    34     T_1w.rotate(Q1);
    35     T_1w.pretranslate(t1);
    36     T_2w.rotate(Q2);
    37     T_2w.pretranslate(t2);
    38 
    39     /* p = T1w * pw  求解pw*/
    40     pw = T_1w.inverse() * p;
    41 
    42     /* p2 = T_2w * pw  求解p2*/
    43     p2 = T_2w * pw;
    44 
    45     /*输出在小萝卜二号下的该点坐标*/
    46     cout<<"该点在小萝卜二号下的坐标为: "<<p2.transpose()<<endl;
    47 
    48     return 0;
    49 }

    欢迎大家关注我的微信公众号「佛系师兄」,里面有关于 Ceres 以及 OpenCV 库的一些文章。

    比如

    反复研究好几遍,我才发现关于 CMake 变量还可以这样理解!

    更多好的文章会优先在里面不定期分享!打开微信客户端,扫描下方二维码即可关注!

  • 相关阅读:
    php的运行模式
    PostgreSQL指定用户可访问的数据库pg_hba.conf
    PostgreSQL创建只读用户
    Python操作PostGreSQL数据库
    Python爬虫基础示例
    Linux下设置tomcat开机自启
    Windows下配置jar环境
    警告1909。无法创建快捷方式VMware Workstation Pro.Ink。解决方法(附 VMware_workstation 12的安装方法)
    删数问题
    An Easy Problem
  • 原文地址:https://www.cnblogs.com/newneul/p/8306456.html
Copyright © 2020-2023  润新知