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

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容