当前位置: 首页 > news >正文

OB_GINS_day3

这里写目录标题

  • 实现当前状态初始化
  • 实现预积分的初始化
  • 由于此时preintegration_options 是3(也就是考虑odo以及earth rotation)
  • 为预积分的容器添加需要积分的IMU积分因子
  • 接下来是添加新的IMU到preintegration中

实现当前状态初始化

这个state_curr的主要功能是初始化GNSS现在时刻的状态参数
在这里插入图片描述

实现预积分的初始化

在这里插入图片描述

由于此时preintegration_options 是3(也就是考虑odo以及earth rotation)

这里值的注意的问题在于:此时emplace_back的类是基于PreintegrationEarthOdo的类,所以在下面这个函数中,返回的preintegration最终是PreintegrationEarthOdo类型的变量
在这里插入图片描述注意:这里需要调用PreintegrationEarthOdo的类默认构造函数
这个默认构造函数

  1. 首先将初始的状态进行重置
    resetState(current_state_, NUM_STATE);//NUM_STATE = 19;此处不明白pn_代表什么
    在这里插入图片描述函数iewn实现的主要功能是:地球自转角速度在n系上的投影
    其中Earth::iewn()函数——是将基站的坐标(初始状态,以及在当地坐标中的位置)在局部坐标系转换成全局坐标系
    在这里插入图片描述将大地坐标系(BLH)转换为ECEF地心地固坐标系,
    然后将地心地固坐标系ECEF0转换为导航坐标系CNE0(实现地心地固坐标系到导航系的转换)

在这里插入图片描述
这里导航系(n系——>e系)的转换矩阵
在这里插入图片描述
在这里插入图片描述
所以在OB_GINS中选取北东地坐标系为导航系

在这里插入图片描述
当前位置的local pos信息转换为在ECEF坐标系中的位置信息

Vector3d ecef1 = ecef0 + cn0e * local;

将在当地坐标系的位置信息转换到ECEF地心地固坐标系后,在转换成大地坐标系中

Vector3d blh1  = ecef2blh(ecef1);

下段代码的大致含义:

iewn_skew_ = Rotation::skewSymmetric(iewn_);
//这段代码目的是求出地球自转角速度的反对陈矩阵static Matrix3d skewSymmetric(const Vector3d &vector) {Matrix3d mat;mat << 0, -vector(2), vector(1), vector(2), 0, -vector(0), -vector(1), vector(0), 0;return mat;}

设置噪声矩阵

最终获得了global的全局坐标系
在这里插入图片描述

为预积分的容器添加需要积分的IMU积分因子

此时的back()是取出preintegrationlist的最后一个元素,然后向这个元素中加入NewImu
这个最后一个元素的类型是:std::shared_ptr
preintegrationlist的类型是PreintegrationBase类型
在这里插入图片描述

接下来是添加新的IMU到preintegration中

在这里插入图片描述
此时值得注意的问题在于:integrationrocess是一个重写的函数
在这里插入图片描述
最终执行的是PreintegrationEarthOdo——因为之前的preintegration返回的类型是PreintegrationEarthOdo类型的变量
在这里插入图片描述
这里需要明确——返回的类型是基类而非派生类,但是返回的变量的类型(preintegration)要定义为派生类类型

