GroundTrue和里程计输出的位姿的参考坐标系不一致的情况

2023-05-16

这里写目录标题

    • 前言
    • 数据集描述
    • 使用TF工具包获取
    • 使用Eigen库计算
    • 置换输出
    • 误差对比
      • 没做转换之前
      • 转换之后

前言

最近遇到一个数据集的ground true参考坐标和vSLAM输出的位姿的参考坐标不一样的问题,记录一下。

在之前参加的一个PRCV 2022的多传感器融合SLAM挑战赛中也同样遇到类似的问题:

image-20230101144353721

因为之前一直忙于其他事情没有记录,这里记录一下,其实解决办法很简单,就是在最后输出的位姿做一个坐标变换即可

数据集描述

最近需要使用到一个由清华大学一个团队构建的数据集 OpenLORIS-Scene Dataset 这个数据是一个做动态场景SLAM比较合适的数据集,里面包含很多行人干扰的场景。它的数据集采集平台是一个类似于服务机器人的平台:

image-20230101144100298

它上面传感器的坐标系如图所示:

image-20230101144149206

因为数据集中的真值是机器人base_linkgt_map坐标系的仿射变换,但是使用vinsfusion得到的位姿的载体是D435iIMU的,所以我们在最后输出位姿的时候需要转换到base_link坐标系下。

数据集中的各个传感器之间的静态TF变换在话题/tf_static中进行了发布,但是这里没有直接d400_imubase_link的TF变换。下面是echo这个话题的输出

transforms:
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "base_link"
    child_frame_id: "laser"
    transform:
      translation:
        x: 0.35
        y: 0.0
        z: 1.28
      rotation:
        x: -0.009737
        y: 0.05002
        z: -0.004493
        w: 0.9986
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "laser"
    child_frame_id: "d400_color"
    transform:
      translation:
        x: 0.0559649
        y: 0.0311189
        z: -0.0756753
      rotation:
        x: -0.52531
        y: 0.494111
        z: -0.469561
        w: 0.50933
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "d400_color"
    child_frame_id: "d400_depth"
    transform:
      translation:
        x: 0.0147083755582571
        y: 3.83682090614457e-05
        z: 0.000288475974230096
      rotation:
        x: 0.000504782
        y: 0.00444093
        z: -0.00264019
        w: 0.999987
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "d400_color"
    child_frame_id: "d400_imu"
    transform:
      translation:
        x: 0.0200968869030476
        y: -0.0050785536877811
        z: -0.0115051260218024
      rotation:
        x: -0.000504782
        y: 0.00444093
        z: -0.00264019
        w: 0.999987
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "base_link"
    child_frame_id: "t265_fisheye1"
    transform:
      translation:
        x: 0.873
        y: 0.026
        z: 0.68
      rotation:
        x: -0.395
        y: 0.406
        z: -0.6
        w: 0.565
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "t265_fisheye1"
    child_frame_id: "t265_fisheye2"
    transform:
      translation:
        x: 0.0640782490372658
        y: 0.000390329543733969
        z: -0.000322926469380036
      rotation:
        x: 0.00186088
        y: 0.0031785
        z: 0.000162728
        w: 0.999993
  -
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs:         0
      frame_id: "t265_fisheye1"
    child_frame_id: "t265_imu"
    transform:
      translation:
        x: 0.0106999985873699
        y: 7.27595761418343e-12
        z: -2.91038304567337e-11
      rotation:
        x: 0.00554841
        y: 0.00136098
        z: 0.99998062
        w: -0.00245956
---

既然没有直接的结果,那我们通过 d400_imu ——> d400_color ——> laser ——> base_link 的变换关系来获得

使用TF工具包获取

使用ros里面的工具包,来监听两个坐标系之间的变换

rosrun tf tf_echo base_link d400_imu

播放数据集之后得到:

image-20230101114051393

直接从这个TF读出来的感觉还是有挺大误差的,因为那个欧拉角旋转应该理论上接近90°才比较正常。下面,我们通过手动计算出来看看有多大差别

使用Eigen库计算

#include <iostream>
#include <vector>
#include <algorithm>
#include <Eigen/Core>
#include <Eigen/Geometry>

