PX4飞控学习与开发(七)-Pixhawk源码中的功能模块分析

2023-05-16

本篇博客主要介绍Firmware固件中各功能模块的基本结构。

功能模块的编译

从上篇博客内容中的demo我们可以发现,如果我们需要给Pixhawk模块新增一个功能模块,一般的做法是新建一个文件夹,所有这个功能模块需要处理的事情均在该文件夹下完成。这个文件夹的结构大致如下:

example
   |--example.c/example.cpp/example.hpp/example.hpp
   |--CMakeLists.txt
   |--....

其中 example.c/example.cpp/example.hpp/..等是实现具体功能的程序文件,CMakeLists.txt 可以视为编译文件列表。以上已是新增功能模块的最低要求。为了能添加一些可以在地面站修改的参数,往往还会增加params.c文件,即基本结构变为:

example
|--example.c/example.cpp/example.hpp/example.hpp
|--CMakeLists.txt
|--params.c
|--....

当一个功能模块里面还包含一些子功能模块的时候,也可以嵌套文件夹放入文件子功能模块文件,以 drivers层下的 gps模块为例,它的结构如下:

gps
|-- >device
|-- >src
|--ashtech.cpp/ashtch.h/mtk.cpp/mtk.h/....
|--CMakeLists.txt
|--gps.cpp
|--params.c
|--definitions.h

它包含了一个 device文件夹,而该文件夹下又包含了一个 src文件夹,之后才是代码文件。从文件夹的命名也可以推测出,可实现 gps定位功能的设备不限于一种,src文件夹就是用于收录这些可实现卫星定位功能设备的驱动文件,实际实现时,可根据具体设备连接情况调用相应的文件执行。现在我们需要关注的是系统如何能编译到这些代码。

通过demo文件 ,我们知道,系统能够编译到新建的代码是因为 CMakeLists.txt文件中的:

...
SRCS
my_example_app.c
...

据此,我们也可以推测,只要我们新建的 xx.c文件或 xx.cpp文件能够在 CMakeLists.txt中出现即可让系统找到并编译。我们可以打开 gps下的 CMakelists.txt文件验证我们的猜想,发现果然有如下内容:

...
SRCS
gps.cpp
devices/src/gps_helper.cpp
devices/src/mtk.cpp
devices/src/ashtech.cpp
devices/src/ubx.cpp
devices/src/uwb.cpp
...

其中 devices/src/..是文件目录。由此,我们可以再次重申下我们的推测:

  • 新建的.cpp或.c等源文件必须在CMakeLists.txt里申明。

对于头文件,源文件调用时,只需在文件开始的地方包含该头文件:#inlude "xxx.h"#include "xx.hpp"即可。

功能模块的入口函数

demo 实际上是独立运行的,就是说它不需要被别的文件调用,它有自己主文件。这也 Nuttx系统的工作特点之一,可以并行处理多进程任务。每一个进程有且仅有一个主文件 (xx.c 或.cpp) 和若干个附属文件(也可以没有)。例如,demo中的主文件就是

my_example_app.c

主文件中必须有一个入口函数,也就是进程开始执行的地方。入口函数要先用 __EXPORT申明,然后再定义。以 demo为例,其申明和定义的格式为:

...
__EXPORT int my_example_app_main(int argc, char *argv[]);//入口函数申明格式
...
int my_example_app_main(int argc, char *argv[])
//入口函数定义格式
{
...
}
....

argc是 argument count 的缩写,表示传入 main函数的参数个数;argv是 argument vector 的缩写,*argv[]表示传入入口函数的命令和参数序列,并且第一个参数argv[0] 一定是命令的名称。以 gps进程的启动命令为例:
gps start
则有,argc=2, *argv[0]="gps",*agrv[1]="start"

功能模块的基本结构

Pixhawk 中任何一个功能模块(如位置控制、姿态控制、各个传感器驱动模块等)或者说一个进程工作基本模式如下图所示:
在这里插入图片描述


图1 模块基本工作模式

下面以一个示例来分析如何实现图中功能模块的工作模式。

