# 参数 & 配置

PX4 使用 参数子系统 (平面表格 浮动int32_t 值)和文本文件(用于启动脚本)来存储配置。

本节将讨论 停止 子系统的详细介绍。它包括如何列出、保存和加载参数,以及如何定义参数并将其提供给地面站。

TIP

系统启动 以及 飞行器机型 启动脚本的工作原理详见其他页面。

# 命令行用法

PX4 系统控制台 提供 停止 工具,可用于设置参数、读取参数值、保存参数以及导出和恢复到/从文件。

# 获取和设置参数

参数 show 命令列出所有系统参数:

参数 show

为提高选择性,可使用带通配符 "*" 的部分参数名:

nsh>; 参数 show 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 标记,以显示所有已更改(与默认值不同)的参数:

参数 show -c

您可以使用 参数 show-for-airframe 以显示当前机身定义文件(及其导入的默认值)中与默认值不同的所有参数。

# 导出和加载参数

您可以保存任何已 变了 (与机身默认值不同)。

标准 参数保存 命令会将参数存储到当前默认文件中:

参数保存

如果提供了参数,它将把参数存储到这个新位置:

参数保存 /fs/microsd/vtol_param_backup

有两种不同的命令可以 负荷 参数

  • 参数载荷 首先将所有参数完全重置为默认值,然后用文件中存储的任何值覆盖参数值。
  • 参数导入 只是用文件中的值覆盖参数值,然后保存结果(即有效调用 参数保存).

负荷 有效地将参数重置为保存参数时的状态(之所以说 "有效地",是因为文件中保存的任何参数都将被更新,但其他参数的固件定义默认值可能与创建参数文件时不同)。

相比之下 舶来品 将文件中的参数与载具的当前状态合并。例如,这可用于导入包含标定数据的参数文件,而无需覆盖系统配置的其他部分。

两种情况的示例如下:

# 将参数重置为保存文件时的状态
参数加载 /fs/microsd/vtol_param_backup
# 可选保存参数(加载时不会自动保存)
参数保存
# 将保存的参数与当前参数合并
停止 舶来品 /fs/microsd/vtol_param_backup

# 创建/定义参数

参数定义包括两个部分:

  • 参数元数据 指定固件中每个参数的默认值以及其他元数据,以便在地面控制站和文档中显示(和编辑)参数。
  • C/C++ 代码 可从 PX4 模块和驱动程序中获取和/或订阅参数值。

下面介绍几种编写元数据和代码的方法。在可能的情况下,代码应使用较新的 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 以获得 定义参数 宏观:
    #包括 <px4_platform_common/module_params.h>;
    
  • 参数更新.h 访问 uORB 参数更新 留言
    #包括 <uORB/topics/parameter_update.h>;
    
  • Subscription.hpp 用于 uORB C++ 订阅 API:
    #包括 <uORB/Subscription.hpp>;
    

模块参数并使用 定义参数 来指定参数及其相关参数属性的列表。参数名称必须与其参数元数据定义相同。

 我的模块 : ...,  模块参数
{
:
	...

私人:

	/** * 检查参数更改,并在需要时进行更新。*/
	空白 参数更新();

	定义参数(
		(ParamInt<;px4::参数::系统自动启动>;) 系统自动启动,   /**< 示例参数 */
		(参数浮点数<;px4::参数::ATT_BIAS_MAX>;) _att_bias_max  /**< 另一个参数 */
	)

	// 订阅
	uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(参数更新), 1_s};

};

用模板更新 cpp 文件,以检查与参数更新相关的 uORB 消息。

致电 参数更新(); 在代码中定期检查是否有更新:

空白 模块::参数更新()
{
	如果 (参数更新子参数.最新的()) {
		参数更新;
		参数更新子参数.抄袭(及样品;参数更新);

		// 如果有参数更新,调用 updateParams() 检查是否
		// 这个类的属性需要更新(并且已经更新)。
		updateParams();
	}
}

在上述方法中

  • _parameter_update_sub.updated() 告诉我们是否有 任何 更新至 参数更新 uORB 信息(但不包括受影响的参数)。
  • 如果有参数更新,我们会将更新内容复制到 参数更新 (参数更新),清除待处理的更新。
  • 然后,我们调用 模块参数::updateParams().这将更新我们的 定义参数 名单。

参数属性 (系统自动启动_att_bias_max 在本例中)就可以用来表示参数,并在参数值发生变化时进行更新。

TIP

应用程序/模块模板 使用新式 C++ 应用程序接口,但不包括 参数元数据.

