【移植Ardupilot的日志记录方法到linux上】

news2024/12/22 18:58:35

移植Ardupilot的日志记录方法到linux上

  • 说明
  • 日志结构组成
  • 日志写入操作
    • 预定义日志项
    • 运行时添加日志项的方法
  • 单例测试
  • 编译方法
  • 查看数据
  • 其他

说明

采用二进制文件记录,可在mission planer查看

  1. 支持所有数据类型记录
  2. 精巧移植方便
  3. 可直接在地面站绘制曲线查看
  4. 可导出生成mat文件在matlab上分析
    提供的日志目标结构
    在这里插入图片描述

日志结构组成

  1. 日志头
  2. 日志消息类型
  3. 消息长度
  4. 日志消息名称
  5. 数据类型标识
  6. 数据标签
  7. 数据单位
  8. 数据格式
    数据结构体定义:
// 用于定义日志记录格式的结构
struct LogStructure {
    uint8_t msg_type;
    uint8_t msg_len;
    const char *name;
    const char *format;
    const char *labels;
    const char *units;
    const char *multipliers;
};

日志写入操作

预定义日志项

该日志项为预先设定好,使用时无需在进行日志名称定义。
预先设置的日志项如下:

// 日志头声明处理
const struct LogStructure log_structure[] = {

  { LOG_FORMAT_MSG, sizeof(log_Format), \
      "FMT", "BBnNZ",      "Type,Length,Name,Format,Columns", "-b---", "-----" },
  { LOG_FORMAT_UNITS_MSG, sizeof(log_Format_Units), \
      "FMTU", "QBNN",      "TimeUS,FmtType,UnitIds,MultIds","s---", "F---" },
  {
    LOG_TEST_MSG, sizeof(struct log_TEST),
    "TEST", "QH",         "TimeUS,value","S-","F-"
  },
  { LOG_MESSAGE_MSG, sizeof(log_Message), \
    "MSG",  "QZ",     "TimeUS,Message", "s-", "F-"}, 
};

其中,LOG_FORMAT_MSG与LOG_FORMAT_UNITS_MSG是必须的,这个是地面站能够正常解析日志的关键,其他为用户自定义。
预先设置的日志写入函数:

// 预先定义类型的日志记录测试函数实体
void Write_Test(uint64_t time_us, uint16_t value)
{
  struct log_TEST pkt = {
    LOG_PACKET_HEADER_INIT(LOG_TEST_MSG),
    .time_us = time_us,
    .value   = value,
  };
  WriteBlock(&pkt, sizeof(pkt));
}

uint64_t micros64()
{
    uint64_t sys_time;
    //在此处赋值系统时间戳
    //sys_time = ;
    return sys_time;
}
// 在日志中写入文本消息的函数实体
bool Write_Message(const char *message)
{
    struct log_Message pkt{
        LOG_PACKET_HEADER_INIT(LOG_MESSAGE_MSG),
        time_us : micros64(),
        msg  : {}
    };
    strncpy(pkt.msg, message, sizeof(pkt.msg));
    return WriteBlock(&pkt, sizeof(pkt));
}

运行时添加日志项的方法

很多时候想临时添加一组日志来对某些状态进行记录分析,直接进行日志结构体构造会省很多事,所以专门提供了一个进行此操作的接口。

/* Write support */
void Write_Log(const char *name, const char *labels, const char *units, const char *mults, const char *fmt, ...)
{
    va_list arg_list;

    va_start(arg_list, fmt);
    WriteV(name, labels, units, mults, fmt, arg_list);
    va_end(arg_list);
}

单例测试

主函数代码:
主要实现了日志初始化,对预先设定的日志项进行一百次的写入,之后对文本消息进行写入操作。

int main()
{
    //初始化日志
    Log_Init();

    //循环写入100次各项日志
    for(uint16_t i=0; i<100; i++){
        Write_Test(i,i);                //预先写好的日志实体测试
        Write_Log("WTS","T1,T2,T3",     //运行时添加的任意日志
            "s--","F--","HHH",
            i,i,i);

        Write_Log_test();               //写入不同数据类型的数据
    }

    //以下为消息日志记录,每次写入的字符串不能大于64字节
    Write_Message("This logging method is applicable to Linux systems");
    Write_Message("In the case of MCU system with SD card,");
    Write_Message("it is also necessary to adjust the write function");
    Write_Message("Take a closer look at the WriteBlock function");
    
    return 0;
}

编译方法

  1. 进入logts目标,创建build文件夹
