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固件

    PX4编译 文章目录 PX4编译疑难杂症bug1bug2catkin build isolated 官方脚本Step1Step2 安装常用依赖Step3 创建并运行脚本Step4 补全代码子模块Step5 验证仿真 官方offboard 例
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • PX4/Pixhawk---uORB深入理解和应用

    The Instructions of uORB PX4 Pixhawk 软件体系结构 uORB 主题发布 主题订阅 1 简介 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • 飞行机器人(七)仿真平台XTDrone + PX4编译

    0 编译PX4固件 参考仿真平台基础配置教程 xff08 中文详细教程 xff09 仿真平台基础配置 语雀 yuque com https www yuque com xtdrone manual cn basic config 按照教程
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • PX4进入系统控制台以及运行程序

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

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • 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模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • PX4通过参数脚本给飞控导入参数

    PX4通过参数脚本给飞控导入参数 先找一架正常能飞的无人机连接地面站 在参数页面右上角点击工具 gt 保存到文件 保存的时候文件名注明参数的相关信息 然后将需要加载参数的无人机连接至地面站 xff0c 注意需要加载参数的无人机必须和保存的参
  • 在准备好的 mysqli 语句中多次使用一个参数

    是否可以在准备好的参数中使用一个参数mysqli 多次声明仅绑定一次 像这样的东西 stmt mysqli gt prepare SELECT FROM user WHERE age BETWEEN 1 2 AND 1 2 stmt gt

随机推荐