PX4模块设计之四十五:param模块

2023-05-16

PX4模块设计之四十五:param模块

  • 1. param模块简介
  • 2. 模块入口函数param_main
  • 3 重要函数列表
  • 4. 总结
  • 5. 参考资料

1. param模块简介

### Description
Command to access and manipulate parameters via shell or script.

This is used for example in the startup script to set airframe-specific parameters.

Parameters are automatically saved when changed, eg. with `param set`. They are typically stored to FRAM
or to the SD card. `param select` can be used to change the storage location for subsequent saves (this will
need to be (re-)configured on every boot).

If the FLASH-based backend is enabled (which is done at compile time, e.g. for the Intel Aero or Omnibus),
`param select` has no effect and the default is always the FLASH backend. However `param save/load <file>`
can still be used to write to/read from files.

Each parameter has a 'used' flag, which is set when it's read during boot. It is used to only show relevant
parameters to a ground control station.

### Examples
Change the airframe and make sure the airframe's default parameters are loaded:
$ param set SYS_AUTOSTART 4001
$ param set SYS_AUTOCONFIG 1
$ reboot

param <command> [arguments...]
 Commands:
   load          Load params from a file (overwrite all)
     [<file>]    File name (use default if not given)

   import        Import params from a file
     [<file>]    File name (use default if not given)

   save          Save params to a file
     [<file>]    File name (use default if not given)

   dump          Dump params from a file
     [<file>]    File name (use default if not given)

   select        Select default file
     [<file>]    File name

   select-backup Select default file
     [<file>]    File name

   show          Show parameter values
     [-a]        Show all parameters (not just used)
     [-c]        Show only changed params (unused too)
     [-q]        quiet mode, print only param value (name needs to be exact)
     [<filter>]  Filter by param name (wildcard at end allowed, eg. sys_*)

   show-for-airframe Show changed params for airframe config

   status        Print status of parameter system

   set           Set parameter to a value
     <param_name> <value> Parameter name and value to set
     [fail]      If provided, let the command fail if param is not found

   set-default   Set parameter default to a value
     [-s]        If provided, silent errors if parameter doesn't exists
     <param_name> <value> Parameter name and value to set
     [fail]      If provided, let the command fail if param is not found

   compare       Compare a param with a value. Command will succeed if equal
     [-s]        If provided, silent errors if parameter doesn't exists
     <param_name> <value> Parameter name and value to compare

   greater       Compare a param with a value. Command will succeed if param is
                 greater than the value
     [-s]        If provided, silent errors if parameter doesn't exists
     <param_name> <value> Parameter name and value to compare
     <param_name> <value> Parameter name and value to compare

   touch         Mark a parameter as used
     [<param_name1> [<param_name2>]] Parameter name (one or more)

   reset         Reset only specified params to default
     [<param1> [<param2>]] Parameter names to reset (wildcard at end allowed)

   reset_all     Reset all params to default
     [<exclude1> [<exclude2>]] Do not reset matching params (wildcard at end
                 allowed)

   index         Show param for a given index
     <index>     Index: an integer >= 0

   index_used    Show used param for a given index
     <index>     Index: an integer >= 0

   find          Show index of a param
     <param>     param name

注:print_usage函数是具体对应实现。

2. 模块入口函数param_main

该模块纯C语言风格,没有C++类继承或者C/C++混合的编码风格,整体看起来就很清爽。

注:C++设计一定要建模,一定要做好概念抽象。至于C/C++那种混合的编程风格,笔者是不建议的。

