Hello! 欢迎来到我的博客
今天的内容关于机器人中常用的传感器IMU,我们用它来实现机器人姿态、速度、位置的估计。
今天将会介绍使用低成本IMU进行机器人运动估计的一个常用方法——ESKF。

1 四元数基础

四元数,英文名称为:quaternion。正如一个单位复数可以表示在复平面上的旋转一样,单位四元数也可以用于表示三维空间中的旋转,并且由于其在更新过程中不会发生奇异现象,因此在惯性导航中被广泛使用。一般来说,四元数的表示方式有许多,其中最常用的是两种,一种是Hamilton,另一种是JPL。由于,在机器人领域中,无论是ROS,Eigen,Ceres等等项目中都用到的是Hamilton四元数,因此,这里后续文章中使用以及介绍的也是这种。

以下介绍的都是在IMU运动方程以及ESKF中必要的关于四元数的知识,因此可能会过于简略,读者可暂时先跳转至第二部分阅读,遇到不明的四元数定义时,再回来查阅。

(1)四元数定义

Q=a+bi+cj+dk∈HQ=a+b i+c j+d k \in \mathbb{H}Q=a+bi+cj+dk∈H
其中,{a,b,c,d}∈R\{a, b, c, d\} \in \mathbb{R}{a,b,c,d}∈R是系数,{i,j,k}\{i, j, k\}{i,j,k}是虚部单位。
一个四元数可以表示为实部和虚部,如下:
Q=qw+qxi+qyj+qzk⇔Q=qw+qvQ=q_{w}+q_{x} i+q_{y} j+q_{z} k \quad \Leftrightarrow \quad Q=q_{w}+\mathbf{q}_{v}Q=qw​+qx​i+qy​j+qz​k⇔Q=qw​+qv​
记作向量形式则为:
q≜[qwqv]=[qwqxqyqz]\mathbf{q} \triangleq\left[\begin{array}{l} q_{w} \\ \mathbf{q}_{v} \end{array}\right]=\left[\begin{array}{l} q_{w} \\ q_{x} \\ q_{y} \\ q_{z} \end{array}\right] q≜[qw​qv​​]=⎣⎢⎢⎡​qw​qx​qy​qz​​⎦⎥⎥⎤​

(2)单位四元数

单位四元数可以作为一种旋转的表示方式,它可以转换为欧拉角,也可以转换为旋转矩阵。
单位四元数的定义:
q=[cos⁡θusin⁡θ]\mathbf{q}=\left[\begin{array}{c} \cos \theta \\ \mathbf{u} \sin \theta \end{array}\right] q=[cosθusinθ​]
其中,u=uxi+uyj+uzk\mathbf{u}=u_{x} i+u_{y} j+u_{z} ku=ux​i+uy​j+uz​k是单位向量,而θ\thetaθ为一个标量。
由此可知,单位四元数的模长为1。
∣∣q∣∣=cos⁡2θ+sin⁡2θ(ux2+uy2+uz2)=1||\mathbf{q}||=\sqrt{\cos^2\theta+\sin^2\theta(u_x^2+u_y^2+u_z^2)}=1 ∣∣q∣∣=cos2θ+sin2θ(ux2​+uy2​+uz2​)​=1

(3)乘法

两个四元数乘法的记号为:⊗\otimes⊗,乘法的具体定义为:
p⊗q=[pwqw−pxqx−pyqy−pzqzpwqx+pxqw+pyqz−pzqypwqy−pxqz+pyqw+pzqxpwqz+pxqy−pyqx+pzqw]\mathbf{p} \otimes \mathbf{q}=\left[\begin{array}{l} p_{w} q_{w}-p_{x} q_{x}-p_{y} q_{y}-p_{z} q_{z} \\ p_{w} q_{x}+p_{x} q_{w}+p_{y} q_{z}-p_{z} q_{y} \\ p_{w} q_{y}-p_{x} q_{z}+p_{y} q_{w}+p_{z} q_{x} \\ p_{w} q_{z}+p_{x} q_{y}-p_{y} q_{x}+p_{z} q_{w} \end{array}\right] p⊗q=⎣⎢⎢⎡​pw​qw​−px​qx​−py​qy​−pz​qz​pw​qx​+px​qw​+py​qz​−pz​qy​pw​qy​−px​qz​+py​qw​+pz​qx​pw​qz​+px​qy​−py​qx​+pz​qw​​⎦⎥⎥⎤​
值得注意的是,两个单位四元数相乘还是单位四元数。

