PIXHAWK添加自定义消息存储到SD卡

2024-08-22 10:18

本文主要是介绍PIXHAWK添加自定义消息存储到SD卡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        四旋翼调试阶段总会出现很多难以预见的现象,这时为了找到所出问题的原因,就需要获得原始相关数据进行分析,pixhawk代码提供了记录飞行日志的功能,能够将飞行中的重要数据存入SD卡中,并有相应的软件画出曲线分析数据。

         目前pixhawk官方开发指导网站上介绍的是Logging功能的用法,没有提到sdlog2,而代码中默认启动的是sdlog2这个应用,所以添加新的日志需要按照sdlog2的方式添加,通过阅读源码尝试,总结出添加新的日志数据的步骤如下:

1.     定义要记录的数据结构体

在src/modules/sdlog2目录下找到sdlog2_messages.h头文件,仿照文件中其他数据结构体的写法,添加自己的结构体。如:

#define LOG_ALT_MSG 62

struct log_ALT_s

{

       floatdistance;

       boolstatus;

};

其中数字代表标号,按顺序排即可;结构体中变量个数按照自己需求添加,不一定要和某个uorb主题内的变量完全相同。

2.     将新定义日志结构添加到消息列表中

同样在上一步的文件中进行操作。在文件末尾找到log_formats数组,仿照格式添加上一步定义的结构体。如:

LOG_FORMAT(ALT, ”fB” , ”Alt , state” ),

其中ALT,Alt,state均为读取日志曲线时对应曲线的标号。

fB代表结构体中数据的类型,对应关系如下图

                         

3.     定义日志数据缓冲区及日志变量

在src/modules/sdlog2目录下找到sdlog2.c文件,在buf联合体的末尾(约1186行)中新增所订阅某个主题的数据。如订阅超声波数据:

struct sonar_distance_s sonar;

缓冲变量用于存储某个主题的所有数据,因此要在此文件的起始位置包含所订阅主题的头文件。

在sdlog.2文件中body结构体的末尾(约1233行)新增待记录数据的变量。如:

struct log_ALT_s log_SONAR;

这个变量用于保存所要写入SD卡的数据。

在sdlog.2文件中subs结构体的末尾(约1296行)新增对所记录主题的订阅,并在结构体外赋初值。如:

int sonar_sub;

subs.sonar_sub = -1;

实现对超声波数据的订阅以及赋值。

4.     新数据转移

这一步将某个主题更新后的数据保存到自定义的数据结构体中。在sdlog.2文件末尾(如2290左右空白处)仿照其他主题的方式增加代码:

if(copy_if_updated(ORB_ID(sonar_distance),&subs.sonar_sub, &buf.sonar))

{

       log_msg.msg_type=LOG_ALT_MSG;

       log_msg.body.log_SONAR.distance=buf.sonar.distance[0]/100.0f;

       log_msg.body.log_SONAR.status=buf.sonar.status[0];

       LOGBUFFER_WRITE_AND_COUNT(ALT);

}

这段代码将缓冲区中所保存的更新后的某主题的数据转移到自定义结构体中用于写入SD卡,可以选择性的保存需要的数据,因此正如第1步所说,自定义数据结构体内的变量个数并不一定如所订阅主题一样,依自己需求而定,可以是主题内的部分变量。

下图为存入SD卡中的超声波数据,红色为测量的距离值,绿色为超声波返回的状态信息。


这篇关于PIXHAWK添加自定义消息存储到SD卡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095986

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1