☰
不完全信息航天器追逃博弈的EKF与ε-纳什均衡复现解析
2026/10/22 16:06:23 网站建设 项目流程

看到【期刊复现】不完全信息Epsilon纳什均衡航天器末端追逃博弈策略这个标题,做航天器博弈与制导控制方向的同行应该有亲切感。这类工作核心是在追逃双方只能通过带噪声观测互相猜底牌时,把传统微分博弈升级成不完全信息框架,用EKF做参数估计,再用ε-纳什均衡撑起自适应策略。我复现时最大的感受是:模型和算法读起来并不难,真正折磨人的是把EKF估出来的参数稳定地送进博弈求解器,还得保证整条仿真链路不炸。这篇博文就围绕标题这条主线,把问题建模、EKF实现、ε-纳什均衡求解逻辑、Matlab代码结构和调试经验全部摊开讲,适合正在复现类似论文的研究生、做制导控制算法的工程师,以及想了解追逃博弈加滤波估计这套技术栈怎么落地的读者。

1. 追逃博弈模型与不完全信息的来龙去脉

1.1 末端追逃场景的数学化描述

航天器末端追逃博弈,直观理解就是追的一方和逃的一方在末端交会阶段互相较劲。追方要降低相对距离并减少视线角误差,逃方则尽量拉开距离或者把视线角带偏。工程上可以用相对运动状态变量描述:相对位置、相对速度、视线角、视线角速率,控制输入是双方各自推力。

这里注意"末端"是有讲究的,它不是全程轨道博弈,而是从某个交会窗口开始到终端时刻T为止的有限时间博弈。时域有限带来的直接后果是终端约束变得非常重要。你想让追方在T时刻把距离压到多少、视线角控制在什么范围,边界条件不同,策略差异会非常大。

动力学上,如果是近距末端交会场景,很多复现工作直接用线性化的相对运动方程(C-W方程)加上非线性视线角模型。我在复现时选了带重力差和J2扰动项的简化模型,不是追求绝对精确,而是要保留"不完全信息"的特性:逃方机动参数未知,系统存在过程噪声。这一点必须说清楚——如果仿真模型太理想,EKF就没有存在价值了。

1.2 纳什均衡到ε-纳什均衡的工程化改造

完全信息微分博弈里,双方都清楚对方的动力学和目标函数,可以求解同时最优的纳什均衡策略对。但现实航天器之间不会互相报参数,你只能通过雷达、光学敏感器去观测对方轨迹,噪声还很大。于是不完全信息博弈登场。

完全纳什均衡的严格定义是:没有一方能通过单方面改变策略获得更高收益。但在连续状态、非线性动力学下,严格均衡非常难求,而且对估计误差极端敏感——参数稍微偏一点,最优策略可能就完全变了。ε-纳什均衡把条件放松成"单方面偏离带来的收益提升不超过ε"。这样工程上才可行:只要估计误差带来的收益损失控制在容忍范围内,这套策略就算数。

我习惯把它类比成打牌:你不知道对手手里究竟有没有那张关键牌,但只要你的打法在各种可能牌型下输得都不多,这个打法就是可用的。ε就是你能接受的"输不多"的上限。

1.3 为什么非要用"自适应博弈"这套组合拳

不完全信息下最直接的思路是把对方参数当作已知常值去做确定性博弈,但这样一旦对方调整机动策略,你的均衡策略立刻失效。自适应博弈的思路是:每个控制周期,先用当前观测更新对方参数的估计值,再基于最新估计重新求解均衡策略。估计-决策-执行形成一个闭环,策略能跟上对手变化。

这套组合拳的工程含义很重要:EKF负责"看",博弈求解器负责"想",执行机构负责"动"。任何一环延迟都可能导致策略滞后,所以我后面会专门讲同步问题。很多复现代码跑出来结果很怪,核心原因往往就在同步环节。

2. EKF参数估计模块:在不完全可观测里逼近对手底牌

2.1 增广状态:把对手加速度变成状态量

EKF要估计的是"对方机动参数"。常见做法是把逃方的加速度分量(或者是推力幅值、机动频率)扩充进状态向量。比如原状态是6维(相对位置3加相对速度3),扩成8维,多出来的2维就是逃方在视线坐标系下的加速度分量。

扩维是手段不是目的。关键原因是:航天器的视线测量只能拿到相对角度和距离,无法直接拿到加速度,但加速度又在动力学方程里起着决定性作用,所以必须把它作为隐状态估计出来。这就是"不完全信息"这个词在技术上的落脚点。