(4)纯四元数的指数函数

纯四元数的定义为,实部为0的四元数,即:v=[0qv]\mathbf{v}=\left[\begin{array}{l}0 \\ \mathbf{q}_{v}\end{array}\right]v=[0qv​​]

定义纯四元数的指数函数如下:
ev=euθ=cos⁡θ+usin⁡θ=[cos⁡θusin⁡θ]e^{\mathbf{v}}=e^{\mathbf{u} \theta}=\cos \theta+\mathbf{u} \sin \theta=\left[\begin{array}{c} \cos \theta \\ \mathbf{u} \sin \theta \end{array}\right]ev=euθ=cosθ+usinθ=[cosθusinθ​]
其中:v=uθ\mathbf{v}=\mathbf{u} \thetav=uθ,并且θ=∥v∥∈R\theta=\|\mathbf{v}\| \in \mathbb{R}θ=∥v∥∈R,u\mathbf{u}u为单位向量。

(5)单位四元数转旋转矩阵

R=R{q}=[qw2+qx2−qy2−qz22(qxqy−qwqz)2(qxqz+qwqy)2(qxqy+qwqz)qw2−qx2+qy2−qz22(qyqz−qwqx)2(qxqz−qwqy)2(qyqz+qwqx)qw2−qx2−qy2+qz2]\mathbf{R}=\mathbf{R}\{\mathbf{q}\}=\left[\begin{array}{ccc} q_{w}^{2}+q_{x}^{2}-q_{y}^{2}-q_{z}^{2} & 2\left(q_{x} q_{y}-q_{w} q_{z}\right) & 2\left(q_{x} q_{z}+q_{w} q_{y}\right) \\ 2\left(q_{x} q_{y}+q_{w} q_{z}\right) & q_{w}^{2}-q_{x}^{2}+q_{y}^{2}-q_{z}^{2} & 2\left(q_{y} q_{z}-q_{w} q_{x}\right) \\ 2\left(q_{x} q_{z}-q_{w} q_{y}\right) & 2\left(q_{y} q_{z}+q_{w} q_{x}\right) & q_{w}^{2}-q_{x}^{2}-q_{y}^{2}+q_{z}^{2} \end{array}\right]R=R{q}=⎣⎡​qw2​+qx2​−qy2​−qz2​2(qx​qy​+qw​qz​)2(qx​qz​−qw​qy​)​2(qx​qy​−qw​qz​)qw2​−qx2​+qy2​−qz2​2(qy​qz​+qw​qx​)​2(qx​qz​+qw​qy​)2(qy​qz​−qw​qx​)qw2​−qx2​−qy2​+qz2​​⎦⎤​
注意,必须是单位四元数!!!

(6)单位四元数转欧拉角

由于欧拉角的定义方式也有很多,这里说明的是依据Z-Y-X定义的欧拉角,其中欧拉角与旋转矩阵的变换关系是:
R=[cos⁡ψcos⁡θcos⁡ψsin⁡θsin⁡ϕ−sin⁡ψcos⁡ϕcos⁡ψsin⁡θcos⁡ϕ+sin⁡ψsin⁡ϕsin⁡ψcos⁡θsin⁡ψsin⁡θsin⁡ϕ+cos⁡ψcos⁡ϕsin⁡ψsin⁡θcos⁡ϕ−cos⁡ψsin⁡ϕ−sin⁡θcos⁡θsin⁡ϕcos⁡θcos⁡ϕ]\mathbf{R}=\left[\begin{array}{ccc}{\cos \psi \cos \theta} & {\cos \psi \sin \theta \sin \phi-\sin \psi \cos \phi} & {\cos \psi \sin \theta \cos \phi+\sin \psi \sin \phi} \\ {\sin \psi \cos \theta} & {\sin \psi \sin \theta \sin \phi+\cos \psi \cos \phi} & {\sin \psi \sin \theta \cos \phi-\cos \psi \sin \phi} \\ {-\sin \theta} & {\cos \theta \sin \phi} & {\cos \theta \cos \phi}\end{array}\right] R=⎣⎡​cosψcosθsinψcosθ−sinθ​cosψsinθsinϕ−sinψcosϕsinψsinθsinϕ+cosψcosϕcosθsinϕ​cosψsinθcosϕ+sinψsinϕsinψsinθcosϕ−cosψsinϕcosθcosϕ​⎦⎤​
其中:ϕ,θ,ψ​\phi,\theta,\psi​ϕ,θ,ψ​为欧拉角,分别为横滚角(X),俯仰角(Y),偏航角(Z)。
所以,四元数转欧拉角的关系为:
ϕ=arctan⁡2(qyqz+qwqx)qw2−qx2−qy2+qz2θ=−arcsin⁡[2(qxqz−qwqy)]ψ=arctan⁡2(qxqy+qwqz)qw2+qx2−qy2−qz2\begin{aligned} \phi &= \arctan\frac{ 2\left(q_{y} q_{z}+q_{w} q_{x}\right)}{q_{w}^{2}-q_{x}^{2}-q_{y}^{2}+q_{z}^{2}}\\ \theta&=-\arcsin [2\left(q_{x} q_{z}-q_{w} q_{y}\right)]\\ \psi&=\arctan\frac{2\left(q_{x} q_{y}+q_{w} q_{z}\right)}{q_{w}^{2}+q_{x}^{2}-q_{y}^{2}-q_{z}^{2}} \end{aligned} ϕθψ​=arctanqw2​−qx2​−qy2​+qz2​2(qy​qz​+qw​qx​)​=−arcsin[2(qx​qz​−qw​qy​)]=arctanqw2​+qx2​−qy2​−qz2​2(qx​qy​+qw​qz​)​​
注意,必须是单位四元数!!!

