1. 四旋翼飞行器控制问题与DDPG算法概述
四旋翼飞行器的姿态控制一直是无人机领域的核心挑战。传统PD控制器虽然结构简单、响应快速,但其固定参数在面对复杂气流扰动、负载变化等动态环境时表现欠佳。我在实际飞行测试中发现,手动调参往往需要耗费数周时间,且很难获得全局最优解。
深度确定性策略梯度(DDPG)算法为解决这一问题提供了新思路。作为结合了值函数方法和策略梯度的强化学习算法,DDPG特别适合处理连续动作空间的控制问题。在四旋翼控制场景中,我们需要同时调节俯仰、滚转、偏航三个通道的6个PD参数(Kp和Kd各3个),这正是DDPG的优势所在。
关键洞见:DDPG的离线策略学习特性使其可以利用历史经验数据进行训练,大幅提升数据利用率。这在实物飞行器训练成本高昂的场景下尤为重要。
2. 控制系统架构设计解析
2.1 内外环控制结构
典型的四旋翼控制采用级联控制结构:
- 外环(位置环):接收期望姿态角指令
- 内环(速率环):生成电机PWM控制信号
matlab复制% 简化版控制流程示例
function [motor_speeds] = control_loop(desired_angles, current_state)
% 外环PD计算期望角速度
omega_desired = outer_pd_controller(desired_angles, current_state.angles);
% 内环PD计算电机指令
motor_speeds = inner_pd_controller(omega_desired, current_state.omega);
end
2.2 PD参数自适应机制
传统固定参数PD控制器的局限性在于:
- 无法适应不同飞行阶段(如起降、巡航)
- 对负载变化敏感(如携带不同重量货物)
- 抗干扰能力有限(如遭遇侧风)
通过DDPG实现的参数自适应系统工作原理:
- 状态观测:飞行器当前姿态、角速度等12维状态
- 动作输出:6个PD参数的调整量
- 奖励函数:设计考虑跟踪误差、控制平滑度等因素
3. Matlab实现关键技术细节
3.1 仿真环境搭建
完整的四旋翼动力学模型应包含:
- 刚体运动方程
- 电机动力学
- 螺旋桨气动效应
matlab复制function [next_state] = quadrotor_dynamics(state, u, dt)
% 状态变量: [phi, theta, psi, p, q, r, x, y, z, vx, vy, vz]
% 控制输入: [motor1, motor2, motor3, motor4]
I = [0.005, 0, 0; 0, 0.005, 0; 0, 0, 0.009]; % 惯性矩阵
l = 0.17; % 轴距
kt = 1.5e-9; % 推力系数
% 计算总推力和力矩
T = kt * sum(u.^2);
tau = [
l*kt*(u(1)^2 - u(3)^2);
l*kt*(u(2)^2 - u(4)^2);
0.1*kt*(u(1)^2 - u(2)^2 + u(3)^2 - u(4)^2)];
% 角加速度
omega = state(4:6);
omega_dot = I \ (tau - cross(omega, I*omega));
% 姿态更新
R = euler2rotmat(state(1:3));
acc = [0; 0; -9.8] + R*[0; 0; T]/0.5; % 假设质量0.5kg
% 状态更新
next_state = zeros(12,1);
next_state(1:3) = state(1:3) + dt*omega2eulerrate(state(1:3))\omega;
next_state(4:6) = state(4:6) + dt*omega_dot;
next_state(7:9) = state(7:9) + dt*state(10:12);
next_state(10:12) = state(10:12) + dt*acc;
end
3.2 神经网络架构设计
演员网络采用三层全连接结构:
- 输入层:12维状态空间
- 隐藏层:64神经元+ReLU激活
- 输出层:6维动作空间+tanh激活(输出归一化到[-1,1])
评论家网络采用状态-动作并联结构:
- 状态分支:64神经元全连接
- 动作分支:直接连接
- 合并层:拼接特征后通过64神经元全连接
matlab复制actorNet = [
featureInputLayer(12,'Name','state')
fullyConnectedLayer(64,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(64,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(6,'Name','output')
tanhLayer('Name','tanh')];
criticNet = [
featureInputLayer(12,'Name','state')
fullyConnectedLayer(64,'Name','state_fc1')
reluLayer('Name','state_relu1')
featureInputLayer(6,'Name','action')
concatenationLayer(1,2,'Name','concat')
fullyConnectedLayer(64,'Name','joint_fc')
reluLayer('Name','joint_relu')
fullyConnectedLayer(1,'Name','qvalue')];
3.3 训练参数配置
关键训练参数设置经验:
- 学习率:演员1e-4,评论家1e-3(评论家需要更快收敛)
- 折扣因子:0.99(考虑长期回报)
- 回放缓冲区:1e6经验样本
- 批次大小:128
- 探索噪声:OU过程,θ=0.15, σ=0.2
matlab复制agentOpts = rlDDPGAgentOptions(...
'SampleTime', 0.01,...
'DiscountFactor', 0.99,...
'MiniBatchSize', 128,...
'ExperienceBufferLength', 1e6,...
'NoiseOptions', rl.option.OrnsteinUhlenbeckActionNoise(...
'Mean', 0,...
'StandardDeviation', 0.2,...
'DecayRate', 0.15));
4. 实际训练技巧与问题排查
4.1 奖励函数设计经验
有效的奖励函数应平衡以下要素:
- 姿态误差惩罚:-k1*(φ_err² + θ_err² + ψ_err²)
- 角速度惩罚:-k2*(p² + q² + r²)
- 控制平滑度:-k3*Σ(Δu)²
- 生存奖励:每步+0.1(鼓励持续飞行)
matlab复制function [reward, done] = calculate_reward(state, action)
% 目标姿态
target = [0; 0; 0];
% 误差计算
angle_error = sum(state(1:3).^2);
rate_penalty = sum(state(4:6).^2);
action_penalty = sum(diff(action).^2);
% 组合奖励
reward = -0.1*angle_error - 0.01*rate_penalty - 0.001*action_penalty + 0.1;
% 终止条件
done = any(abs(state(1:3)) > pi/4) || (state(9) < 0); % 倾角过大或坠地
end
4.2 常见训练问题与解决方案
-
训练初期发散
- 原因:初始探索动作过大
- 解决:降低初始噪声强度,设置动作限幅
-
收敛到局部最优
- 原因:探索不足
- 解决:增加噪声参数,采用课程学习策略
-
训练波动剧烈
- 原因:学习率过高
- 解决:动态调整学习率,添加梯度裁剪
-
过拟合仿真环境
- 原因:模型过于复杂
- 解决:添加正则化,使用域随机化技术
实战技巧:先在小范围参数空间预训练,待稳定后再扩展搜索空间。我通常先用PID稳定点附近的参数作为初始值,将搜索范围设为±50%。
5. 性能评估与实测对比
5.1 仿真环境测试指标
评估指标应包括:
- 姿态稳定时间(settling time)
- 超调量(overshoot)
- 稳态误差(steady-state error)
- 抗干扰能力(施加脉冲扰动后的恢复时间)
测试场景建议:
- 阶跃响应测试
- 正弦跟踪测试
- 抗风扰测试
5.2 与传统PID对比结果
实测数据对比示例(滚转角控制):
| 指标 | 固定PID | DDPG-PID |
|---|---|---|
| 稳定时间(s) | 1.2 | 0.8 |
| 超调量(%) | 15 | 5 |
| 抗风扰误差(deg) | ±8 | ±3 |
| 参数调节耗时 | 3天 | 自动 |
5.3 实物飞行测试注意事项
-
安全措施:
- 加装保护架
- 限制初始飞行高度
- 准备紧急停止机制
-
迁移学习策略:
- 先在仿真环境预训练
- 实物微调时减小学习率
- 使用增量式参数更新
-
实时性保障:
- 简化网络结构
- 定点数量化
- 硬件加速(如GPU)
在最近的一个农业喷洒无人机项目中,采用这种方法将控制参数调节时间从原来的2周缩短到3天,且在不同负载条件下的控制误差减少了40%。特别是在突遇侧风时,自适应PID表现出更强的鲁棒性。