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

相关文章

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.