ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

不完全信息Epsilon纳什均衡的航天器追逃博弈复现与Matlab仿真

不完全信息Epsilon纳什均衡的航天器追逃博弈复现与Matlab仿真

复现一篇带"不完全信息"和"Epsilon纳什均衡"字样的航天器末端追逃博弈论文,听起来就比常规的LQR追击问题高一个档次。这篇文章的完整标题是"不完全信息Epsilon纳什均衡航天器末端追逃博弈策略(基于EKF的参数估计与自适应博弈)",我花了大约三周时间把它从公式一步步推到了Matlab仿真结果。整个过程踩了不少坑,也积累了很多工程细节,这篇博文就把完整的复现思路、核心公式推导、代码实现细节和调试经验一次性讲清楚。

先说结论:这篇论文的核心创新点有三个。第一,把传统追逃博弈从"完全信息"假设推广到了"不完全信息",追击者和逃逸者都不知道对方的精确参数;第二,用EKF(扩展卡尔曼滤波)在线估计对手的未知参数,而不是假设参数直接已知;第三,基于估计结果自适应地调整博弈策略,最终收敛到Epsilon纳什均衡。这三个点环环相扣。如果你正在做航天器交会对接、空间目标逼近或相关的制导控制研究,这篇复现过程对你应该很有参考价值。

1. 项目概述与核心思路

1.1 追逃博弈在航天器末端场景中的实际意义

航天器末端追逃不是简单的"追得上追不上"的问题。真实场景里,追击器要接近目标飞行器,而目标飞行器会机动规避,这是一个典型的双人零和微分博弈——一方要最小化相对距离,另一方要最大化相对距离或者最小化自己被捕获的概率。末端阶段的特点是:相对速度大、机动时间短、对实时性要求极高,几秒钟的决策延迟可能就决定了整个任务的成败。

传统做法是把问题简化成线性二次型最优控制,或者直接用比例导引之类的制导律。但这样做有个明显缺陷:它把逃逸器当作"不动的目标"或"匀速运动的目标"来对待,忽视了逃逸器也在实时做机动决策。博弈论的引入让双方都有了明确的策略意图,追击器做决策时必须把逃逸器的反应考虑进去,这才是"博弈"的含义。末端场景里,一次成功的拦截不是单纯的速度优势问题,而是策略对抗的胜负问题。

1.2 不完全信息与Epsilon纳什均衡的引入逻辑

完全信息博弈在航天器追逃里有一个致命假设:双方都知道对方的全部参数,比如推力加速度上限、燃料剩余、最大过载等。但现实中几乎不可能做到这一点。追击器可能只知道逃逸器的大致类型,不知道它的真实推力参数;逃逸器同样也可能不知道追击器的制导策略参数。这就是不完全信息。

不完全信息直接导致一个问题:经典的纳什均衡要求双方都能精确求解对方的最优响应,现在这个前提不成立了。论文给出的解决方案是用Epsilon纳什均衡来放松这个要求。所谓Epsilon纳什均衡,就是任何一个单方面偏离自己策略,最多只能带来Epsilon那么大的收益改进。当Epsilon足够小时,这个均衡就是一个可接受的近似解。换句话说,在信息不完全的前提下,双方不需要精确找到"完美的"最优策略,只需要保证自己的策略在Epsilon范围内是最优的即可。

我在复现前查过相关文献,Epsilon纳什均衡在经济学里用得多,在航天控制里相对少。这篇论文把它和EKF估计结合起来,逻辑上是通的:EKF负责把不完全信息逐步变成"越来越完全的信息",Epsilon纳什均衡负责在信息仍然不完全的时候给出一个可计算、有理论保障的策略。这里有个关键心得——不要把Epsilon单纯理解成"误差"或"容差",它实际上是信息不完备程度在策略层面的体现。信息越完备,能取到的Epsilon越小;信息越不完备,Epsilon就得放宽,否则均衡可能求不出来。

1.3 为什么选择EKF做参数估计

追逃博弈里的状态估计天然是非线性的。相对运动方程本身是非线性的,观测方程(比如视线角、相对距离测量)也不是线性的。标准的卡尔曼滤波(KF)要求系统是线性加高斯噪声,这在航天器追逃场景下基本不成立。EKF的思路很简单:在每个时刻对非线性函数做一阶泰勒展开,把系统近似成线性系统,再走标准卡尔曼滤波的预测-更新流程。

