GNSS-INS组合导航:KF-GINS(二)
Earth.h文件
基于Eigen库矩阵计算。
1、WGS84确定椭球模型参数
const double WGS84_WIE = 7.2921151467E-5; /* 地球自转角速度*/
const double WGS84_F = 0.0033528106647474805; /* 扁率 */
const double WGS84_RA = 6378137.0000000000; /* 长半轴a */
const double WGS84_RB = 6356752.3142451793; /* 短半轴b */
const double WGS84_GM0 = 398600441800000.00; /* 地球引力常数 */
const double WGS84_E1 = 0.0066943799901413156; /* 第一偏心率平方 */
const double WGS84_E2 = 0.0067394967422764341; /* 第二偏心率平方 */
2、计算重力
class Earth {public:/* 正常重力计算 */static double gravity(const Vector3d &blh) {double sin2 = sin(blh[0]);sin2 *= sin2;return 9.7803267715 * (1 + 0.0052790414 * sin2 + 0.0000232718 * sin2 * sin2) +blh[2] * (0.0000000043977311 * sin2 - 0.0000030876910891) + 0.0000000000007211 * blh[2] * blh[2];}
与严老师PSINS中的代码相近
eth.g = eth.g0*(1+5.27094e-3*eth.sl2+2.32718e-5*sl4)-3.086e-6*pos(3); % grs80
3、计算子午圈半径
/* 计算子午圈半径和卯酉圈半径 */static Eigen::Vector2d meridianPrimeVerticalRadius(double lat) {double tmp, sqrttmp;tmp = sin(lat);tmp *= tmp;tmp = 1 - WGS84_E1 * tmp;sqrttmp = sqrt(tmp);return {WGS84_RA * (1 - WGS84_E1) / (sqrttmp * tmp), WGS84_RA / sqrttmp};}
4、计算卯酉圈半径
static double RN(double lat) {double sinlat = sin(lat);return WGS84_RA / sqrt(1.0 - WGS84_E1 * sinlat * sinlat);}
5、n系到e系转换矩阵
static Matrix3d cne(const Vector3d &blh) {double coslon, sinlon, coslat, sinlat;sinlat = sin(blh[0]);sinlon = sin(blh[1]);coslat = cos(blh[0]);coslon = cos(blh[1]);Matrix3d dcm;dcm(0, 0) = -sinlat * coslon;dcm(0, 1) = -sinlon;dcm(0, 2) = -coslat * coslon;dcm(1, 0) = -sinlat * sinlon;dcm(1, 1) = coslon;dcm(1, 2) = -coslat * sinlon;dcm(2, 0) = coslat;dcm(2, 1) = 0;dcm(2, 2) = -sinlat;return dcm;}
6、n系到e系转换四元数
static Quaterniond qne(const Vector3d &blh) {Quaterniond quat;double coslon, sinlon, coslat, sinlat;coslon = cos(blh[1] * 0.5);sinlon = sin(blh[1] * 0.5);coslat = cos(-M_PI * 0.25 - blh[0] * 0.5);sinlat = sin(-M_PI * 0.25 - blh[0] * 0.5);quat.w() = coslat * coslon;quat.x() = -sinlat * sinlon;quat.y() = sinlat * coslon;quat.z() = coslat * sinlon;return quat;}
7、从n系到e系转换四元数得到经纬度
static Vector3d blh(const Quaterniond &qne, double height) {return {-2 * atan(qne.y() / qne.w()) - M_PI * 0.5, 2 * atan2(qne.z(), qne.w()), height};}
8、地理坐标转地心地固坐标
/* 大地坐标(纬度、经度和高程)转地心地固坐标 */static Vector3d blh2ecef(const Vector3d &blh) {double coslat, sinlat, coslon, sinlon;double rnh, rn;coslat = cos(blh[0]);sinlat = sin(blh[0]);coslon = cos(blh[1]);sinlon = sin(blh[1]);rn = RN(blh[0]);rnh = rn + blh[2];return {rnh * coslat * coslon, rnh * coslat * sinlon, (rnh - rn * WGS84_E1) * sinlat};}
9、地心地固坐标系转地理坐标
tatic Vector3d ecef2blh(const Vector3d &ecef) {double p = sqrt(ecef[0] * ecef[0] + ecef[1] * ecef[1]);double rn;double lat, lon;double h = 0, h2;// 初始状态lat = atan(ecef[2] / (p * (1.0 - WGS84_E1)));lon = 2.0 * atan2(ecef[1], ecef[0] + p);do {h2 = h;rn = RN(lat);h = p / cos(lat) - rn;lat = atan(ecef[2] / (p * (1.0 - WGS84_E1 * rn / (rn + h))));} while (fabs(h - h2) > 1.0e-4);return {lat, lon, h};}
这里有许多公式,知乎上有一位北大遥感的大佬对此部分做过详细的总结。
10、n系相对位置转地理坐标相对位置、地理坐标相对位置转n系相对位置
/* n系相对位置转大地坐标相对位置 */static Matrix3d DRi(const Vector3d &blh) {Matrix3d dri = Matrix3d::Zero();Eigen::Vector2d rmn = meridianPrimeVerticalRadius(blh[0]);dri(0, 0) = 1.0 / (rmn[0] + blh[2]);dri(1, 1) = 1.0 / ((rmn[1] + blh[2]) * cos(blh[0]));dri(2, 2) = -1;return dri;}/* 大地坐标相对位置转n系相对位置 */static Matrix3d DR(const Vector3d &blh) {Matrix3d dr = Matrix3d::Zero();Eigen::Vector2d rmn = meridianPrimeVerticalRadius(blh[0]);dr(0, 0) = rmn[0] + blh[2];dr(1, 1) = (rmn[1] + blh[2]) * cos(blh[0]);dr(2, 2) = -1;return dr;}
11、地球自转角速度投影到e系
/* 地球自转角速度投影到e系 */static Vector3d iewe() {return {0, 0, WGS84_WIE};}
12、地球自转角速度投影到n系
/* 地球自转角速度投影到n系 */static Vector3d iewn(double lat) {return {WGS84_WIE * cos(lat), 0, -WGS84_WIE * sin(lat)};}static Vector3d iewn(const Vector3d &origin, const Vector3d &local) {Vector3d global = local2global(origin, local);return iewn(global[0]);}
13、n系相对于e系转动角速度投影到n系
/* n系相对于e系转动角速度投影到n系 */static Vector3d enwn(const Eigen::Vector2d &rmn, const Vector3d &blh, const Vector3d &vel) {return {vel[1] / (rmn[1] + blh[2]), -vel[0] / (rmn[0] + blh[2]), -vel[1] * tan(blh[0]) / (rmn[1] + blh[2])};}static Vector3d enwn(const Vector3d &origin, const Vector3d &local, const Vector3d &vel) {Vector3d global = local2global(origin, local);Eigen::Vector2d rmn = meridianPrimeVerticalRadius(global[0]);return enwn(rmn, global, vel);}
感谢武汉大学卫星导航定位技术研究中心多源智能导航实验室(i2Nav)牛小骥教授团队开源的KF-GINS软件平台。
GNSS-INS组合导航:KF-GINS(二)相关推荐
- GNSS/INS组合导航实习面试
GNSS/INS组合导航面试 美团无人机.云创智行.阿里达摩院.图森蔚来组合导航.来牟创新. 腾讯地图出行事业部.百度地图 持续更新 文章目录 GNSS/INS组合导航面试 1.GNSS方面的问题 模 ...
- 关于GNSS/INS组合导航开源软件GINav
GINav 理论资料 参考<GNSS/INS组合导航软件开发> <组合导航从入门到精通>--1 绪论 <组合导航从入门到精通>--2 高精度GNSS定位模型 < ...
- GNSS/INS 组合导航(一):定位技术分类与介绍
一.文档学习连接 https://download.csdn.net/download/yongjinfeiba/10761520 一. 定位技术分类 1.1 基于相对测量的定位(航位推算) (1)轮 ...
- GNSS/INS组合导航(八):INS/GPS组合导航
INS/GPS组合导航 对比INS与GPS导航方法,二者都有其各自的优缺点. 惯性导航系统INS是一种全自主的导航系统,可以输出超过200Hz的高频信号,并且具有较高的短期测量精度.除了提供位置与速度 ...
- GNSS/INS组合导航笔记
文章目录 问题1:不可交换误差 问题2:划桨运动 问题3:关于卡尔曼滤波器效果判断(INS/GPS) 问题4:失准角理解 问题5:关于feedback反馈矫正 问题6:组合导航精度结果主要依赖于GNS ...
- GNSS/INS组合导航(七):卡尔曼滤波
Kalman滤波 导航系统的精度受到 惯性传感器初始化以及算法的误差影响.低成本MEMS传感器由于严重的随机误差,INS输出可能迅速漂移.因此低精度的IMU基本上不能作为导航独立传感器进行使用. 在之 ...
- GNSS/INS组合导航(1)-- 姿态矩阵
对于开始接触惯性导航的人来说,姿态矩阵是必经之路.我在开始学习惯导的过程中,只是用姿态矩阵,但没具体去研究其对应欧拉角旋转方式,最近把自己绕晕了,所以推导完后记录一下自己对欧拉角与旋转矩阵理解,重点针 ...
- GNSS/INS组合导航学习-GINAV(一)
从今天开始整理一下,最近半年学习的组合导航算法 目前开源程序 1.严老师PSINS工具箱 (MATLAB--卡尔曼滤波算法) 2.GINAV (MATLAB--卡尔曼滤波算法 ) 3.KF-GINS ...
- GNSS/INS组合导航(四):惯性导航系统
可以结合下面连接看: https://blog.csdn.net/hltt3838/category_10500565.html 惯性导航理论依据: 牛顿第一定律(在不受外力作用下,物体将保持静止或匀 ...
- GNSS/INS组合导航(三):GPS全球定位系统
全球定位系统(GPS)由美国国防部在20世纪70年代开发.GPS的定位基础是24颗卫星组成的网络.每颗卫星发送一个包含伪随机噪声(PRN)码与导航信息的无线电信号.接收机通过PRN码获得无线电信号的传 ...
最新文章
- AutoFac Ioc依赖注入容器
- IOS开发调用系统相机和打开闪光灯
- Linux(内核和用户态的)动态内存管理
- 移动开发需要知道的像素知识『多图』
- ansible笔记汇总
- linux中python编译器的配置_PyCharm配置虚拟编译环境(windows/linux通用版)
- linux服务器运维基础学习
- asp空间和php空间_两个最新空间及回顾100Mphp及数个asp免费空间放
- 百度图片搜索搜出大量色情图片,原因不明
- 前端静态服务踩坑实践
- GVM-11 centos8 源码安装指南(OpenVas)
- 走在路上能被识别人脸,该为高科技而喜还是为隐私而忧?
- (二)卷积神经网络之——AlexNet
- 人体的矢状面,冠状面,以及水平面,你懂吗?
- ONEROOT获得Bithumb大股东BXA战略投资,成为区块链行业准独角兽
- 【找不到SQL Server ODBC 驱动程序的安装例程】的解决
- es java 模糊查询_java使用elasticsearch进行模糊查询-已在项目中实际应用
- 用matplotlib绘制十字星光标
- 微信小程序:数据存储、传值、取值
- 赶紧收藏!考博英语听力中常见的俚语分析
热门文章
- 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败
- PTA 2021年秋-MOOC-编程练习
- c语言的源程序翻译成机器语言的目标,计算机基础知识2.3 源程序是如何被翻译成目标程序的?.ppt...
- 智能手机之硬件开发知识篇一
- 阿里云免费Https证书申请使用
- Web安全之SSRF漏洞
- android 在相对布局水平居中显示,Android手机开发 使用线性布局和相对布局实现Button垂直水平居中...
- 修复ubuntu引导
- 下行法求最小割集案例_机械产品典型失效分析案例
- 【Java】Java 开发手册以及规范