2 IMU运动方程

2.1 关于IMU测量数据

在聊到IMU测量数据的时候,我们首先需要明白两个坐标系的定义。

一是惯性系,二是IMU坐标系。

这里的惯性系就是指静止或者其速度的改变可以忽略不记的坐标系。通常在机器人的应用中,由于所用的IMU都是低成本IMU,对于地球自转角速度不够敏感,所以可以认为与地面固连的坐标系都是惯性坐标系。然而对于,航空航天应用而言,用到的IMU精度很高,对于惯性导航的要求也很严格,则需要考虑地球自转角速度,这是惯性坐标系为地球惯性坐标系。

IMU测量的实际上就是IMU坐标系相对于惯性系的加速度和角速度。值得注意的是,这里的相对于惯性系的加速度不仅包括载体的运动加速度,还包括重力加速度。
所以,我们需要特别注意,加速度计测量的不是载体的运动加速度,而是载体相对惯性空间的绝对加速度和引力加速度之和,称作“比力”。

通常,IMU的测量模型如下:
am=Rt⊤(at−gt)+abt+anωm=ωt+ωbt+ωn\begin{array}{l} \mathbf{a}_{m}=\mathbf{R}_{t}^{\top}\left(\mathbf{a}_{t}-\mathbf{g}_{t}\right)+\mathbf{a}_{b t}+\mathbf{a}_{n} \\ \bm{\omega}_{m}=\bm\omega_{t}+\bm\omega_{b t}+\bm\omega_{n} \end{array}am​=Rt⊤​(at​−gt​)+abt​+an​ωm​=ωt​+ωbt​+ωn​​
其中,Rt⊤\mathbf{R}_{t}^{\top}Rt⊤​表示从惯性系到IMU坐标系的旋转矩阵。abt,ωbt\mathbf{a}_{b t},\bm\omega_{b t}abt​,ωbt​代表随机游走噪声,可以理解为加速度计和陀螺仪的零漂。an,ωn\mathbf{a}_{n},\bm\omega_{n}an​,ωn​为零均值高斯白噪声。gt\mathbf{g}_{t}gt​代表重力加速度,表示在惯性系下。这里关于gt\mathbf{g}_{t}gt​的符号不用特别在意,这个负号并不是一定的,也可以写成正号,取决于gt\mathbf{g}_{t}gt​的定义。

2.2 IMU运动方程

IMU的运动方程主要描述了物体速度,位置以及姿态在IMU测量数据的激励下产生的变化。除了关于四元数的部分以外,用到的知识就是小学二年级学过的物理知识。比如,位置的导数是速度,速度的导数是加速度。
我们定义我们关心的状态量为:

  • pt\mathbf{p}_{t}pt​:表示IMU系相对惯性系的位置,在惯性系下表示的,默认是三维的
  • vt\mathbf{v}_{t}vt​:表示IMU系相对惯性系的速度,同样是在惯性系下表示的,默认是三维的
  • qt\mathbf{q}_{t}qt​:表示从IMU系到惯性系的四元数,表示从IMU系到惯性系的旋转变换

