能量正则化神经MPC:提升全向飞行机器人控制精度的关键技术
1. 项目概述:当神经MPC遇上全向飞行机器人
最近在折腾一个挺有意思的项目,核心就是标题里那串看起来有点唬人的词:“基于能量正则化的全向飞行机器人神经MPC残差动力学学习”。说白了,这其实是一个解决复杂机器人控制问题的“组合拳”方案。全向飞行机器人,比如我们常见的多旋翼无人机,它的魅力在于能在三维空间里自由地前后、左右、上下移动,甚至原地旋转,机动性极强。但想让它精准、稳定、又高效地完成复杂任务,比如在狭窄的仓库里自主穿梭搬运,或者在风中稳定悬停进行检测,传统的控制方法就有点力不从心了。
为什么?因为现实世界太“脏”了。我们用来描述机器人运动的数学模型(动力学模型),无论建得多精细,都只是对真实物理世界的一种近似。电机响应延迟、电池电压波动引致的推力非线性、空气动力学的复杂干扰(尤其是近地或近墙飞行时的地面效应、涡流)、结构形变、传感器噪声……这些“未建模动态”就像一个个隐藏的捣蛋鬼,会让基于理想模型设计的控制器在实际飞行中表现打折,甚至失稳。
于是,我们引入了“神经MPC”(神经模型预测控制)和“残差动力学学习”这套组合。MPC本身是个很棒的框架,它能在每个控制周期,根据当前状态和未来一段时间的预测模型,在线求解一个优化问题,得到最优的控制序列。但它的性能严重依赖预测模型的准确性。神经网络的加入,就是为了用其强大的非线性拟合能力,去学习那个“不完美”的真实动力学与我们的理想模型之间的“残差”。这个残差,就是所有未建模动态和扰动的总和。通过学习它,我们相当于给MPC装上了一副能“看见”隐藏干扰的眼镜,让它做出的预测和决策更贴近现实。
而“能量正则化”,则是这个学习过程中的“纪律委员”。直接让神经网络去拟合残差,它可能会为了最小化眼前的预测误差,而学习到一些物理上不合理、甚至导致系统能量发散的“捷径”。能量正则化通过惩罚那些违反物理能量守恒(或耗散)原则的预测,引导网络学习出更稳定、更物理可信的动力学残差,从根本上提升了学习模型的可靠性和控制器的鲁棒性。这个项目,就是把这几个前沿技术拧成一股绳,尝试让全向飞行机器人在充满不确定性的现实环境中,飞得更稳、更准、更智能。
2. 核心思路与方案选型背后的考量
2.1 为什么是全向飞行机器人+神经MPC?
选择全向飞行机器人作为载体,是因为它代表了空中机器人中动力学耦合性强、控制自由度高的典型挑战。其欠驱动或全驱动的特性使得动力学模型非线性显著,对模型误差极为敏感。传统的PID或线性MPC在简单悬停、轨迹跟踪上尚可,但一旦涉及敏捷机动(如快速避障、翻滚恢复)或在强干扰下作业,性能便急剧下降。
神经MPC的选型,是基于“数据驱动”与“模型驱动”融合的思想。纯数据驱动的端到端强化学习(RL)虽然潜力巨大,但样本效率低、训练不稳定,且“黑箱”特性使得安全验证困难。而纯模型驱动的MPC虽然透明、可解释,但受限于模型精度。神经MPC取二者之长:用一个神经网络来增强(而非替代)基于物理的模型,既利用了物理先验的结构化知识来保证基础稳定性和样本效率,又用数据驱动的方式弥补了模型的不足。具体到实现,我们通常采用“结构化”的神经网络,例如将网络输出作为理想动力学方程的附加项(即残差),这样网络学起来更容易,且学到的模型依然保有部分物理可解释性。
2.2 残差动力学学习:补全模型的“拼图”
残差学习是这个方案的核心创新点。我们不是让神经网络从头学习整个动力学,那太难了,需要海量数据且容易过拟合。相反,我们假设有一个名义模型f_nom(x, u),它由牛顿-欧拉方程推导而来,包含了质量、惯性、重力、基本的推力模型等。这个模型在理想情况下是准确的,但实际有偏差。
我们定义真实动力学为f_true(x, u) = f_nom(x, u) + f_res(x, u)。其中,f_res(x, u)就是需要神经网络学习的残差项。x是状态(如位置、速度、姿态、角速度),u是控制输入(如电机PWM信号或推力指令)。神经网络NN_θ(x, u)的目标就是逼近f_res。
这样做的好处显而易见:
- 降低学习难度:神经网络只需要学习“偏差”,而不是整个复杂的物理过程,任务更简单,收敛更快。
- 保证基础性能:即使神经网络在初期表现不佳,名义模型
f_nom仍能提供一个基础稳定的控制器(如一个调好的PID或LQR),确保系统不会完全失控,便于安全地收集数据。 - 可解释性增强:我们可以分析残差
f_res的大小和规律,来推断是哪种未建模动态在主导(例如,发现角速度高时残差变大,可能暗示了陀螺效应或电机饱和的非线性)。
2.3 能量正则化:为学习套上“物理枷锁”
直接最小化状态预测误差(如用MSE损失)来训练残差网络,是常见做法。但这样训练出的网络可能只是一个“数据拟合器”,它学到的动力学在短期内误差小,但可能隐含着不稳定的模式,比如在某个状态区域预测出会导致能量无限增长的动力。这在控制中是大忌。
能量正则化的思想源于哈密顿或拉格朗日力学中的能量守恒/耗散原理。对于一个稳定的物理系统,其总能量(动能+势能)应该是非增的(考虑阻尼时)或守恒的(无阻尼理想情况)。我们可以利用这一点构造一个正则化项。
假设系统的总能量函数为H(x)。根据动力学方程,能量的变化率dH/dt与广义力(与控制输入和耗散有关)相关。对于一个稳定的被动系统,在零输入下,应有dH/dt ≤ 0。我们虽然学习的是残差,但希望由f_nom + NN_θ构成的整体动力学模型,在“行为上”更像一个被动或严格无源的系统。
因此,我们在训练神经网络的损失函数中,除了预测误差L_pred,额外增加一个能量正则化项L_energy:L_total = L_pred + λ * L_energy其中λ是正则化系数。
L_energy的一种常见设计是惩罚那些导致能量非耗散变化的预测。例如,计算基于学习模型预测出的能量变化率dH/dt_pred,然后定义L_energy = max(0, dH/dt_pred)^2。这样,只有当模型预测能量会增加(违反被动性)时,才会受到惩罚。这相当于给神经网络的学习过程增加了一个软约束,引导它去寻找那些不仅拟合数据,而且符合物理能量规律的解。这能显著提升学习模型的闭环稳定性,即使在外界扰动下,基于该模型的MPC也更倾向于产生镇定系统的控制指令。
注意:能量函数
H(x)的设计需要根据具体机器人来定。对于全向飞行机器人,通常包括平移动能、旋转动能和重力势能。正则化的强度λ需要仔细调节,太小不起作用,太大会迫使网络过度满足能量约束而牺牲预测精度。
3. 系统架构与核心模块拆解
3.1 整体框架与数据流
整个系统可以看作一个“学习-预测-控制”的闭环。下图勾勒了其核心架构与数据流动关系:
[ 真实机器人 ] <--传感器数据(状态x)-- [ 状态估计器(如VIO、IMU滤波)] | | | 控制指令u | 估计状态x_est V V [ 执行器(电机)] [ 数据缓冲区 ] | | | | 历史数据 (x, u, x_next) V V [ 名义模型 f_nom ] [ 残差神经网络 NN_θ ] | | | | 预测残差 f_res V V [ 增强动力学模型 f_aug = f_nom + f_res ] | | 用于预测 V [ MPC 控制器 ] | | 优化求解未来控制序列 {u} V [ 第一个控制量 u_0 ] | |(闭环反馈) +-----------------+工作流程:
- 在线控制环:在每个控制周期(通常1-10ms),状态估计器提供当前状态估计
x_est。MPC控制器以f_aug作为预测模型,从x_est出发,优化未来一段时域内的控制序列,并将第一个控制量u_0发送给机器人执行。 - 离线/在线学习环:同时,机器人的实际状态变化数据(
x, u, x_next)被记录到数据缓冲区。定期或不定期地,用这些数据来训练/更新残差神经网络NN_θ。训练时,损失函数包含基于f_aug的状态预测误差和能量正则化项。
3.2 名义动力学模型 f_nom 的构建
对于典型的全驱动多旋翼(如六旋翼带倾斜机构或八旋翼),其名义模型基于刚体动力学。状态x通常包含位置p(三维)、速度v(三维)、四元数q(或欧拉角) 表示姿态、机体角速度ω(三维)。控制输入u是各电机的推力指令。
关键方程包括:
- 平移动力学:
m * v_dot = R(q) * F_b + m * g * e_z。其中m是质量,R(q)是从机体坐标系到世界坐标系的旋转矩阵,F_b是机体坐标系下的总推力矢量,g是重力加速度,e_z是世界坐标系下的天向单位矢量。对于全向机器人,F_b不一定是[0,0,T_sum],其各个分量都可能受控。 - 旋转动力学:
I * ω_dot = τ_b - ω × (I * ω)。这是欧拉方程,I是机体惯性张量,τ_b是机体坐标系下的总力矩矢量,×表示叉乘。 - 电机模型:建立从电机指令
u(如PWM或期望转速)到F_b和τ_b的映射。这通常是一个线性或二次映射,取决于螺旋桨拉力系数、力矩系数以及电机的布局(分配矩阵)。
f_nom就是将上述微分方程离散化(例如采用欧拉法或龙格-库塔法)后的状态转移函数:x_{k+1} = f_nom(x_k, u_k)。这个模型忽略了电机动态、空气阻力、电池效应等。
3.3 残差神经网络的设计与输入输出
神经网络NN_θ的设计需要权衡表达能力和计算效率,因为它在MPC的每次迭代中都会被调用多次进行前向传播。
- 输入层:通常包含当前状态
x和控制输入u。为了更好的学习效果,有时会加入一些工程化的特征,比如状态各分量之间的乘积项(捕捉耦合)、归一化后的值等。输入维度可能在15-30之间(取决于状态表示)。 - 隐藏层:2到4层的全连接层(MLP)通常是足够的,因为任务不是学习整个动力学,而是残差。每层神经元数量在128到512之间。激活函数常用ReLU或其变体(如Leaky ReLU),它们在MPC的梯度计算中表现良好(非零梯度)。
- 输出层:输出残差
f_res,其维度应与状态导数x_dot或状态增量Δx的维度一致。通常我们让网络直接输出状态残差Δx_res,那么增强模型的状态更新为:x_{k+1} = f_nom(x_k, u_k) + Δx_res。输出层一般使用线性激活。 - 归一化:对输入数据(状态、控制量)进行标准化(减均值、除标准差)至关重要,能加速训练并提高泛化能力。均值和标准差从经验数据中计算。
一个简单的PyTorch网络结构示例:
import torch import torch.nn as nn class ResidualDynamicsNet(nn.Module): def __init__(self, state_dim, action_dim, hidden_dims=[256, 256]): super().__init__() layers = [] input_dim = state_dim + action_dim for h_dim in hidden_dims: layers.append(nn.Linear(input_dim, h_dim)) layers.append(nn.ReLU()) input_dim = h_dim layers.append(nn.Linear(input_dim, state_dim)) # 输出状态残差 self.net = nn.Sequential(*layers) def forward(self, state, action): x = torch.cat([state, action], dim=-1) residual = self.net(x) return residual3.4 能量正则化损失的具体实现
实现能量正则化的关键在于计算基于学习模型的能量变化率。对于全向飞行机器人,其总机械能H可以定义为:H = 0.5 * m * v^T * v + 0.5 * ω^T * I * ω + m * g * height其中height是位置向量的z分量。
在离散时间设置下,我们关心从一个状态x_k施加控制u_k后,预测的下一个状态x_{k+1}^pred对应的能量H_{k+1}^pred。名义模型预测的状态为x_{k+1}^nom = f_nom(x_k, u_k),神经网络预测的残差为Δx_res = NN_θ(x_k, u_k),因此增强预测为x_{k+1}^pred = x_{k+1}^nom + Δx_res。
能量正则化损失可以设计为:L_energy = torch.mean( torch.relu( (H(x_{k+1}^pred) - H(x_k)) / Δt )^2 )这里Δt是控制周期,torch.relu是ReLU函数,即max(0, ·)。这个损失只惩罚预测能量增加的情况。我们也可以加入一个小的阻尼项,允许微小的能量增加,或者考虑控制输入做的功,设计更精确的耗散不等式。但在实践中,上述简单形式通常已能有效引导学习。
4. 实操流程:从仿真到真机部署
4.1 仿真环境搭建与数据收集
在真机上“盲训”风险极高,因此仿真环境是开发和验证的第一步。
- 选择仿真器:MuJoCo是一个极佳的选择。它物理精度高,速度快,并且支持通过其
mjData结构直接获取状态和施加控制力,方便对接我们的控制器。标题热词中提到的“编译了无 ros 本地 mujoco 仿真平台”正是为了剥离ROS的复杂性,获得更轻量、更可控的仿真循环,这对于需要高频运行MPC和神经网络的环境至关重要。PyBullet是另一个免费开源的好选择,同样提供丰富的API。 - 机器人模型建模:在仿真器中精确构建你的全向飞行机器人模型。这包括几何形状、质量、惯性、关节(电机铰链)、执行器类型(位置、速度或力控)以及传感器(IMU、里程计)。确保你的名义模型
f_nom中的参数(质量、惯性、推力系数)与仿真模型参数一致或非常接近。 - 设计激励轨迹:为了收集覆盖机器人状态-动作空间的有价值数据,需要设计丰富的激励轨迹。这不仅仅是随机的控制信号,而应包含:
- 扫频信号:让机器人在不同频率下进行姿态和位置振荡,以激发其动态特性。
- 阶跃响应:测试电机和系统的瞬态响应。
- 复杂轨迹:如“8”字飞行、快速定点切换、带滚转/俯仰的平移等,以覆盖耦合动力学。
- 注入扰动:在仿真中主动添加风扰、脉冲力、或改变模型参数(如模拟电池电压下降导致的推力衰减),让网络学习如何补偿这些扰动。
- 自动化数据收集:编写脚本,让机器人自动执行上述激励轨迹,并记录每一时刻的状态
x_t、控制输入u_t和下一时刻的状态x_{t+1}。数据量通常需要数十万到百万个数据点。务必做好数据的管理和版本控制。
4.2 残差神经网络的训练与调优
- 数据预处理:将收集到的
(x_t, u_t, x_{t+1})转换为训练样本。计算名义模型预测x_{t+1}^nom = f_nom(x_t, u_t),然后计算目标残差Δx_res_target = x_{t+1} - x_{t+1}^nom。对输入(x_t, u_t)和输出Δx_res_target分别进行标准化。 - 训练循环:
# 伪代码示例 optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) for epoch in range(num_epochs): for batch_states, batch_actions, batch_residuals in dataloader: pred_residuals = model(batch_states, batch_actions) # 预测损失 loss_pred = F.mse_loss(pred_residuals, batch_residuals) # 能量正则化损失 # 首先计算名义预测 batch_next_nom = f_nom(batch_states, batch_actions) # 假设f_nom已向量化 batch_next_pred = batch_next_nom + pred_residuals energy_current = compute_energy(batch_states) energy_next_pred = compute_energy(batch_next_pred) energy_rate = (energy_next_pred - energy_current) / dt loss_energy = torch.mean(torch.relu(energy_rate)**2) # 总损失 loss = loss_pred + lambda_energy * loss_energy optimizer.zero_grad() loss.backward() optimizer.step() - 关键调参:
- 正则化系数 λ_energy:从较小的值(如0.01)开始,观察验证集上的预测误差和闭环仿真稳定性。逐渐增大λ,直到预测误差开始显著恶化,然后选择一个折中点。
- 网络结构与深度:从较小的网络开始(如2层x128)。如果欠拟合(训练和验证误差都高),增加宽度或深度。如果过拟合(训练误差低,验证误差高),增加Dropout层或L2权重衰减。
- 学习率与优化器:Adam优化器通常是不错的选择。使用学习率调度器(如ReduceLROnPlateau)在验证损失停滞时降低学习率。
- 验证策略:不仅要在独立的测试集上评估预测误差,更重要的是进行闭环仿真测试。将训练好的
f_aug模型放入MPC中,在仿真中执行一系列任务,直观地观察控制器的稳定性和性能。这是检验模型好坏的“金标准”。
4.3 神经MPC控制器的实现
MPC是一个在线优化问题。对于我们的系统,在时刻k,问题可以表述为:
minimize Σ_{i=0}^{N-1} [ (x_{k+i|k} - x_ref)^T Q (x_{k+i|k} - x_ref) + u_{k+i|k}^T R u_{k+i|k} ] + (x_{k+N|k} - x_ref)^T P (x_{k+N|k} - x_ref) subject to x_{k+i+1|k} = f_nom(x_{k+i|k}, u_{k+i|k}) + NN_θ(x_{k+i|k}, u_{k+i|k}), i=0,...,N-1 u_min ≤ u_{k+i|k} ≤ u_max, i=0,...,N-1 (可能的其他状态约束)其中N是预测时域,Q,R,P是权重矩阵,x_ref是参考轨迹。
- 求解器选择:由于动力学模型
f_aug包含了神经网络,是非线性且可能非凸的,因此需要使用非线性规划(NLP)求解器。- 学术研究常用:acados、CasADi(搭配IPOPT或SNOPT)。它们支持自动微分,能高效处理包含神经网络的优化问题。acados特别适合嵌入式部署,能生成高效的C代码。
- 工程实践可选:Do-mpc、MPC.jl(Julia)等库也提供了方便的接口。
- 自定义梯度:如果你用PyTorch训练网络,可以利用其自动微分计算动力学约束的梯度,然后传递给求解器。
- 实时性考量:神经MPC的计算开销主要来自求解NLP。为了满足实时控制(>100Hz),需要:
- 限制预测时域
N(通常5-20步)。 - 使用更高效的求解器(如acados的SQP方法)。
- 对神经网络进行剪枝、量化或转换为更高效的推理格式(如TensorRT、ONNX Runtime)。
- 采用热启动策略:将上一个控制周期求解的最优序列作为当前周期的初始猜测,能大幅加速收敛。
- 限制预测时域
- 实现步骤: a. 将训练好的神经网络模型(
NN_θ)和名义模型f_nom整合成一个函数f_aug(x, u)。 b. 使用MPC框架(如acados)定义优化问题,将f_aug作为系统动力学模型设置进去。 c. 配置求解器参数(时域、权重、约束)。 d. 编写主控制循环:获取状态 -> 设置参考轨迹 -> 求解MPC问题 -> 提取第一个控制量并执行 -> 循环。
4.4 从仿真到真机的迁移部署
这是最具挑战性的一步,因为仿真到现实的差距(Sim2Real Gap)依然存在。
- 在环验证:
- 硬件在环(HIL):将运行MPC和神经网络的机载计算机(如Jetson AGX Orin)接入仿真环路。仿真器提供虚拟状态,计算机输出控制量给仿真器。这测试了实际硬件上的代码运行效率和实时性。
- 控制延迟补偿:实测从传感器数据采集、状态估计、MPC求解到电机指令发出的全链路延迟。在MPC的预测模型中显式地加入延迟补偿(例如,将当前状态向前预测延迟时间)。
- 真机安全启动:
- 控制器热切换:真机首先由一个经过充分验证的、鲁棒的基础控制器(如PID)控制并悬停。
- 残差网络“暖机”:在基础控制器稳定飞行时,让残差网络开始运行并预测残差,但不作用于控制。观察其预测输出是否在合理范围内(例如,与名义模型预测的偏差不应过大)。
- 渐进式切换:采用混合控制策略,如
u = (1-α) * u_baseline + α * u_mpc,逐渐将α从0增加到1。或者,在MPC的成本函数中,加入一个惩罚控制量与基础控制器输出偏差的项,在初期将其设大,然后逐渐减小。
- 在线适应:
- 即使在真机上,也可以持续收集数据。可以设置一个安全的数据缓冲区,当机器人处于稳定飞行状态时,将数据加入缓冲区。
- 定期或在检测到性能下降时,在后台用新数据对神经网络进行微调(Fine-tuning)。注意,在线学习必须非常谨慎,要有严格的更新验证机制,防止模型突然恶化导致失控。
5. 常见问题、调试技巧与避坑指南
在实际操作中,你会遇到各种各样的问题。下面是一些典型问题及解决思路。
5.1 神经网络训练不收敛或预测误差大
- 问题表现:训练损失居高不下,或者验证集误差远大于训练集误差。
- 排查步骤:
- 检查数据:这是最常见的原因。可视化你的数据,检查是否有异常值(Outliers)。确保
(x_t, u_t)到x_{t+1}的对应关系是正确的(没有错位)。计算名义模型的预测误差x_{t+1} - f_nom(x_t, u_t),如果这个误差本身就非常小,说明名义模型已经很准,残差学习的空间不大,或者你的任务不需要那么高的精度。如果误差很大但很杂乱,可能需要更多样化的激励数据。 - 检查归一化:确保输入输出都进行了正确的标准化。错误的均值和标准差会导致网络难以学习。
- 降低模型复杂度:如果数据量有限,过大的网络容易过拟合。尝试减少层数或神经元数量,并加入Dropout和权重衰减。
- 调整学习率:学习率太大可能导致震荡不收敛,太小则收敛过慢。使用学习率查找器(LR Finder)或简单的网格搜索。
- 检查能量正则化强度:如果
λ_energy设置得过大,可能会过度约束网络,导致其无法拟合数据中的真实残差。尝试暂时将λ_energy设为0,看预测损失是否能下降。如果能,再逐步增加λ。
- 检查数据:这是最常见的原因。可视化你的数据,检查是否有异常值(Outliers)。确保
5.2 MPC求解失败或计算超时
- 问题表现:求解器返回失败信息(如不可行、达到迭代上限),或者单次求解时间超过控制周期。
- 排查步骤:
- 简化问题:首先,用名义模型
f_nom运行MPC,看是否能正常求解。如果不行,问题可能出在MPC问题本身(约束过紧、权重设置不当、初始猜测差)。 - 检查梯度:当使用神经网络时,确保动力学约束的梯度计算是正确的。可以用有限差分法检查自动微分给出的梯度是否准确。
- 提供更好的初始猜测:使用上一时刻的解作为初始猜测(热启动),能极大提升求解速度和成功率。对于轨迹跟踪,可以用参考轨迹作为状态初始猜测。
- 调整求解器参数:增加最大迭代次数,放宽收敛容忍度。对于acados,可以尝试不同的QP求解器(如HPIPM, OSQP)。
- 降低预测时域:这是最直接减少计算量的方法,但会牺牲一定的前瞻性。
- 网络简化:考虑使用更小、更快的神经网络架构,或者在MPC中使用神经网络的线性化版本(在参考轨迹附近)。
- 简化问题:首先,用名义模型
5.3 真机飞行不稳定、震荡或发散
- 问题表现:切换至神经MPC后,机器人出现高频震荡、缓慢漂移或突然失控。
- 排查步骤:
- 延迟是第一杀手:用高精度计时器测量整个控制回路的延迟。如果延迟超过10ms,必须进行补偿。在MPC模型中,状态
x_k实际上已经是过去的状态,你需要预测x_{k+d}(d为延迟步数)作为优化的初始状态。 - 状态估计质量:神经MPC对状态估计误差非常敏感,特别是速度和角速度。检查你的状态估计器(如VIO、滤波)在高速机动或振动环境下的表现。考虑在MPC中增加对状态估计不确定性的鲁棒性设计(如Tube MPC)。
- 模型失配:仿真中训练的网络可能无法覆盖真机遇到的所有情况(如特定的电机发热特性、新的风扰模式)。在安全条件下(如系绳),记录失控前的数据,分析残差网络的预测是否出现异常。可能需要针对真机数据进行微调。
- 逐步验证:不要一开始就做激进机动。从简单的悬停、小范围平移开始,逐步增加任务难度,观察控制器的表现。
- 加入滤波:对MPC输出的控制指令进行低通滤波,可以抑制高频震荡,但会引入相位延迟,需谨慎。
- 延迟是第一杀手:用高精度计时器测量整个控制回路的延迟。如果延迟超过10ms,必须进行补偿。在MPC模型中,状态
5.4 能量正则化效果不明显
- 问题表现:加入了能量正则化,但闭环系统的能量行为没有明显改善,或者反而变得更差。
- 排查思路:
- 检查能量函数:你定义的系统总能量
H(x)是否物理正确?对于飞行机器人,势能零点设置是否合理?在计算能量变化时,是否考虑了控制输入所做的功?一个更严格的方法是设计基于耗散不等式(Dissipativity Inequality)的正则化,但这更复杂。 - 正则化项权重:
λ_energy可能太小。尝试在验证集上观察,随着λ增大,预测损失和能量损失的变化曲线,找到一个明显的拐点。 - 诊断能量变化:在仿真中,分别记录使用/不使用能量正则化训练出的模型,在闭环控制下的系统能量历史曲线。观察在受到扰动后,能量是否更快地趋于稳定(耗散)。
- 与其他正则化结合:有时单独的能量正则化可能不够,可以结合梯度惩罚(Gradient Penalty)或对网络权重的L2正则化,共同提升模型的平滑性和稳定性。
- 检查能量函数:你定义的系统总能量
这个项目就像在给飞行机器人打造一个不断进化的“小脑”。名义模型是它的先天反射,神经网络是它通过经验学习到的补偿和预判能力,而能量正则化则是确保这种学习不会走火入魔的先天法则。整个过程充满了挑战,从仿真环境的构建、数据的精心设计,到网络训练中的各种“炼丹”调参,再到最后惊心动魄的真机迁移,每一步都需要耐心和细致的调试。但当你看到机器人凭借着学习到的模型,在风中稳稳悬停,或者灵巧地穿过原本无法通过的狭窄通道时,那种成就感是无与伦比的。这条路还很长,比如如何让在线学习更安全高效,如何将视觉等感知信息也融入到动力学学习中,都是值得继续探索的方向。