例1: 利用 Pixhawk 飞控和控制台实现加法功能,即控制台输入 加数 a和 被加数 b, 然后
飞控计算后,再返回结果到控制台。

为了能将该任务依照图2.6给定的方式完成,程序应当具备以下特点:

  • 一共包含五个指令:进程启动指令、进程停止指令、进程状态指令、进程帮助指令以及用户操作指令。
  • 用户操作指令的格式为: my_example_app test -a num1 -b num2,其中 my_example_app是指令的名称, -a num1 -b num2均是指令参数。如一个正常命令为:
my_example_app test -a 100 -b 2
  • 指令输入后,应当反馈计算的结果到控制台,然后系统继续等待新的指令, 比如上面 100 加 2 的例子,应返回:
The result is: 102
  • 启动指令为:my_example_app start, 输入后,若当前已启动,返回信息:"Task is already running, now is waiting for data to my_example_app"; 若当前未启动,则启动状态设为 true,并返回信息:"Task start successful!"
  • 停止指令为:my_example_app stop, 输入后,启动状态转化为 false。
  • 状态指令为:my_example_app status,输入后,若当前未启动,返回信息:"Task is is not running, please start first"; 若当前已启动,则返回信息 Task is already running, now is waiting for data to my_example_app!
  • 帮助指令为:my_example_app help,输入后,返回以下信息:
This is my_example_app module, using for addition opreation. You can use the following command:
my_example_app start //---- start the module
my_example_app stop //---- stop the module
my_example_app status
my_example_app help
//---- show the current state of the module
//---- show what you can do in this module
my_example_app test -a num1 -b num2
//----caculate your data,
there is a limit that "a<=10000 and a>=-10000", and ’b’ has the same limitation.
  • 当指令不符合规范时,返回信息:
command is not right, please check if it is one of the following command
:
my_example_app start //---- start the module
my_example_app stop //---- stop the module
my_example_app status
my_example_app help
//---- show the current state of the module
//---- show what you can do in this module
my_example_app test -a num1 -b num2
//----
caculate your data, there is a limit that "a<=10000 and a>=-10000", and ’b’ has the same limitation.
  • 当输入数据超范围时,返回警告信息 “Your data is beyond the limitation

实现: 考虑到源码中主要是用 C++ 进行编程,这里我们将 demo 用的 .c文件改为 .cpp文件,从而文件中需要创建一个类,我们创建如下:

#include <px4_posix.h>//包含了打印信息函数:PX4_INFO
#include <px4_defines.h>//含有OK等定义
#include <px4_getopt.h>//用于解析指令
#include <stdlib.h>//基本函数库,如字符串转浮点数据的函数: atof
#include <string.h>//用于字符串处理

extern "C" __EXPORT int my_example_app_main(int argc, char *argv[]);

class AddtionCall
{
public:
  /**
   * Constructor
   */
   AddtionCall();//构造函数

  /**
   * Destructor, also kills task.
   */
    ~AddtionCall();//析构函数

  int    start();
  int    stop();
  void   status();
  void   help();
  void   my_example_app(int argc, char *argv[]);

private:
  float   _num1 ;//加数
  float   _num2;//被加数
  float   _result ;//结果
  bool    _status; //状态标志
};     

如此,我们定义了一个名为Addtioncall的类,里面包含了需要实现各个指令的公有函数,和用于运算与状态标记的变量。

C++中类的成员(即类里面定义的函数、变量等)可分类三种:public、protected、private;public 表明该数据成员、成员函数是对所有用户(类对象)开放的,所有用户都可以直接进行调用;private 表示私有,私有的意思就是除了 class 自己的成员(如类里的各种函数)可以使用之外,任何类对象都不可以直接使用;protected对于继承和友元类来说,就是 public 的,可以自由使用,没有任何限制,而对于其他的外部class,protected 就变成 private。

类函数具体的实现可参考C++相关资料, 这里主要以加法运算函数为例:

void AddtionCall::my_example_app(int argc, char *argv[])
{
  bool error_flag=false;
  int myoptind = 1;
  int ch;
  const char *myoptarg = nullptr;

  while ((ch = PX4_getopt(argc, argv, "a:b:", &myoptind, &myoptarg)) != EOF){
    switch (ch) {
    case 'a':
      _num1= atof(myoptarg);
      break;

    case 'b':
      _num2 = atof(myoptarg);
      break;
    default:
      PX4_WARN("unrecognized flag");
      error_flag = true;
      break;
    }
  }

  if (error_flag){
      ;
  }
  else{
      if (_num1<=10000&&_num1>=-10000&&_num2<=10000&&_num2>=-10000){
          _result=_num1+_num2;
          PX4_INFO("The result is: %f",(double)_result);
      }
      else{
        PX4_WARN("Your data is beyond the limitation!");
      }     
  }
  
}

该段函数比较关键的是对指令参数的提取,主要利用了头文件 #include<px4_getopt.h>中的

int PX4_getopt(int argc, char *argv[], const char *options, int *myoptind,
const char **myoptarg)

函数来解析指令。如我们想传入某一个参数值,那么必须以-cmd_name cmd_value(指令名称和参数值,参数值有时候也可以没有)的形式传入,其中符号"-" 标识其后是一个指令名,这有利于函数PX4_getopt在其字符串参数 *options中对指令进行检索,如上述函数参数中:

*options="a:b:"//这里的冒号”:“表示指令后有参数值,需要提取到*myoptarg中,若没有冒号,表示该指令后不带参数值

而我们输入的命令是

my_example_app test -a num1 -b num2

那么函数PX4_getopt根据符号"-"检测到指令 ab并对照 *options, 发现确实有指令 a和 b,然后根据冒号提取后面的参数值 num1num2,我们最后用 atof函数将提取到的参数值转换为浮点型数据。

最后,我们打开 QGC 地面站的控制台,输入指令测试,得到我们期望的测试结果如下图所示。
在这里插入图片描述


图3 控制台运算结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4飞控学习与开发(七)-Pixhawk源码中的功能模块分析 的相关文章

  • PX4位置控制offboard模式说明

    offboard模式的开发及应用 一 px4固件的模式 px4固件支持10几种飞行模式 xff0c 从代码结构上分析 xff0c 分为基本模式 自定义模式和自定义子模式 1 基本模式 基本模式又分为 xff0c 位置控制模式 自稳模式 手动
  • [pixhawk笔记]2-飞行模式

    本文翻译自px4官方开发文档 xff1a https dev px4 io en concept flight modes html xff0c 有不对之处 xff0c 敬请指正 pixhawk的飞行模式如下 xff1a MANUAL xf
  • 关于PX4中的高度若干问题

    飞行的高度是如何测量的 xff1f 地面的高度和海平面的高度差别很大 xff0c 飞控又是如何有效判别进行降落的 xff1f 这是我脑子里的疑问 搜索的一圈发现很少有人讨论这方面的问题 xff0c 于是本次我就直接看一下源代码 xff0c
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • APM与Pixhawk间的关系

    1 APM 本文APM指代 xff1a https github com ArduPilot ardupilot 2 Pixhawk 本文Pixhawk指代 xff1a https github com PX4 Firmware 3 关系
  • Pixhawk串口名称与硬件接口对应关系

    Pixhawk提供的串口较多 xff0c 通过ls dev 可以看到有如下7个tty设备 xff1a ttyACM0 ttyS0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5 ttyS6 但每个串口名称对应到Pixhawk硬件
  • win7下 pixhawk (ardupilot) 的编译

    前几天都在搞pixhawk源码编译问题 xff0c 什么在window下用Console或者eclipse xff0c 还是在Ubuntu下 xff0c 都做了 xff0c 而且把 mk文件都看了 xff0c 结果还是有bug 总结一下三种
  • 我设计了一款开源飞控,性能远超Pixhawk,运行APM固件-怒飞垂云

    从2009年到现在 xff0c 我从事无人机研发将近11年了 xff0c 中途设计过很多飞控 xff0c 有闭源的无人飞艇飞控 大型固定翼无人机飞控 xff0c 也有在开源飞控Pixhawk基础上修改的飞控 xff0c 如今 xff0c 基
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之二十六:BatteryStatus模块

    PX4模块设计之二十六 xff1a BatteryStatus模块 1 BatteryStatus模块简介2 模块入口函数2 1 主入口battery status main2 2 自定义子命令custom command 3 Batter
  • PX4模块设计之三十:Hysteresis类

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • 自己组装Pixhawk F450无人机的一些细节

    首先参考文档为 xff1a 1 https mp weixin qq com s VXKU kIB v i0AX3zgtLig 2 https mp weixin qq com s Qzzl dQ6Tz2pXNp7Oj0lTg 3 http
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • 步骤八:PX4使用cartographer与move_base进行自主建图导航

    首先老样子硬件如下 飞控 HOLYBRO PIXHAWK V4 PX4 机载电脑 jetson nano b01 激光雷达 思岚a2 前提 你已经完成了cartographer建图部分 能够正常输出map话题 前言 由于要参加中国机器人大赛
  • 无人机PX4使用动捕系统mocap的位置实现控制+MAVROS

    动捕系统Optitrack xff0c 有很高的定位精度 xff0c 能够给无人机提供比较精确的位置信息 xff0c 因此如果实验室有条件 xff0c 都可以买一套动捕系统 动捕系统的原理 xff1a 光学式动作捕捉依靠一整套精密而复杂的光
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 很久没有进行系统的总结了 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 如内容有错误 欢迎指出 1 飞控软件的基本模块 无人机能够飞行主要是依靠传感
  • mission planner SITL仿真系统配置

    背景 主要参考ArduPilot的官网 作者还拥有个人公众号 会写一些感悟文章 知圈 二维码如下 欢迎扫描关注 关注后有作者微信 欢迎添加交流 链路图 图源 Cygwin 下载 去官网下载Cygwin 作者电脑windows 10 64位

