为旋翼飞行器添加新参数

参数既可以是主代码的一部分,也可以是程序库的一部分。

在主代码中添加参数

步骤 #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: 为了找出转换的关键:

参数转换有效期

参数转换是必要的,以确保用户升级到 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