为旋翼飞行器添加新参数¶
参数既可以是主代码的一部分,也可以是程序库的一部分。
在主代码中添加参数¶
步骤 #1: 中的参数类枚举中找到一个空闲位置。 参数.h 并添加新参数,如下图红色所示。需要注意一些事项:
尽量将参数添加到功能相似的参数附近,或者在最坏的情况下添加到 "其他 "部分的末尾。
确保您要添加的部分未满。您可以通过计算该部分的参数数来检查该部分是否已满,并确保最后一个元素小于下一个部分的第一个元素。例如,"杂项 "部分的第一个参数是 #20,而 my_new_parameter 是 #36。如果下一节从 #36 开始,我们就无法在此处添加新参数。
不要在组中间添加参数,从而导致现有参数的插槽发生变化
请勿使用旁边带有 "已废弃 "或 "已移除 "注释的槽,因为有些用户的 eeprom 中可能还保留着这些旧参数的默认值,因此新参数的默认值可能会设置得很奇怪。
枚举 {
// 杂项
//
k_param_log_bitmask = 20,
k_param_log_last_filenumber, // *** 已停用 - 去除
// 与 下一个 eeprom 编号
// 改变
k_param_toy_yaw_rate, // 索尔 "这款" 内存
// 地点 对于 的
// 亚乌 费率 1 = 快,
// 2 = 药物, 3 = 慢
k_param_crosstrack_min_distance, // 弃用 - 去除 与 下一个 eeprom 编号 改变
k_param_rssi_pin,
k_param_throttle_accel_enabled, // 弃用 - 去除
k_param_wp_yaw_behavior,
k_param_acro_trainer,
k_param_pilot_velocity_z_max,
k_param_circle_rate,
k_param_sonar_gain,
k_param_ch8_option,
k_param_arming_check_enabled,
k_param_sprayer,
k_param_angle_max,
k_param_gps_hdop_good, // 35
k_param_my_new_parameter 参数, // 36
步骤 #2: 在枚举下面的参数类中声明变量。可能的类型包括 AP_Int8、AP_Int16、AP_Float、AP_Int32 和 AP_Vector3(注意:目前不支持无符号整数)。变量名称应与新枚举相同,但去掉 "k_param_"前缀。
// 254,255: 矜持
};
AP_Int16 格式版本;
AP_Int8 软件类型;
// 遥测 控制权
//
AP_Int16 sysid_this_mav;
AP_Int16 sysid_my_gcs;
AP_Int8 serial3_baud;
AP_Int8 延迟;
AP_Int16 高度;
AP_Int8 已启用声纳;
AP_Int8 声纳类型; // 0 = XL, 1 = LV,
// 2 = XLL (XL 与 10m 范围)
// 3 = HRLV
AP_Float 声纳增益;
AP_Int8 电池监测; // 0=残, 3=电压 只是,
// 4=电压 和 当前
AP_Float 伏特比;
AP_Float 每伏特电流;
AP_Int16 包装容量; // 电池 一包 能力 更少 后备
AP_Int8 已启用电池故障安全功能; // 电池 故障安全 启用
AP_Int8 已启用 failsafe_gps_enabled; // 全球定位系统 故障安全 启用
AP_Int8 故障安全系统; // 地面 火车站 故障安全 行为
AP_Int16 gps_hdop_good; // 全球定位系统 Hdop 价值 低于 其中 代表着 a 好 位置
AP_Int16 新参数; // 我的 新 规范'说明在此
步骤 #3: 将变量声明添加到 参数.cpp
// @Param: 新参数
// @DisplayName: 我的 新 参数
// @描述: A 描述 的 我的 新 规范 去 这里
// @Range: -32768 32767
// @ 用户: 高级
GSCALAR(新参数, "MY_NEW_PARAMETER";, 默认新参数),
@参数 ~ @用户注释用于地面站(即Mission Planner地面站)向用户显示建议,并限制用户可设置的参数值。
参数名称(如 "MY_NEW_PARAMETER")最多 16 个字符。
步骤 #4: 将参数默认设置添加为 config.h
#ifndef MY_NEW_PARAMETER_DEFAULT
# define MY_NEW_PARAMETER_DEFAULT 100 // 我的新参数的默认值
#endif
大功告成!新参数可以从主代码(而不是库)中以 g.my_new_parameter 的形式访问。
备注
ArduPilot 载具的全局参数类非常拥挤。为避免超出载具参数类的最大参数数,我们引入了另一个全局参数类(名为 "ParametersG2")。在该类中添加参数与在库中添加参数类似。添加到该类中的参数同样可以从载具的主代码中访问。
为库添加参数¶
也可以通过以下步骤将参数添加到库中,这些步骤使用 AP_Compass 图书馆为例。
步骤 #1: 将新的类变量添加到顶层 .h 文件中(即 Compass.h).可能的类型包括 AP_Int8、AP_Int16、AP_Float、AP_Int32 和 AP_Vector3f。还可以为参数添加默认值(我们将在第二步中使用该值)
#define MY_NEW_PARAM_DEFAULT 100
类 指南针
{
公:
int16_t product_id; /// 产品 本我
int16_t mag_x; ///<; 磁性 领域 力量 沿着 的 X 轴线
int16_t mag_y; ///<; 磁性 领域 力量 沿着 的 Y 轴线
int16_t mag_z; ///<; 磁性 领域 力量 沿着 的 Z 轴线
uint32_t 最后更新; ///<; 微型() 时间 的 最后一个 更新
bool 健康的; ///<; 真 如果 最后一个 阅读 好的
/// 构造函数
///
指南针();
受保护的:
AP_Int8 _方向;
AP_Vector3f _offset;
AP_Float 解散;
AP_Int8 使用_for_yaw; ///<;以便 使用 对于 打呵欠 计算
AP_Int8 自动解散; ///<;以便 自动 偏角 代码
AP_Int16 _my_new_lib_parameter_参数; /// 描述 的 我的 新 规范
};
步骤 #2:将变量添加到 .cpp 文件的 var_info 表中(即 Compass.cpp),包括 @Param ~ @Increment 注释,以便 GCS 向用户显示说明,并控制地面站设置的最小值和最大值。添加新参数时要注意
插槽(即下面的 "9")比前一个变量高一个。
参数名称(即 MY_NEW_P)的长度小于 16,包括要添加的对象前缀。例如,罗盘对象的前缀是 "COMPASS_"。
缢 AP_Param::群组信息 指南针::var_info[] = {
// 索引 0 是 中古 对于 的 久远 方向 基体
// @Param: OFS_X
// @DisplayName: 指南针 偏置 关于 的 X 轴线
// @描述: 偏移 至 是 附加的 至 的 指北针 x-轴线 价值观 至 赔偿 对于 金属 于 的 画框
// @Range: -400 400
// @Increment: 1
<;剪具>;
// @Param: 方向
// @DisplayName: 指南针 方向
// @描述: "这款" 方向 的 的 指北针 相对的 至 的 (飞行)控制器 官方.
// @ 价值: 0:无,1:Yaw45,2:Yaw90,3:Yaw135,4:Yaw180,5:Yaw225,6:Yaw270,7:Yaw315,8:Roll180
AP_GROUPINFO("方向";, 8, 指南针, _方向, 旋转_无),
// @Param: MY_NEW_P
// @DisplayName: 我的 新 图书馆 参数
// @描述: "这款" 新 图书馆 规范 描述 去 这里
// @Range: -32768 32767
// @ 用户: 高级
AP_GROUPINFO("MY_NEW_P";, 9, 指南针, _my_new_lib_parameter_参数, 我的新参数默认值),
AP_GROUPEND
};
该参数可以在库中作为 _my_new_lib_parameter 访问。请注意,我们将参数设为 "protected"(受保护的),因此类外部无法访问它。如果我们将其设置为 "公共",那么主代码和 "compass._my_new_lib_parameter "都可以访问它。
步骤 #3: 除了 .cpp 文件中的定义外,在新库类的 .h 文件 public 部分添加 var_info 的声明:
天电 缢 结构 AP_Param::群组信息 var_info[];
步骤 #4: 如果该类是全新添加到代码中的(而不是像 AP_Compass 这样的现有类),则应将其添加到主载具的 var_info 表中的 参数.cpp 文件(其在 var_info 表中的顺序并不重要)。下图红色部分为 Compass 类出现的位置。
缢 AP_Param::信息 var_info[] = {
// @Param: 格式版本
// @DisplayName: Eeprom 格式 版本 编号
// @描述: 这 价值 是 增量 当 变化 是 作出 至 的 eeprom 格式
// @ 用户: 高级
GSCALAR(格式版本, "FORMAT_VERSION";, 0),
<;剪具>;
// @Group: COMPASS_
// @Path: ../图书馆/AP_Compass/指南针.cpp
物品(指北针, "COMPASS_";, 指南针),
<;剪具>;
// @Group: INS_
// @Path: ../图书馆/惯性传感器/惯性传感器.cpp
物品(保险, "INS_";, 惯性传感器),
AP_VAREND
};
步骤 #5: 如果该类是全新添加到代码中的,则还应将 k_param_my_new_lib 添加到 参数.h中的 GOBJECT 声明的第一个参数。 参数.cpp.请阅读枚举上方的注释,了解新值的位置,因为这里的顺序很重要。
更改参数类型¶
有时需要更改或重命名参数。ArduPilot 具备从一个版本到另一个版本进行管理的功能,因此升级时总能保留用户配置的参数。参数以 eeprom 中的插槽为键,因此如果占用的插槽没有改变,那么参数就不会改变--无论其名称如何。但如果需要更改类型,则需要将参数移至新插槽,并保留现有插槽,以防止意外配置。为了保留配置,需要将其从旧槽复制并转换到新槽。
步骤 #1: 将现有参数的索引改为未使用的索引,并添加注释,大意是保留旧槽。
步骤 #2: 为了找出转换的关键:
将 AP_PARAM_KEY_DUMP 定义设为 "1" 在 AP_Param.h 中
在 SITL 中启动旧代码,将显示所有参数名称及其神奇数字
从 Copter 的 Parameters.cpp 文件的 现有参数转换表,如姿态控制增益转换表.
参数转换有效期¶
参数转换是必要的,以确保用户升级到 ArduPilot 更新版本时的连续性。不过,转换过程会占用一些启动资源,并增加代码的闪存成本。因此,我们不再永久保留转换代码。为便于查找和删除转换,请在添加的任何参数转换上方添加以下注释:
// 参数转换 - 已添加: 八月-2021
请使用上述日期格式,以免产生歧义。还请将日期与关键词 "PARAMETER_CONVERSION "保持在同一行,以便在搜索代码时可以看到日期。当添加到已有的 AP_Param::ConversionInfo 表时,请将转换作为一个新块添加,并在新块上方添加转换注释。例如
缢 AP_Param::转换信息 q_conversion_table[] = {
// PARAMETER_CONVERSION - 添加时间:2018 年 1 月
{ 参数::k_param_quadplane, 4044, AP_PARAM_FLOAT, "Q_P_POSZ_P"; }, // Q_PZ_P
{ 参数::k_param_quadplane, 4045, AP_PARAM_FLOAT, "Q_P_POSXY_P";}, // Q_PXY_P
{ 参数::k_param_quadplane, 4046, AP_PARAM_FLOAT, "Q_P_VELXY_P";}, // Q_VXY_P
{ 参数::k_param_quadplane, 78, AP_PARAM_FLOAT, "Q_P_VELXY_I";}, // Q_VXY_I
{ 参数::k_param_quadplane, 142, AP_PARAM_FLOAT, "Q_P_VELXY_IMAX";}, // Q_VXY_IMAX
// PARAMETER_CONVERSION - 添加时间: Aug-2021
{ 参数::k_param_quadplane, 206, AP_PARAM_FLOAT, "Q_P_VELXY_FLTE";}, // q_vxy_filt_hz
// PARAMETER_CONVERSION - 添加时间:2018 年 1 月
{ 参数::k_param_quadplane, 4047, AP_PARAM_FLOAT, "Q_P_VELZ_P";}, // Q_VZ_P
{ 参数::k_param_quadplane, 4048, AP_PARAM_FLOAT, "Q_P_ACCZ_P";}, // Q_AZ_P
{ 参数::k_param_quadplane, 80, AP_PARAM_FLOAT, "Q_P_ACCZ_I";}, // Q_AZ_I
{ 参数::k_param_quadplane, 144, AP_PARAM_FLOAT, "Q_P_ACCZ_D";}, // Q_AZ_D
{ 参数::k_param_quadplane, 336, AP_PARAM_FLOAT, "Q_P_ACCZ_IMAX";}, // Q_AZ_IMAX
// PARAMETER_CONVERSION - 添加时间: Jun-2019
{ 参数::k_param_quadplane, 400, AP_PARAM_FLOAT, "Q_P_ACCZ_FLTD";}, // Q_AZ_FILT