用EKF而不是粒子滤波或者无迹卡尔曼滤波(UKF),我猜测论文作者主要考虑三个因素。第一,EKF的计算量最小,在末端追逃这种强实时场景里,运算时间是硬约束;第二,EKF对参数估计这类问题,在初始值不太离谱的情况下收敛性通常够用;第三,EKF实现复杂度低,便于在嵌入式平台上部署。我自己复现时也试过UKF,精度确实略高一些,但计算时间大约是EKF的三倍,调试难度也明显上升。如果论文本身不做滤波算法的对比研究,EKF是性价比最高的选择。

2. 理论基础与模型构建

2.1 航天器末端追逃的动力学模型

论文采用的动力学模型是相对运动方程,基于经典的C-W方程(Clohessy-Wiltshire方程)及其非线性版本。C-W方程描述了目标轨道坐标系下,追踪器相对目标飞行器的运动,适用于圆轨道、近距离相对运动场景。线性化后写成状态空间形式,就是常见的六维状态向量:三个相对位置分量加三个相对速度分量。末端追逃场景一般把初始相对距离设成几十公里量级,相对速度几百米每秒量级,整个博弈时间窗口大约几十秒到几分钟。推力加速度作为控制输入进入状态方程。

我复现时第一个坑就出在这里:论文里没有明确写清楚用的是线性C-W方程还是非线性相对运动方程。从仿真结果反推,论文实际采用的是非线性方程,因为EKF本身的更新需要非线性函数,如果完全用线性模型,EKF就退化成KF了,没必要额外引入。所以我最终采用:状态预测用非线性相对运动方程,状态更新用EKF的一步更新,这样既符合论文设定,又能让EKF真正发挥作用。

2.2 不完全信息博弈的数学刻画

不完全信息在论文里的数学表达是:每个玩家对对手的某个关键参数有一个先验分布,但参数的精确值只有对手自己知道。最典型的是推力加速度上限。追击器不知道逃逸器的最大推力加速度到底是多少,只知道它落在某个区间内,比如[3, 6] m/s²。

这样的博弈叫贝叶斯博弈(Bayesian game)。每个玩家的策略要针对对手参数的所有可能取值都给出响应,而不是只针对一个确定值。但直接求解贝叶斯博弈的均衡往往极其困难,尤其在高维状态空间下。论文巧妙地把问题拆成两步:先用EKF在线估计对手参数,把贝叶斯博弈在每一个时刻"退化成"一个带估计误差的确定性博弈;再在这个确定性博弈框架下求解Epsilon纳什均衡。这样的处理让计算复杂度大幅下降,同时保证了实时性。

这部分我做了一个类比帮助理解:这就像打牌的时候你不知道对手手里是什么牌,但根据他之前的出牌习惯(观测数据)不断更新判断(EKF估计),然后基于判断选择当前最优的出牌策略(Epsilon纳什均衡)。信息在每一轮中逐渐完善,策略也在一轮轮中逐渐优化。

2.3 Epsilon纳什均衡的定义与求解思路

Epsilon纳什均衡的严格定义是:对于博弈中的每个玩家i,如果没有任何玩家可以通过单方面改变策略获得超过Epsilon的收益,那么这个策略组合就是Epsilon纳什均衡。数学表述为:

u_i(s_i^, s_{-i}^) ≥ max_{s_i' ∈ S_i} u_i(s_i', s_{-i}^*) - ε

其中u_i是玩家i的效用函数(在追逃博弈里通常是代价值或支付值),S_i是策略集合,s_{-i}^*是其他玩家的策略组合。

求解Epsilon纳什均衡的思路通常是迭代最优响应(iterative best response):初始给一个策略组合,每一步让每个玩家针对对手当前策略求解自己的最优响应,更新策略,重复直到策略变化幅度小于某个阈值。这个迭代过程不一定总能收敛到精确纳什均衡,但实践中的确可以收敛到Epsilon纳什均衡,也就是每个玩家的策略偏离最优响应的收益损失不超过Epsilon。

复现时我特别注意了Epsilon的取值方式。论文中Epsilon不是固定常数,而是和估计误差的协方差矩阵相关联。估计误差越小,Epsilon取值越小,均衡越"严格"。这个设计在逻辑上非常自洽:信息估计精度直接决定了博弈策略的可信程度,也决定了均衡的精细程度。

3. EKF参数估计模块的设计与实现

3.1 状态向量设计与观测方程

EKF的状态向量不是单纯的相对运动状态,而是把需要估计的未知参数扩展进了状态向量。最常见的方式是增广状态向量:

x_aug = [x_rel; v_rel; p_unknown]

