参数 & 配置
PX4 使用 参数子系统 (平面表格 浮动
和 int32_t
值)和文本文件(用于启动脚本)来存储配置。
本节将讨论 停止 子系统的详细介绍。它包括如何列出、保存和加载参数,以及如何定义参数并将其提供给地面站。
命令行用法
PX4 系统控制台 提供 停止 工具,可用于设置参数、读取参数值、保存参数以及导出和恢复到/从文件。
获取和设置参数
参数 show
命令列出所有系统参数:
停止 展览
为提高选择性,可使用带通配符 "*" 的部分参数名:
nsh>; 停止 展览 RC_MAP_A*
标志 x = 用过 + = 有救了 * = 未保存
x RC_MAP_AUX1 [359,498] : 0
x RC_MAP_AUX2 [360,499] : 0
x RC_MAP_AUX3 [361,500] : 0
x RC_MAP_ACRO_SW [375,514] : 0
723 参数 总计 532 用过
您可以使用 -c
标记,以显示所有已更改(与默认值不同)的参数:
停止 展览 -c
您可以使用 参数 show-for-airframe
以显示当前机身定义文件(及其导入的默认值)中与默认值不同的所有参数。
导出和加载参数
您可以保存任何已 变了 (与机身默认值不同)。
标准 参数保存
命令会将参数存储到当前默认文件中:
停止 节省
如果提供了参数,它将把参数存储到这个新位置:
停止 节省 /fs/microsd/vtol_param_backup
有两种不同的命令可以 负荷 参数
参数载荷
首先将所有参数完全重置为默认值,然后用文件中存储的任何值覆盖参数值。参数导入
只是用文件中的值覆盖参数值,然后保存结果(即有效调用参数保存
).
负荷
有效地将参数重置为保存参数时的状态(之所以说 "有效地",是因为文件中保存的任何参数都将被更新,但其他参数的固件定义默认值可能与创建参数文件时不同)。
相比之下 舶来品
将文件中的参数与载具的当前状态合并。例如,这可用于导入包含标定数据的参数文件,而无需覆盖系统配置的其他部分。
两种情况的示例如下:
# 将参数重置为保存文件时的状态
停止 负荷 /fs/microsd/vtol_param_backup
# 可选保存参数(加载时不会自动保存)
停止 节省
# 将保存的参数与当前参数合并
停止 舶来品 /fs/microsd/vtol_param_backup
创建/定义参数
参数定义包括两个部分:
下面介绍几种编写元数据和代码的方法。在可能的情况下,代码应使用较新的 YAML 元数据 和 C++ API 而不是老式的 C 参数/代码定义,因为这些定义更灵活、更健壮。
参数元数据为 编入固件并通过 MAVLink 组件信息服务.
参数名称
参数名称不得超过 16 个 ASCII 字符。
按照惯例,组中的每个参数都应共享相同的(有意义的)字符串前缀,后跟下划线,并且 MC_
和 FW_
用于专门与多旋翼或固定翼系统相关的参数。此惯例不强制执行。
名称必须在代码和 参数元数据 以将参数与其元数据(包括固件中的默认值)正确关联起来。
C / C++ 应用程序接口
有单独的 C 和 C++ 应用程序接口,可用于从 PX4 模块和驱动程序中访问参数值。
这两个应用程序接口之间的一个重要区别是,C++ 版本有一个更有效的标准化机制,可以同步参数值的变化(即来自全球计算机控制系统的变化)。
同步非常重要,因为参数可以随时更改为另一个值。您的代码应 始终 使用参数存储中的当前值。如果无法获取最新版本,则在更改参数后需要重启(使用 @reboot_required
元数据)。
此外,C++ 版本还具有更好的类型安全性和更少的内存开销。缺点是参数名称必须在编译时已知,而 C API 可以使用动态创建的字符串名称。
C++ API
C++ API 提供了将参数声明为 类属性.您可以添加一些模板代码,以定期监听系统中的变化。 uORB 主题 与 任何 参数更新。然后,框架代码会(隐蔽地)跟踪影响参数属性的 uORB 消息,并保持同步。在代码的其余部分,你只需使用已定义的参数属性,它们就会始终保持最新!
首先,在模块或驱动程序的类头文件中加入所需的必要头文件:
px4_platform_common/module_params.h 以获得
定义参数
宏观:cpp#include <px4_platform_common/module_params.h>;
参数更新.h 访问 uORB
参数更新
留言cpp#include <uORB/topics/parameter_update.h>;
Subscription.hpp 用于 uORB C++ 订阅 API:
cpp#include <uORB/Subscription.hpp>;
从 模块参数
并使用 定义参数
来指定参数及其相关参数属性的列表。参数名称必须与其参数元数据定义相同。
类 我的模块 : ..., 公 模块参数
{
公众:
...
私人
/**
* 检查参数变化,必要时进行更新。
*/
空白 参数更新();
定义参数(
参数<;px4::参数系统自动启动>;) 系统自动启动, /**< 示例参数 */
(ParamFloat<;px4::参数::ATT_BIAS_MAX>;) _att_bias_max /**< 另一个参数 */
)
// 订阅
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(参数更新)、 1_s};
};
用模板更新 cpp 文件,以检查与参数更新相关的 uORB 消息。
致电 参数更新();
在代码中定期检查是否有更新:
空白 模块::参数更新()
{
如果 (_parameter_update_sub.最新的()) {
参数更新;
_parameter_update_sub.抄袭(及样品;param_update);
// 如果有参数更新,调用 updateParams() 检查是否
// 这个类的属性需要更新(并且已经更新)。
updateParams();
}
}
在上述方法中
_parameter_update_sub.updated()
告诉我们是否有 任何 更新至参数更新
uORB 信息(但不包括受影响的参数)。- 如果有参数更新,我们会将更新内容复制到
参数更新
(参数更新
),清除待处理的更新。 - 然后,我们调用
模块参数::updateParams()
.这将更新我们的定义参数
名单。
参数属性 (系统自动启动
和 _att_bias_max
在本例中)就可以用来表示参数,并在参数值发生变化时进行更新。
C API
C API 可在模块和驱动程序中使用。
首先包括参数 API:
#include <参数/param.h>;
然后检索参数并将其赋值给一个变量(此处为 参数
),如下所示 参数名称
.变量 参数
可以在模块代码中使用。
int32_t 参数 = 0;
参数get(参数查找("PARAM_NAME";), 及样品;参数);
信息
如果 参数名称
如果在参数元数据中声明了该参数,那么它的默认值就会被设置,上述查找参数的调用就会成功。
param_find()
是一个 "昂贵 "的操作,它返回一个句柄,可以被 param_get()
.如果要多次读取参数,可以缓存句柄,并将其用于 param_get()
必要时
# 获取参数的句柄
参数_t 参数句柄 = PARAM_INVALID;
参数句柄 = 参数查找("PARAM_NAME";);
# 需要时查询参数值
int32_t 参数 = 0;
参数get(my_param_handle、 及样品;my_param);
参数元数据
PX4 使用广泛的参数元数据系统来驱动面向用户的参数显示,并在固件中设置每个参数的默认值。
TIP
正确的元数据对地面站良好的用户体验至关重要。
参数元数据可存储在源代码树中的任何位置,可以是 .c 或 .yaml 参数定义(YAML 定义更新、更灵活)。通常情况下,它与相关模块一起存储。
构建系统会提取元数据(使用 制作参数_元数据
)来建立 参数参考 和参数信息 地面站使用.
警告
添加一个 新 参数文件时,应调用 一扫而光
生成新参数(参数文件作为 cmake configure 步骤,这发生在干净的联编和修改 cmake 文件时)。
YAML 元数据
信息
在撰写本文时,YAML 参数定义不能用于 图书馆.
YAML 元数据可完全替代 .c 定义。它支持所有相同的元数据,以及多实例定义等新功能。
这里是 YAML 参数元数据模式: validation/module_schema.yaml.
在 MAVLink 参数定义中可以找到使用 YAML 定义的示例: /src/modules/mavlink/module.yaml.
通过在 cmake 编译系统中添加
cmakeMODULE_CONFIG module.yaml
到
px4_add_module
部分CMakeLists.txt
文件。
多实例(模板化)YAML 元数据
中支持模板化参数定义。 YAML 参数定义 (不支持模板化参数代码)。
YAML 允许您在参数名称、描述等中定义实例编号。 ${i}
.例如,下面将生成 MY_PARAM_1_RATE、MY_PARAM_2_RATE 等。
MY_PARAM_${i}_RATE:
描述:
短: ${i} 实例的最高速率
以下 YAML 定义提供了开始和结束索引。
数量
(默认为 1):要生成的实例数 (>=1)实例开始
(默认为 0):第一个实例编号。如果为 0、${i}
扩展为 [0,N-1]`。
完整示例请参阅 MAVLink 参数定义: /src/modules/mavlink/module.yaml
c 参数元数据
定义参数元数据的传统方法是在扩展名为 .c (在撰写本文时,这是源代码树中最常用的方法)。
参数元数据部分如下所示:
/**
* P 增益
*
* 螺距比例增益,即误差为 1 弧度时的期望角速度(弧度/秒)。
*
* @单位 1/s
* @min 0.0
* @max 10
* @十进制 2
* @increment 0.0005
* @reboot_required true
* @组多旋翼飞行器姿态控制
*/
参数定义浮点数(MC_PITCH_P、 6.5f);
/**
* 基于 GPS 的加速补偿
* 速度。
*
* @组态度 Q 估计器
* @布尔
*/
参数define_int32(ATT_ACC_COMP、 1);
PARAM_DEFINE_*
末尾的宏指定参数的类型 (参数定义浮点数
或 参数define_int32
)、参数名称(必须与代码中使用的名称一致)以及固件中的默认值。
注释块中的行都是可选的,主要用于控制地面站内的显示和编辑选项。各行的用途如下(更多详情请参见 module_schema.yaml).
/**
* title>;
*
*较长的描述,可多行>;
*
* @unit<单位,如 m 表示米>;
* @min<最小合理值。可由用户覆盖>;
* @max <最大合理值。可由用户覆盖>;
* @十进制 <最小合理值。可由用户覆盖>;
* @increment <该值在用户界面中递增的"刻度";
* @reboot_required true <如果更改参数需要重启系统,则添加此项;
* @boolean<为表示布尔值的整数参数添加此参数>;
* @group <组成一组参数的标题>;
*/
向全球监控系统发布参数元数据
参数元数据 JSON 文件被编入固件(或托管在互联网上),并通过 MAVLink 组件元数据服务.这样可以确保元数据始终与载具上运行的代码保持同步。
此过程与 事件元数据.更多信息,请参见 PX4 元数据(翻译 & 出版)