INS/GNSS组合导航(十)松耦合捷联车载定位解算示例

2023-12-09 14:59

本文主要是介绍INS/GNSS组合导航(十)松耦合捷联车载定位解算示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.摘要

     基于GNSS信号辅助IMU实现车载导航,可有效规避IMU积分误差累积效应及GNSS信号丢失导致位姿解算失准的问题,为此本文引入结合GNSS与IMU的松组合融合定位计算方法实现低成本车载IMU传感器的准确定位.

2.算法实现

2.1流程图

      基于融合的INS/GNSS组合导航方法 实现位姿解算(求解PVA)的流程图如下。

2.2算法实现

2.2.1主要坐标系方向

对于车载导航算法解算过程,涉及的坐标系参见下图所示,均符合右手坐标系法则

       

                       

2.2.2 IMU估算

定义时刻的导航状态量与IMU的观测量分别如下:

                                              x_{t}=\begin{bmatrix}p_{t} \\v_{t}\\q_{t}\end{bmatrix}\in R^{10}                                                              (1)

                                                u_{t}=\begin{bmatrix}a_{t} \\\omega_{t}\end{bmatrix}\in R^{6}                                                             (2)

其中p_{t}\in R^{3}[m]对应位置向量,v_{t}\in R^{3}[m/s]对应速度向量,q_{t}\in R^{4}[-]对应姿态向量(四元数表示法),

a_{t}\in R^{3}[m/s^2]对应三个方向的加速度向量,\omega_{t}\in R^{3}[rad/s]对应三个方向的角速度向量.

对于纯惯性导航系统INS的求解,将时间物理量离散化后,可采用下述非线性差分表达式进行递推得到.

                                                 x_{t}=f(x_{t-1},u_{t})                                                            (3)

其中,

                       p_{t}=p_{t-1} + T_{s}v_{t-1} +\frac{T_{s}^{2}}{2}{R_{b}^n(q_{t-1})a_t -g)}                                           (4)

                         v_{t}=v_{t-1} + T_{s}{R_{b}^n(q_{t-1})a_t -g)}                                                          (5)

                         \frac{1}{||\omega_{t}||}sin(0.5T_{s}||\omega_{t}||)\Omega_{t})q_{t-1}                                                              (6)

                      \Omega_{t}=\begin{bmatrix}0 &[\omega_t]_z&-[\omega_t]_y&[\omega_t]_x\\-[\omega_t]_z&0&[\omega_t]_x&[\omega_t]_y\\ [\omega_t]_y&-[\omega_t]_x&0&[\omega_t]_z\\-[\omega_t]_x &-[\omega_t]_y&-[\omega_t]_z&0\end{bmatrix}                                               (7)

其中T_s对应的是IMU数据采样周期(s),R_{b}^n(q)对应的是方向余弦矩阵DCM,即将body系(b-frame)中的向量旋转到navi系(n-frame).对于车载而言,通常因安装误差或人为调整,使得IMU传感器与车体之间存在一定安装倾角,则上述表达式对应的b-frame需对应调整为车体坐标系,而非通常意义的IMU坐标系(可将IMU的坐标系调整为车体的b系).

2.2.3 GNSS与IMU融合

上述章节给出了仅采用IMU实现解算的流程,通常单独的IMU解算只能维持较短时间,长时间则因积分累计误差,使得累计误差过大解算结果大幅偏移实际行驶轨迹.为此,采用结合GNSS的松组合解算方法,具体而言,借助卡尔曼滤波器(Kalman Filter)实现融合定位的位姿解算.

假定IMU的测量信号可采用下述表达式定义:

                                                 \widetilde{u_{t}}=u_{t} - {\delta}u_{t} +W_{t}^{(1)}                                                (8)

其中,W_{t}^{(1)}  表示协方差矩阵 Q^{(1)} 添加高斯白噪声后得到的测量噪声, {\delta}u_{t}表示缓慢变化的测量偏差,可基于随机行走模拟其大小变化,即:

                                                         {\delta}u_{t}={\delta}u_{t-1} +W_{t}^{(2)}                                          (9)

其中,W_{t}^{(2)}  表示协方差矩阵 Q^{(2)}添加高斯白噪声后得到的随机行走噪声.

进一步结合上述表达式,给出真实的导航状态量x_t与INS估测得到状态量\hat{x}_t之间的误差

                                                 {\delta}x_{t}=\begin{bmatrix}{\delta}p_{t} \\{\delta}v_{t}\\\epsilon_{t}\end{bmatrix}\in R^{9}                                                  (10)

上式中,相应的得到位置误差为:\delta p_k=p_k-\hat{p}_k, 速度误差为:\delta v_k=v_k-\hat{v}_k ,姿态扰动量\epsilon_t可视作姿态量 \hat{q}_t 变化到 {q}_t 所引起的欧拉角变化,实际是一个3x3的旋转矩阵.

结合相关文献,可得到 \hat{q}_t 与 {q}_t 的关系式如下:

                                    R_{b}^{n}(q_{t})=(I_{3} -[\epsilon_{t}]_{skew})R_{b}^{n}(\widehat q)                                            (11)

其中下标skew表示相应矩阵的反对称矩阵(skew symmetric,类似A=-A^T)

根据上述式(10)定义的误差向量,将测量信号\tilde{u}_t 传递给INS求解表达式(3),对于较小的误差信号,可采用线性状态空间模型表述如下:

                                      z_{t}=F(x_{t},u_{t})z_{t-1} + G_{t}{(x_t)W_{t}}                                       (12)