mkdir build
  1. 进入build目录
cd build
  1. 运行cmake
cmake ..
  1. 编译源码
make

在这里插入图片描述
运行demo

./log

可看到在build目录下生成了log1.bin文件,该文件即为我们需要的日志文件,此时可使用地面站打开次文件查看相关内容
在这里插入图片描述

查看数据

  1. 查看常规数据
    打开mission planner地面站,选择回顾日志,打开log1.bin,选择对应的日志项勾选对应的标签即可查看数据。
    在这里插入图片描述
  2. 查看文本消息日志
    勾选Data Table,再对消息进行滤波,选择MSG日志项。
    在这里插入图片描述
    在这里插入图片描述
    文件日志也可以在该界面上右键导出csv文件。
  3. 导出成matlab文件可使用地面站的创建matlab文件 功能

其他

  1. 将本例程放入到实际系统去时还需要考虑每次开始记录时按照递进的方式对文件名曾1,否则会直接在文件尾继续写入新数据。
  2. 若在MCU上使用,则需要另外封装读写函数,主要是WriteBlock函数

资料下载链接:
https://download.csdn.net/download/qq_39016531/87720027

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

觉非科技发布:基于BEV的数据闭环融合智驾解决方案

2023年上海车展期间&#xff0c;觉非科技基于BEV的数据闭环融合智能驾驶解决方案正式发布。 该方案可通过量产车BEV的实时感知结果&#xff0c;提供完整的城市Map-lite及Map-free数据闭环融合解决方案&#xff0c;并满足城市NOA、记忆通勤/泊车以及感知大模型训练的需要。 车…

OSPF基础配置实验

目录 一、实验要求与拓扑结构 1、实验要求 2、提前规划好的网段以及拓扑结构如下图 二、实验步骤 1、给各个路由器的每个接口配ip 2、运行ospf协议并划分区域 一、实验要求与拓扑结构 1、实验要求 首先划分区域&#xff0c;蓝色区域为Area 0&#xff0c;黄色区域为Area…

MyBatis(十五)MyBatis的逆向工程

前言、 所谓的逆向工程是&#xff1a;根据数据库表逆向生成Java的pojo类&#xff0c;SqlMapper.xml文件&#xff0c;以及Mapper接口类等。 要完成这个工作&#xff0c;需要借助别人写好的逆向工程插件。 思考&#xff1a;使用这个插件的话&#xff0c;需要给这个插件配置哪些…

基于 TensorRT 使用 python 进行推理优化

文章大纲 简介TensorRT 简介构建测试的conda 环境注意事项TensorRT 安装参考文献与学习路径简介 TensorRT 简介 TensorRT是NVIDIA推出的一个高性能的深度学习推理框架,可以让深度学习模型在NVIDIA GPU上实现低延迟,高吞吐量的部署。TensorRT支持Caffe,TensorFlow,Mxnet,P…

【Python】实战:生成无关联单选问卷 csv《压疮风险评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 &#xff08;1&#xff09;创建文件 &#xff08;2&#xff09;代码示例 四、csv 文件 一、适用场景 实战场景&#xff1a; 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…

FPGA基于XDMA实现PCIE X8采集AD7606数据 提供工程源码和QT上位机程序和技术支持

1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xff0c;比起 PCI 以及更早期的计算机总线的共享并行架构&#xff0c;每个设备都有自己的专用连接&#xff0c;不需要向整个总线请求带宽&#xff0c;而且可以把数据传输率提高到一个很…

倍数+路径之谜

倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中&#xff0c;有多少个…

Java十大排序算法

排序算法 对一序列对象根据某个关键字进行排序 &#xff08;1&#xff09;稳定性 在排序中对于相等的两个元素a、b。如果排序前a在b的前边&#xff0c;排序之后a也总是在b的前边。位置不会因为排序而改变称之为稳定。反之&#xff0c;如果排序后a、b的位置可能会发生改变&am…

Java线程池从入门到精通(线程池实战)

参考 java常用线程池及它们的适用场景&#xff08;JDK1.8&#xff09; Java线程与线程池实战 线程池的拒绝策略_线程池 RejectedExecutionHandler 拒绝策略 ThreadPoolExecutor原理解析-关闭线程池 代码经验—java获取cpu个数-docker 一、概念 Java 中的线程池核心实现类是 …

鉴源论坛 · 观模丨面向界面的图形化测试技术