# C API

C API 可在模块和驱动程序中使用。

首先包括参数 API:

#包括 <参数/param.h>;

然后检索参数并将其赋值给一个变量(此处为 参数),如下所示 参数名称.变量 参数 可以在模块代码中使用。

int32_t 参数 = 0;
参数get(参数查找("PARAM_NAME";), 及样品;参数);

备注

如果 参数名称 如果在参数元数据中声明了该参数,那么它的默认值就会被设置,上述查找参数的调用就会成功。

param_find() 是一个 "昂贵 "的操作,它返回一个句柄,可以被 param_get().如果要多次读取参数,可以缓存句柄并在 param_get() 必要时

# 获取参数句柄
param_t my_param_handle = PARAM_INVALID;
参数句柄 = 参数查找("PARAM_NAME";);

# 需要时查询参数值
int32_t 参数 = 0;
参数get(参数句柄, 及样品;参数);

# 参数元数据

PX4 使用广泛的参数元数据系统来驱动面向用户的参数显示,并在固件中设置每个参数的默认值。

TIP

正确的元数据对地面站良好的用户体验至关重要。

参数元数据可存储在源代码树中的任何位置,可以是 .c.yaml 参数定义(YAML 定义更新、更灵活)。通常情况下,它与相关模块一起存储。

构建系统会提取元数据(使用 制作参数_元数据)来建立 参数参考 和参数信息 地面站使用.

警告

添加一个 参数文件时,应调用 一扫而光 生成新参数(参数文件作为 cmake configure 步骤,这发生在干净的联编和修改 cmake 文件时)。

# YAML 元数据

备注

在撰写本文时,YAML 参数定义不能用于 图书馆.

YAML 元数据可完全替代 .c 定义。它支持所有相同的元数据,以及多实例定义等新功能。

# 多实例(模板化)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 * @最小 0.0 * 最大 10 * @十进制 2 * @增量 0.0005 * @reboot_required true * @组别 多旋翼飞行器姿态控制 */
参数定义浮点数(MC_PITCH_P, 6.5f);
/** * 基于 GPS * 速度的加速度补偿。* @group Attitude Q estimator * @boolean */
参数define_int32(ATT_ACC_COMP, 1);

PARAM_DEFINE_* 末尾的宏指定参数的类型 (参数定义浮点数参数define_int32)、参数名称(必须与代码中使用的名称一致)以及固件中的默认值。

注释块中的行都是可选的,主要用于控制地面站内的显示和编辑选项。各行的用途如下(更多详情请参见 module_schema.yaml (打开新窗口)).

/** * <标题> * * <较长的描述,可以是多行> * * @unit<单位,例如 m 表示米> * @min<最小合理值。可由用户覆盖> * @max<最大合理值。可被用户覆盖> * @decimal<最小合理值。可由用户覆写> * @increment <该值在用户界面中递增的"刻度" * @reboot_required true <如果更改参数需要重启系统,则添加此项> * @boolean <为表示布尔值的整数参数添加此项> * @group <为组成一个组的参数添加标题> */

# 向全球监控系统发布参数元数据

每次构建 PX4 时,都会将参数元数据收集到 JSON 或 XML 文件中。

对于大多数飞行控制器来说(因为大多数控制器都有足够的闪存),JSON 文件会被 xz 压缩并存储在生成的二进制文件中。然后使用 MAVLink 组件信息协议 (打开新窗口).这可确保参数元数据始终与载具上运行的代码保持同步。

内存有限的飞行控制器目标的二进制文件不会在二进制文件中存储参数元数据,而是引用存储在 px4-travis.s3.amazonaws.com.例如,这适用于 全能 F4 SD.元数据通过 github CI (打开新窗口) 对所有构建目标都适用(因此只有在参数合并到主版本后才可用)。

备注

您可以识别内存受限的电路板,因为它们指定了 CONFIG_BOARD_CONSTRAINED_FLASH=y 在其 px4board 定义文件 (打开新窗口).

备注

元数据 px4-travis.s3.amazonaws.com 在载具上没有参数元数据时使用。它也可作为一种备用方法,以避免通过低速率遥测链路进行非常缓慢的下载。

在受 FLASH 限制的电路板上进行定制开发的任何人都可以调整 URL 这里 (打开新窗口) 指向另一个服务器。

主分支的 XML 文件通过 CI 复制到 QGC 源代码树中,并在组件信息服务无法提供元数据的情况下作为备用(这种方法早于组件信息协议的出现)。

# 更多信息