侧边栏壁纸

PX4中自定义参数在QGC中设置

2024年11月20日 364阅读 0评论 1点赞

PX4中自定义参数在QGC中可设置

一、背景

在使用 PositionSmoothing 来进行位置平滑时,首次使用需要对相关数据进行初始化,包括以下参数:

参数名称描述函数调用
最大横向/纵向加速度为生成的轨迹设置最大加速度。setMaxAccelerationXY(float accel)
最大垂直加速度为生成的轨迹设置最大垂直加速度。setMaxAccelerationZ(float accel)
最大加速度为生成的轨迹设置最大加速度(X、Y、Z轴均设置)。setMaxAcceleration(const Vector3f &accel)
最大横向/纵向速度为生成的轨迹设置最大速度。setMaxVelocityXY(float vel)
最大垂直速度为生成的轨迹设置最大垂直速度。setMaxVelocityZ(float vel)
最大速度为生成的轨迹设置最大速度(X、Y、Z轴均设置)。setMaxVelocity(const Vector3f &vel)
最大横向误差设置轨迹生成器允许的最大横向误差。setMaxAllowedHorizontalError(float error)
垂直接受半径设置垂直接受半径。setVerticalAcceptanceRadius(float radius)
巡航速度设置飞行器的巡航速度。setCruiseSpeed(float speed)
横向轨迹位置误差比例增益设置横向轨迹位置误差的比例增益。setHorizontalTrajectoryGain(float gain)
目标接受半径设置目标接受半径。setTargetAcceptanceRadius(float radius)
最大加加速度设置生成轨迹的最大加加速度(jerk)。setMaxJerkXY(float jerk)
最大垂直加加速度设置生成轨迹的最大垂直加加速度。setMaxJerkZ(float jerk)
最大加加速度(全轴)设置生成轨迹的最大加加速度(X、Y、Z轴均设置)。setMaxJerk(const float jerk)

在实验中,通过修改源码来调整数据非常不便,因此可以引入 自定义参数,通过 QGC (Ground Control Station) 来动态调整参数,方便使用和实验。


二、加入自定义参数

自定义参数的配置

PX4 的自定义参数配置格式参考:PX4 参数与配置文档

以下是参数定义模板:

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

添加自定义参数的步骤

由于此处涉及位置控制,因此在 src/modules/mc_rate_control/mc_rate_control_params.c 中加入自定义参数:

////////////////////
//  QGC中新增参数  //
///////////////////

/**
 * 最大横向/纵向加速度
 *
 * 为生成的轨迹设置最大加速度。
 *
 * @min 0.0
 * @max 10.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_A_XY, 3.0f);

/**
 * 最大垂直加速度
 *
 * 为生成的轨迹设置最大垂直加速度。
 *
 * @min 0.0
 * @max 10.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_A_Z, 3.0f);



/**
 * 最大横向/纵向速度
 *
 * 为生成的轨迹设置最大速度。
 *
 * @min 0.0
 * @max 20.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_V_XY, 3.0f);

/**
 * 最大垂直速度
 *
 * 为生成的轨迹设置最大垂直速度。
 *
 * @min 0.0
 * @max 10.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_V_Z, 3.0f);

/**
 * 最大横向误差
 *
 * 设置轨迹生成器允许的最大横向误差。
 *
 * @min 0.0
 * @max 5.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_H_ERR, 1.0f);

/**
 * 垂直接受半径
 *
 * 设置轨迹生成器垂直接受半径。
 *
 * @min 0.0
 * @max 5.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_V_ACC_RAD, 0.5f);

/**
 * 巡航速度
 *
 * 设置轨迹生成器飞行器的巡航速度。
 *
 * @min 0.0
 * @max 20.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_CRUISE_SPD, 3.0f);

/**
 * 横向轨迹位置误差比例增益
 *
 * 设置横向轨迹位置误差的比例增益。
 *
 * @min 0.0
 * @max 2.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_XY_TRAJ_GAIN, 1.0f);

/**
 * 目标接受半径
 *
 * 设置目标接受半径。
 *
 * @min 0.0
 * @max 5.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_TGT_RAD, 0.5f);

/**
 * 最大加加速度
 *
 * 设置生成轨迹的最大加加速度(jerk)。
 *
 * @min 0.0
 * @max 50.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_JK_XY, 4.0f);

/**
 * 最大垂直加加速度
 *
 * 设置生成轨迹的最大垂直加加速度。
 *
 * @min 0.0
 * @max 50.0
 * @decimal 2
 * @group 平滑初始化参数
 */
PARAM_DEFINE_FLOAT(MC_MAX_JK_Z, 4.0f);

// 这里是无法编译通过的参数,不支持结构体,但这三个参数的设置均可通过同类型的分别设置

