在上一篇博文《动手学无人驾驶(5):多传感器数据融合》介绍了如何使用Radar和LiDAR数据对自行车进行追踪,这是对汽车外界运动物体进行定位。
对于自动驾驶的汽车来说,有时也需要对自身进行更精确的定位,今天就介绍如何使用IMUGPS进行自车定位(因为在上一篇文章中对kalmanExtend Kalman原理进行了比较详细的介绍,本文中理论部分不会再介绍的这么详细了,有需要的话可以回看上文)。
本文参考了Coursera自动驾驶课程项目,在此表示感谢。

大家可以先看看下面这个视频,对本项目要介绍的内容有个初步了解,视频链接为:https://www.bilibili.com/video/BV1cE411D7Y9?p=18

Coursera 自动驾驶教程:Part2 - State Estimation and Localization for Self-Driving Cars

文章目录

  • 1.IMU简介
  • 2.GPS简介
  • 3.数据融合
    • 3.1 Extend Kalman Filter
    • 3.2 Motion Model
    • 3.3 Measurement Model
    • 3.4 Sensor Fusion

1.IMU简介

惯性测量单元(Inertial Measurement Unit)通常由3个加速度计和3个陀螺仪组合而成,加速度计和陀螺仪安装在互相垂直的测量轴上,这里可以将其输出看作为三个方向的加速度和角速度,表示为:
imu=[axayazwxwywz]imu=\begin{bmatrix}a_x \\ a_y\\ a_z \\ w_x \\ w_y \\ w_z\end{bmatrix}imu=axayazwxwywz


2.GPS简介

全球定位系统(Global Positioning System)大家应该都不陌生,其输出常见为:经度,维度,和高度,表示为:
gps=[lnglatalt]gps=\begin{bmatrix} lng\\lat\\alt \end{bmatrix}gps=lnglatalt


3.数据融合

3.1 Extend Kalman Filter

整个流程框架如下图所示,这里需要注意的是IMU与GPS的输出信号频率是不同的,IMU输出频率常见为50-500Hz不等GPS输出频率常见为1-10Hz。因此要分为两部分来讨论:

(1)在只有IMU数据时(此时GPS还未有输出产生),IMU数据经过运动模型,得到预测状态xˇk\check {x}_kxˇk;然后预测状态传送回运动模型,继续下一步预测;
(2)当有GPS数据产生时,上一时刻产生的预测状态将会和接收到的GPS位置信息进行数据融合,得到修正后的状态x^k\hat {x}_kx^k。然后再传回运动模型,进行下一周期的运算。


3.2 Motion Model

运动模型如下,状态向量为10维状态向量,即x=[px,py,pz,vx,vy,vz,q0,q1,q2,q3]Tx=[p_x,p_y,p_z,v_x,v_y,v_z,q_0,q_1,q_2,q_3]^Tx=[px,py,pz,vx,vy,vz,q0,q1,q2,q3]T,模型可以分为三部分讨论:

(1)位置运动模型,假设载体做匀加速运动,则有:pk=Δtvk−1+Δt22(Cnsfk−1−g)p_k=\Delta{t}v_{k-1}+\frac{\Delta{t}^2}{2}(C_{ns}f_{k-1}-g)pk=Δtvk1+2Δt2(Cnsfk1g),其中fk−1f_{k-1}fk1imu的测量值,CnsC_{ns}Cns为旋转矩阵,用于对imu的测量值进行坐标变换。
(2)速度运动模型,同样假设载体做匀加速运动。
(3)方向运动模型,这里qk−1q_{k-1}qk1表示为四元数,关于四元数的旋转变换可以参考有关资料,这里不做展开了。


上面的模型不是线性的,课程中将上面的模型进行线性化处理,结果如下,处理后的误差状态向量为9维的状态向量,这里需要关注的是状态转移矩阵Fk−1F_{k-1}Fk1噪声协方差矩阵Lk−1L_{k-1}Lk1


3.3 Measurement Model

测量模型如下,这里我们需要用到的是GPS的位置数据。

3.4 Sensor Fusion