static std::shared_ptr<PreintegrationBase>  creatPreintegration(const std::shared_ptr<IntegrationParameters> &parameters, const IMU &imu0,  const IntegrationState &state, PreintegrationOptions options)
{if (options == PREINTEGRATION_EARTH_ODO) {//最终执行这个if条件语句preintegration = std::make_shared<PreintegrationEarthOdo>(parameters, imu0, state);}return preintegration;
}

这里先进行偏差补偿

void PreintegrationEarthOdo::integrationProcess(unsigned long index) {IMU imu_pre = compensationBias(imu_buffer_[index - 1]);IMU imu_cur = compensationBias(imu_buffer_[index]);// 区间时间累积double dt = imu_cur.dt;delta_time_ += dt;end_time_           = imu_cur.time;current_state_.time = imu_cur.time;// 连续状态积分, 先位置速度再姿态// 位置速度Vector3d dvfb = imu_cur.dvel + 0.5 * imu_cur.dtheta.cross(imu_cur.dvel) +1.0 / 12.0 * (imu_pre.dtheta.cross(imu_cur.dvel) + imu_pre.dvel.cross(imu_cur.dtheta));// 哥氏项和重力项Vector3d dv_cor_g = (gravity_ - 2.0 * iewn_.cross(current_state_.v)) * dt;// 地球自转补偿项, 省去了enwn项Vector3d dnn    = -iewn_ * dt;Quaterniond qnn = Rotation::rotvec2quaternion(dnn);Vector3d dvel =0.5 * (Matrix3d::Identity() + qnn.toRotationMatrix()) * current_state_.q.toRotationMatrix() * dvfb + dv_cor_g;// 前后历元平均速度计算位置current_state_.p += dt * current_state_.v + 0.5 * dt * dvel;current_state_.v += dvel;// 缓存IMU时刻位置, 时间间隔为两个历元的间隔pn_.emplace_back(std::make_pair(dt, current_state_.p));// 姿态Vector3d dtheta = imu_cur.dtheta + 1.0 / 12.0 * imu_pre.dtheta.cross(imu_cur.dtheta);current_state_.q = qnn * current_state_.q * Rotation::rotvec2quaternion(dtheta);current_state_.q.normalize();// 预积分// 中间时刻的地球自转等效旋转矢量dnn           = -(delta_time_ - 0.5 * dt) * iewn_;Matrix3d cbbe = (q0_.inverse() * Rotation::rotvec2quaternion(dnn) * q0_ * delta_state_.q).toRotationMatrix();// 里程增量//相比于earth 多了里程增量Vector3d dsodo = Vector3d(imu_cur.odovel, 0, 0);delta_state_.s += cbbe * (cvb_ * dsodo * (1 + delta_state_.sodo) -Rotation::rotvec2quaternion(imu_cur.dtheta).toRotationMatrix() * lodo_ + lodo_);// 前后历元平均速度计算位置dvel = cbbe * dvfb;delta_state_.p += dt * delta_state_.v + 0.5 * dt * dvel;delta_state_.v += dvel;// 姿态delta_state_.q *= Rotation::rotvec2quaternion(dtheta);delta_state_.q.normalize();// 更新系统状态雅克比和协方差矩阵updateJacobianAndCovariance(imu_pre, imu_cur);
}

在这里插入图片描述

相关文章:

OB_GINS_day3

这里写目录标题 实现当前状态初始化实现预积分的初始化由于此时preintegration_options 是3&#xff08;也就是考虑odo以及earth rotation&#xff09;为预积分的容器添加需要积分的IMU积分因子接下来是添加新的IMU到preintegration中 实现当前状态初始化 这个state_curr的主要…...

【Python3】【力扣题】405. 数字转换为十六进制数

【力扣题】题目描述&#xff1a; 题意理解&#xff1a;&#xff08;不允许使用库函数&#xff09; 数字等于0&#xff0c;则结果为0&#xff0c; 数字小于0&#xff0c;则补码运算&#xff0c;即最高位&#xff08;32位&#xff09;为1&#xff0c;其余全部取反&#xff0c;再加…...

记录一次企业外部通过ssh 连接数据库的事DBeaver

情况大概是这样&#xff0c;公司算法供应商开通了连接某个服务器A的权限&#xff0c;但是数据库x是在另一台服务器B上。 直接通过外部连接数据库是不行的&#xff0c;需要借用服务器A来进行访问x 使用软件&#xff1a;DBeaver, 数据库x类型&#xff1a;oracle 需要的信息&am…...

中聚企服:中聚AI女娲大模型,企业难题迎刃而解!

在这个瞬息万变的商业世界里&#xff0c;企业面临的挑战愈发复杂多样。小到日常文书和规章制度&#xff0c;大到工商财税和知识产权保护&#xff0c;每一个环节都至关重要。为了帮助中小企业在激烈的市场竞争中脱颖而出&#xff0c;中聚企服在官方小程序重磅上线了一款革命性产…...

对镜像精简

dive工具&#xff0c;用来优化镜像大小 ENV命令合并 ENV DEBUG_PORT8777 \HTTP_PORT12080 \PROGRAM_FILE_HOME_UPORTAL_CONF/home/zenap/uportal/confWORKDIR usr/src/app&#xff0c;会切换到这个目录 使用COPY --chown 修改属主&#xff0c;不要使用RUN chown 容器内非root…...

老电脑不能装纯净版windows

手上有一台2016年的老笔记本电脑&#xff0c;用了8年&#xff0c;基本上能换的都换了一遍&#xff0c;散热风扇换了&#xff0c;键盘换了&#xff0c;屏幕换了&#xff0c;扬声器也换了&#xff0c;内存也换大了&#xff0c;甚至都换过固态硬盘&#xff0c;但是CPU没法换&#…...

在Python中实现一个简单的社交媒体应用

在Python中实现一个简单的社交媒体应用 社交媒体应用是现代互联网的重要组成部分,允许用户分享信息、交流和互动。在这篇博文中,我们将使用Python构建一个简单的社交媒体应用,涵盖用户注册、发布动态、评论和查看动态等基本功能。我们将使用Flask框架作为后端,SQLite作为数…...

pytest高版本兼容test_data[“log“] = _handle_ansi(“\n“.join(logs))错误

一、问题现象&#xff1a; 执行seleniumpytest结束时报: INTERNALERROR> File "D:\workspace\pytestframe\.venv\Lib\site-packages\pytest_html\report_data.py", line 141, in add_test INTERNALERROR> test_data["log"] _handle_ansi(&q…...

Redis技术入门与实践指南

一、Redis基础知识 1、概念 Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database)&#xff0c;是一个非关系型数据库&#xff0c;redis 提供将内存通过网络远程共享的一种服务&#xff0c;提供类似功能的 还有memcached&#xff0…...