param_main
 ├──> <argc < 2>  // 参数不够,直接提供打印帮助!!!
 │   └──> print_usage()
 ├──> <!strcmp(argv[1], "save")> // save 子命令
 │   ├──> <argc >= 3>
 │   │   └──> do_save(argv[2])
 │   └──> <else>
 │       └──> do_save_default()
 ├──> <!strcmp(argv[1], "dump")> // dump 子命令
 │   ├──> <argc >= 3>
 │   │   └──> do_dump(argv[2])
 │   └──> <else>
 │       └──> do_dump(param_get_default_file())
 ├──> <!strcmp(argv[1], "load")> // load 子命令
 │   ├──> <argc >= 3>
 │   │   └──> do_load(argv[2])
 │   └──> <else>
 │       └──> do_load(param_get_default_file())
 ├──> <!strcmp(argv[1], "import")> // import 子命令
 │   ├──> <argc >= 3>
 │   │   └──> do_import(argv[2])
 │   └──> <else>
 │       └──> do_import()
 ├──> <!strcmp(argv[1], "select")> // select 子命令
 │   ├──> <argc >= 3>
 │   │   └──> param_set_default_file(argv[2])
 │   ├──> <else>
 │   │   └──> param_set_default_file(nullptr)
 │   ├──> const char *default_file = param_get_default_file()
 │   └──> <default_file> PX4_INFO("selected parameter default file %s", default_file)
 ├──> <!strcmp(argv[1], "select-backup")> // select-backup 子命令
 │   ├──> <argc >= 3>
 │   │   └──> param_set_backup_file(argv[2])
 │   ├──> <else>
 │   │   └──> param_set_backup_file(nullptr)
 │   ├──> const char *backup_file = param_get_backup_file()
 │   └──> <backup_file> PX4_INFO("selected parameter backup file %s", backup_file)
 ├──> <!strcmp(argv[1], "show")>  // show 子命令
 │   ├──> <argc >= 3>
 │   │   ├──> <!strcmp(argv[2], "-c")>  // optional argument -c to show only non-default params
 │   │   │    ├──> <argc >= 4>
 │   │   │    │   └──> do_show(argv[3], true)
 │   │   │    └──> <else>
 │   │   │        └──> do_show(nullptr, true)
 │   │   ├──> <!strcmp(argv[2], "-a")>
 │   │   │    └──> do_show_all()
 │   │   ├──> <!strcmp(argv[2], "-q")>
 │   │   │    └──> <argc >= 4> do_show_quiet(argv[3])
 │   │   └──> <else>
 │   │        └──> do_show(argv[2], false)
 │   └──> <else>
 │       └──> do_show(nullptr, false)
 ├──> <!strcmp(argv[1], "show-for-airframe")>  // show-for-airframe 子命令
 │   └──> do_show_for_airframe()
 ├──> <!strcmp(argv[1], "status")>  // status 子命令
 │   └──> param_print_status()
 ├──> <!strcmp(argv[1], "set")>  // set 子命令
 │   ├──> <argc >= 5>
 │   │   ├──> bool fail = !strcmp(argv[4], "fail")  //if the fail switch is provided, fails the command if not found
 │   │   └──> return do_set(argv[2], argv[3], fail)
 │   └──> <argc >= 4> do_set(argv[2], argv[3], false)
 ├──> <!strcmp(argv[1], "set-default")>  // set-default 子命令
 │   ├──> <argc >= 5 && !strcmp(argv[2], "-s")> do_set_custom_default(argv[3], argv[4], true)
 │   └──> <argc == 4> do_set_custom_default(argv[2], argv[3])
 ├──> <!strcmp(argv[1], "compare")> // compare 子命令
 │   ├──> <argc >= 5 && !strcmp(argv[2], "-s")> do_compare(argv[3], &argv[4], argc - 4, COMPARE_OPERATOR::EQUAL, COMPARE_ERROR_LEVEL::SILENT)
 │   └──> <argc >= 4> do_compare(argv[2], &argv[3], argc - 3, COMPARE_OPERATOR::EQUAL, COMPARE_ERROR_LEVEL::DO_ERROR)
 ├──> <!strcmp(argv[1], "greater")>  // greater 子命令
 │   ├──> <argc >= 5 && !strcmp(argv[2], "-s")> do_compare(argv[3], &argv[4], argc - 4, COMPARE_OPERATOR::GREATER, COMPARE_ERROR_LEVEL::SILENT)
 │   └──> <argc >= 4> do_compare(argv[2], &argv[3], argc - 3, COMPARE_OPERATOR::GREATER, COMPARE_ERROR_LEVEL::DO_ERROR)
 ├──> <!strcmp(argv[1], "reset")>  //reset 子命令
 │   └──> <argc >= 3> do_reset_specific((const char **) &argv[2], argc - 2)
 ├──> <!strcmp(argv[1], "reset_all")>  //reset_all 子命令
 │   ├──> <argc >= 3>
 │   │   └──> do_reset_all((const char **) &argv[2], argc - 2)
 │   └──> <else>
 │       └──> do_reset_all(nullptr, 0)
 ├──> <!strcmp(argv[1], "touch")>  // touch 子命令
 │   └──> <argc >= 3> do_touch((const char **) &argv[2], argc - 2)
 ├──> <!strcmp(argv[1], "index_used")>  // index_used 子命令
 │   └──> <argc >= 3> do_show_index(argv[2], true)
 ├──> <!strcmp(argv[1], "index")>  // index 子命令
 │   └──> <argc >= 3> do_show_index(argv[2], false)
 └──> <!strcmp(argv[1], "find")>  // find 子命令
     └──> <argc >= 3> do_find(argv[2])