介绍完理论部分,下面我们开始一步步实现代码部分。
(1)使用IMU数据进行更新,需要注意旋转矩阵的计算。

    # 1. Update state with IMU inputsC_ns = Quaternion(*q_est[k-1]).to_mat() #rotational matrixC_ns_dot_f_km = np.dot(C_ns, imu_f.data[k-1])# 1.1 Linearize the motion model and compute Jacobiansp_est[k] = p_est[k-1] + delta_t * v_est[k-1] + (delta_t**2)/2.0 * (C_ns.dot(imu_f.data[k-1]) + g)v_est[k] = v_est[k-1] + delta_t*(C_ns.dot(imu_f.data[k-1]) + g)# Instead of using Omega, we use quaternion multiplicationq_est[k] = Quaternion(axis_angle = imu_w.data[k-1] * delta_t).quat_mult_right(q_est[k-1])

(2)状态协方差矩阵的更新

   # 2. Propagate uncertainty# Global orientation error, over local orientation error# See Sola technical reportF = np.identity(9)F[:3, 3:6] = delta_t * np.identity(3)#F[3:6, 6:] = -(C_ns.dot(skew_symmetric(imu_f.data[k-1].reshape((3,1)))))F[3:6,6:9] = -skew_symmetric(C_ns_dot_f_km) *delta_tQ = np.identity(6)Q[:, :3] *= delta_t**2 * var_imu_fQ[:, -3:] *= delta_t**2 * var_imu_wp_cov[k] = F.dot(p_cov[k-1]).dot(F.T) + l_jac.dot(Q).dot(l_jac.T)  #uncertainty

(3)计算kalman增益

    # 3.1 Compute Kalman GainK_k = p_cov_check.dot(h_jac.T).dot(np.linalg.inv(h_jac.dot(p_cov_check).dot(h_jac.T)+np.identity(3)*sensor_var))

(4)计算误差状态

    # 3.2 Compute error stateerrorState = K_k.dot(y_k - p_check)

(5)误差状态修正

    # 3.3 Correct predicted statep_hat = p_check + errorState[:3]v_hat = v_check + errorState[3:6]q_hat = Quaternion(euler=errorState[6:]).quat_mult_left(\q_check) # left or right

(6)修正状态协方差矩阵

    # 3.4 Compute corrected covariancep_cov_hat = (np.identity(9) - K_k.dot(h_jac)).dot(p_cov_check)

到这一步,就完成了整个处理过程,可以看看最终的结果,途中橙色为轨迹真值位置,蓝色为估计的轨迹位置。


也可以绘制误差分布图,如下图所示,这里使用的3σ3\sigma3σ标准。


至此,本文要介绍的内容就结束了。基于IMU和GPS的位置定位,关键点在于IMU的运动模型,特别是四元数更新部分,里面牵涉到的变化比较多,需要留心。

如果想深入了解IMU和GPS融合原理,可以看看这篇文章: 重读经典《Quaternion kinematics for the error-state Kalman filter》,这也是Coursera课程关于这一项目的参考文献。