如何一键完成20个Oracle实例运维脚本部署

在日常的运维工作中&#xff0c;常常是一个人需要管理维护数个数十个数据库实例&#xff0c;如果是开源类集群如mysql&#xff0c;PG等可能更多&#xff1b;在没有商业的集中管理平台的情况下&#xff0c;如何快速的部署监控或者运维脚本&#xff0c;是一个值得探讨的问题&…...

【C++刷题】力扣-#598-区间加法 II

题目描述 给你一个 m x n 的矩阵 M和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大整数的个数 。 示…...

优雅的LUA数据记录方法-serpent序列化+LUA Table

目录 简述如何集成&#xff1f;如何使用序列化 反序列化 参考 简述 项目里需要使用LUA脚本将数据记录到文件&#xff0c;要方便的增加、查找、删除&#xff0c;要方便的加载与存回。 使用序列化/反序列化 lua table可以很容易实现这些功能。 序列化将table转换为字符串 反序列…...

初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…...

Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216)

0x01 产品简介 Apache Solr是一个开源的搜索平台,基于流行的Apache Lucene库构建。它提供了一个强大的全文搜索功能,能够快速处理大量数据,并支持复杂的搜索操作。并且是一个独立的企业级搜索应用服务器,它采用Java开发,并基于Apache Lucene实现。Solr提供了类似于Web-Se…...

C#整合Ollama实现本地LLMs调用

前言 近两年AIGC发展的非常迅速&#xff0c;从刚开始的只有ChatGPT到现在的很百家争鸣。从开始的大参数模型&#xff0c;再到后来的小参数模型&#xff0c;从一开始单一的文本模型到现在的多模态模型等等。随着一起进步的不仅仅是模型的多样化&#xff0c;还有模型的使用方式。…...

C++基于opencv的视频质量检测--图像抖动检测

文章目录 0.引言1. 原始代码分析2. 优化方案3. 优化后的代码4. 代码详细解读 0.引言 视频质量图像抖动检测已在C基于opencv4的视频质量检测中有所介绍&#xff0c;本文将详细介绍其优化版本。 1. 原始代码分析 首先&#xff0c;我们来看图像抖动检测的原始代码&#xff1a; …...

Cuda By Example - 11 (Texture Memory 2-D)

跟1D一样&#xff0c;2D的代码也没有运行过。旧的方法看看就好。 声明二维Texture texture<float, 2> texConstSrc; texture<float, 2> texIn; texture<float, 2> texOut; 访问二维Texture 使用2D的Texture的便利性体现在blend_kernel函数里。不再需要通…...

Go匿名结构体使用场景

1. 定义 在 Go 语言中&#xff0c;匿名结构体&#xff08;Anonymous Struct&#xff09;是一种没有显式命名的结构体类型。你可以直接在代码中定义并使用匿名结构体&#xff0c;而不需要为其定义一个单独的类型名称。匿名结构体通常用于临时数据结构或一次性使用的场景。 匿名…...

Vue 发布十年了!你知道我这十年是怎么过的吗?

2014 年 2 月 3 日&#xff0c;Vue 在 Hacker News 上首次亮相。十年后的今天&#xff0c;Vue 已经成为使用最广泛的前端框架之一&#xff0c;拥有了一个非常丰富的生态系统。本文来梳理一下 Vue.js 十年以来的重要里程碑&#xff01; 尤雨溪&#xff0c;无疑是 Vue.js 背后的灵…...

Unity 6 来袭

这里写自定义目录标题 1.提升渲染性能1.1 降低CPU开销 Lower CPU overhead1.2.减少内存带宽1.3.高档低分辨率帧2.多人游戏创作3.扩大多平台覆盖范围3.1.增进Android平台开发4.使用Runtime AI解锁各种可能性4.1.Unity Muse4.2.Unity Sentis5.实现更具吸引力的视觉效果5.1.自适应…...