3 重要函数列表

所有参数相关操作都是使用了Parameters API,关于全局参数存储 Parameters API这里不做展开,详见:src/lib/Parameters, param.h

  1. do_save
  2. do_save_default
  3. do_dump
  4. do_load
  5. do_import
  6. param_set_default_file
  7. param_set_backup_file
  8. do_show
  9. do_show_for_airframe
  10. param_print_status
  11. do_set
  12. do_set_custom_default
  13. do_compare
  14. do_reset_specific
  15. do_reset_all
  16. do_touch
  17. do_show_index
  18. do_find

4. 总结

该模块主要提供了系统参数的动态更新/固化保存,以及提供了参数修正的底层操作方法。

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4模块设计之三十:Hysteresis类
【7】PX4 modules_main
【8】PX4模块设计之四十一:I2C/SPI Bus Instance基础知识

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

PX4模块设计之四十五:param模块 的相关文章

  • px4自定义mavlink收不到消息的问题

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • 飞行机器人(七)仿真平台XTDrone + PX4编译

    0 编译PX4固件 参考仿真平台基础配置教程 xff08 中文详细教程 xff09 仿真平台基础配置 语雀 yuque com https www yuque com xtdrone manual cn basic config 按照教程
  • PX4代码学习系列博客(6)——offboard模式位置控制代码分析

    分析offboard模式的代码需要用到以下几个模块 local position estimator mavlink mc pos control mc att control mixer 程序数据走向 mavlink 一般的offboar
  • PX4进入系统控制台以及运行程序

    这里提供进入控制台两种办法 1 运行 Tools mavlink shell py dev ttyACM0 是我进入Px4系统控制台的命令 xff0c 进入之后应该是这样 Pixhawk src Firmware Tools mavlink
  • PX4 ---- Mixer

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • 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模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • 关于github px4 gps 驱动的开发的总结

    源码编译上边已经写过文章了 遇到的几个问题 1 解决虚拟机不能共享文件夹的问题 一开始虚拟机的更新 vmware tools 是灰色的 xff0c 不能点 xff0c 然后通过关掉虚拟机 xff0c 然后再开启的时候 xff0c 在没有启动
  • PX4飞控之自主返航(RTL)控制逻辑

    本文基于PX4飞控1 5 5版本 xff0c 分析导航模块中自护返航模式的控制逻辑和算法 自主返航模式和导航中的其他模式一样 xff0c 在Navigator main函数中一旦触发case vehicle status s NAVIGAT
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 四、无人机知识笔记(初级:基本运动原理)

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

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

    继之前研究了一些飞行姿态理论方面的问题后 又找到了之前很流行的一段外国大神写的代码 来分析分析 第二篇文章的最后 讲到了文章中的算法在实际使用中有重大缺陷 大家都知道 分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况 原因是很多情
  • 使用浏览器转换XML时是否可以通过URL向XSLT传递参数?

    当使用浏览器 Google Chrome 或 IE7 转换 XML 时 是否可以通过 URL 将参数传递给 XSLT 样式表 example data xml

随机推荐