Lego-LOAM IMU坐标系变换的详细记录

2023-11-14

最近看了Lego-LOAM 的IMU部分,没看懂IMU的坐标系变换。看其它的博客,看的让我更混淆了,因此决定抛开其他人的理解,故写下这篇博客。

0 基础知识

  1. IMU的数据欧拉角表示的时从当前时刻的坐标系初始坐标系的旋转关系(内旋变换),且旋转顺序为RPY( yaw(z) - > pitch(y) -> roll(x) ), 即:
    R = R(yaw)*R(pitch)*R(roll);
  2. IMU的欧拉角的值旋转顺时针(从负轴看向正轴)为,本人实测。这也解释了第一点为什么IMU的欧拉角表示的是从当前时刻的坐标系初始坐标系的原因。
  3. 旋转矩阵 R = R(yaw)*R(pitch)*R(roll) -----------------------------------------------------------------------(1)

    在这里插入图片描述

5 IMU坐标系方向:IMU RPY顺时针为正,加速度计


在这里插入图片描述

1. IMU 重力加速度消除

首先,一般重力加速度再Z轴为正,至少本人IMU测试重力加速度再Z轴为正。有了上面的基础,再来看IMU的重力加速度消除就简单,减去重力加速度在xyz轴的分量即可。
1.1 假设在初始坐标系下IMU的重力加速度在x,y,z方向的分量表示为ginit=[0; 0 ; 9.8]
1.2 Rinit_imu =R(yaw)R(pitch)R(roll)表示从当前时刻的IMU坐标系转换到初始坐标系
1.3 因此有,ginit = Rinit_imu * gimu,可得重力加速度在当前IMU坐标系下的xyz重力分量为:
               gimu = RTinit_imu * ginit
                 = [-9.8
sin(pitch); 9.8
sin(roll)cos(pitch); 9.8*cos(roll)cos(pitch)];
1.4 IMU数据减去重力分量,并且转换到相机坐标系下:

[accZ; accX; accY] = [imu_acc_x; imu_accy; imu_acc_z] - g imu

旋转到相机坐标系下,RPY和相机坐标系的关系:


在这里插入图片描述

2 相机坐标系(camera)到初始坐标系(camera_init)的转换

上面我们将IMU转换到相机坐标系下了。在Lego-LOAM 中计算位移和速度以初始相机坐标系(camera_init)为参考,因此需要转换到初始相机坐标系(camera_init)。
2.1 从当前时刻的相机坐标系转换到初始相机坐标系的旋转关系,应该和IMU的旋转关系一致,即

R init_camera = R init_imu

acc_wrold = R init_camera * [accZ; accX; accY] = R init_imu *( [imu_acc_x; imu_accy; imu_acc_z] - g imu );

  上面等式也描述了为什么两个旋转矩阵相等,右边是IMU的旋转到初始IMU坐标系位置,左边是相机坐标系旋转到初始坐标系位置。并且从相机坐标系变换会初始坐标系时不是:z(roll) --> y(yaw)–>x(pitch),而是(y_cam)yaw -> (x_cam)pitch -> (z_cam)roll,即:
    acc_wrold = R2init_camera * [accX; accY; accZ];
    R2init_camera = R(yaw)*R(pitch)*R(roll) = R(y_cam)*R(x_cam)*R(z_cam)

2.2 最后将上述等式乘起来就是Lego-LOAM中AccumulateIMUShiftAndRotation()的坐标系变换。
2.3 Lego-LOAM旋转变换都是遵循RPY(Y->P->R)顺序,只是Yaw 对应的到底是R(x),R(y),R(z)的哪个旋转矩阵,要根据IMU的RPY坐标系和待旋转坐标轴确定。例如在相机坐标系下yaw对应的就是y轴,因此对应R(y)的旋转矩阵。明白了这些,在Lego-LOAM中其他地方的IMU坐标变换便迎刃而解。

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

Lego-LOAM IMU坐标系变换的详细记录 的相关文章