// /**
//  * 最大加速度
//  *
//  * 为生成的轨迹设置最大加速度(X、Y、Z轴均设置)。
//  *
//  * @min 0.0
//  * @max 10.0
//  * @decimal 2
//  * @group 平滑初始化参数
//  */
// PARAM_DEFINE_VECTOR3F(MC_MAX_ACCEL, 3.0f, 3.0f, 3.0f);

// /**
//  * 最大速度
//  *
//  * 为生成的轨迹设置最大速度(X、Y、Z轴均设置)。
//  *
//  * @min 0.0
//  * @max 20.0
//  * @decimal 2
//  * @group 平滑初始化参数
//  */
// PARAM_DEFINE_VECTOR3F(MC_MAX_VEL, 3.0f, 3.0f, 3.0f);

// /**
//  * 最大加加速度(X、Y、Z轴均设置)
//  *
//  * 设置生成轨迹的最大加加速度(jerk) (X、Y、Z轴均设置)。
//  *
//  * @min 0.0
//  * @max 50.0
//  * @decimal 2
//  * @group 平滑初始化参数
//  */
// PARAM_DEFINE_VECTOR3F(MC_MAX_JK, 4.0f, 4.0f, 4.0f);

同时在 src/modules/mc_rate_control/MulticopterRateControl.hpp 中注册参数:

// QGC参数设置
// 这里注意最后一条不需要','否则会编译不通过
(ParamFloat<px4::params::MC_MAX_A_XY>) _param_mc_max_a_xy,   /**< 最大横向/纵向加速度 */
(ParamFloat<px4::params::MC_MAX_A_Z>) _param_mc_max_a_z,     /**< 最大垂直加速度 */
// (ParamVector3f<px4::params::MC_MAX_ACCEL>) _param_mc_max_accel, /**< 最大加速度 */
(ParamFloat<px4::params::MC_MAX_V_XY>) _param_mc_max_v_xy,   /**< 最大横向/纵向速度 */
(ParamFloat<px4::params::MC_MAX_V_Z>) _param_mc_max_v_z,     /**< 最大垂直速度 */
// (ParamVector3f<px4::params::MC_MAX_VEL>) _param_mc_max_vel,  /**< 最大速度 */
(ParamFloat<px4::params::MC_MAX_H_ERR>) _param_mc_max_h_err, /**< 最大横向误差 */
(ParamFloat<px4::params::MC_V_ACC_RAD>) _param_mc_v_acc_rad, /**< 垂直接受半径 */
(ParamFloat<px4::params::MC_CRUISE_SPD>) _param_mc_cruise_spd, /**< 巡航速度 */
(ParamFloat<px4::params::MC_XY_TRAJ_GAIN>) _param_mc_xy_traj_gain, /**< 横向轨迹位置误差比例增益 */
(ParamFloat<px4::params::MC_TGT_RAD>) _param_mc_tgt_rad,     /**< 目标接受半径 */
(ParamFloat<px4::params::MC_MAX_JK_XY>) _param_mc_max_jk_xy, /**< 最大加加速度(横向/纵向) */
(ParamFloat<px4::params::MC_MAX_JK_Z>) _param_mc_max_jk_z   /**< 最大垂直加加速度 */
// (ParamVector3f<px4::params::MC_MAX_JK>) _param_mc_max_jk,    /**< 最大加加速度(X、Y、Z轴均设置) */

更新参数元数据

添加自定义参数后,需执行以下命令更新元数据和重新编译:

make distclean
make parameters_metadata
make px4_sitl_default gazebo

三、使用自定义参数

在使用的 control_node_smooth 中,调用以下代码初始化参数:

// 定义 initialize_smoothing 并使用作用域
void ControlNodeSmooth::initialize_smoothing() {
    // 获取参数值
    double param_mc_max_a_xy = _param_mc_max_a_xy.get();
    _position_smoothing.setMaxAccelerationXY(param_mc_max_a_xy);
    PX4_INFO("param_mc_max_a_xy=%lf", param_mc_max_a_xy);
}

在需要使用参数的头文件中定义:

// QGC 参数设置
(ParamFloat<px4::params::MC_MAX_A_XY>) _param_mc_max_a_xy; /**< 最大横向/纵向加速度 */

四、注意事项

  • 参数命名长度限制:定义参数时,参数名如 MC_MAX_A_XY 不能超过 16 字节长度,否则会导致报错。
  • 元数据更新:修改参数后必须执行 make parameters_metadata 来刷新元数据,否则可能导致参数无法生效。
  • 参数精度:参数定义中的 @decimal 决定了小数位精度,需根据需求设置。

五、示例图片

03c0ad52c86f3fb0ef3b0399d6cdd6c
f4901ff5d733df7fb8c83bcafe05f69
118a44cabe4dde923d93f9514be1f64


通过上述步骤,可以成功在 PX4 中添加自定义参数,并通过 QGC 动态设置参数值,极大提高了调试和实验的效率。

1

—— 评论区 ——

昵称
邮箱
网址
取消
博主栏壁纸
12 文章数
5 标签数
1 评论量
人生倒计时
标签云
舔狗日记