int convert()
{
  Eigen::Quaterniond q_ci(0.999987, -0.000504782, 0.00444093, -0.00264019);
  Eigen::Vector3d t_ci(0.0200968869030476, -0.0050785536877811, -0.0115051260218024); 
  Isometry3d T_ci(q_ci);
  T_ci.pretranslate(t_ci);

  Eigen::Quaterniond q_lc(0.50933, -0.52531, 0.494111, -0.469561);
  Eigen::Vector3d t_lc(0.0559649, 0.0311189, -0.0756753); 
  Isometry3d T_lc(q_lc);
  T_lc.pretranslate(t_lc);

  Eigen::Quaterniond q_bl(0.9986, -0.009737, 0.05002, -0.004493);
  Eigen::Vector3d t_bl(0.35, 0.0, 1.28); 
  Isometry3d T_bl(q_bl);
  T_bl.pretranslate(t_bl);

  Isometry3d T_bi = T_bl * T_lc * T_ci;
  Eigen::Quaterniond q_bi(T_bi.rotation());
  cout <<"Rotation Matrix: \n" << T_bi.matrix() << endl;
  cout << "Quaternion    " << q_bi.coeffs().transpose() << endl;
  cout << "Translation   " << T_bi.translation().transpose() << endl;
  cout << "RPY (degree): " << T_bi.rotation().eulerAngles(2, 1, 0).transpose()*180/M_PI << endl;
  return 0;
};

输出如下:

image-20230101122330869

可以看到,这里我们手动计算得到的结果和直接从TF监听得到的结果还是有差别的,主要在于TF监听得到的结果的精度是比较低的,他舍去了小数点后一些位,导致在反复累乘过程中积累了一定的误差。后面我们还是直接使用我们手动计算出来的结果。

置换输出

在代码中添加一个变换函数

    static Eigen::Isometry3d transformBaselink(const Eigen::Quaterniond& q, const Eigen::Vector3d& t) {
        Eigen::Isometry3d Twi(q);
        Twi.pretranslate(t);

        Eigen::Isometry3d Tbi(Eigen::Quaterniond(0.550447, -0.51761, 0.453209, -0.472959));
        Tbi.pretranslate(Eigen::Vector3d(0.388943, 0.0084219, 1.20522));

        Eigen::Isometry3d Twb = Tbi * Twi * Tbi.inverse();
        return Twb;
    }

然后在保存位姿之前做一次转换即可

image-20230101154329158

误差对比

下面我们跑同一个数据集输出用输出的位姿和真值做评估,对比一下做了这个转换和没做这个转换看看有多大的差别

没做转换之前

image-20230101154604304

转换之后

image-20230101161633252