作者 | 熊一衡 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 版块 | 鉴源论坛 观模 01 什么是面向界面的图形化测试&#xff08;GUI Testing&#xff09; 图形用户界面(GUI) 是一种通过图形化方式呈现信息、数据、功能和操作的用户界面&#xff0c;旨在…

一起学 WebGL:三角形加上渐变色

大家好&#xff0c;我是前端西瓜哥。之前教大家绘制一个红色的三角形&#xff0c;这次我们来画个有渐变的三角形。 本文为系列文章&#xff0c;请先阅读如何绘制红色三角形的文章&#xff1a; 《一起学 WebGL&#xff1a;绘制三角形》 原来的写法&#xff0c;颜色是在片元着色器…

移动边缘计算意味着真正的5G时代已经来临

5G的承诺尚未实现&#xff0c;但现在宣布其失败还为时过早。DataBank首席执行官劳尔k马丁尼克(Raul K. Martynek)表示 &#xff0c;真正的5G正在通过移动边缘计算实现&#xff0c;而数据中心将成为其中的核心。 在美国所有主要的移动运营商都在大力宣传他们在全美范围内提供无…

STM32-移植RTT

目录 Cubemx引入RTT资源新建工程生成工程 时钟选择选单片机引脚引脚搜索快速选中取消引脚选中引脚命名IO普通模式设置 串口串口基本配置串口DMA ADC采集ADC基本应用ADC_DMA RTT-shell指令定义RTTCOM调试串口J-Link RTT调试 教程shell指令RTT外设驱动使用1--串口添加 STM32_pwm …

玩元宇宙血亏后 蓝色光标梭哈AI也挺悬

蓝色光标2022年年度报告出炉&#xff0c;巨亏21.75 亿元&#xff0c;其中20.38亿亏损因商誉、无形资产及其他资产减值造成&#xff0c;而在实际亏损业务中&#xff0c;元宇宙占比不小。 蓝色光标在元宇宙领域的布局&#xff0c;主要通过三家子公司实施&#xff0c;分别为蓝色宇…

分布式文件系统HDFS的多问多答

分布式文件系统HDFS 简述HDFS的优缺点简述HDFS的体系结构请论述HDFS中SecondaryNameNode的作用和工作原理请论述HDFS写数据原理 简述HDFS的优缺点 HDFS的优良特性&#xff1a; ①兼容廉价的硬件设备。在成百上千台廉价服务器中存储数据&#xff0c;常会出现节点失效的情况&…

从浏览器输入url到页面加载(四)协议栈和套接字以及三次握手确认对于通信的作用

前言 上一节我们说到了域名对用户记忆的优点&#xff0c;但是IP对于路由器的优点&#xff0c;所以需要有DNS服务器提供域名与IP地址的转换&#xff0c;还说到了在前端开发中dns-prefetch域名预解析的好处。 本小节呢&#xff0c;我们会说一些不常用的知识点&#xff0c;如协议…

【社区图书馆】读《悲惨世界》有感

文章目录 故事简介经典重现价值取向我的思想 故事简介 《悲惨世界》是一部充满了悲剧的小说&#xff0c;故事首先由教堂展开&#xff0c;然后主要围绕着主人公冉阿让进行一系列的生动形象的描写&#xff0c;讲述了冉阿让悲惨的一生。 主人公冉阿让是一个诚实、善良的工人&…

100天涨薪4k,从功能测试到自动化测试,我整理的3000字超全学习指南

去年6月份&#xff0c;由于经济压力让我下定决心进阶自动化测试&#xff0c;已经24的我做了3年功能测试&#xff0c;坐标广州薪资定格在8k&#xff0c;可能是生活过的太安逸&#xff0c;觉得8000的工资也够了&#xff0c;但是生活总是多变的&#xff0c;女朋友的突然怀孕&#…

SpringBoot 整合WebService详解

1. 概述 WebService服务端是以远程接口为主的&#xff0c;在Java实现的WebService技术里主要依靠CXF开发框架&#xff0c;而这个CXF开发框架可以直接将接口发布成WebService。 CXF又分为JAX-WS和JAX-RS&#xff0c;JAX-WS是基于xml协议&#xff0c;而JAX-RS是基于Restful风格&…

OCR卡证识别

文章目录 前言一、DBNet多分类二、步骤1.训练、训练模型推理、模型转换2.通过推理模型进行推理 三、解决思路1、查看模型2、tools/infer/predict_det.py修改3、utility.py修改 总结 前言 最近涉及到了身份证识别&#xff0c;为了便于匹配识别结果的属性&#xff0c;如姓名、身…