融合定位(imu-gps fusion)修仙

整理一些知识点, 参考链接用蓝色标注.

目录

概念汇集口

业界技巧汇集口:

融合定位的小思绪:



概念汇集口


PVT: i.e., position, velocity, time, 即通过伪距/载波相位求解(至少)三个变量的模块. 一般是通过最小二乘, 卡尔曼滤波等方法求解. 

  1. 只利用伪距, 或者组合波, 产生单点定位spp
  2. 利用伪距和载波相位, 并加入各种补偿, 产生精密单点定位ppp
  3. 利用伪距和相位的差分(双差), 通过卡尔曼滤波+lambda算法, 产生rtk

RTK: real time kinematic, 全称应该是RTK载波相位差分技术, 定位精度明显高于单点定位/伪距方法. 一般是通过伪距/载波相位的双差, 先用kf得到float解. 然后通过lambda算法得到高精度的fix解.


ESKF: fuse-location一种实现方式, 对误差状态建立卡尔曼滤波, 而不是对真实状态, 参考资料可见: ESKF-Joan Solà , 基于机械编排的eskf


EIF: 其实和ekf是等价的, 但是它维持的参数不是mean/covariance, 而是information state vector以及信息矩阵. EKF方便预测, EIF方便更新(从复杂度上而言).


业界技巧汇集口:


状态的预测: 对于载体状态的预测, 通常会根据各种传感器更新, 常用的是imu. 如果不考虑自转, 而且局部地区移动, 只用简单的高中物理运动方程知识更新即可. 如果考虑, 用机械编排(有针对导航系的, 也有针对ecef的). 

预测时, 可以加入零速检测, 把速度直接置为0, 然后更新各种状态, 减少一定的imu累计误差.  零速检测可以通过imu的acc, gyro判断, 也可以搞一个机器学习模型(i.e. XGBoost tree)通过预测概率判断.


选星: 卫星应该分布地比较广阔, 更立体. 有一篇专利: 选星专利-解放军大学. 这个没怎么考虑过, 顺带学习了一下. 毕竟是gps内部自己要做的事, 我们只需要那gps做后处理. 


方向修正: 指南针的数据, 可用低通滤波器修正, 补偿跳点. 低通滤波修正方向传感器数据


SPP(单点定位): 

        状态量只考虑(位置r, 钟差dt), 观测量是到各卫星的伪距P(可以考虑多频带).

将伪距拆分成真实几何距离+接收机钟差, 卫星钟差, 电离层, 对流层延时, y = h(x). 再将观测方程在当前估计值处一阶泰勒展开, 利用最小二乘以及迭代法(给定个初始解), 不断更新x

 

 

 


PPP(精密单点定位):

        状态中除了位置, 钟差, 还引入了速度(V),  天顶总延迟(zenith total delay), 北东对流层水平梯度(G_N, G_E), 载波相位偏差B(m个卫星就有m个). 同时观测还加入了载波相位.

理论上也可以和spp一样通过迭代最小二乘求解. 但我们可以使用一些先验信息, 譬如 a basic dynamic model for the receiver, and some statistical knowledge about the status of the troposphere. 这个时候我们引入了卡尔曼滤波而不是用最小二乘法直接求状态.

1. 运动方程的转移(预测)矩阵如下, 这个有点无语, 基本就是继承上一状态.

 2.使用伪距, 载波相位建立观测方程, 这里d\Phi表示一些矫正, 比如pco(相位中心和位置中心不一定重合, 要进行补偿),pcv, earth tide, phase windup等.

 求导之后即可得到K矩阵, 更新状态(m_W,r 是接收机的wet mapping function, m_WG,r还没弄清楚).

这里对流层的模型采用了ZTD+GRAD的方式, 考虑垂直方向延迟以及水平方向的梯度. 具体对流层延时模型如下: 

其中El_r^{(s)}, Az_r^{(s)}表示卫星在接收机enu坐标系下的高度角, 方位角. m_w(\cdot), m_H(\cdot)是相应的wet mapping function, hydro-static mapping function. G_{N,r}, G_{E,r}是对流层北/南向梯度. 提一点, 对流层模型中天顶总延迟可分为干分量(也就是hydrostatic)Z_{H,r}和湿分量, 下式z, e取0即可得到Z_{H,r}, 其中p是total pressure (in hPa),  ℎ is the geodetic height above MSL (mean sea level), 这其实就是standard atmosphere(p, T, e) and saastamoninen model.(不过这个saastamoninen模型好像有多重定义)

 3. 总的操作如下

Q和R如下:具体参数见之前的链接


rtklib主要算法接口逻辑顺序: 


rtkpost:

输入观测, 星历等直接求解用户位置. 可以把结果.pos转为谷歌地球的kml文件, 然后动态显示到谷歌地图上!!!!!!

登陆地球官网, 点击项目, 然后添加kml文件, 点击演示即可.

 


rtknav: 

实时处理观测数据进行定位.


融合定位的小思绪:


除了GVINS是紧耦合GNSS信息外,其他的方案都是松耦合GNSS信息。然后除了EFK,ESKF的方案,其他方案都使用了图优化来进行位姿更新。所以从精度上(也包括了系统鲁棒性)来说GVINS的精度最高,LIO-SAM次之(主要是雷达精度高),VINS-FUSION 略大于ESKF 大于 EKF 。如果从研发周期、系统的运行效率(时间、空间)来说,ESKF是最优的,EKF次之,然后是VINS FUSION 约等于 LIO-SAM 大于 GVINS.

如果用松耦合, 基本就是使用eskf了. 直接用牛顿定律预测位置/速度状态(每来一个imu数据). 然后对状态的误差项建立kf, 更新error, 然后add到状态上进行矫正.  这方面自己做过项目之后发现有些不好解决的问题:

  1. 一般的imu在1s之内累积误差就相对很大了, 所以会偏离gt, 然后下一秒靠gps拉回来, 这样轨迹锯齿会非常严重. 说白了, 就是这种融合依赖其他的高精度sensor, i.e., gps, 磁力计等矫正imu的偏置误差, 如果这些sensor频率太低, 轨迹必然锯齿, 且精度低.(这方面可以加个mean/median滤波试试)
  2. 即使这些sensor频率高, 也会陷入一些悖论: 如果这些sensor在很多自然环境都有位置输出, 那imu的存在没啥意义. 如果没有, 那imu的偏置矫正又无法进行.
  3. 可能讨论2的中间情况比较适合, 我做的1hz gps频率对融合定位算是比较低的, 好的gps可以做到32hz, 当然我们不需要, 可能5-10hz的gps会效果不错? 在线维持偏置在一定水准, 延长在无gps信号下的imu定位精度?

如果想尝试紧耦合, 那可以结合ppp, 将imu运动预测加入到观测方程, 在ppp输出结果前进行紧耦合. 但是这时imu的偏置也是一个必须放在状态量中更新的变量. ppp内部使用了kf. 偏置每次预测直接给定上imu的偏置, 靠观测方程来持续更新矫正.

松紧耦合可以给大家一篇思路链接(耦合), 公式都是考虑自转, 在N系下推导. 紧耦合, 观测方程式imu伪距和gps伪距相减. imu伪距是什么具体看链接.

时间对齐: 这部分有两个方面可以考虑, 一是不同传感器时间戳可能来自不同的时间系统, 二是同一时间系统, 真实采样点和记录时间点也会有偏差.

这方面可以先不用要求那么高, 理论上最新的imu时间与最新gps时间满足如下关系, imu如果频率较高, 则可以尝试认为二者是同一时间的观测然后进行处理. (f指代频率)

        |t_{imu} - t_{gps}| <= 1/f_{imu}

当然, 传感器时间要先转换到同一时间系统. 

wifi可能不太行, 需要一直打开wifi获取周围路由器的mac地址进行室内相对定位, 功耗降不下来. 

  1. 每一个无线AP(access point)都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内是不会移动的
  2. 设备在开启Wi-Fi的情况下,即可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址
  3. 设备将这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备. 定位算法有三角定位(三个球的交点即用户位置), 指纹定位.
  4. 位置服务商要不断更新、补充自己的数据库,以保证数据的准确性,毕竟无线AP不像基站塔那样基本100%不会移动
  5. 苹果之前用skyhook的数据库, 后面自己建立了一个, 毕竟他有众多的iPhone用户, 只要周围有一个ap已经在数据库中, 那么附近的其他ap的位置都可以推算出来不断更新扩大数据库!

蓝牙的话, 需要一个蓝牙发射器作为基站, 然后通过接收信号定位用户位置. 或者也可以将发射基安装在重要资产上, 这种适合于搜索定位, 而不是接收机自身. 蓝牙成本低, 但是误差大. 

  • 重要资产上安装由电池供电的低功耗蓝牙发射器(标签),将资产当前位置和接收信号强度发送到固定位置的蓝牙接收器上,精准定位。
  • 景区游客定位:通过定位标签可以查看游客位置,为预防危险和救援提供可靠保障。

ros开发

        如果要玩实体, 可以通过ros开发, 将imu/gps等设备安装在树莓派上, 然后设置主从机, 通过分布式通讯, 在从机pc上rviz展示或进行其他功能运算. 如果要加一个带轮子的底盘驱动, 可以加上arduino和电机驱动板(用来增大电压).

        树莓派: 一个微型电脑, 能实现pc的所有基本功能, 作为机器人的控制系统. 主要是为了安装并使用ros.

        arduino: 一个电路控制器, 什么温度湿度传感器, led等, 电机都可以连接在上面与环境产生交互. 通过配套的软件arduino_ide来开发. 为了和ros联系起来, 已有一个封装好的ros功能包ros_arduino_bridge, 进去调参适配即可(也是通过arduino_ide打开).

        ros: robot operation system, 专门用来开发机器人, 功能包众多, 

sudo apt-get install ros-kinetic-PACAKGE

将PACKAGE替换为系统提示缺啥少的软件包,例如(ros的包都是用-来连接单词)

$ sudo apt-get install ros-kinetic-slam-gmapping   #GMapping-SLAM算法包
$ sudo apt-get install ros-kinetic-turtlebot-description  #Turtlebot机器人模型包
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值