Ardupilot四元数姿态控制函数attitude_controller_run_quat解析

解析Ardupilot中四元数姿态控制函数attitude_controller_run_quat的工作原理,包括姿态误差计算、期望角速率更新及前馈叠加过程。

在开始阅读本文之前,建议可以先看一下前面几篇博文,当然你基础好直接看也是没事的~
详解APM的开方控制器sqrt_controller
Ardupilot倾转分离函数thrust_heading_rotation_angles
Ardupilot前馈及平滑函数input_euler_angle_roll_pitch_yaw解析

 

源码解析

以n系简称NED坐标系,b系简称机体坐标系,tb表示期望姿态,cb表示当前姿态。

// 根据姿态误差计算得出期望角速率
void AC_AttitudeControl::attitude_controller_run_quat()
{
   
   
	// 检索四元数车辆姿态
	// 获取到当前姿态的四元数并保存到attitude_vehicle_quat
    Quaternion attitude_vehicle_quat;
    _ahrs.get_quat_body_to_ned(attitude_vehicle_quat);

	// 计算姿态误差
	// _attitude_target_quat:输入参数,在n系下期望姿态的四元数,旋转方向tb->n
	// attitude_vehicle_quat:输入参数,在n系下当前姿态的四元数,旋转方向cb->n
	// attitude_error_vector:传入传出参数,姿态误差向量
	// _thrust_error_angle:传入传出参数,期望z轴和当前z轴的误差(详见轴角分离),即推力方向上的偏差角
	// 该函数通过前两个输入的四元数参数计算得到各轴的姿态偏差
	// 经过此函数后得到的参数均在b系下
    Vector3f attitude_error_vector;
    thrust_heading_rotation_angles(_attitude_target_quat, attitude_vehicle_quat, attitude_error_vector, _thrust_error_angle);

	// P控制器,输入为姿态误差,输出为期望角速率
	// 函数内部根据是否开启了sqrt_controller来区分计算各通道的期望角速率_rate_target_ang_vel
	// 是,则使用开方调整过的P控制器
	// 否,则使用常规的Kp*error
    _rate_target_ang_vel = update_ang_vel_target_from_att_error(attitude_error_vector);

	// 对P控制器输出叠加前馈项,尝试确保侧倾和俯仰误差随车身框架而不是参考框架旋转
	// x轴的前馈项 = y轴的姿态误差(限幅后的)*陀螺仪获取的z轴角速度
	// y轴的前馈项 = x轴的姿态误差(限幅后的)*陀螺仪获取的z轴角速度
	// 注意此处并没有对z轴的期望角速率进行处理
    // todo: this should probably be a matrix that couples yaw as well.
    _rate_target_ang_vel.x += constrain_float(attitude_error_vector.y, -M_PI / 4, M_PI / 4) * _ahrs.get_gyro().z;
    _rate_target_ang_vel.y += -constrain_float(attitude_error_vector.x, -M_PI / 4, M_PI / 4) * _ahrs.get_gyro().z;

	// 期望角速率限幅
    ang_vel_limit(_rate_target_ang_vel, radians(_ang_vel_roll_max), radians(_ang_vel_pitch_max), radians(_ang_vel_yaw_max
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值