发布作者:
Viiicee
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
在使用 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
决定了小数位精度,需根据需求设置。通过上述步骤,可以成功在 PX4 中添加自定义参数,并通过 QGC 动态设置参数值,极大提高了调试和实验的效率。
—— 评论区 ——