身份治理技术:从手动到AI的变革,实现Linux的ssh免密登录实操保姆级教程。

身份治理技术的演进历程 身份治理技术&#xff08;Identity Governance&#xff09;是企业IT架构中确保用户身份、权限和访问控制合规性的核心组件。从早期的手动管理到现代的智能自动化&#xff0c;其演进历程反映了安全需求和技术能力的双重驱动。 早期阶段&#xff1a;手动管…...

造相-Z-Image-Turbo亚洲LoRA WebUI教程:多分辨率适配(768x1024/1024x1024)

造相-Z-Image-Turbo亚洲LoRA WebUI教程&#xff1a;多分辨率适配&#xff08;768x1024/1024x1024&#xff09; 提示&#xff1a;本文介绍的镜像已预装所有依赖和环境&#xff0c;开箱即用&#xff0c;无需手动配置 1. 开篇&#xff1a;为什么需要这个工具&#xff1f; 如果你正…...

手把手玩转三相SPWM逆变器

三相电压型SPWM逆变器控制设计及应用&#xff08;原理图工程源代码工 10067-三相电压型SPWM逆变器控制设计及应用&#xff08;原理图工程源代码工程仿真工程详细说明书PPT&#xff09; 随着国家电网的发展&#xff0c;国明对于电网的使用要求越来越高&#xff0c;并且家家户户均…...

LLM 是怎么学习的?训练过程大揭秘

系列&#xff1a;大语言模型原理科普&#xff08;5 篇&#xff09; 本篇&#xff1a;第 2 篇 难度&#xff1a;⭐⭐ 零基础 浅显技术 字数&#xff1a;约 9000 字 阅读时间&#xff1a;20 分钟&#x1f4d6; 开篇&#xff1a;LLM 不是生来就懂 想象一下&#xff0c;你刚出生的…...

OpenClaw压力测试:Qwen3-32B在RTX4090D上的连续任务稳定性

OpenClaw压力测试&#xff1a;Qwen3-32B在RTX4090D上的连续任务稳定性 1. 测试背景与目标 上周在本地部署了OpenClaw对接Qwen3-32B模型后&#xff0c;我遇到了一个现实问题&#xff1a;当连续执行复杂任务链时&#xff0c;系统会在运行2-3小时后突然崩溃。作为需要724小时运行…...

避坑指南:当你的回归系数突然变号或不显著时,可能是多重共线性在捣鬼

回归模型中的多重共线性&#xff1a;从异常现象到实战解决方案 当你在分析电商用户行为数据时&#xff0c;突然发现"用户浏览时长"这个变量的回归系数从正变负&#xff0c;或者上周还显著的"促销活动参与次数"这周P值却变得不显著了——别急着怀疑人生&…...

Matlab Simulink四分之一主动悬架:PID与模糊PID控制器在车身加速度上的对比研究

项目&#xff1a;Matlab Simulink四分之一主动悬架&#xff0c;针对车身加速度的PID和模糊Pid控制器对比 详情&#xff1a;根据汽车的半主动悬架系统&#xff0c;通过Simulink建立二自由度1/4车辆简化模型以及路面激励模型&#xff0c;以车身垂直加速度为控制对象&#xff0c;悬…...

程序员必看:代码注释规范与重构实战指南

1. 程序员入职第一天的震撼教育那天早上九点整&#xff0c;我刷完门禁卡走进新公司的办公区&#xff0c;工位上已经摆好了全新的MacBook Pro和一台4K显示器。行政小姐姐热情地带着我走完入职流程后&#xff0c;我迫不及待地打开代码仓库&#xff0c;准备熟悉项目。就在我点开核…...

深入解析LM2675电源管理芯片内部架构与设计原理

1. 芯片内部电路设计概述作为一名从业十年的芯片设计工程师&#xff0c;我经常遇到同行对芯片内部结构一知半解的情况。很多人拿到新芯片后直接翻到Datasheet的应用电路部分&#xff0c;按推荐设计搭建外围电路就完事。这种做法虽然能快速实现功能&#xff0c;却错失了深入理解…...

国内大模型托管平台推荐:四大平台选型指南

随着大模型技术加速落地&#xff0c;模型托管平台已成为开发者不可或缺的基础设施。本文梳理了2025年国内主流的四大大模型托管平台&#xff0c;从核心优势、适用场景到选型建议&#xff0c;为你提供一份实用的选型指南。一、模力方舟&#xff1a;国产开源生态的“基石”推荐指…...