前言
在使用PX4飞控时,我们难免要对其进行二次开发,例如修改控制算法,添加新的传感器,这时需要在代码中定义属于自己的消息。本节主要分享一下如何在PX4代码中添加自己的消息
一、消息添加与配置
从代码解析(1)中,我们了解到PX4主要的消息都放在PX4项目下的msg目录中,因此,我们添加自己的消息也需要在msg文件夹下操作
打开msg文件夹,在其中新建一个以.msg结尾的文件,如图,我建立了一个mylove.msg文件
打开文件,在其中定义两个变量,a,b,并定义一个时间戳timestamp(否则编译不通过)
在msg文件夹下找到cmakelist.txt文件,打开在其中添加mylove.msg
对代码重新编译,在终端输入make px4_sitl_default
编译完成,在PX4项目下会生成build文件,该文件中会存放关于编译后生成的可执行文件和编译中间文件,打开build,会看到我们编译生成的px4_sitl_default的文件夹
在该文件夹下打开msg文件夹,会在其中看到tmp文件夹,该文件夹会存放定义的消息生成的.h文件与.cpp文件
进入header文件夹,你会找到mylove.h文件,这就是我们定义消息产生的文件
打开mylove.h文件,我们会看到
#pragma once
#include <uORB/uORB.h>
#ifndef __cplusplus
#endif
#ifdef __cplusplus
struct __EXPORT mylove_s {
#else
struct mylove_s {
#endif
uint64_t timestamp;
float a;
float b;
#ifdef __cplusplus
#endif
};
系统在文件中帮我们自动定义了以s结尾的消息结构体,这个结构体在我们使用消息时会使用到。这点在上一讲中讲解px4_simple_app代码时有所体现,在代码中他使用了vehicle_attitude_s与sensor_combined_s两种消息结构体,用来存放消息数据,并通过uorb发送与接收。
消息定义与配置完成,接下来我将用一个简单的例子来演示如何使用自己的消息并在PX4编写自己的代码
二、PX4添加并运行自己程序
在代码解析(1)中,我们曾说过,PX4有关飞机的代码全部存在src目录下,因此添加自己的代码也需要在src目录下添加。进入src/example,在其中建立一个my_example的文件夹
在my_example文件夹下建立两个文件,my_example.c与CMakeList.txt
在my_example.c中添加下列代码
#include "stdio.h"
#include <px4_platform_common/log.h>//PX4_INFO所在头文件
#include <uORB/uORB.h>//uorb相关文件夹
#include <uORB/topics/mylove.h>//消息所在头文件
#include <string.h>//meset头文件
//把主函数声明为全局,方便调用
//px4中主函数的命名规则,以_main表示主函数
__EXPORT int my_example_main(int argc, char *argv[]);
//主函数实现
int my_example_main(int argc, char *argv[])
{
//使用之前自定义消息生成的结构体
struct mylove_s love;
//为结构体分配空间
memset(&love, 0, sizeof(love));
//向系统公布本程序要分布mylove消息
//公布主题成功则返回一个指针
//公布主题失败则返回NULL空指针
orb_advert_t love_pub = orb_advertise(ORB_ID(mylove), &love);
if (love_pub != NULL)
{//表明公布成功,侧面证明我们定义消息可用
PX4_INFO("success!");
}
else
{//公布失败
PX4_INFO("faild!");
}
return 0;
}
CMakeList.txt代码中存放相关配置,代码内容如下
px4_add_module(//添加一个模块
//examples代表我们的代码在src/examples文件夹下
//examples后面有两条_,代表存放在examples文件夹下
//my_examples是模块名称
MODULE examples__my_example
//主函数名称
MAIN my_example
//源代码文件列表
SRCS
my_example.c
DEPENDS
)
添加好my_example模块后,我们需要将其加入到编译目录中,例如我编译的是px4_sitl_default,则在boards下找到px4目录,进入px4找到sitl(软件在环,为没有硬件的兄弟准备)
进入sitl,找到default.cmake文件,在EXAMPLES下添加my_example
添加完成后在PX4目录下打开终端,进行编译make px4_sitl_default jmavsim
jmavsim是PX4的一种仿真器
编译完成后在终端输入help,可以看到PX4代码中可以运行的模块名称,你会在其中找到my_example模块
输入my_example,结果如下
返回success证明实验成功
后记
自己写代码解析一方面是巩固自己所学,另一方面希望分享自己对PX4源码解读,找到一些志同道合的朋友,可以一起讨论交流进步
此外,我目前在做空中作业机器人,希望可以有大佬指导指导,目前在无人机下加了四自由度的舵机机械臂,但无法进行力矩反馈,打算换电机机械臂,有推荐吗