动手学无人驾驶(6):基于IMU和GPS数据融合的自车定位相关推荐

  1. 无人车传感器 IMU与GPS数据融合进行定位机制

    前言 上一次的分享里,我介绍了GPS的原理(三角定位)及特性(精度.频率),同时也从无人车控制的角度,讨论了为什么仅有GPS无法满足无人车的定位要求. 为了能让无人驾驶系统更高频率地获取定位信息,就必 ...

  2. 动手学无人驾驶(4):基于激光雷达点云数据3D目标检测

    上一篇文章<动手学无人驾驶(3):基于激光雷达3D多目标追踪>介绍了3D多目标追踪,多目标追踪里使用的传感器数据为激光雷达Lidar检测到的数据,本文就介绍如何基于激光雷达点云数据进行3D ...

  3. 动手学无人驾驶(2):车辆检测

    上一篇博客介绍了无人驾驶中深度学习在交通标志识别中的应用(动手学无人驾驶(1):交通标志识别). 本文介绍如何使用深度学习进行车辆检测,使用到的模型是YOLO模型,关于YOLO模型的具体检测原理,可以 ...

  4. 动手学无人驾驶(1):交通标志识别

    今天主要介绍无人驾驶当中深度学习技术的应用. 本文是根据博客专家AdamShan的文章整理而来,在此表示感谢. 关于深度学习的图像分类技术,网上已有很多关于深度学习的课程(如吴恩达老师的深度学习专项课 ...

  5. 毕业设计-基于深度学习的数据融合方法研究

    目录 前言 课题背景和意义 实现技术思路 一.深度学习概述 二.基于深度学习的数据融合方法分类 1.基于深度学习特征提取的数据融合方法 2.基于深度学习融合的数据融合方法 3.基于深度学习全过程的数据 ...

  6. 【C4AI-2022】基于可见光与激光雷达数据融合的航天器三维精细结构智能重建

    基于可见光与激光雷达数据融合的航天器三维精细结构智能重建 选题背景 随着航天技术的快速发展,空间活动任务类型呈现出多元化的发展趋势.其中,太空垃圾快速清除.故障卫星在轨维修.空间目标监视寄生.空间卫星 ...

  7. 动手学无人驾驶(3):基于激光雷达3D多目标追踪

    上一篇博客介绍了无人驾驶中的车辆检测算法(YOLO模型),该检测是基于图像进行的2D目标检测.在无人驾驶环境感知传感器中还有另一种重要的传感器:激光雷达.今天就介绍一篇无人驾驶中基于激光雷达目标检测的 ...

  8. 动手学无人驾驶(5):多传感器数据融合

    本系列的前4篇文章主要介绍了深度学习技术在无人驾驶环境感知中的应用,包括交通标志识别,图像与点云3D目标检测.关于环境感知部分的介绍本系列暂且告一段落,后续如有需要再进行补充. 现在我们开启新的篇章, ...

  9. 【动手学深度学习PyTorch版】27 数据增强

    上一篇请移步[动手学深度学习PyTorch版]23 深度学习硬件CPU 和 GPU_水w的博客-CSDN博客 目录 一.数据增强 1.1 数据增强(主要是关于图像增强) ◼ CES上的真实的故事 ◼ ...

最新文章

  1. 户外私密Party | 在大峡谷里聊一点平时不能聊的干货(报名ing...)
  2. 环美亚二十年装修师傅分享,甲醛的八种来源
  3. Python 中类的继承:属性初始化、类型判断、多态、多继承和对象信息的获取
  4. android 8.0 调系统拍照_Android通知栏微技巧,8.0系统中通知栏的适配
  5. 解决配置linux环境每次重新连接都需要bash ~/.bashrc的问题
  6. Aminer学术社交网络数据知识图谱构建(三元组与嵌入)
  7. 从HDFS看分布式文件系统的设计需求
  8. 华为机试(C++)真题Od
  9. 51单片机控制动态数码管的显示
  10. 阿里云10M带宽服务器实际下载速度测试说明
  11. Mysql(下载、安装、环境配置详细图文)
  12. 在家怎么做炸酱面 炸酱面做法
  13. 照片生成3D虚拟数字人,虚拟形象主播搭建(软件+教程)
  14. QT_下拉选项框_Combo Box_使用
  15. RGB、Lab、YUV、HSI、HSV等颜色空间的区别
  16. 一键启动u盘的快捷键查询表
  17. 读后感《富爸爸穷爸爸》
  18. 富爸爸穷爸爸阅读思考
  19. sql server 2000安装程序配置服务器失败
  20. RocketMQ学习笔记(二)

热门文章

  1. python对象属性在引用时前面需要加()_python基础-面向对象进阶
  2. 轻量级锁_并发编程实战05:锁的状态
  3. C#中变量(成员变量、局部变量、全局变量)的作用域
  4. python autoit上传文件_结合python+selenium使用AutoIt V3实现文件、图片上传
  5. stringbuilder寻找字符串位置可能存在多个 java_Java 语言基础amp;String
  6. python爬虫运行不出结果_请问这个为什么就是爬不到,运行之后电脑卡的不行,求大佬指导...
  7. python各版本区别_关于python中不同版本的print区别
  8. Linux 禁用msi模式,通过禁用MSI模式解决Win10磁盘占用100%的方法
  9. js 正则中冒号代表什么_javascript中正则表达式语法详解
  10. 新手学java7编程_新手学Java 7编程:面向对象程序设计