于是,IMU的运动方程可以表示如下:
p˙t=vtv˙t=at=Rt(am−abt−an)+gtq˙t=12qt⊗ωt=12qt⊗(ωm−ωbt−ωn)a˙bt=awω˙bt=ωwg˙t=0\begin{aligned} \dot{\mathbf{p}}_{t} &=\mathbf{v}_{t} \\ \dot{\mathbf{v}}_{t} &=\mathbf{a}_{t}=\mathbf{R}_{t}\left(\mathbf{a}_{m}-\mathbf{a}_{b t}-\mathbf{a}_{n}\right)+\mathbf{g}_{t} \\ \dot{\mathbf{q}}_{t} &=\frac{1}{2} \mathbf{q}_{t} \otimes \bm\omega_{t}=\frac{1}{2} \mathbf{q}_{t} \otimes\left(\bm\omega_{m}-\bm\omega_{b t}-\bm\omega_{n}\right) \\ \dot{\mathbf{a}}_{b t} &=\mathbf{a}_{w} \\ \dot{\bm\omega}_{b t} &=\boldsymbol{\omega}_{w} \\ \dot{\mathbf{g}}_{t} &=0 \end{aligned}p˙​t​v˙t​q˙​t​a˙bt​ω˙bt​g˙​t​​=vt​=at​=Rt​(am​−abt​−an​)+gt​=21​qt​⊗ωt​=21​qt​⊗(ωm​−ωbt​−ωn​)=aw​=ωw​=0​
其中,Rt=R{qt}\mathbf{R}_{t}=\mathbf{R}\{\mathbf{q}_{t}\}Rt​=R{qt​}为基于qt\mathbf{q}_{t}qt​得到的旋转矩阵,表示了从IMU系到惯性系的旋转变换。aw,ωw\mathbf{a}_{w},\bm\omega_waw​,ωw​为零均值高斯白噪声。

值得注意的是,在这组运动方程中,把gt\mathbf{g}_{t}gt​也视作变化的量,后续基于此运动方程构造的ESKF也会对gt\mathbf{g}_{t}gt​进行更新。这在许多IMU运动方程中是不常见到的,这样做有什么好处呢?

首先,我们要明白gt\mathbf{g}_{t}gt​并不等于[0,0,9.8]T[0,0,9.8]^T[0,0,9.8]T,gt\mathbf{g}_{t}gt​的值取决于IMU的初始姿态。这是因为,IMU运动方程是递推的方程,计算出来的位置和速度都是相对于初始状态的,而不是绝对的位置和速度。因此为了方便起见,我们通常都会定义初始时刻的IMU坐标系为惯性系,这样我们后面计算出来的虽然是相对于初始IMU系的位置和速度,但也可以作为绝对的位置和速度了。于是,gt\mathbf{g}_{t}gt​既然代表了惯性系下的重力加速度,也就是初始的IMU坐标系下表示的重力加速度,所以当初始IMU坐标系不是水平的时候,gt\mathbf{g}_{t}gt​自然也就不等于[0,0,9.8]T[0,0,9.8]^T[0,0,9.8]T了。

进一步地,我们也可以知道,估计gt\mathbf{g}_{t}gt​,也就是估计初始时刻IMU的姿态。既然我们通过可以gt\mathbf{g}_{t}gt​估计了初始IMU的姿态,那么初始时刻的四元数就可以直接定义为q0=(1,0,0,0)\mathbf{q}_{0}=(1,0,0,0)q0​=(1,0,0,0)。这种操作实际上就是,我们先假设初始时刻四元数为q0=(1,0,0,0)\mathbf{q}_{0}=(1,0,0,0)q0​=(1,0,0,0),然后在此基础上估计gt\mathbf{g}_{t}gt​。当然,还有另外一种方法就是,先假设gt=[0,0,9.8]\mathbf{g}_{t}=[0,0,9.8]gt​=[0,0,9.8],然后估计初始时刻的IMU相距水平姿态相差多少。这两种方法都可以,然后估计gt\mathbf{g}_{t}gt​的话可以使模型的线性化程度更好。

为了更好的阅读体验,本文分为上下两文,关于ESKF的内容以及MATLAB代码,请移步下一篇文章。