随机推荐

  • 使用nginx+uwsgi+flask实现python服务的负载均衡---(2)uwsgi的安装

    0 安装uwsgi 转自官网 使用pip install uwsgi就可以 当然了也可以下载源码自己make 1 配置uwsgi uwsgi 有多种配置可用 1 ini 2 xml 3 json 4 yaml 这里我使用的ini 当然也可以
  • selenium-server-standalone selenium-server 和 selenium-java 的区别

    selenium1 0还是 seleniumRC的时候 需要启动selenium server standalone包 用来做server selenium RC通过server来给code和broswer建立通道 同时 该jar包包括我们
  • BATJ面试必会之Java IO 篇

    一 概览 二 磁盘操作 三 字节操作 实现文件复制 装饰者模式 四 字符操作 编码与解码 String 的编码方式 Reader 与 Writer 实现逐行输出文本文件的内容 五 对象操作 序列化 Serializable transien
  • DDL和DML常用语句总结

    DDL语句 常用来操作数据库 数据库表 用到的语句 create show alter drop 1 操作数据库 CRUD 1 C Create 创建 创建数据库 create database 数据库名称 创建数据库 判断不存在 再创建
  • 前端页面性能优化 - 字体加载优化

    相比于英文的字库来说 中文字库的体积非常之大 小则1M 动辄几十 M 的体积非常常见 所以在前端页面性能优化中 字体加载的优化就显得尤为重要 阅读了相关的知识和文章 在研究了市面上字体加载方案之后 我总结出了目前可行的方案 1 font s
  • 实对称矩阵的特征值求法_机器学习与线性代数 - 特殊矩阵

    在线性代数中 有一些特殊的矩阵具有易于分析和操作的特性 它们的特征向量可能具有特定的特征值或特殊关系 还有一些方法可以将一个矩阵分解成这些 更简单 的矩阵 操作复杂性的降低提高了可伸缩性 然而 即使这些矩阵都是特殊的 它们也不是罕见的 在机
  • linux创建文件软连接和硬链接详解

    前言 linux系统中链接文件仔细区分可以分为软连接 符号链接 和硬链接 软链接比硬链接应用更广泛 所以也可以认为linux链接文件就是指软链接文件 本文将会在第2部分介绍创建软链接和硬链接的基本命令 在第3部分从linux文件系统的角度出
  • 联合体union在立体几何中的妙用

    联合体union在立体几何中的妙用 为了更好地理解三维游戏编程 我开始研究了立体几何 注意 是立体解析几何 里面涉及到了很多元组 向量和矩阵的知识 虽然还有
  • 编写一个密码类,其中包含一个 str 密码字符串私有成员数据,一个“==”运算 符重载成员函数,用于比较用户输入的密码是否正确。并用数据测试该类。

    define CRT SECURE NO WARNINGS 编写一个密码类 其中包含一个 str 密码字符串私有成员数据 一个 运算 符重载成员函数 用于比较用户输入的密码是否正确 并用数据测试该类 include
  • [Python人工智能] 七.加速神经网络、激励函数和过拟合

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前六篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 theano正规化处理 这
  • PTA L1-058 6翻了(详解)

    前言 内容包括 题目 代码实现 大致思路 代码解读 题目 666 是一种网络用语 大概是表示某人很厉害 我们很佩服的意思 最近又衍生出另一个数字 9 意思是 6翻了 实在太厉害的意思 如果你以为这就是厉害的最高境界 那就错啦 目前的最高境界
  • 【运维知识基础篇】Linux定时任务

    今天给大家介绍下linux定时任务 定时任务无非就是在什么时间干什么命令 首先大家要知道文件怎么配置 定时任务一般用root执行 这里介绍crond crontab crontab e 用户定时任务 var spool cron root
  • 2021-06-18 mysql8.0数据库常用操作语句总结

    net start mysql启动MySQL的服务了 net stop mysql停止服务 sc delete MySQL mysqld remove卸载 MySQL 服务 创建新用户 CREATE USER 用户名 host名称 IDEN
  • STL中迭代器的问题

    STL中的容器迭代器 在容器的学习过程中 使用迭代器跳转插入 做了个简单测试 void test 指定位置插入 index使用迭代器 list
  • c++中如何只保留float型的小数点后两位

    float spd 22 518744 char buf 10 sprintf buf 2f spd sscanf buf f spd 记录一下 有时候我们需要float类型只保留两个有效小数 但是在实际应用中会发现一些现象 如 1 5 在
  • 这个 17 岁的黑客天才,破解了第一代 iPhone!

    关注 星标公众号 直达精彩内容 时间来到2007年 第一代的ipone问世惊艳了世人 重新定义了智能手机 但第一代的iPhone也有让人恼火的地方 当时的iPhone和AT T 当时美国最大的移动运营商 签了五年的独家运营协议 使得网络只局
  • redmine Email delivery error: Net::ReadTimeout

    好吧 创建一个redmine 在配置邮件的时候sendmail 可以通过 smtp 25端口可以通过 但使用SSL465 端口说什么也过不去 报错Email delivery error Net ReadTimeout 找样例找不到 有关于
  • 支付宝支付整体流程,包括验签【同步】【异步】

    一 前期准备 1 支付宝开放平台沙箱账号 用于测试 应用公钥需要使用支付宝第三方工具生成 最好在本地备份好 公钥以及配对的密钥 2 javasdk的maven仓库 javasdk 3 内网穿透 使内网能够被 支付宝的服务器访问 支付成功后支
  • java中常见异常

    为了以后方便查阅 特将java中常见异常记录下来 java lang ArithmeticException 算术条件异常 譬如 整数除零等 java lang ArrayIndexOutOfBoundsException 数组索引越界异常
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它