PX4多旋翼位置控制

多悬翼的位置控制由内外环控制,外环P控制作用于位置差,产生期望速度,内环PID作用于速度差,产生期望油门,然后将油门解算成期望姿态。

 

  • 外环位置控制的三种控制源

1.Manual

  手动控制下通过手动的输入直接产生期望速度,然后进入内环速度控制(不经过外环)

2.Offboard

  离线外部控制模式,即飞机所需要的一些数据:位置、速度都是来源于飞控外部期望位置、速度航向,都不是计算出来的,而是由外面的直接给出来的。

3.Auto

通过内外环控制,通过期望位置计算出期望姿态

 

  • 以下是位置控制流程,我们不难发现系统的输入除了期望位置以外,还输入了期望偏航角用于解算油门

 

  • 外环控制

  • 内环控制

 

  • Control_auto 

这个函数用于自动控制模式下,让飞机进行航线任务,除了内外环PID控制之外,还需要对系统输入的期望位置进行修正,并且这个修正较为复杂。

在自动模式下,期望位置修正分为两部分,第一部分是Z方向,第二部分是XY方向,Z方向控制优先

Z方向上

其中

Vel_sp_z=_vel_sp(2)+Z轴最大加速度* dt  (加速过程)

       min_vel_z+slope*dist_to_current_z (减速过程)

       dis_to_current_z * P参数         (离当前期望位置较近)

 

XY方向上分为两部分,当前位置Current航点之后,当前位置Current之前

Vx是Vel_sp_along_track,它的计算与当前位置和prev,current两点的位置有关。

### PX4 旋翼无人机姿态控制程序解析 #### 姿态控制器架构概述 PX4旋翼姿态控制系统是一个分层设计的闭环反馈系统,主要包括内环角度速率控制和外环角度控制两部分。该系统通过接收来自外部传感器的数据并结合设定点信息来调整电机输出,实现稳定飞行。 #### 内环角速度控制 为了精确地维持期望的姿态,在内部存在一个快速响应的角度速率回路。此环节负责将实际测量得到的身体坐标系下的角速度转换为目标指令所对应的参考值之间的差异,并利用PID算法计算出所需的转矩命令: ```cpp // 计算角速度误差 Vector3f rate_error = _rate_setpoint - gyro; // 应用 PID 控制律获得力矩需求 _vector_thrust_body += _ctrl_rate.getControl(rate_error, dt); ``` 上述代码片段展示了如何基于当前陀螺仪读数`gyro`与预期角速度设定点 `_rate_setpoint` 来求得偏差 `rate_error` ,进而调用 PID 调节器对象 `_ctrl_rate` 获取最终施加于机体上的额外推力矢量[^1]。 #### 外环姿态控制 在外围则构建了一个较慢但更注重精度的态度保持机制。它接受由导航模块产生的航向、俯仰及横滚角作为输入信号,并将其转化为相应的角速度设定点传递给内环处理: ```cpp // 更新姿态估计 _quat.setFromEuler(roll_sp, pitch_sp, yaw_sp); // 将四元数形式的姿态设为新的状态机目标 _attitude_setpoint.q_d = _quat; // 使用四元数差乘法获取旋转矩阵中的前两个轴方向 _matrix_R_to_earth = Matrix3f(_attitude_setpoint.q_f).transpose(); _matrix_R_to_body = Matrix3f(_quat).transpose(); // 得到相对于水平面投影后的期望朝向变化率 Vector2f body_z_axis_proj = rpy_from_rotation(_matrix_R_to_body)[2].xy().normalize(); Vector2f earth_z_axis_proj = rpy_from_rotation(_matrix_R_to_earth)[2].xy().normalize(); // 设置横向偏移补偿项 float lateral_offset_compensation = atan2(-body_z_axis_proj.y(), body_z_axis_proj.x()) - atan2(-earth_z_axis_proj.y(), earth_z_axis_proj.x()); // 构建完整的三维空间内的角速度请求 Vector3f att_rate_setpoint(lateral_offset_compensation * Kp_roll, (pitch_angle_desired - attitude_estimate.pitch) * Kp_pitch, heading_rate_command); ``` 这里实现了从欧拉角表示的姿态目标至角速度域的具体映射过程;其中涉及到四元数运算用于表征刚体转动关系,同时也考虑到了侧风等因素可能引起的附加扰动修正[^3]。 #### 推力分配策略 当完成内外双闭环调节之后,下一步就是依据所得总合力矩大小合理安排各执行机构的工作强度。对于常规布局类型的旋翼平台而言,通常会采用如下方式来进行动力学解耦和平滑过渡: ```cpp for (int i = 0; i < NUM_ACTUATORS; ++i){ float thrust_i = base_thrust + mix_factor[i][ROLL]*moment_x + mix_factor[i][PITCH]*moment_y+ mix_factor[i[YAW]]*moment_z; // 防止出现异常情况导致失控现象的发生 if (!isfinite(thrust_i)){ thrust_i = 0.f; } } ``` 这段伪码描述了按照预定义好的混合系数矩阵 `mix_factor[][]` 对整体作用效果按需拆分成单个螺旋桨应承担的任务份额,并且加入了必要的数值检验措施以保障安全性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值