机器人运动估计——IMU运动方程与ESKF原理介绍(上)相关推荐

  1. 机器人运动估计——IMU运动方程与ESKF原理介绍(下)

    Hello! 欢迎来到我的博客 今天的内容关于机器人中常用的传感器IMU,我们用它来实现机器人姿态.速度.位置的估计. 今天将会介绍使用低成本IMU进行机器人运动估计的一个常用方法--ESKF. 3 ...

  2. 机器人运动估计系列(二)——运动学方程(上)

    机器人运动估计系列(二)--运动学方程(上) 前言 在上一篇文章中,我们了解了用于表示机器人位置.速度的坐标系的定义,学习了如何表示姿态,也就是旋转的三种表达方式:旋转矩阵.欧拉角以及四元数.在这一节 ...

  3. 腾讯云Web应用防火墙有什么用?Web应用防火墙是防御原理介绍

    腾讯云Web应用防火墙有什么用?Web应用防火墙是防御原理介绍 腾讯云 Web 应用防火墙是一款专业为网站及 Web 服务的一站式智能防护平台,帮助企业组织应对网站及 Web 业务面临的 Bot 爬虫 ...

  4. 个人博客 SEO 优化(1):搜索引擎原理介绍

    文章首发于我的博客:个人博客 SEO 优化(1):搜索引擎原理介绍 写在文章前面: 前段时间接到一个 SEO 优化的私活.为了完成这个活,只能赶鸭子上架,从零开始系统地去学习 SEO 知识.经过几天的 ...

  5. GPU加速技术原理介绍

    GPU加速技术&原理介绍 1.GPU&CPU GPU英文全称Graphic Processing Unit,中文翻译为"图形处理器".与CPU不同,GPU是专门为处 ...

  6. HDR sensor 原理介绍

    HDR sensor 原理介绍 一. HDR sensor 原理介绍 什么是sensor的动态范围(dynamic range): sensor的动态范围就是sensor在一幅图像里能够同时体现高光和 ...

  7. java语言的实现机制_JAVA语言之Java NIO的工作机制和实现原理介绍

    本文主要向大家介绍了JAVA语言之Java NIO的工作机制和实现原理介绍,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 前言 本文只简单介绍NIO的原理实现和基本工作流程 I/O和 ...

  8. 中兴SDH原理介绍及中兴E300网管介绍

    姓名 苟忠兴 培训课程 中兴SDH原理介绍及中兴E300网管介绍 培训心得 1. SDH概念: SDH(Synchronous Digital Hierarchy,同步数字体系)是一种将复接.线路传输 ...

  9. 【机器学习】多项式回归原理介绍

    [机器学习]多项式回归原理介绍 [机器学习]多项式回归python实现 [机器学习]多项式回归sklearn实现 在上一节中我们介绍了线性回归的原理,然后分别用python和sklearn实现了不同变 ...

最新文章

  1. 机器学习-Sklearn
  2. Apache 2.4 配置多个虚拟主机的问题
  3. linux userdel删除用户命令
  4. 【数据结构与算法】之深入解析“自由之路”的求解思路与算法示例
  5. GitLab 自动触发 Jenkins 构建
  6. 文件句柄(file handles) 文件描述符(file descriptors)
  7. Expression Blend实例中文教程(4) - 布局控件快速入门Canvas
  8. 原理简介_消息通信的利器MQTT协议简介及协议原理
  9. ARP地址解析协议原理
  10. 标准C程序设计七---120
  11. 论文阅读:Natural Language Processing Advancements By Deep Learning: A Survey
  12. QA:Golang抽象nil问题
  13. SpreadJS V15.0 Update2 新特性一览
  14. 控制极限(UCL,LCL) 和规格极限(USL,LSL)
  15. 阿里云服务器 云对象存储OOS(一) ---入门级操作
  16. 带刺玫瑰特别美?OLED屏幕画面美但眼睛会累
  17. Html--判断客户端类型
  18. MySQL 查看本机的MySQL版本
  19. mysql配置文件参数详解_MySQL配置文件mysql.ini参数详解
  20. 毫米波雷达(一):原理

热门文章

  1. (附源码)springboor大学生防疫封校管理系统 毕业设计632124
  2. Python Scrapy 上传图片到FastDfs(py3fdfs)
  3. 报错 | SyntaxError: Legacy octal literals are not allowed in strict
  4. mysql 时间计算器
  5. OPENMV羽毛球识别
  6. linux关闭内存插槽,linux 统管理中的查看内存插槽数、最大容量和频率
  7. 最新分布式存储解决方案zData将于闪存论坛上正式发布!
  8. 微信小程序 扫码 加载图片
  9. Windows Touch 输入
  10. 纵观DeSci:起源、代表项目与未来发展