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

来源:互联网 发布:抢票软件成网络黄牛 编辑:程序博客网 时间:2024/05/20 23:21

        四旋翼调试阶段总会出现很多难以预见的现象,这时为了找到所出问题的原因,就需要获得原始相关数据进行分析,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卡中的超声波数据,红色为测量的距离值,绿色为超声波返回的状态信息。


原创粉丝点击