ArduPilot开源飞控之AP_InertialNav
ArduPilot开源飞控之AP_InertialNav
- 1. 源由
- 2. 调用关系
- 3. 重要例程
- 3.1 read_inertia
- 3.2 update
- 4. 封装接口
- 4.1 get_filter_status
- 4.2 get_position_neu_cm
- 4.3 get_position_xy_cm
- 4.4 get_position_z_up_cm
- 4.5 get_velocity_neu_cms
- 4.6 get_velocity_xy_cms
- 4.7 get_speed_xy_cms
- 4.8 get_velocity_z_up_cms
- 5. 参考资料
1. 源由
AP_InternationalNav类是NavEKF的封装,提供关于导航相关的信息:
- 坐标位置
- 相对位置
- 运动速度
- 导航状态
2. 调用关系
状态更新函数调用嵌套关系。
FAST_TASK(read_inertia)└──> Copter::read_inertia└──> AP_InertialNav::update
3. 重要例程
3.1 read_inertia
- current_loc.lat
- current_loc.lng
- current_loc.alt
Copter::read_inertia││ // inertial altitude estimates. Use barometer climb rate during high vibrations├──> inertial_nav.update(vibration_check.high_vibes);││ // pull position from ahrs├──> Location loc;├──> ahrs.get_location(loc);├──> current_loc.lat = loc.lat;├──> current_loc.lng = loc.lng;││ // exit immediately if we do not have an altitude estimate├──> <!inertial_nav.get_filter_status().flags.vert_pos>│ └──> return;││ // current_loc.alt is alt-above-home, converted from inertial nav's alt-above-ekf-origin├──> const int32_t alt_above_origin_cm = inertial_nav.get_position_z_up_cm();├──> current_loc.set_alt_cm(alt_above_origin_cm, Location::AltFrame::ABOVE_ORIGIN);└──> <!ahrs.home_is_set() || !current_loc.change_alt_frame(Location::AltFrame::ABOVE_HOME)>│ // if home has not been set yet we treat alt-above-origin as alt-above-home└──> current_loc.set_alt_cm(alt_above_origin_cm, Location::AltFrame::ABOVE_HOME);
3.2 update
- _relpos_cm
- _velocity_cm
AP_InertialNav::update││ // get the NE position relative to the local earth frame origin├──> Vector2f posNE;├──> <_ahrs_ekf.get_relative_position_NE_origin(posNE)>│ ├──> _relpos_cm.x = posNE.x * 100; // convert from m to cm│ └──> _relpos_cm.y = posNE.y * 100; // convert from m to cm││ // get the D position relative to the local earth frame origin├──> float posD;├──> <_ahrs_ekf.get_relative_position_D_origin(posD)>│ └──> _relpos_cm.z = - posD * 100; // convert from m in NED to cm in NEU││ // get the velocity relative to the local earth frame├──> Vector3f velNED;└──> <_ahrs_ekf.get_velocity_NED(velNED)>│ // during high vibration events use vertical position change├──> <high_vibes>│ ├──> float rate_z;│ └──> <_ahrs_ekf.get_vert_pos_rate_D(rate_z)>│ └──> velNED.z = rate_z;├──> _velocity_cm = velNED * 100; // convert to cm/s└──> _velocity_cm.z = -_velocity_cm.z; // convert from NED to NEU
4. 封装接口
4.1 get_filter_status
/*** get_filter_status : returns filter status as a series of flags*/
nav_filter_status AP_InertialNav::get_filter_status() const
{nav_filter_status status;_ahrs_ekf.get_filter_status(status);return status;
}union nav_filter_status {struct {bool attitude : 1; // 0 - true if attitude estimate is validbool horiz_vel : 1; // 1 - true if horizontal velocity estimate is validbool vert_vel : 1; // 2 - true if the vertical velocity estimate is validbool horiz_pos_rel : 1; // 3 - true if the relative horizontal position estimate is validbool horiz_pos_abs : 1; // 4 - true if the absolute horizontal position estimate is validbool vert_pos : 1; // 5 - true if the vertical position estimate is validbool terrain_alt : 1; // 6 - true if the terrain height estimate is validbool const_pos_mode : 1; // 7 - true if we are in const position modebool pred_horiz_pos_rel : 1; // 8 - true if filter expects it can produce a good relative horizontal position estimate - used before takeoffbool pred_horiz_pos_abs : 1; // 9 - true if filter expects it can produce a good absolute horizontal position estimate - used before takeoffbool takeoff_detected : 1; // 10 - true if optical flow takeoff has been detectedbool takeoff : 1; // 11 - true if filter is compensating for baro errors during takeoffbool touchdown : 1; // 12 - true if filter is compensating for baro errors during touchdownbool using_gps : 1; // 13 - true if we are using GPS positionbool gps_glitching : 1; // 14 - true if GPS glitching is affecting navigation accuracybool gps_quality_good : 1; // 15 - true if we can use GPS for navigationbool initalized : 1; // 16 - true if the EKF has ever been healthybool rejecting_airspeed : 1; // 17 - true if we are rejecting airspeed databool dead_reckoning : 1; // 18 - true if we are dead reckoning (e.g. no position or velocity source)} flags;uint32_t value;
};
4.2 get_position_neu_cm
/*** get_position_neu_cm - returns the current position relative to the EKF origin in cm.** @return*/
const Vector3f &AP_InertialNav::get_position_neu_cm(void) const
{return _relpos_cm;
}
4.3 get_position_xy_cm
/*** get_position_xy_cm - returns the current x-y position relative to the EKF origin in cm.** @return*/
const Vector2f &AP_InertialNav::get_position_xy_cm() const
{return _relpos_cm.xy();
}
4.4 get_position_z_up_cm
/*** get_position_z_up_cm - returns the current z position relative to the EKF origin, frame z-axis up, in cm.* @return*/
float AP_InertialNav::get_position_z_up_cm() const
{return _relpos_cm.z;
}
4.5 get_velocity_neu_cms
/*** get_velocity_neu_cms - returns the current velocity in cm/s** @return velocity vector:* .x : latitude velocity in cm/s* .y : longitude velocity in cm/s* .z : vertical velocity in cm/s*/
const Vector3f &AP_InertialNav::get_velocity_neu_cms() const
{return _velocity_cm;
}
4.6 get_velocity_xy_cms
/*** get_velocity_xy_cms - returns the current x-y velocity relative to the EKF origin in cm.** @return*/
const Vector2f &AP_InertialNav::get_velocity_xy_cms() const
{return _velocity_cm.xy();
}
4.7 get_speed_xy_cms
/*** get_speed_xy_cms - returns the current horizontal speed in cm/s** @returns the current horizontal speed in cm/s*/
float AP_InertialNav::get_speed_xy_cms() const
{return _velocity_cm.xy().length();
}
4.8 get_velocity_z_up_cms
/*** get_velocity_z_up_cms - returns the current z-axis velocity, frame z-axis up, in cm/s** @return z-axis velocity, frame z-axis up, in cm/s*/
float AP_InertialNav::get_velocity_z_up_cms() const
{return _velocity_cm.z;
}
5. 参考资料
【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计
相关文章:
ArduPilot开源飞控之AP_InertialNav
ArduPilot开源飞控之AP_InertialNav 1. 源由2. 调用关系3. 重要例程3.1 read_inertia3.2 update 4. 封装接口4.1 get_filter_status4.2 get_position_neu_cm4.3 get_position_xy_cm4.4 get_position_z_up_cm4.5 get_velocity_neu_cms4.6 get_velocity_xy_cms4.7 get_speed_xy_c…...
DataX工具部署与使用(PostgreSQL to Oracle)
目录: 一、准备环境(1)安装JDK(2)检查Python版本(3)DataX 解压及测试 二、同步测试1、配置清单2、操作示例(1)同步测试环境(2)准备测试表…...
【PyTorch2 之027】在 PyTorch 中的R-CNN、Fast R-CNN和 Faster R-CNN
一、说明 亮点:对象检测是计算机视觉中最重要的任务之一。在这篇文章中,我们将概述最有影响力的对象检测算法家族之一:R-CNN、Fast R-CNN 和 Faster R-CNN。我们将重点介绍它们中的每一个的主要新颖性和改进。 最后,我们将专注于 …...
C++学习——C++函数的编译、成员函数的调用、this指针详解
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 从博文的分析中可以看出,对象的内存中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 stu 的类型为 Student,也不知道它…...
Pulsar Manager和dashboard部署和启用认证
Pulsar Manager部署和启用认证 官方地址: https://pulsar.apache.org/docs/zh-CN/next/administration-pulsar-manager/ Pulsar Manager 是一个网页式可视化管理与监测工具,支持多环境下的动态配置。可用于管理和监测租户、命名空间、topic、订阅、broker、集群等…...
K8S环境搭建
K8S环境搭建 前置条件 部署3台VM,一台作为master,两台作为slave需要保障vm之间网络是互通的 为vm安装docker # 安装/更新 yum-utils yum install -y yum-utils#添加阿里镜像稳定版仓库 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce…...
常用的软件项目管理工具一览
软件项目管理工具是帮助团队成功管理和完成软件开发项目的软件程序和应用程序。根据项目及其规模和复杂性,可以使用各种各样的这些工具来协助完成任务,从任务跟踪和调度,到项目报告,到版本控制和协作。 项目经理对软件项目的整体成…...
关于网络协议的若干问题(五)
1、DH 算法会因为传输随机数被破解吗? 答:DH 算法的交换材料要分公钥部分和私钥部分,公钥部分和其他非对称加密一样,都是可以传输的,所以对于安全性是没有影响的,而且传输材料远比传输原始的公钥更加安全。…...
TensorFlow入门(十七、神经元的拟合原理)
深度学习的概念源于人工神经网络的研究,神经网络是由多个神经元组成,。一个神经元由以下几个关键知识点组成: ①激活函数 ②损失函数 ③梯度下降 单个神经元的网络模型如图所示 用计算公式表达如下: z为输出的结果,x为输入,w为权重,b为偏置值。z…...
VSCODE配置C和C++
VSCode 运行 C/C 怎么配置? - 忆梦怀思的回答 - 知乎 https://www.zhihu.com/question/577315418/answer/3232537840 这个很好用,简单明白。 其中最后我的只配置了tasks.json就成功了。...
位于同一子网下的ip在子网掩码配置错误的情况下如何进行通信(wireshrak抓包分析)
前言 最近看书发现个问题,正好想学习下wireshark的使用,于是抓包做了下实验。 问题是这样的,假设有服务器A和服务器B,正确配置下两者处于同一子网;此时B的网络配置正确,而A在配置子网掩码时出了错ÿ…...
Dockerfile镜像实战
目录 1、构建SSH镜像 2、Systemctl镜像 3、nginx镜像 4、tomcat 镜像 5、mysql镜像 1、构建SSH镜像 cd /opt/sshd vim Dockerfile #第一行必须指明基于的基础镜像 FROM centos:7 #作者信息 MAINTAINER this is ssh image <hmj> #镜像的操作指令 RUN yum -y update R…...
企业如何选择安全又稳定的文件传输协议
企业无论是内部的数据共享,还是与外部的合作交流,都需要通过网络进行文件的传输和交换。然而,文件传输它涉及到多方面的因素,例如文件的大小、数量、类型、敏感性、传输距离、网络环境等。这些因素都会影响到文件传输的各个方面&a…...
Linux Kernel 4.13 RC6发布:正式版9月3日发布
美国当地时间上周末,大神Linus Torvalds发布了Linux Kernel 4.13内核的又一候选版本。上周发布的RC5版本更新幅度也要比上上周的RC4要小,Linus Torvalds表示本周发布的RC6版本属于常规更新,在过去一周的开发过程中并没有出现任何意外。RC6版本…...
C++学习——C++中const的新花样
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 关于C语言中const的用法,见《C语言const的用法详解》。 一、C中const的新花样 在C语言中,const用来限制一个变量,表示这个变量不能被修改…...
【Linux环境搭建】五、Linux(CentOS7)编译源码安装Subversion
Subversion(简称为SVN)是一种版本控制系统,能够管理和跟踪项目开发中的代码变化。Subversion最初由CollabNet公司开发,现已成为Apache软件基金会的顶级项目之一。 Subversion使用一个中央仓库来存储所有项目文件和历史记录。开发人…...
微信小程序入门讲解【超详细】
一. 微信小程序简介 1.1 什么是小程序 2017年度百度百科十大热词之一 微信小程序(wei xin xiao cheng xu),简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用( 张小龙对其的定义是无需安装…...
AtCoder ABC239G 最小割集
题意 传送门 AtCoder ABC239G Builder Takahashi 题解 将原图中每个节点拆为入点 v v v 与出点 v ′ v v′,对于原图任一边 ( u , v ) (u,v) (u,v) 则 u ′ → v , v → u u\rightarrow v, v\rightarrow u u′→v,v→u 连一条容量为 ∞ \infty ∞ 的边&…...
Simple RPC - 01 框架原理及总体架构初探
文章目录 概述RPC 框架是怎么调用远程服务的?客户端侧的逻辑服务端侧的逻辑完整流程 客户端是如何找到服务端地址的呢?核心:NamingService跨语言的RPC实现原理 RPC 框架的总体结构对外接口服务注册中心如何使用业务服务接口客户端服务端 模块…...
VScode运行C/C++
VScode运行C/C VScode的安装这里不讲 一、mingw64的下载 二、VS code打开文件夹与创建C文件 ----------------这一步给萌新看,有C和VScode的基础可跳过---------------- 1.创建一个文件夹 2.vscode打开刚刚创建的文件夹 3.新建文件,在输入文件名1.c后…...
动态窗口法避障的5个调参陷阱:用Python可视化分析成本函数权重影响
动态窗口法避障的5个调参陷阱:用Python可视化分析成本函数权重影响 在智能移动机器人开发中,动态窗口法(Dynamic Window Approach, DWA)因其计算高效和实时性强的特点,成为主流的局部路径规划算法之一。但许多开发者在实际调参过程中常遇到机…...
如何快速追溯微博图片来源:Chrome插件终极指南
如何快速追溯微博图片来源:Chrome插件终极指南 【免费下载链接】WeiboImageReverse Chrome 插件,反查微博图片po主 项目地址: https://gitcode.com/gh_mirrors/we/WeiboImageReverse 你是否在微博上看到一张有趣的图片,却不知道它来自…...
数据安全首选:Clawdbot+Qwen3:32B私有化AI平台部署全解析
数据安全首选:ClawdbotQwen3:32B私有化AI平台部署全解析 1. 为什么选择私有化AI平台 在金融、医疗、法律等对数据安全要求严格的行业,企业常常面临两难选择:既希望使用大语言模型提升效率,又担心敏感数据通过公有云API泄露。传统…...
OFA-VE部署教程:WSL2环境下Windows平台OFA-VE完整安装指南
OFA-VE部署教程:WSL2环境下Windows平台OFA-VE完整安装指南 1. 为什么要在WSL2上部署OFA-VE? 你是不是也遇到过这样的问题:想在Windows上跑一个需要CUDA加速的多模态AI系统,但又不想折腾双系统,也不愿忍受虚拟机的性能…...
**向量数据库实战:用 Python 实现高效语义搜索与多模态检索系统**在现代AI 应用中,**语义理解能力**已经
向量数据库实战:用 Python 实现高效语义搜索与多模态检索系统 在现代 AI 应用中,语义理解能力已经成为核心竞争力之一。传统的关键词匹配方式已经无法满足复杂场景下的查询需求,比如电商商品推荐、智能客服问答、文档相似度分析等。这时候&a…...
Java 虚拟机垃圾回收机制详解
Java虚拟机垃圾回收机制详解 在Java开发中,垃圾回收(Garbage Collection, GC)是自动管理内存的核心机制,它让开发者无需手动释放内存,有效避免了内存泄漏和悬垂指针等问题。理解JVM的垃圾回收机制,不仅有助…...
3步搞定微信聊天记录完整备份:WeChatExporter终极免费解决方案
3步搞定微信聊天记录完整备份:WeChatExporter终极免费解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 微信聊天记录中保存着珍贵的记忆和重要的工作沟…...
【笔试真题】- 团子-2026.04.11-研发岗
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 团子-2026.04.11-研发岗 这套 4 月 11 日的美团研发岗整体不算偏难,但题型切得很开。第一题是典型热身,第二题开始考你能不能把局部约束整理成可执行的构造,…...
嵌入式按钮事件处理库:多类型去抖与状态机驱动设计
1. 项目概述 r89m Buttons 是一个面向嵌入式系统的轻量级、可移植按钮事件处理库,专为统一管理多种物理形态与电气特性的按钮输入而设计。其核心目标并非仅实现“按下/释放”电平检测,而是构建一套 事件驱动的抽象层 ,将底层硬件差异&…...
CafeIOT嵌入式云连接库:轻量级二进制协议栈设计与ESP32实践
1. 项目概述CafeIOT 是一个面向嵌入式物联网终端的轻量级云连接库,专为 ESP32(及兼容 ESP8266)平台设计,实现设备与 CafeIOT 云平台之间的可靠、低开销 TCP/IP 级通信。尽管其 README 中仅提及 “Esp8266”,但实际工程…...
