[SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

2023-11-12

四元数定义 Hamilton vs JPL

不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中,都需要用到单位四元数(Quaternion)来表示旋转,主要是单位四元数表示旋转相对于其他旋转表示方式如旋转矩阵、欧拉角或者旋转向量等具有优势,它既是紧凑(自由度3)同时还没有奇异性。本系列主要是介绍在SLAM&VIO系统中涉及到的公式(ESKF,IMU预积分等)所涉及的四元数的一些基础性质的推导和整理,关于四元数的更基础的定义建议参考引用【1】到【4】。该系列主要包括:

注:除了[SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL中,后面的介绍中都采用Hamilton形式表示四元数。

简介

根据四元数实部虚部顺序、乘法定义、旋转操作定义以及旋转方向定义等四种概念的不同组合有将近12种不同的四元数表示方式,其中最常用的是Hamilton(引用1)和JPL(引用2)方式。本文就上面的四种不同概念以及常用的两种四元数表示方式详细介绍。
首先定义四元数为:
q = q w + q x i + q y j + q z k \mathbf{q} = q_w + q_xi + q_yj+q_zk q=qw+qxi+qyj+qzk
这里 i , j , k i,j,k i,j,k为三个虚单位数,其中
i 2 = j 2 = k 2 = i j k = − 1 i^2 = j^2 = k^2 = ijk = −1 i2=j2=k2=ijk=1

四种区分方式

简介中提到可以根据四元数实部虚部顺序、乘法定义、旋转操作定义以及旋转方向定义对四元数进行分类,下面详细介绍下:

  • 实部虚部顺序
    主要是根据实部在前或者虚部在前予以区分,如下
    q = [ q w q v ] v s . q = [ q v q w ] \mathbf{q} = \left[ \begin{matrix} q_w \\ \mathbf{q}_v \end{matrix} \right] \qquad vs. \qquad \mathbf{q} = \left[ \begin{matrix} \mathbf{q}_v \\ q_w \end{matrix} \right] q=[qwqv]vs.q=[qvqw]
  • 乘法定义
    主要根据四元数代数的乘法公式定义予以区分,如下
    i j = − j i = k , j k = − k j = i , k i = − i k = j v s . − i j = j i = k , − j k = k j = i , − k i = i k = j \begin{matrix} ij = −ji = k, &jk = −kj = i, &ki = −ik = j \\ & vs. \\ -ij = ji = k, &-jk = kj = i, &-ki = ik = j \end{matrix} ij=ji=k,ij=ji=k,jk=kj=i,vs.jk=kj=i,ki=ik=jki=ik=j
    上面两种乘法定义分别对应两种不同的旋转方式
    r i g h t − h a n d e d v s . l e f t − h a n d e d right-handed \qquad vs. \qquad left-handed righthandedvs.lefthanded
    这里表示给定单位旋转轴 u \mathbf{u} u和旋转角度 θ \theta θ,第一种方式对应的四元数 q r i g h t { u θ } \mathbf{q}_{right}\{\mathbf{u}\theta\} qright{uθ}按照右手规则绕着旋转轴 u \mathbf{u} u旋转角度 θ \theta θ,而另一种方式对应的四元数 q l e f t { u θ } \mathbf{q}_{left}\{\mathbf{u}\theta\} qleft{uθ}则是按照左手规则进行旋转。
  • 旋转操作定义
    主要根据该旋转是旋转坐标系还是旋转向量予以区分,如下
    P a s s i v e v s . A c t i v e Passive \qquad vs. \qquad Active Passivevs.Active
    被动旋转还是主动旋转,这两个是相反的操作,对于坐标系的向量来说,固定坐标系旋转向量等价于逆向的旋转坐标系,在实际中常用的是被动旋转。
  • 旋转方向定义
    在被动旋转中(主动旋转无坐标系定义,不存在这个问题),可以根据旋转方向从local坐标系到global坐标系global坐标系到local坐标系予以区分,如下
    x g l o b a l = q ⊗ x l o c a l ⊗ q ∗ v s . x l o c a l = q ⊗ x g l o b a l ⊗ q ∗ \mathbf{x}_{global} = \mathbf{q} \otimes \mathbf{x}_{local} \otimes \mathbf{q}^{*} \qquad vs. \qquad \mathbf{x}_{local} = \mathbf{q} \otimes \mathbf{x}_{global} \otimes \mathbf{q}^{*} xglobal=qxlocalqvs.xlocal=qxglobalq
    其中
  • ⊗ \otimes 符号表示四元数乘法运算;
  • x g l o b a l \mathbf{x}_{global} xglobal x l o c a l \mathbf{x}_{local} xlocal分别表示向量在global坐标系和local坐标系下的表示(四元数形式,实部补0);
  • q ∗ \mathbf{q}^{*} q表示四元 q \mathbf{q} q的共轭四元数;
  • x ′ = q ⊗ x ⊗ q ∗ \mathbf{x}^{\prime} = \mathbf{q} \otimes \mathbf{x} \otimes \mathbf{q}^{*} x=qxq 表示使用四元数进行旋转;

Hamilton vs JPL

根据上面的几种区分方式按照排列组合可知有12中四元数的表示方式,其中最常用的两种是Hamilton和JPL,它们关于上诉的区分方式具体对比如下:

Hamilton JPL
实部虚部顺序 ( q w , q v ) (q_w, \mathbf{q}_v) (qw,qv) ( q v , q w ) (\mathbf{q}_v, q_w) (qv,qw)
乘法定义
Handedness
i j = − j i = k ij = −ji = k ij=ji=k
right-handed
− i j = j i = k -ij = ji = k ij=ji=k
left-handed
旋转操作 Passive Passive
旋转方向 x g l o b a l = q ⊗ x l o c a l ⊗ q ∗ \mathbf{x}_{global} = \mathbf{q} \otimes \mathbf{x}_{local} \otimes \mathbf{q}^{*} xglobal=qxlocalq x l o c a l = q ⊗ x g l o b a l ⊗ q ∗ \mathbf{x}_{local} = \mathbf{q} \otimes \mathbf{x}_{global} \otimes \mathbf{q}^{*} xlocal=qxglobalq

Hamilton方式是使用的较广的,像很多的开源库,如Eigen, ROS, Google Ceres以及使用IMU的卡尔曼滤波的很多论文也都是使用的该方式。

引用

【1】Quaternion kinematics for the error-state Kalman filter
【2】Indirect Kalman Filter for 3D Attitude Estimation-A Tutorial for Quaternion Algebra
【3】四元数与三维旋转
【4】视觉SLAM十四讲-从理论到实践(第二版)

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

[SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL 的相关文章

  • Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

    图像特征提取中需要用到SIFT等算法 因此不得不安装从源码编译安装opencv contrib 网上有很多教程 但是在不同的环境下多少会出现一些错误 针对Ubuntu20 04 gcc 7环境下对opencv opencv contrib编
  • slam数学基础——最小二乘

    一 前言 1 最小二乘是一类特殊形式的最优化求解问题 相比于其他优化问题 求解方式比较简洁 2 最小二乘被广泛应用于各种实际问题的建模 在求解实际工程问题中有着广泛的应用 例如 slam 中随处可见最小二乘的声影 二 线性最小二乘法 1 预
  • No rule to make target

    No rule to make target 引言 解决方法 引言 报错 No rule to make target Thirdparty g2o lib libg2o so needed by lib libygz SLAM so 停止
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • 【大一立项】如何亲手搭建ROS小车:硬件和软件介绍

    本次博客将详细介绍上篇博客中提到的ROS小车的硬件和软件部分 由于十一实验室不开门 所以部分代码还没有上传到Github 下位机 下位机使用Arduino 因为大一上刚学完用Arduino做循迹小车 其实Arduino作为ROS小车的下位机
  • SLAM评估工具evo的使用

    evo官方指南 参考博客 lt 官方手册 这篇参考博客 完全可以掌握evo的基本操作 gt Then 实践出真知 1 安装evo sudo apt install python pip pip install evo upgrade no
  • 视觉SLAM实践入门——(20)视觉里程计之直接法

    多层直接法的过程 1 读图 随机取点并计算深度 2 创建图像金字塔 相机内参也需要缩放 并计算对应点的像素坐标 3 应用单层直接法 使用G N L M等方法 或者使用g2o ceres库 进行优化 源码中有一些地方会引起段错误 修改方法见下
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g
  • LeGO-LOAM论文翻译(内容精简)

    LeGO LOAM是一种在LOAM之上进行改进的激光雷达建图方法 建图效果比LOAM要好 但是建图较为稀疏 计算量也更小了 本文原地址 wykxwyc的博客 github注释后LeGO LOAM源码 LeGO LOAM NOTED 关于代码
  • 深度相机Kinect2.0三维点云拼接实验(一)

    文章目录 摘要 Kinect2 0简介 工作原理 RGB相机成像原理 深度相机成像原理 总结 参考文献 摘要 Kinect2 0是微软推出的一款RGB D相机 它即支持普通相机的拍摄 也支持脉冲测量深度信息 本系列文章基于该传感器给出基本的
  • 激光SLAM7-基于已知位姿的构图算法

    1 通过覆盖栅格建图算法进行栅格地图的构建 1 1 Theory 1 2 code 这里没有判断idx和hitPtIndex是否有效 start of TODO 对对应的map的cell信息进行更新 1 2 3题内容 GridIndex h
  • 视觉SLAM技术及其应用(章国锋--复杂环境下的鲁棒SfM与SLAM)

    SLAM 同时定位与地图构建 机器人和计算机视觉领域的基本问题 在未知环境中定位自身方位并同时构建环境三维地图 应用广泛 增强现实 虚拟现实 机器人 无人驾驶 SLAM常用的传感器 红外传感器 较近距离感应 常用与扫地机器人 激光雷达 单线
  • 动态场景下基于实例分割的SLAM(毕业设计开题及语义分割部分)

    动态场景下基于实例分割的SLAM 毕业论文设计思路及流水 前言 今年选了个比较难的毕设题目 这里记录一下自己思路和流程 为之后的学弟学妹 划掉 铺个方向 会按日期不定期的更新 一 开题 2019 12 24 考研前选择课题是 利用深度学习对
  • Lego-LOAM IMU坐标系变换的详细记录

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

    如果STL容器中的元素是Eigen库数据结构 例如这里定义一个vector容器 元素是Matrix4d 如下所示 vector
  • SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断

    目录 一 三角测量 方法一 SVD分解法的推导 方法二 最小二乘法求解 二 ORB SLAM2 三角测量源码 三 利用Eigen源码实现三角测量 方法一 SVD分解法 方法二 最小二乘法求解 速度最快 方法三 利用OpenCV自带函数 四
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    ORB SLAM2 基于可识别特征的自主导航与地图构建 ORB SLAM Tracking and Mapping Recognizable Features 转自 http blog csdn net cicibabe article d
  • Eigen几何模块的使用方法

    include
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国

随机推荐

  • 深入浅出PID控制算法(二)————PID算法离散化和增量式PID算法原理及Matlab实现

    引言 上篇介绍了连续系统的PID算法 但是计算机控制是一种采样控制 他只能根据采样时刻的偏差来计算控制量 因此计算机控制系统中 必须对公式进行离散化 具体就是用求和代替积分 用向后差分来代替微分 使模拟PID离散化为数字形式的差分方程 准备
  • Java动态代理一——动态类Proxy的使用

    1 什么是动态代理 答 动态代理可以提供对另一个对象的访问 同时隐藏实际对象的具体事实 代理一般会实现它所表示的实际对象的接口 代理可以访问实际对象 但是延迟实现实际对象的部分功能 实际对象实现系统的实际功能 代理对象对客户隐藏了实际对象
  • CSS选择器总结

    元素选择器 作用 通过元素选择器可以选择页面中的所有元素 语法 标签名 如下 选中所有的P标签 p color red font size 40px ID选择器 作用 通过元素ID属性值选中唯一的一个元素 语法 id属性值 如下 选中ID为
  • 数据结构(2.1)——时间复杂度和空间复杂度计算

    前言 1 因为上一篇博客 数据结构 2 算法对于时间复杂度和空间复杂度计算的讲解太少 所以我在次增加多个案例讲解 2 上一篇已经详细介绍了 为什么我们的算法要使用复杂度这一个概念 因此 我这一篇将重点介绍 复杂度如何进行计算 时间复杂度计算
  • 使用ulisesbocchio对spring-boot项目properties配置文件信息加密

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Spring boot项目中properties文件中的密码明文不太安全 所以想到给明文加密 了解了一下 有一个依赖工具可以实现这个功能 Ulisesbocchio插件 1
  • 【机器学习】使用scikit-learn实现多元线性回归(10min阅读时长)

    Multiple Linear Regression 多元线性回归 之前有一篇简单线性回归的文章 大家感兴趣可以看看 使用scikit learn实现简单线性回归 Objectives 目标 看完这篇文章 将会 1 使用scikit lea
  • 勇士屠熊,绿军射鹿,夕阳西下,人群散尽,唯有烈火燎原势不可挡

    SpringBoot的日志 一 了解日志 1 什么是日志 2 日志的作用 二 自定义打印日志 1 实现步骤 2 日志的格式说明 三 日志级别 1 了解日志级别 2 配置日志级别 四 日志持久化 五 使用lombok进行日志输出 1 步骤 2
  • zerotier搭建moon模式

    最近发现zerotier内网穿透在和家里nas存储交互网速好像不怎么样 于是想搞个moon看看是不是会有所改善 先决条件建议 有一台云服务器 很多童鞋说要钱 刚刚白piao了一百度云的服务器 一年只要38RMB 配置CentOS7 9 1C
  • 编译cryptopp库

    1 下载源码 网址 https github com golang crypto git 2 打开里面的cryptest sln 如下图 3 打开后如下图所示 4 接着邮件crptlib属性 修改内容如下所示 release版本改为如下 对
  • 【知识点】eval() 的用法

    目录 一 基本知识 二 具体实例 三 项目应用 总结 一 基本知识 返回传入字符的表达式的结果 即将字符串当成有效的表达式 进行运算 求值并返回结果 从某种意义上说 eval就是实现list dict tuple和 str 之间的相互转换
  • cookie、session以及token的定义、区别、使用环境

    Cookie Cookie 的工作原理 由于 HTTP 是一种无状态的协议 服务器单从网络连接上无从知道客户身份 怎么办呢 就给客户端们颁发一个通行证吧 每人一个 无论谁访问都必须携带自己通行证 这样服务器就能从通行证上确认客户身份了 这就
  • 一个按键控制数码管的开和关_按键控制数码管显示

    功能 按键查询控制数码管显示的数据 定时器中断控制数码管扫描显示 所用器件 STC12C5A32S2 include config h define uint unsigned int define uchar unsigned char
  • 2021-08-12 一阶系统的频率响应 低通滤波器

  • 深入浅出PID控制算法(三)————增量式与位置式PID算法的C语言实现与电机控制经验总结

    前文对PID算法离散化和增量式PID算法原理进行来探索 之后又使用Matlab进行了仿真实验 对PID三个参数又有了更深入的认识 接下来我们来使用C语言进行PID算法实现 并且结合控制电机的项目来深入学习 1 PID 算法C 语言原代码 先
  • [BJDCTF2020]EasySearch1

    BJDCTF2020 EasySearch1 0x01漏洞类型 打开题目如图所示 还是对CTF套路不太熟悉 拿到这种就以为是sql注入 启动sqlmap就一顿操作 都大 了 搞竞赛还来得及吗 参考别人的wp后知道是源码泄露 这里就不给服务器
  • QT中监控全局键盘鼠标事件

    先介绍一下在单一Widget等控件中监听鼠标键盘事件的代码 void mouseMoveEvent QMouseEvent event void mouseReleaseEvent QMouseEvent event void keyPre
  • CNN代码系列之训练源文件及头文件(二)

    本博客为CNN卷积代码系列之训练源文件及头文件 注意 本博客是系列博客 请链接上一博客http blog csdn net samylee article details 69325368 训练主程序中的头文件 funset hpp ifn
  • 半路出家OCR后成领域专家,白翔:计算机视觉科研没有捷径

    极市学者专访 第三期 听大牛说说计算机视觉那些事儿 AI派在读学生小姐姐Beyonce Java实战项目练习群 长按识别下方二维码 按需求添加 扫码添加Beyonce小姐姐 扫码关注 进Java学习大礼包 本次极市学者访谈 我们非常荣幸地邀
  • WebSSH2 界面ssh

    工具 Virtual Machines14 1 系统环境 CentOS 7 64位 2个 IP 192 168 163 138 IP 192 168 163 141 概述 在138系统中安装部署WebSSH服务 通过浏览器 http Web
  • [SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

    四元数定义 Hamilton vs JPL 简介 四种区分方式 Hamilton vs JPL 引用 不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中 都需要用到单位四元数 Quaternion 来表示旋转 主要是单位四元数表示旋