其中x_rel和v_rel是相对位置和相对速度(六个分量),p_unknown是待估计的未知参数(比如逃逸器的推力加速度上限)。增广之后,状态方程变成x_aug_dot = f(x_aug, u, t)。这个增广状态方程的特点是:未知参数的导数为零(假设参数在博弈过程中不变化),这样EKF就能通过观测数据持续修正对参数的估计。

观测向量一般包括:相对距离(雷达测量)、视线角(光学传感器测量),有时候还包括相对速度(多普勒测量)。我在复现中采用相对距离加两个视线角的组合,一共三个观测分量。这个组合在工程上最容易实现,也最有代表性。观测噪声考虑为高斯白噪声,协方差矩阵R对应各传感器的测量精度。

3.2 EKF递推流程与关键参数设置

EKF的递推流程分预测和更新两步。预测阶段用非线性状态方程从当前估计值出发,计算下一时刻的先验估计和协方差矩阵:

x_pred = x_est + f(x_est, u, dt) P_pred = F * P_est * F' + Q

其中F是状态方程对状态向量的雅可比矩阵,Q是过程噪声协方差矩阵。更新阶段用观测方程计算卡尔曼增益,修正先验估计:

K = P_pred * H' * (H * P_pred * H' + R)^(-1) x_est = x_pred + K * (z - h(x_pred)) P_est = (I - K * H) * P_pred

其中H是观测方程对状态向量的雅可比矩阵,R是测量噪声协方差矩阵。

这里有几个参数对收敛性影响极大。Q矩阵设置太小,EKF会过度信任模型预测,参数估计收敛慢;设置太大,估计结果抖动剧烈。我的经验是采用"对角加小扰动"的方式:相对位置和速度对应的Q元素取1e-6到1e-4量级,未知参数对应的Q元素取1e-8左右,表示参数在短时间内基本不变但允许缓慢漂移。初始协方差矩阵P0反映了对初始状态估计的信心,参数对应的P0元素不能太小,否则EKF几乎没有修正参数的能力。我踩过的一个坑就是P0设得太小,结果EKF对参数的真实值根本不响应,估计值一直停留在初始猜测附近。合理设置是:状态变量取1e-4量级左右,参数取1到10量级。

3.3 参数可观测性与收敛性分析

参数可观测性是EKF参数估计里绕不开的问题。简单说,就是你拿到的观测数据里,到底能不能"看出"这个参数的影响。如果观测完全不包含参数的信息,EKF无论怎么调,参数都不可观测,估计结果只会是初始值的延续。

在追逃场景里,逃逸器的推力加速度上限是否可观测,取决于逃逸器是否真的在机动。如果逃逸器全程不机动,那它的推力参数就不会对相对运动产生任何影响,EKF自然无法估计出真实值,可能只能估计出一个"下界"。论文里实际上假设逃逸器会执行最优逃逸策略,也就是在博弈过程中一定会用到自己的推力,这样就保证了参数的可观测性。

我复现时验证了这个逻辑:把逃逸器的机动幅度人为调小之后,参数估计的误差明显变大,收敛速度也变慢。这说明"激励"对参数估计非常重要。为了达到论文中的理想效果,仿真场景里逃逸器的机动必须是"足够的",否则后面的自适应博弈就缺少了基础。

4. 自适应博弈策略与核心算法

4.1 自适应策略的迭代更新机制

自适应博弈的核心思想是:每个决策周期内,玩家先基于EKF的当前估计值,把对手视为"参数已知"的对手,然后求解对应的最优策略。随着EKF估计越来越准确,这个最优策略也会越来越接近完全信息下的最优策略。

具体实现上,我把整个博弈过程分成多个决策周期,每个周期内执行三个步骤:第一步,用EKF更新对对手参数的估计;第二步,将参数估计值代入博弈模型,求解Epsilon纳什均衡;第三步,根据均衡策略计算本周期的最优控制输入,作用于动力学模型。三个步骤循环进行,直到博弈结束(追击成功、逃逸成功或达到时间上限)。

这里有一个工程细节值得注意:策略更新的频率和EKF更新的频率未必需要一致。EKF可以每个仿真步长都做一次更新,但博弈策略的求解计算量大,更适合以固定的决策周期执行。我复现时把仿真步长设为0.1秒,EKF每个步长更新一次,而博弈策略每2秒更新一次。这个分层设计既保证了估计的实时性,又控制了计算负载。

4.2 代价函数与最优响应求解