随机推荐

  • Linux(Ubuntu系统)安装unzip

    最近在阿里云服务器上下载了zip形式的数据集压缩包 xff0c 解压时却发现并没有unzip解压命令 xff0c 于是习惯性地pip install unzip xff0c 并不能成功 xff0c 网上很多方法都说运行 sudo apt g
  • Python问题&解决

    python pycharm小技巧 1 要学会使用Debug pycharm Debug使用 Debug记得打断点 xff01 Pycharm debug技巧 在debug的时候python console可以直接敲变量显示 在安装Pych
  • Linux系统安装ClamAV的详细步骤

    ClamAV是一款开源免费的杀毒软件 xff0c 它可以在Linux系统上运行 以下是在Linux系统上安装ClamAV的步骤 xff1a 打开终端并更新软件包列表 xff1a sudo apt update 安装ClamAV xff1a
  • 为什么 0.1 + 0.2 不等于0.3?如何解决这个问题?

    一 开头 我们都知道0 1 43 0 2 61 61 0 3 xff0c 而是0 30000000000000004 xff0c 那么是为什么 xff1f 我们都知道计算机在内部实现中使用的是二进制 xff0c 0 1也是不例外的 xff0
  • 前端手写(十八)——Promise并行限制

    一 写在前面 一般我们做多个异步请求 xff0c 此时我们常常采用的是Promise all来进行处理 xff0c Promise all会全部的一起执行 xff0c 但是如果存在一些并行的限制 xff0c 也就是说一次最多只能执行固定的数
  • 深度学习环境安装(VMware)-Miniconda-pytorch

    提示 xff1a 最近要要跑一些算法 xff0c 用的linux系统一直是在服务器上进行开发 xff08 无GUI界面 xff09 xff0c 双系统又懒得开关机 xff0c 虚拟机还不能调用gpu xff0c 真无了个大语 对于文章中出现
  • novnc安装

    ubuntu22 04 span class token comment 安装软件 span span class token function sudo span span class token function apt span sp
  • python扫描端口

    什么是端口扫描 定义 xff1a 对一段端口或指定的端口进行扫描 目的 xff1a 通过扫描结果可以知道一台计算机上都提供了哪些服务 xff0c 然后就可以通过所提供的这些服务的己知漏洞就可进行攻击 原理 xff1a 当一个主机向远端一个服
  • HTML_移动端界面

    homework8 移动端界面 注 点击图标放大 点击图片旋转180度 ydd html span class token doctype lt DOCTYPE html gt span span class token tag span
  • Windows11安装与使用初体验

    Windows11安装 因为下载的是美国镜像 xff0c 所以系统语言是英文的 xff0c 但是这么多年的使用 xff0c 还是能够看懂一二的 xff0c 一步步操作就好了呗 xff0c 随缘点击 xff0c 无脑下一步 不知是我没有选择对
  • 基于51单片机的智能窗帘仿真方案原理图设计

    系统总体方案 xff08 附文件 xff09 通过上述对各个模块介绍 xff0c 我们最终选择了采用STC89C52作为的主控芯片 xff0c 采用光敏电阻采集环境光强通过ADC0832转换成数字信息然后由单片机处理得出环境光强的情况 xf
  • 基于RNN-LSTM模型的诗词生成/TensorFlow

    1 研究任务一介绍 1 1 研究任务 给定诗词数据集poems xff0c 采用基于循环神经网络 xff08 RNN xff09 的LSTM模型实现古诗词自动生成 xff0c 调整参数实现五言诗 七言诗 五言藏头诗 七言藏头诗和词的自动生成
  • PX4飞控学习与开发(三)-PX4+ROS开发环境搭建

    PX4开发环境搭建 主要步骤如下 xff1a 第一步 xff0c 设置用户组 在终端输入命令 xff1a sudo usermod a G dialout USER xff0c 然后登出 xff0c 重启 xff1b 第二步 xff0c P
  • PX4飞控学习与开发(五)-Pixhawk固件Firmware源码结构分析

    Pixhawk固件Firmware源码结构分析 Pixhawk源码Firmware是一个内容庞大的文件夹 xff0c 里面有许多的子文夹 xff0c 代表着不同的功能模块 文件夹结构如下图所示 xff1a 图1 Firmware源码结构 图
  • Latex的一些排版技巧

    Latex是科研论文写作的必备工具之一 xff0c 学会一些常用的排版指令有助于快速提高论文的排版质量 本篇博客的主要内容就是总结一些排版技巧 xff0c 方便后续查找使用 当然 xff0c 随着latex排版相关知识的进一步学习和使用 x
  • PX4飞控学习与开发(六)-利用 VScode 修改源码

    努力学习 xff0c 珍惜时间 xff1b 全力以赴 xff0c 创造未来 克制欲望 xff0c 摒除心魔 xff1b 心向何处 xff0c 往来圣贤 功崇惟志 xff0c 业广惟勤 xff1b 惟克果断 xff0c 乃罔后艰 面临困难 x
  • 基于VSCode软件的markdown笔记环境配置

    前期在CSDN上用markdown写了一些博客 xff0c 使用时还是觉得不太方便 xff0c 尤其是在编写公式时 xff0c 效率十分低下 但Markdown本身还是一款非常不错的笔记撰写工具 xff0c 所以一直琢磨着怎么改善其使用体验
  • Ubuntu 主机单系统 安装

    首先是安装系统 xff0c 启动盘是USB HDD模式 xff0c 其他基本和下面这篇文章一样 xff0c 除了安装时候没有Install 然后按e什么的 xff0c 应该是因为我的是20 04吧 史上最全Ubuntu18 04单系统安装教
  • 竞拍算法(Auction Algorithm)原理及工作过程分析

    这几天因一些项目工作 xff0c 需要对竞拍算法进行学习 但百度了大部分资料都未找到一篇文章对此算法有着较为深入的介绍 在一番努力之下 xff0c 终于找到了最初提出该算法的论文 xff0c 本文内容主要结合该论文对竞拍算法进行分析 竞拍算
  • PX4飞控学习与开发(七)-Pixhawk源码中的功能模块分析

    本篇博客主要介绍Firmware固件中各功能模块的基本结构 功能模块的编译 从上篇博客内容中的demo我们可以发现 xff0c 如果我们需要给Pixhawk模块新增一个功能模块 xff0c 一般的做法是新建一个文件夹 xff0c 所有这个功