从上面结果来看,确实是会有一定的影响,平均误差降低了不少,在没做转换之后平均误差在1.3m左右,转换为真值参考坐标之后平均误差在1.1m左右,最大偏差也减少了不少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GroundTrue和里程计输出的位姿的参考坐标系不一致的情况 的相关文章

  • Vins-Fusion工控机运行Debug

    一 问题记录 在自己的笔记本上运行Vins Fusion效果OK xff0c 但在工控机上运行出现静止状态轨迹飘飞 xff0c 笔记本上和工控机上都是ubantu 18 04系统 xff0c 摄像头硬件均为ZED2i xff0c 配置文件相
  • xavier安装torch-gpu

    1 查看xavier安装的jetpack版本 xff1a sudo apt show nvidia jetpack 一般情况下都是462的 2 查看cuda版本 xff1a cat usr local cuda version txt 3
  • 保存图像(cv::imwrite)

    保存图像文件道指定目录路径 只有8位 xff0c 16位的PNG xff0c JPG xff0c Tiffy文件格式而且时单通道或者三通道的BGR的图像才通过这种方式保存 保存PNG格式的时候可以保存透明通道的图片 可以指定压缩参数 inc
  • 解决 ssh: Could not resolve hostname \342\200\223t: Name or service not known

    问题 xff1a 在配置github时输入以下内容时报错 xff1a ssh T git 64 github span class token punctuation span com 方法 xff1a 将上述内容换为以下内容 ssh sp
  • python实现随机森林

    定义 xff1a 随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器 可回归可分类 所以随机森林是基于多颗决策树的一种集成学习算法 xff0c 常见的决策树算法主要有以下几种 xff1a 1 ID3 xff1a 使用信息增益g D
  • 从Github上下载文件的方法汇总

    前言 对于程序猿来说 xff0c Github简直就是个宝藏 xff0c 里面有世界各地大神的代码 xff0c 可以放心安全高效的食用 xff0c 本文整理了Github文件的一些下载方法 xff0c 仅供参考 1 通过git命令行 特点
  • fatal error: Python.h: No such file or directory #include “Python.h“

    在TX2上安装h5py时 xff0c pypi org没有对应的轮子 xff0c 需要自己用源码安装 xff0c 源码中涉及到C语言 xff0c 所以需要编译 xff0c 然而在编译的过程中报错 fatal error span class
  • 基于Python的ZED2教程 0.ZED2介绍

    本文主要介绍了ZED2的基本简介和硬件配置 基本简介 ZED2双目深度传感立体相机是位于美国旧金山Stereo labs公司制作的一款产品 xff0c 其与Kinect相机等流行的深度图像原理不同 xff0c 该深度相机的深度计算是通过双目
  • 基于Python的ZED2教程 1.打开ZED2

    本教程简单的对ZED相机进行了配置和打开 xff0c 然后打印出ZED 相机的串口号 xff0c 接着关闭相机 准备工作 由于ZED SDK在GPU上运算 xff0c 因此需要先在 nvidia com下载最新版的Cuda 然后 xff0c
  • 2.Open3D教程——文件读取和保存

    文件读取和保存 本教程演示了Open3D如何读写基本数据结构 1 点云 下面的代码读取和写入点云 span class token keyword print span span class token punctuation span s
  • 7.Open3D教程——表面重建

    在许多情况下 xff0c 我们希望生成密集的三维几何体 xff0c 即三角形网格 然而 xff0c 从多视点立体方法 xff0c 或深度传感器 xff0c 我们只能获得一个非结构化的点云 为了从非结构化输入中得到三角形网格 xff0c 我们
  • PASCAL VOC数据集

    一 简介 PASCAL pattern analysis statistical modelling and computational learning VOC visual object classes 该挑战赛的竞赛项目主要包括 图像
  • ubuntu python 通过奥比中光摄像头获取深度图片和彩色图片

    1 依赖 安装Openni Openni下载Openni添加至环境 xff08 要通过全局变量找到Openni头文件和库 xff09 安装primesense和openni pip install primesense pip instal
  • ROS tf使用报错:ImportError: dynamic module does not define module export function (PyInit__tf2)

    1 报错内容 Traceback span class token punctuation span most recent call last span class token punctuation span File span cla
  • ubuntu cuda cudnn tensorRT的卸载和安装

    1 安装显卡驱动 显卡安装教程 查看N卡驱动支持的最高cuda版本 nvidia smi 2 卸载 span class token function sudo span span class token function apt get
  • 初识VSCode

    Visual Studio Code xff08 以下简称vscode xff09 是一个轻量且强大的代码编辑器 xff0c 跨平台支持Windows xff0c Mac OS X和Linux 内置JavaScript TypeScript
  • Modbus通信及数据存储读取

    1 存储区代号 代码号功能1区输入线圈0区输出线圈3区输入寄存器4区输出寄存器 2 功能码 代码功能0x01读取输出线圈0x02读取输入线圈0x03读取输出寄存器0x04读取输入寄存器0x05写入单个线圈0x06写入单个寄存器0x0F写入多
  • 着色器语言 GLSL (opengl-shader-language)入门大全

    GLSL 中文手册 基本类型 类型说明void空类型 即不返回任何值bool布尔类型 true falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2 vec3 vec4n
  • Data structure alignment (数据结构对齐 / 内存对齐)

    开篇的话 在比较老的编译器里 xff0c 如果没有对变量取地址的操作 xff0c 那么有些局部变量是通过寄存器保存的 xff0c 不占栈上内存 xff0c 根本不存在内存中如何排列的问题 xff0c 比如TurboC 2 0这种 在一些较新