增广状态要注意时间尺度匹配。加速度变化的时间常数如果和相对运动时间常数不在一个量级,EKF协方差就会很难调。我复现时把逃方机动建模成一阶马尔可夫过程,相关时间取10到20秒,配合末端博弈时长60到100秒,效果比较稳定。

2.2 EKF预测-校正流程的Matlab落地

EKF的循环分两步:预测和校正。预测用动力学模型把状态和协方差推到当前时刻;校正用观测残差修正状态。

核心Matlab代码框架如下:

% 状态: x = [r; v; aE]; % 观测: 视线角方位角/俯仰角 + 相对距离 % 预测 f = dynamics_relative(x, dt); % 状态转移(含逃方加速度 aE 的演化) F = compute_jacobian(x, dt); % 状态转移雅可比 x_pred = f; P_pred = F * P * F.' + Q; % Q 过程噪声协方差 % 校正 H = measurement_jacobian(x_pred); % 观测雅可比 K = P_pred * H.' / (H * P_pred * H.' + R); x_post = x_pred + K * (z - h(x_pred)); % z 为实际测量值 P_post = (eye(n) - K * H) * P_pred;

这里最容易被忽略的是compute_jacobian和measurement_jacobian必须用离散化的真实模型,而不是连续模型直接近似。我开始图省事用了连续模型雅可比,仿真步长一大就发散。后来改成对离散状态转移做数值差分雅可比(也可以用符号工具箱生成),稳了很多。

协方差矩阵Q和R的取值建议在仿真前做几组扫描。R可以从传感器误差指标换算,Q则需要根据对手机动不确定性手动标定。我的经验是:Q初值让参数维对应的元素比状态维大一个数量级,这样EKF对参数变化更敏感,收敛更快。

2.3 可观测性与初值设置的工程心得

增广后系统未必完全可观测。如果观测只有视线角,逃方加速度某些方向可能无法估计——也就是不同加速度值产生几乎相同的测量序列,滤波器只能给出一个后验平均值。这个问题没有万能解,只能靠设计测量模型回避:尽量加入相对距离和多通道视线角信息,并且在仿真场景中避免观测几何退化。

初值方面,状态初值里逃方参数的初始猜测要写在配置脚本里,不要随手填0。我第一次调试时把加速度初值设为0,EKF前30秒疯狂波动,后来改成和真实值同量级但带偏差的初值(比如真实0.5 m/s²,初值给0.2 m/s²),收敛更快也更稳。这是很反直觉但又非常实用的经验。

3. ε-纳什均衡求解与自适应策略更新

3.1 有限时域上的极小极大求解思路

求解ε-纳什均衡,背景是有限时域微分博弈。我在复现时没有直接解HJI方程(连续状态下没有解析解),而是把整个时域离散成N步,每一步构造一个极小极大优化问题:追方最小化终端距离加控制代价,逃方最大化同一个指标。这样就把微分博弈转成序列决策问题。

离散化的好处是可以用数值优化方法。我采用滚动时域:当前时刻k,对[k, T]区间做N步优化,取第一步控制执行,下一拍重新估计、重新求解。这和模型预测控制的框架几乎一样,区别只是目标函数是双边的。

3.2 数值迭代逼近纳什均衡的完整流程

求解有限时域纳什均衡需要两方策略同时满足各自最优。常用做法是高斯-赛德尔式迭代:

  1. 初始化逃方策略序列。
  2. 固定逃方策略,用非线性优化(fmincon)求追方最优策略。
  3. 固定追方策略,用优化求逃方最优策略。
  4. 重复第2和第3步,直到两轮策略变化带来的收益差小于ε。

这个迭代需要控制节奏。我最初一次都不迭代直接跑,结果追方明显吃亏;迭代30轮后双方收益收敛到均衡附近。但30轮乘每轮两次优化,单步耗时太大。后来发现一个技巧:初始用简化线性模型求初值,再切到完整模型迭代5到8次就够,速度和精度都能兼顾。

3.3 自适应闭环:估计-决策-执行的同步问题

自适应博弈主循环如下:

for k = 1:N 1. EKF更新 -> 得到当前对手参数估计值 2. 基于最新参数重新求解 ε-纳什均衡策略 3. 执行当前步最优控制 4. 推进仿真并采集新观测 end

这里最大的坑是同步:EKF更新的是过去时刻的参数,而策略求解需要当前时刻参数,直接拿滞后参数去求解会引发震荡。我的处理是让EKF输出的后验状态先做一步状态外推,再把外推值送给博弈求解器。这一步外推很好地缓解了滞后,代价是半个控制周期的时间延迟,实测下来系统稳健很多。

另外要注意同一时刻只能有一个策略在跑。如果EKF和策略求解都在主循环里顺序执行,最好把求解器调用频率设为控制频率的一半,给足收敛时间。很多复现结果出现高频抖振,多半是因为求解器没收敛就执行了控制。

4. Matlab代码架构与关键模块实现

4.1 工程目录与模块划分

代码组织对复现类项目非常重要,否则改一个参数要翻半天。我建议按下面结构组织:

project/ ├── main.m % 主脚本,串起整个仿真流程 ├── config_params.m % 所有可调参数集中管理 ├── dynamics/ │ ├── relative_dynamics.m │ └── dynamics_jacobian.m ├── estimator/ │ ├── ekf_predict.m │ ├── ekf_update.m │ └── init_ekf.m ├── game/ │ ├── solve_nash_iteration.m │ ├── objective_pursuer.m │ └── objective_evader.m └── plot_results.m % 结果可视化

模块划分的原则是"改参数不进代码",所有需要标定的量都放在config_params.m里。我踩过的坑就是一开始把仿真时长直接写死在主脚本里,结果做参数扫描时要改三处,教训很深。

4.2 相对运动动力学仿真模块

相对运动方程我采用离散化推进,而不是直接在每个控制周期里用解析解。原因很简单:博弈策略需要踩每个时刻的状态,而解析解在考虑变加速度时很麻烦,数值推进反而简洁。

% relative_dynamics.m % 输入x=[r; v; aE],控制uP(追方加速度指令),dt为步长 function x_next = relative_dynamics(x, uP, dt) A = cw_matrix(n); % 相对运动线性项矩阵 B = control_matrix(n); % 简单梯形积分,兼顾稳定性和速度 x_next = x + dt * (A*x + B*uP + [0;0;0; aE(x)]); x_next(7:8) = x_next(7:8) + dt * (-x_next(7:8)/tau); % 一阶马尔可夫机动 end

注意梯形积分在dt=0.1秒时完全够用,没必要上四阶Runge-Kutta。如果你把dt压到0.01去和RK4对比,精度差异在10^-3量级,但计算时间翻了几倍。仿真博弈这种场景,速度比那点精度重要。

4.3 EKF参数估计模块

EKF模块按标准两步写,关键在雅可比矩阵。我推荐用数值差分自动生成雅可比,这样改动力学方程后不用手动重推公式:

% 数值雅可比生成 F = zeros(n, n); for i = 1:n x_pert = x; x_pert(i) = x_pert(i) + 1e-6; F(:, i) = (f(x_pert) - f(x - perturb)) / (2*perturb(i)); end

中心差分比单侧差分更稳,虽然多一倍的动力学调用,但对EKF这样对数值敏感的地方完全值得。用数值雅可比还有一个好处:如果后来把动力学方程从C-W模型换成更复杂的轨道模型,EKF模块不需要大改,只换状态转移函数就行。

4.4 策略求解与主循环

策略求解模块里我用了fmincon作为底层优化器。需要注意fmincon是在求局部最优,而博弈问题往往非凸,所以要提供好的初值。我的做法是用上一时刻的最优策略序列做热启动,这样迭代收敛快且不易跳到完全不同的局部解。

主循环核心代码如下:

% main.m 主循环(简化) for k = 1:N_window % 1. 更新EKF [x_est, P_est] = ekf_predict(x_est, P_est, uP_history(:,k-1), dt); [x_est, P_est] = ekf_update(x_est, P_est, z_measured(:,k)); % 2. 一步外推,补偿参数滞后 x_future = relative_dynamics(x_est, uP_guess, dt); % 3. 求解ε-纳什均衡 [uP_now, strategyE] = solve_nash(x_future, params); % 4. 执行控制并仿真推进 x_true = relative_dynamics(x_true, uP_now, dt); z_measured(:,k+1) = generate_measurement(x_true, R); end

看过很多复现代码,我发现大家最常犯的错是在第3步之后重新用x_est而不是x_true更新EKF。这里必须强调:EKF的输入永远是带噪声的观测z_measured,不是仿真真值x_true,否则滤波就白做了,估计误差曲线看起来完美,但完全失真。

4.5 参数设置与可视化输出

仿真参数我按"末端交会"场景取了一套参考值,不一定适合所有论文,但可以当作标定起点:

参数取值说明
初始相对距离8 km末端窗口起点
初始相对速度200 m/s沿视线方向
追方最大加速度5 m/s²推力上限约束
逃方最大加速度3 m/s²对方未知待估
观测周期0.1 s传感器采样
终端博弈时长60 s有限时域
过程噪声Q1e-3 ~ 1e-1根据方差标定
测量噪声R1e-4 ~ 1e-2按传感器换算

可视化我喜欢画三张图:相对距离变化曲线、EKF对逃方加速度的估计误差收敛曲线、以及ε随时间变化(或收益差值变化)。前两张用于验证,第三张用于检查均衡求解质量。如果ε一直不下降,说明迭代次数不够或者博弈模型与EKF的参数没对齐。

5. 复现过程中踩过的坑与调试实录

5.1 滤波器发散的经典诱因

EKF发散是我在复现时第一个遇上的硬骨头。现象是相对距离估计在仿真第10秒左右开始偏离真值,随后协方差矩阵P出现对角线元素变成NaN。

排查过程有两条线:一是检查雅可比是否写错,特别是增广参数维度对状态转移的影响;二是Q矩阵如果不是正定或者R矩阵数量级不对,滤波大概率翻车。根治方案是:先用无噪声数据跑一遍EKF,如果无噪声数据下都发散,说明模型错了;如果无噪声正常、加噪声发散,再调Q和R。

无噪声先行的原则很基础但极其有效,我后续复现任何滤波器都先做这个验证。这个习惯帮我省下大量排查时间。

5.2 均衡求不出来怎么办

迭代求解ε-纳什均衡不收敛是我遇到的高频问题。现象是fmincon报"目标函数不存在梯度",或者迭代十几轮后策略在相邻两轮之间来回跳,像振荡。

处理思路分两步:

  1. 检查目标函数的可导性。如果用了饱和函数、阶跃逻辑,目标函数不光滑,局部优化器会随机抖动。我后来把所有不光滑项换成光滑近似(比如用softplus代替max(0,x)),迭代就稳定了。

  2. 增加正则项。在双方目标函数中加上控制变化量的二次惩罚,抑制相邻迭代间的策略跳变。这个正则项会让最终收益略微偏离理论纳什均衡,但偏差本身就是ε的一部分,所以完全可接受。

5.3 和论文结果对不齐时的排查思路

复现类项目最焦虑的就是"为什么我的曲线和论文不一样"。我总结了一套排查顺序:

先检查对手策略是否真的和论文一致。很多论文说"逃方采用最优响应策略",但实际上是次优或启发式策略,你如果按理论最优去对,曲线肯定差得远。

再检查终端约束和边界条件是否一致。末端追逃博弈对终端时间T极其敏感,T差5秒都可能让胜负数颠倒。

最后检查坐标系定义。视线坐标系、惯性系、轨道系搞错是常见低级但致命的错误,尤其当论文里不写清楚坐标变换矩阵时。我用一个固定的基准轨迹做单元测试,确认三个坐标系之间的旋转矩阵满足正交性约束(A'*A=I),能发现大部分问题。

5.4 常见问题速查表

现象可能原因解决方法
EKF协方差出现NaNQ非正定或雅可比错误无噪声先行验证,改用数值雅可比
策略高频抖振求解器未收敛就执行延长迭代轮数,或降低策略更新频率
ε值不下降目标函数不光滑换光滑近似,加控制变化正则项
追方胜算远低于论文逃方模型用的是最优而非论文的简化策略核对对方控制策略类型
估计误差长期有偏可观测性退化增加视线角通道或距离观测,避免几何退化
仿真时耗过大迭代求解太频繁热启动初值,用简化模型求初解

说实话,做完这套复现之后我对"不完全信息"的理解比读论文时深了一大截。EKF只是把你带到一个"还算看得清"的位置,真正的重点是博弈策略怎么在参数误差存在的前提下保持稳定,或者说ε要怎么选才既宽松又严谨。我个人后续在这个方向还会再扩展,比如把逃方机动从马尔可夫过程换成带切换的混合模型,或者把求解器从离线迭代改成在线近似,目标是让策略更新频率再往上提。最后再给个建议:所有参数和模型定义全部写进配置文件,每一次调参留个记录,复现类项目拼的其实就是这些细节的积累。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询