SLAM整理-1-坐标变换

11 篇文章 0 订阅
7 篇文章 0 订阅
  • 假设两个物体位于世界坐标系中,
  • 物体1号位姿为 q 1 q_1 q1(四元数表示旋转),t1(表示平移);
  • 物体2号位姿为 q 2 q_2 q2(四元数表示旋转),t2(表示平移);
  • 现已知物体1号看到某个点在自身坐标系下的坐标为 p 1 p_1 p1,求该点在物体2号坐标系下的坐标 p 2 p_2 p2

  • 记世界坐标系为 W W W,物体坐标系分别为 R 1 R_1 R1 R 2 R_2 R2
  • T T T表示坐标系之间的变换关系
  • 由于
    T W 2 ∗ p 2 = T W 1 ∗ p 1 T_{W2}*p_2 = T_{W1}*p_1 TW2p2=TW1p1
  • 得到
    p 2 = T W 2 − 1 ∗ T W 1 ∗ p 1 p_2 = T_{W2}^{-1}*T_{W1}*p_1 p2=TW21TW1p1
  • 注意:四元数使用之前需要归一化。
#include <eigen3/Eigen/Dense>
#include <iostream>

int main()
{
    //
    Eigen::Vector3d p1(1, 1, 1);

    Eigen::Quaterniond q1(1, 0, 0, 0);
    Eigen::Quaterniond q2(0.5, 0.4, 0.3, 0.3);

    //normalize and normalized different
    q1.normalize();
    q2.normalize();

    //translation
    Eigen::Vector3d t1(1, 2, 3);
    Eigen::Vector3d t2(4, 5, 6);

    //T_{1W} T_{2W}
    Eigen::Isometry3d T1w(q1);
    Eigen::Isometry3d T2w(q2);

    T1w.pretranslate(t1);
    T2w.pretranslate(t2);

    std::cout << "T1W t :" << T1w.translation().transpose() << std::endl;
    std::cout << "T2W t :" << T2w.translation().transpose() << std::endl;

    std::cout << "T1W r :" << std::endl
              << T1w.rotation() << std::endl;
    std::cout << "T2W r :" << std::endl
              << T2w.rotation() << std::endl;

    // p_2 = T_{2W}*T_{W1}*p1
    Eigen::Vector3d p2 = T2w * T1w.inverse() * p1;
    std::cout << std::endl
              << p2.transpose() << std::endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值