随机推荐

  • C++primer plus和C++ primer的读书心得

    C 43 43 两本巨著primer plus和primer太过于经典 xff0c 以至于读过多次 xff0c 每次阅读仍然有新的收获 xff0c 所以将一些零碎的知识点整理在这里 xff0c 与大家共同进步 1 i 43 43 与 43
  • VINS 外参在线标定

    在VINS中相机的外参 R i c R ic R i c 是可以在线动态标定的 xff0c 实现函数为 xff1a 6
  • A-LOAM源码阅读

    LOAM 论文地址 xff1a https www ri cmu edu pub files 2014 7 Ji LidarMapping RSS2014 v8 pdf A LOAM地址 xff1a https github com HKU
  • LeGo-LOAM 跑通与源码学习

    论文链接 xff1a https www researchgate net LeGO LOAM 源码仓库 xff1a https github com RobustFieldAutonomyLab LeGO LOAM 本人注释 xff1a
  • SLAM中evo评估工具(用自己的数据集评估vinsFusion)

    目录 xff1a 配置标题文件修改源码修改第一处第二处第三处重新编译工程 安装evo1 安装命令2 常用指令 运行vinsFusion生成位姿估计文件使用evo评估轨迹 配置标题文件修改 主要根据自己的设备 xff0c 修改自己传感器的RO
  • Ubuntu中USB端口与外设绑定,ROS读取IMU模块数据

    目录 xff1a 1 根据设备ID绑定1 1 查看ID1 2 编写USB规则文件1 3 查看绑定结果 2 根据电脑USB口绑定2 1 找到USB端口名称2 2 编写绑定规则 3 通过ROS读数据 1 根据设备ID绑定 方法原理 xff1a
  • 实现外网Ping通WSL(网卡桥接方式实现)

    目录 xff1a 前言 xff1a 实现原理 xff1a 实现步骤1 开启hyper v2 编写桥接网络powershell脚本3 编写网络配置脚本 实现结果取消桥接最后 前言 xff1a 在我们经常和机器人打交道的这群人中有一个需求 xf
  • 如何在markdown中插入表情包

    我们平时经常使用markdown完成一些诸如博客的文档写作 xff0c 但是有时像我这种语言比较乏力的急需要在文档写作过程中插入表情包来完整的表达我想要表达的意思 xff0c 所以我去网上查了一下 xff0c 还真有 比如我想要表达开心即s
  • ROS多设备组网(WSL+miniPC+Nv Orin)

    目录 xff1a 前言硬件连接组网配置1 获取hostname和IP2 在主机添加从机的host信息3 在从机1中配置4 在从机2中配置 测试test1 话题订阅test2 rqt plot可视化传感器信息 最后 前言 实验室最近购买了两台
  • ZED 2i 双目-IMU标定

    目录 xff1a 前言IMU标定1 编译标定工具2 准备数据集3 标定 Camera IMU标定1 安装依赖2 编译Kaibr3 制作标定板下载标定板生成标定板target yaml文件 4 数据采集5 相机标定标定中遇到的问题问题1 xf
  • gazebo中给机器人添加16线激光雷达跑LIO-SAM

    目录 xff1a 前言1 下载雷达仿真包2 添加雷达支架描述文件3 添加雷达描述文件4 启动仿真5 添加IMU模块6 添加RGB D相机7 LIO SAM仿真安装依赖安装GTSAM编译LIO SAM运行 8 源码 遇到的问题1 error
  • ROS中的多线程使用

    目录 xff1a 单线程多线程订阅多个Topic xff0c 多个Spinner threads订阅一个Topic xff0c 多个Spinner threads订阅多个Topic xff0c 每个Subscriber一个Callback
  • 机器人端的图形界面ssh远程显示方案

    目录 xff1a 前言原理解析实现步骤机器人端 xff08 X client xff09 xff1a 1 安装一些必要的软件2 修改 96 etc ssh sshd config 96 中的四个地方 调试端 xff08 X server x
  • 报错 Key is stored in legacy trusted.gpg keyring

    目录 xff1a 1 找到警告相关源的key2 导出相应key到指定目录3 修改ros2源里指定加载key的路径 最近在安装ROS2的时候遇到一个关于密钥的报错 xff0c 这里记录一下 xff01 在 sudo apt update 的时
  • wsl中使用ROS工具rqt显示界面跑到窗口外面

    问题 xff1a 在WSL中使用ROS时确实会有一些小bug xff0c 比如下面这个 的rqt plot功能包时 xff0c 想通过rqt plot指令查看相应信息 xff0c 但是窗口弹出在窗口是空白的 xff0c 并且rqt那个功能界
  • RS雷达转Velodyne雷达数据Failed to find match for field ‘intensity‘

    目录 xff1a 问题分析解决 问题 因为目前很多SLAM框架支持的激光雷达都是Velodyne型号的 xff0c 对于速腾RS雷达的使用者来说 xff0c 需要对数据进行转换 xff0c 其实现在速腾的雷达已经支持输出XYZI和XYZIR
  • LIO-SAM中的mapOptmization

    前言 最近在学习LIO SAM源码的时候 xff0c 发现LIO SAM这套代码调用了比较多库的内置API xff0c 里面涉及的一些细节也比较多 xff0c 整个工程还是比较清晰的 xff0c 值得学习 xff01 LIO SAM这个框架
  • 使用D435i+Avia跑Fast-LIVO

    前言 最近Fast LIVO开源了 xff0c 之前看它的论文的时候发现效果很优秀 xff0c 于是用实验室现有的设备尝试一下 这里主要记录一下使用不带外触发功能的D435i 43 Avia跑Fast LIVO的过程 xff0c 为了适配代
  • CMakeList 中引用系统环境变量中的 include 文件,以及 lib 文件

    CMakeList 中引用系统环境变量中的 include 文件 xff0c 以及 lib 文件 cmake中对环境变量读写都是通过ENV前缀来访问环境变量 ENV ZLIB DIR 表示系统环境变量ZLIB DIR 所表示的路径 以ZLI
  • GroundTrue和里程计输出的位姿的参考坐标系不一致的情况

    这里写目录标题 前言数据集描述使用TF工具包获取使用Eigen库计算置换输出误差对比没做转换之前转换之后 前言 最近遇到一个数据集的ground true参考坐标和vSLAM输出的位姿的参考坐标不一样的问题 xff0c 记录一下 在之前参加