PX4 编译分析之Airframe文档生成

2023-05-16

PX4 编译分析之Airframe文档生成

本文假设已经阅读了 PX4
1 Makefile分析
2 CMakeLists.txt分析
这里要分析的是 make airframe_metadata 的指令, 在 Makefile 文件中找到 airframe_metadata 的编译配置

# Documentation
# --------------------------------------------------------------------
.PHONY: parameters_metadata airframe_metadata module_documentation px4_metadata doxygen

parameters_metadata:
    @$(MAKE) --no-print-directory px4_sitl_default metadata_parameters

airframe_metadata:
    @$(MAKE) --no-print-directory px4_sitl_default metadata_airframes

可以发现它实际执行的是make px4_sitl_default metadata_airframes , 第一选项是px4 的仿真配置选项这个会传给CMakeLists.txt 中的cmake-buildbuild/px4_sitl_default生成一些配置文件, 第二个和airframe_metadatametadata_airframe 相比只是前后两个单词互换了一下, 接下来依照我们在 Makefile分析 中的分析, 在Firmware 文件夹下的 CMakeLists.txt 中找到以下语句

add_custom_target(metadata_airframes
    COMMAND ${CMAKE_COMMAND} -E make_directory ${PX4_BINARY_DIR}/docs
    COMMAND ${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/px_process_airframes.py
        -v -a ${PX4_SOURCE_DIR}/ROMFS/px4fmu_common/init.d
        --markdown ${PX4_BINARY_DIR}/docs/airframes.md
    COMMAND ${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/px_process_airframes.py
        -v -a ${PX4_SOURCE_DIR}/ROMFS/px4fmu_common/init.d
        --xml ${PX4_BINARY_DIR}/docs/airframes.xml
    COMMENT "Generating full airframe metadata (markdown and xml)"
    USES_TERMINAL
)

由以上定义语句我们发现, 编译metadata_airframes 的主要操作是(假设当前目录为源码 Firmware 文件夹):

  1. build/px4_sitl_default 中建立输出文件夹 docs
  2. 执行 python Tools/px_process_airframes.py -v -a ROMFS/px4fmu_common/init.d --markdown build/px4_sitl_default/docs/airframes.md
  3. 执行 python Tools/px_process_airframes.py -v -a ROMFS/px4fmu_common/init.d --xml build/px4_sitl_default/docs/airframes.xml

接下来, 继续分析一下 px_process_airframes.py 程序, 摘抄如下

# PX4 airframe config processor (main executable file)
#
# This tool scans the PX4 ROMFS code for declarations of airframes
#
# Currently supported formats are:
#   * XML for the parametric UI generator
#   * Markdown for the PX4 dev guide (https://github.com/PX4/Devguide)
#
#

from __future__ import print_function
import sys 
import os
import argparse
from px4airframes import srcscanner, srcparser, xmlout, rcout, markdownout

def main():
    # Parse command line arguments
    parser = argparse.ArgumentParser(description="Process airframe documentation.")
    parser.add_argument("-a", "--airframes-path",
                        default="../ROMFS/px4fmu_common",
                        metavar="PATH",
                        help="path to source files to scan for parameters")
    parser.add_argument("-x", "--xml",
                        nargs='?',
                        const="airframes.xml",
                        metavar="FILENAME",
                        help="Create XML file"
                             " (default FILENAME: airframes.xml)")
    parser.add_argument("-m", "--markdown",
                        nargs='?',
                        const="airframes.md",
                        metavar="FILENAME",
                        help="Create Markdown file"
                             " (default FILENAME: airframes.md)")
    default_image_path = '../../assets/airframes/types'
    parser.add_argument("-i", "--image-path",
                        default=default_image_path,
                        metavar="IMAGEPATH",
                        help="HTML image path for Markdown (containing the airframe svg files)"
                             " (default IMAGEPATH: "+default_image_path+")")
     parser.add_argument("-s", "--start-script",
                        nargs='?',
                        const="rc.autostart",
                        metavar="FILENAME",
                        help="Create start script file")
    parser.add_argument("-b", "--board",
                         nargs='?',
                         const="",
                         metavar="BOARD",
                         help="Board to create airframes xml for")
    parser.add_argument('-v', '--verbose', action='store_true', help="verbose output")
    args = parser.parse_args()

    # Check for valid command
    if not (args.xml) and not (args.start_script) and not args.markdown:
        print("Error: You need to specify at least one output method!\n")
        parser.print_usage()
        sys.exit(1)

    # Initialize source scanner and parser
    scanner = srcscanner.SourceScanner()
    parser = srcparser.SourceParser()

    # Scan directories, and parse the files
    if args.verbose: print("Scanning source path " + args.airframes_path)
    if not scanner.ScanDir(args.airframes_path, parser):
        sys.exit(1)
    # We can't validate yet
    # if not parser.Validate():
    #     sys.exit(1)
    param_groups = parser.GetParamGroups()

    # Output to XML file
    if args.xml:
        if args.verbose: print("Creating XML file " + args.xml)
        out = xmlout.XMLOutput(param_groups, args.board)
        out.Save(args.xml)

    # Output to markdown file
    if args.markdown:
        if args.verbose: print("Creating markdown file " + args.markdown)
        out = markdownout.MarkdownTablesOutput(param_groups, args.board, args.image_path)
        out.Save(args.markdown)

    if args.start_script:
        if args.verbose: print("Creating start script " + args.start_script)
        out = rcout.RCOutput(param_groups, args.board)
        out.Save(args.start_script)

    if (args.verbose): print("All done!")

if __name__ == "__main__":
    main()

可以看到这里只是一个入口函数, 解析了一些用户选项, 然后通过srcscannersrcparser 解析了 -a 选项给定的路径里的.hil 文件或者无扩展名的文件进行解析,这里摘录一个ROMFS/px4fmu_common/init.d/airframes/1001_rc_quad_x.hil 文件如下

#!/bin/sh
#
# @name HIL Quadcopter X
#
# @type Simulation
# @class Copter
#
# @maintainer Lorenz Meier <lorenz@px4.io>
#

sh /etc/init.d/rc.mc_defaults

set MIXER quad_x
set PWM_OUT 1234

if [ $AUTOCNF = yes ]
then
        param set COM_DISARM_LAND 5
fi

param set SYS_HITL 1

这里基于上面 .hil 文件我们分析一下Tools/px4airframes/srcparser.py 中的 SourceParser类parse 方法的执行步骤, 由于其文件比较长,这里只给出简要描述, 并不附上代码.

  1. 首先通过.hil 文件名解析得到序号, 这里是1001
  2. 进行如下图流程图中的操作的描述(尚未全部完成)
Created with Raphaël 2.2.0 开始 state=None 获取一行输入放入line 去掉行的开始和结束空字符 state=None 匹配到'^\#\s' 设置state为wait-short short_desc=None; long_desc=None state!=comment-processed 匹配到'(.*?)\s*\#\n/' line=匹配到的第一组 last_comment_line=True 匹配到'^\#\s*(.*)' 获取到开头字符串 state="wait-short-end" 设置 state="wait_long" last_comment_line=False yes no yes yes yes no yes yes

主要过程就是把"url", "maintainer", "output", "arch", "name", "type" 这几个域对应的信息解析出来. 然后调用xmlout 导出到xml,md 或者rc 文件中.
所以 make metadata_airframe 的操作就是把这些信息导出到mdxml 中.

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

PX4 编译分析之Airframe文档生成 的相关文章

随机推荐

  • Leetcode 105 106 重构二叉树

    Leetcode上105 xff0c 106题很相似 xff0c 都是重构二叉树的题 题目 xff1a 105 Given preorder and inorder traversal of a tree construct the bin
  • LeetCode 查并集系列 朋友圈 冗余链接等

    网上有作者已经总结的很好 xff0c 这里转载一下 xff1a https www jianshu com p b81f6db6beaf 什么是并查集 一种数据结构 xff0c 用来描述集合 查 xff08 find xff09 xff1a
  • 记 7.24 阿里巴巴机试题

    题一 题目 xff1a 吃烧饼大赛 有n个盘子 xff0c 每个盘子内有s i 个烧饼 每次选取一个 x xff08 1 x n xff09 xff0c 可以吃到1 xff5e x 号盘子里的一个烧饼 若这1 xff5e x个盘子中有空盘时
  • C++ 智能指针学习

    网上找了一篇很棒的文章 转载自 xff1a https www jianshu com p bf8de014e5c2 C Java python和go等语言中都有垃圾自动回收机制 xff0c 在对象失去引用的时候自动回收 xff0c 而且基
  • 记面试遇到的一个智力题:追击问题

    一个带环的单链表 xff0c 一个快指针 xff08 每次走三步 xff09 xff0c 一个慢指针 xff08 每次走一步 xff09 xff0c 请问这两个指针可能无法相遇吗 xff1f 解 xff1a 假设慢指针入环时 xff0c 快
  • 面试经典题 手撸LRU

    1 C与C 43 43 混搭写法 struct LRUCacheNode int key int value LRUCacheNode prev LRUCacheNode next LRUCacheNode key 0 value 0 pr
  • 腾讯8.23号笔试 刷木板题 DP

    作者 xff1a 夜 xffe3 太美 链接 xff1a https www nowcoder com discuss 486642 type 61 2 来源 xff1a 牛客网 题意 有n xff08 n在5000内 xff09 块木板
  • 京东2018笔试题 神奇数

    题目 东东在一本古籍上看到有一种神奇数 如果能够将一个数的数字分成两组 其中一组数字的和等于另一组数字的和 我们就将这个数称为神奇数 例如242就是一个神奇数 我们能够将这个数的数字分成两组 分别是 2 2 以及 4 而且这两组数的和都是4
  • 绑定mac地址与网卡驱动wlan

    按照之前博客https blog csdn net Lin QC article details 90717218的配置 xff0c 我们可以在树莓派上实现双网卡 xff0c 但是再多次试验中发现 xff0c 每次重启后 xff0c 网卡的
  • 在树莓派上ROS MAVROS的安装使用

    首先 xff0c 我购买的是树莓派3B 43 xff0c 比较新款 xff0c 所以装不了太老的树莓派系统 xff0c 安装的是树莓派官方提供的Raspbian Stretch系统 树莓派系统安装过程较为简单 xff0c 且官网教程详细 x
  • APP引导页UI设计素材模板|轻松留下完美的第一印象

    App首次引导页是当你第一次打开一款应用的时候你看到的引导页 xff0c 它们在你未使用产品之前提前告知产品的主要功能与特点 先来看看 像素精简版引导UI工具包 好的实际案例 xff0c 让初学者更友好 xff01 美丽的用户界面 xff0
  • px4 offboard外部控制仿真

    官网中http dev px4 io en ros mavros offboard html xff0c 只给示例代码 xff0c 却不告诉怎么用 xff0c 实在有点坑 xff0c 还好参照网上的一些博客 xff0c 找到了使用方法 首先
  • POST和GET方法的区别与联系

    错误的一个理论就是 xff0c get是从服务器拿数据 xff0c 而post是给服务器传数据 两者其实都是从服务器端拿数据 xff0c 只是一些细节不同罢了 历史 get和post是HTTP与服务器交互的方式 xff0c 说到方式 xff
  • Dronekit 搭配使用Ardupilot 和 PX4

    Dronekit是一个与无人机飞控搭配使用 xff0c 方便开发者使用代码控制无人机 个人认为它会比搭建ros来控制无人机更容易上手一些 对于Dronekit xff0c PX4被支持的较少 xff0c 不可以进行模式切换 xff0c 而对
  • 堆栈存放什么

    此乃转载别人发表 xff0c 作为知识点保存积累 一 xff1a 概念 1 栈 xff1a 当程序进入一个方法时 xff0c 会为这个方法单独分配一块私属存储空间 xff0c 用于存储这个方法内部的局部变量 xff0c 当这个方法结束时 x
  • 嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2

    本文是 嵌入式实时操作系统ucosii原理及应用 xff08 任哲 xff09 一书第三章的阅读笔记 xff0c 知识点多为摘录 xff0c 若希望深入了解 xff0c 请购买该书认真研读 由于一些知识比较零散 xff0c 记起来不大方便
  • 如何做项目总结与汇报

    在我们测试工作过程中 xff0c 由于公司业务发展 xff0c 快速迭代等原因 xff0c 我们遇到的项目以小项目居多 更新界面元素 xff0c 上个活动页 xff0c 优化一下原有的功能等等 xff0c 加上事情繁琐 xff0c 任务多
  • 手机安装linux deploy 安装和配置

    最近在淘了一款二手三星的sw 2014 正好最近正在研究智能家居 就想用它来搭建domoticz来管理 xff0c 虽然手头也有一块吃灰的树莓派3b 但是觉得用树莓派搭建有点浪费 xff0c 索性就用这款手机 为什么不用temux xff1
  • 国家分级保护规范要求解读

    仅就项目建设流程而言 xff0c 涉密信息系统建设使用单位应依据 涉及国家秘密的信息系统分级保护管理办法 国保发 2005 16号 确定系统等级 xff0c 结合本单位业务需求和涉密信息制定安全保密需求 xff0c 依据国家保密标准 BMB
  • PX4 编译分析之Airframe文档生成

    PX4 编译分析之Airframe文档生成 本文假设已经阅读了 PX4 的 1 Makefile分析 2 CMakeLists txt分析 这里要分析的是 make airframe metadata 的指令 在 Makefile 文件中找