其中状态转移矩阵F(x_t,u_t)与噪声增益矩阵G_t(x_t)分别定义如下:

                                      z_{t}=\begin{bmatrix}{\delta}x_{k} \\{\delta}u_{k}\end{bmatrix}\in R^{15}                                                            (13)

                                    W_{t}=\begin{bmatrix}W_{t}^{(1)} \\W_{t}^{(2)}\end{bmatrix}\in R^{12}                                                         (14)

  F(x_{t},u_{t})=\begin{bmatrix}I_{3} &T_{s}I_{3}&0_{3,3}&0_{3,3}&0_{3,3}\\0_{3,3}&I_{3}&T_{s}[R_{b}^n(q_{t})a_{t}]_{skew}&T_{s}R_{b}^n(q_{t})&0_{3,3}\\ 0_{3,3}&0_{3,3}&I_{3}&0_{3,3}&-T_{s}R_{b}^n(q_{t})\\0_{3,3}&0_{3,3}&0_{3,3}&I_3&0_{3,3}\\0_{3,3}&0_{3,3}&0_{3,3}&0_{3,3}&I_{3}\end{bmatrix}            (15)

                            G_k(x_{t})=\begin{bmatrix}0_{3,3} &0_{3,3}&0_{3,3}&0_{3,3}\\T_{s}R_{b}^n(q_{t})&0_{3,3}&0_{3,3}&0_{3,3}\\0_{3,3}&T_{s}R_{b}^n(q_{t})&0_{3,3}&0_{3,3}\\0_{3,3}&0_{3,3}&I_{3}&0_{3,3}\\0_{3,3}&0_{3,3}&0_{3,3}&I_{3} \end{bmatrix}                        (16)

进一步,对于GNSS信号接收器得到的位置测量值 \widetilde p_{t}^{gnss}可表述如下:

                                         \widetilde p_{t}^{gnss}=p_{t} +e_{t}^{(1)}                                                         (17)

其中 e_{t}^{(1)}是协方差矩阵添加高斯白噪声后得到GNSS测量噪声.

由此得到融合解算(KF解算所需)的误差输入量即为GNSS测量值与纯IMU估算量之差,即:

                                  y_{t}^{(1)}=\widetilde p_{t}^{gnss}-\widehat p_{t}=H^{(1)}z_{t} +e_{t}^{(1)}                                    (18)

                                                         H^{(1)}=\begin{bmatrix}I_3 &0_{3,12}\end{bmatrix}                                     (19)

上述式(11)与式(19)所定义的状态空间模型即通常意义上的松组合条件下GNSS辅助的INS融合解算算法.

2.2.4 车体动力学模型

尽管借助GNSS可有效辅助IMU传感器对位置进行估计,然而在GPS信号丢失的情况下,位置误差迅速增加,使得导航解算显著偏离实际位置,估算失效.为此,可引入车体运动动力学模型.通常的做法是引入运动学约束.通常假定车辆无打滑现象,车体运动方向垂直方向都无速度分量,即v_yv_z均为0,仅考虑车体前进方向速度v_x

                                                        O_{2,1}=AR_{n}^{p}v                                             (20)

                                                      A=\begin{bmatrix}0 &1&0\\0&0&1\\ \end{bmatrix}                                            (21)

 R_{n}^{p}对应的是方向余弦矩阵DCM,即将navi系(n-frame)旋转变换到车辆坐标系(p-frame)。实际行驶过程,上述两个方向的速度并非完全为0,为此适当松弛上述约束条件,即添加一个噪声项。

                                  ​​​​​​​        y_{t}^{(2)}=0_{2,1}-AR_{n}^{p}\widehat v_{t}=H^{(2)}z_{k} +e_{k}^{(2)}                     (22)

           ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         H^{(2)}=\begin{bmatrix}0_{2,3}&AR_{n}^{p}&0_{2,9}\end{bmatrix}                                    (23)

         ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         y_{t}=\begin{bmatrix}y_{t}^{(1)} \\y_{t}^{(2)}\end{bmatrix}=Hz_{t}+e_{t}                                 (24)

其中,

                                             H=\begin{bmatrix}I_3 &0_{3,3}&0_{3,9}\\0_{3,3}&AR_{n}^{p}&0_{3,9}\end{bmatrix}                                     (25)

对于y_t进一步可写成如下形式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​                ​​​​​​​y_{t}=\begin{bmatrix}\widetilde p_{t}^{gnss}\\0_{2,1}\end{bmatrix}-\begin{bmatrix}I_3 &0_{3,3}\\0_{2,3}&AR_{n}^{p}\end{bmatrix}\begin{bmatrix}\widehat p_{t} \\\widehat v_{t}\end{bmatrix}                         (26)

3.解算效果

 

 

4.其它说明

本次松耦合解算只是一个简单的示例,对很多误差模型的处理进行了简化,实际车载定位解算需考虑更为全面的数学模型。

5.参考文献

1.Accuracy Improvement of Low Cost INS/GPS for Land Applications

2.GNSS-aided INS for land vehicle positioning and navigation

3.Tilt Sensing Using a Three-Axis Accelerometer

4.Design and Implementation Issues of a Portable Navigation System

5.Principles of GNSS, Inertial, and Multisensor Integrated Navigation Systems

这篇关于INS/GNSS组合导航(十)松耦合捷联车载定位解算示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474116

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的