追逃博弈的代价函数通常设计成终端代价格加过程代价的组合。追击器的目标是让终端相对距离尽可能小,同时消耗的控制能量尽可能少;逃逸器的目标则相反,要让终端相对距离尽可能大,同时保存自己的控制能量。也就是说,这本质上是一个零和博弈,追击器的收益就是逃逸器的损失,只是两者各自的控制能量权重不同。

代价函数的具体形式是:

J = Φ(x(T)) + ∫₀ᵀ L(x(t), u_p(t), u_e(t)) dt

其中Φ是终端代价项,L是过程代价项(通常是控制能量的积分)。追击器最小化J,逃逸器最大化J(等价于最小化它自己的代价函数)。

最优响应的数值求解是这样做的:给定对手的控制策略(在决策周期内视为固定),把最优控制问题离散化,变成一个非线性规划问题,用Matlab的fmincon函数求解。这样把微分博弈近似成了序列化的最优控制问题,这个"轮流求最优响应"的过程就是前面说的迭代最优响应方法。

4.3 Epsilon均衡的判定条件与跳出机制

迭代最优响应最大的风险是不收敛或者振荡。两个玩家的策略互相影响,可能出现交替更新、循环往复不收敛的情况。判断是否达到Epsilon纳什均衡,我的做法是看策略在两次连续迭代中的变化量:

Δ = max_i || s_i^(k+1) - s_i^(k) ||

当Δ小于某个阈值时,认为策略已经稳定,必然满足Epsilon纳什均衡的定义,因为任何一个玩家在下一步迭代中最多只能改善Δ那么大的收益。跳出机制是设置最大迭代次数(一般20次),如果达到最大次数仍然不收敛,就接受当前策略作为近似均衡解,同时把Epsilon的值适当放大。

实际仿真中我发现一个很微妙的现象:Epsilon可以设置成动态值,和EKF估计的协方差矩阵范数绑定。前期估计误差大,Epsilon自动放宽,策略迭代容易收敛;后期估计精度提升,Epsilon自动收紧,策略质量也随之提升。这个动态机制我认为是论文里最重要的创新点之一,值得在复现时重点体会。

5. Matlab代码实现与工程细节

5.1 整体代码架构与模块划分

我把Matlab代码分成了五个模块:动力学模块、EKF估计模块、博弈策略模块、仿真主循环和结果可视化模块。

动力学模块负责计算相对运动状态方程和观测方程,同时提供雅可比矩阵的数值计算。EKF估计模块实现标准的预测-更新流程。博弈策略模块负责迭代最优响应的求解,内部调用fmincon。仿真主循环控制整个时间推进,并在适当的时间间隔调用策略更新。结果可视化模块负责绘制相对轨迹、参数估计收敛曲线和策略变化图像。

模块化结构非常重要,因为复现论文代码最怕的就是把什么都写在一个大脚本里。模块化之后每个模块可以单独测试,有问题容易定位。我调试时先把EKF模块单独拎出来,用一组已知参数生成观测数据,验证EKF能不能把参数估计回去;再把博弈策略模块单独测试,验证在完全信息(估计值等于真值)条件下能不能收敛到纳什均衡。分模块测试通过后再跑整体仿真,省去了大量联调时间。

5.2 关键函数实现与参数配置

先看EKF的核心更新函数,我用Matlab实现的基本框架如下:

function [x_est, P_est] = ekf_update(x_pred, P_pred, z, dt, u) % 计算观测雅可比矩阵 H H = compute_observation_jacobian(x_pred); % 计算预测观测值 z_pred = h(x_pred); % 新息(innovation) innov = z - z_pred; % 创新协方差 S = H * P_pred * H' + R; % 卡尔曼增益 K = P_pred * H' / S; % 状态更新 x_est = x_pred + K * innov; % 协方差更新(Joseph形式提高数值稳定性) IKH = eye(length(x_pred)) - K * H; P_est = IKH * P_pred * IKH' + K * R * K'; end

注意我用了Joseph形式的协方差更新,而不是更简单的P_est = (I - K*H)*P_pred。这是因为在参数估计问题里,协方差矩阵容易出现非正定或者不对称的情况,Joseph形式能把这些问题降到最低。这个细节是踩过坑之后的经验之谈。

敌方参数的真实值我设成:逃逸器的推力加速度上限为5.2 m/s²,追击器初始猜测为3.5 m/s²。仿真的核心看点就是EKF能不能快速把估计值从3.5拉到接近5.2。参数配置整理成了一张表,方便按表复现:

参数符号取值说明
初始相对位置r0[10; 5; -2] km目标轨道坐标系下的相对位置
初始相对速度v0[-100; 20; 5] m/s相对速度初值
追击器推力上限u_pmax8 m/s²追击器自身已知
逃逸器推力上限u_emax5.2 m/s²逃逸器真实值,追击器未知
参数初始猜测p03.5 m/s²追击器对逃逸器参数的先验估计
过程噪声Qdiag(1e-6, ..., 1e-8)状态/参数分别设置
测量噪声Rdiag(10, 0.01, 0.01)距离/角度分别设置
仿真总时长T60 s博弈时间窗口
仿真步长dt0.1 s数值积分步长
策略更新周期T_control2 s博弈策略更新频率

5.3 仿真场景设置与结果分析要点

仿真场景采用目标轨道坐标系,追击器和逃逸器在同一个轨道面内进行末端博弈。初始相对距离约11.2公里,相对速度接近100 m/s,整个60秒的时间窗口内,追击器需要不断逼近逃逸器,逃逸器则持续机动规避。

结果分析时我最关心三个指标。第一个是参数估计值与真值的偏差随时间的变化,看EKF能不能收敛、收敛速度有多快。第二个是追逃双方相对距离的变化曲线,看最终的拦截或逃逸结果。第三个是Epsilon值的变化趋势,验证自适应机制是否有效:前期Epsilon应该较大,后期逐渐变小,说明策略在信息完善的过程中持续优化。

从复现结果来看,EKF大约在10秒左右就完成了主要参数的收敛,估计值从3.5逐步逼近5.2附近。相对距离曲线前期变化较平缓,中期开始出现明显的拉锯,后期追击器凭借先手优势逐渐占据主动。Epsilon从初期的约0.5逐步下降到末期的0.05以下,符合自适应博弈的设计预期。

6. 复现过程中踩过的坑与调试心得

6.1 常见问题速查表

复现过程里我整理了以下高频问题,每一个都是实际遇到过并解决的:

问题现象可能原因解决方案
EKF参数估计不收敛Q中参数对应元素太小增大对应Q元素至1e-7~1e-8
参数估计收敛到错误值初始P0参数元素太小将P0参数元素设为1~10
协方差矩阵出现负特征值协方差更新用了简化形式改用Joseph形式更新
迭代最优响应不收敛最大迭代次数太小或Epsilon固定增大迭代次数,动态调整Epsilon
fmincon求解失败控制约束设置不合理放松约束,检查fmincon选项
相对轨迹振荡剧烈策略更新频率过高延长策略更新周期到2秒以上
仿真结果与论文图不符初始条件或坐标系定义不同仔细核对论文的坐标系定义

6.2 数值稳定性与收敛性调试技巧

数值稳定性是追逃博弈仿真里最头疼的问题之一。相对运动动力学方程本身是刚性的,加上EKF的矩阵运算和fmincon的迭代求解,任何一个环节出现数值问题都会导致整个仿真崩溃或者结果明显失真。

我的调试经验是"由简到繁":先用完全信息版本跑通整个流程,即假定双方都知道对方参数,确认博弈策略模块本身没有逻辑问题;然后打开EKF估计模块,先给一个非常准的初始猜测,确认EKF不会把正确的估计值"带偏";最后再把初始猜测调差,验证EKF的修正能力。每一步测试都有明确的检验指标,任何一个环节不符合预期都能快速定位。

关于fmincon的使用,我强烈建议设置完所有选项后,先用一个极简的测试算例验证一遍。比如固定逃逸器策略不变,只有追击器做优化,这时候最优解应该是一个开环最优控制问题。如果这一步都跑不对,说明fmincon设置有问题,后面整个博弈迭代必然出问题。

6.3 从复现到改进的个人体会

复现完这篇论文后,我的体会是:论文最重要的不是最后的几张仿真图,而是"EKF估计 + 自适应策略 + Epsilon均衡"这个三位一体的框架。它提供了一个可扩展的范式:换掉EKF可以用UKF或者粒子滤波,换掉零和博弈假设可以推广到更一般的主从博弈,换掉Epsilon均衡可以尝试更严格的均衡概念。这种模块化的思路让论文的价值远超一份代码本身。

最后再分享一个小技巧:如果你也打算复现类似的博弈论文,建议先把代价函数里各个项的权重记录下来。不同论文对控制能量的权重差别很大,直接决定仿真结果的性质。我最初复现时权重设置和论文不一致,导致追击器几乎是直线冲过去,完全体现不出博弈的"策略性"。调了好几组权重才找到和论文匹配的那一组。拿到论文的第一时间,先尝试从公式和图像里反推权重的量级关系,这能帮你省掉大量盲目试错的时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进