前言

在使用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 {#endifuint64_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//源代码文件列表SRCSmy_example.cDEPENDS)

添加好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源码解读,找到一些志同道合的朋友,可以一起讨论交流进步
此外,我目前在做空中作业机器人,希望可以有大佬指导指导,目前在无人机下加了四自由度的舵机机械臂,但无法进行力矩反馈,打算换电机机械臂,有推荐吗

px4代码解析(3)相关推荐

  1. PX4代码解析(5)

    一.前言 我所讨论的PX4代码是基于v1.11版本,该版本与之前的版本有不少不同,其中一个比较大的区别在于新版本大部分用到了C++中模板,使得代码没有以前那么容易理解,因此我在后面介绍PX4的姿态估计 ...

  2. PX4代码解析(6)

    一.前言 上一节介绍了PX4姿态估计调用函数的流程,这一节分享一下我对PX4姿态解算的解读.首先,要理解PX4姿态解算的程序,要先从传感器的特性入手,这里主要介绍的传感器有加速度计,磁力计,陀螺仪. ...

  3. PX4代码解析(1)

    前言 做pixhawk飞控有一段时间了,但在学习过程中遇到许多困难,目前网上找不到比较完整的PX4学习笔记,我打算结合自己理解,写写自己对PX4源码的理解,不一定对,只是希望与各位大佬交流交流,同时梳 ...

  4. PX4代码解析(4)

    一.引言 PX4程序是基于实时操作系统(Real-time operating system, RTOS)的上层应用程序,PX4飞控程序的很多重要模块都是在Nuttx操作系统的调度下运行的.因此,想要 ...

  5. PX4代码解析(2)

    前言 在大致了解PX4代码架构后,我们需要了解PX4的通信机制.在PX4代码架构中,每通信总线主要分为两个部分,一是内部通信总线uORB,即PX4内部进程通信采用的协议,例如PX4内部姿态控制需要获取 ...

  6. PX4代码解析:振动分析

    本篇文章首发于公众号:无人机系统技术.更多无人机技术相关文章请关注此公众号 一.前言 前面的文章主要都是一些理论知识为主,很多读者朋友看了之后可能会有点枯燥,里面很多公式看起来也比较晦涩,今天起给大家 ...

  7. px4代码jlink调试

    之前看了许多介绍px4环境搭建的文章有介绍windows下eclipse和ubuntu下eclipse阅读px4源码的文章,但是没有看到对px4进行代码调试的文章,后来查看px官网发现可以通过visu ...

  8. PX4代码学习系列博客(6)——offboard模式位置控制代码分析(之前转载过,这是第二次转载了)

    我刚刚发现这篇文章去年八月份的时候转载过一次了 https://blog.csdn.net/sinat_16643223/article/details/107874349 转载自:https://b ...

  9. matrix_multiply代码解析

    matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...

最新文章

  1. oftp-2协议服务器,科普:Oasis自研通信协议与互联网分层架构
  2. Tree Operations 打印出有向图中的环
  3. 设计模式六大原则之白话讲解
  4. 《图解CSS3:核心技术与案例实战》——1.1节什么是CSS3
  5. Lightoj 1123 - Trail Maintenance(最小增量生成树)
  6. 社交大佬们的数据“大”在哪里?
  7. 判断页面打开的浏览器信息
  8. rose-scanning reading
  9. 用R演示逻辑回归过程-值得收藏
  10. Oracle和MySQL语法区别
  11. pinphp3.0后台系统权限管理的bug
  12. 一、二层交换机构建局域网
  13. 编译一个.cpp文件的过程
  14. java ppt转图片 失真_Apache POI将PPT转换成图片实例代码
  15. 用树莓派实现宽带多次拨号,带宽叠加
  16. idea关闭html校验,怎么样关闭IntelliJ IDEA的javascript提示
  17. 库克说他在上大学时学会了编程,你呢?
  18. nodemcu(esp8266)u8g2 oled显示汉字获取网络时间
  19. 面试技巧---白话文
  20. 世界战争英雄服务器怎么修改,世界战争-英雄 修改版

热门文章

  1. C#转C++的一点分享
  2. Android基础教程之-------Android中两种设置全屏的方法!!!
  3. C#ADO.NET操作数据代码汇总
  4. 计算机控制台win10,寻找win10电脑的控制面板工具
  5. centos6.5卸载和安装mysql_Linux CentOS 6.5 卸载、tar安装MySQL的教程
  6. java数值加法null得到什么,fastjson 处理null值,对象为null时返回{},数字为null返回[]...
  7. app测试-兼容性测试与云测试技术
  8. 2018-6-19bash编程之循环
  9. perl中替换文本一例
  10. HDU——2768 Cat vs. Dog