news 2026/10/22 10:48:21

EKF驱动的航天器末端追逃博弈:不完全信息自适应纳什均衡复现与调试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EKF驱动的航天器末端追逃博弈:不完全信息自适应纳什均衡复现与调试

做航天器末端追逃博弈的期刊复现,最让人头疼的往往不是博弈论本身,而是“不完全信息”这四个字落地成代码时,你根本不知道对方下一秒会怎么机动。这篇复现的核心,就是把逃逸器的推力上限、质量特性这些不确定参数,用EKF在线估计出来,再把这个估计值喂给一个自适应的博弈策略求解器,最终在Matlab里跑出一个epsilon纳什均衡意义下的追逃闭环。我前前后后折腾了大约三周,把某期刊论文里的方法完整走了一遍,踩了不少坑,也理清了很多细节。这篇文章就把我复现过程中的思路、代码结构、参数设置和调试经验完整写出来,给后面要做类似工作的同学一条相对顺的路。

先说这个项目是干什么的。末端追逃博弈,通俗讲就是拦截器在最后阶段对着逃逸器做“猫抓老鼠”的博弈,两个航天器在近端交会段各自优化自己的控制策略:追的一方想最小化末端相对距离,逃的一方想最大化它。传统解法假定双方都清楚对方的动力学参数,现实中这根本不成立——你只能通过相对测量去猜对方的能力。于是这套方案拆分成两层:底层EKF做参数估计,上层根据当前估计结果,在一个滚动时域上求解近似纳什均衡策略。两层交替运行,就形成了一套“边猜边打”的自适应博弈闭环。

这篇博文适合正在做航天器交会对接、编队控制、追逃博弈仿真,或者想复现期刊控制算法的研究生和工程师。文章假设你有基本的状态空间方程和卡尔曼滤波基础,但即便这几块不太熟,后面的代码结构和调试心得也应该能让你跑起来。

1. 项目整体思路与关键假设拆解

1.1 末端追逃博弈场景与核心设定

末端追逃,在工程上对应的是拦截段或最终交会段。这个时候双方的相对距离已经从几十公里缩小到几公里以内,轨道动力学的影响逐渐让位于双方自身的推力机动。如果把场景简化成近圆轨道、短时间末端段,相对运动可以用线性化的CWH方程来描述,追逃双方各自施加推力加速度,构成一个典型的零和微分博弈问题。

论文里的设定大致是这样的:追逃双方各有自己的推力上限,逃逸器的真实推力上限、质量比、甚至控制效率这些参数,对追的一方来说都是未知的。追的一方只能通过相对测量(比如相对位置、相对速度)去估计这些未知量。更关键的是,双方都在实时优化自己的策略,追方的每一次估计更新,都会改变整个博弈问题的信息结构,从而影响双方的最优策略。这就是“不完全信息”和“自适应”两个词的技术含义所在。

我在复现时把问题拆成了三个模块:相对运动模型、EKF参数估计器、基于估计值的epsilon纳什均衡求解器。模块之间通过一个主循环串联起来,仿真时钟每推进一个步长,先用量测更新EKF,再用最新估计值重新求解当前时刻的博弈策略,最后把策略施加到双方动力学上。这个结构看起来不难,但模块之间的接口设计与数据流方向,决定了好几个容易翻车的细节。

1.2 相对运动方程与状态空间描述

追逃博弈的状态量一般取相对位置和相对速度。在近圆轨道假设下,采用CWH方程描述相对运动,写成状态空间形式就是:

x_dot = A * x + B_r * u_r + B_c * u_c

其中 x = [rx, ry, rz, vx, vy, vz]^T,u_r 和 u_c 分别是追逃双方的推力加速度矢量。A是CWH方程的系统矩阵,里面包含轨道角速度项;B矩阵根据推力作用方向选取。需要说明的是,CWH方程的精确性在末端短时间场景下是够用的,如果轨道偏心率较大,需要换成TH方程,但代码整体结构不变,只是系统矩阵A会麻烦一些。

代价函数的选择是复现里的一个重要决策点。我参考的期刊方法用的是终端状态二次型加控制能量的组合:

J = (x(tf))^T * Q_f * x(tf) + ∫(u_r^T * R_r * u_r - u_c^T * R_c * u_c) dt

这个式子里,追方最小化J,逃方最大化J,是一个标准零和微分博弈。Q_f、R_r、R_c 这几个权重矩阵要怎么取,直接影响最终策略的样子。我试过几组参数后发现,权重值的变化对均衡策略的形态影响很大,后面做参数敏感性分析时值得单独跑一组对比。

1.3 不完全信息与Epsilon纳什均衡的含义

完全信息下的追逃博弈,双方都知道对方的动力学参数,可以求解一个精确的鞍点策略。但这里追方不知道逃逸器的真实能力参数,只能在每个时刻给出一个估计,所以真正能求解的是一个基于估计参数的近似问题。如果估计误差不大,求解出来的策略相对真实博弈来说就是一个epsilon纳什均衡——也就是双方都没有动力通过单方面改变策略来获得超过epsilon量级的收益改进。

这个epsilon不是随便取的。它由两部分误差决定:EKF估计误差和博弈求解的数值近似误差。论文里的做法是给epsilon设定一个阈值,当估计值收敛到一定程度后,就认为当前策略满足epsilon纳什均衡条件。这个思路的好处是,工程上你不需要一个数学上绝对精确的均衡,只需要一个足够接近均衡的策略来保证闭环性能。复现的时候,我选择了在滚动时域上反复求解近似均衡来逼近这个epsilon条件,具体做法在后面章节展开。

2. 核心模块一:基于EKF的在线参数估计

2.1 为什么选EKF而不选其他滤波器

不完全信息追逃博弈里,最自然的估计需求是“边观测边修正”。扩展卡尔曼滤波在这里几乎是默认选项,原因是它直接处理非线性系统,而且计算量可控,适合在线运行。虽然无迹卡尔曼滤波(UKF)对强非线性的近似精度更好,但在这个场景里状态方程的非线性主要来自动力学参数耦合,并不会严重到让EKF发散,所以EKF在算力和实现难度上更有优势。

我在复现过程中也对比过粒子滤波,精度确实更高,但计算代价放在实时博弈求解的框架里很不划算。博弈策略求解本身就要消耗可观算力,如果估计部分再拖后腿,整个闭环根本跑不起来。期刊方法选EKF,本质上是在精度、实时性和实现复杂度之间取的折中,复现的时候不必轻易偏离这个选择。

2.2 状态向量设计与量测方程

EKF的状态向量设计是影响成败的关键。我把状态分成两部分:相对运动状态加未知参数。相对运动部分是六个维度(相对位置和相对速度),未知参数部分根据逃逸器建模方式选取一到两个维度,例如推力加速度上限a_c_max或者控制效率系数k_c。最终状态向量写作:

x_est = [rx, ry, rz, vx, vy, vz, k_c]^T

这里k_c表示逃逸器的推力能力系数,真实值在仿真里设为某个常数,但EKF的初始猜测故意设得偏离一些,用来模拟追方的不完全信息状态。量测方程相对简单,观测量取相对位置和相对速度,因为末端交会段这两个量通常可以通过雷达或光学敏感器获得:

z = H * x_est + v

H矩阵需要根据状态向量结构做对应映射。注意一点,量测方程里观测不到k_c,这是个典型的部分可观测问题。EKF通过状态方程里k_c对动力学的影响来间接估计它,因此过程噪声和初始协方差设置就变得非常敏感。后面调试心得里我会专门讲这个坑。

2.3 EKF递推流程与Matlab实现要点

EKF的标准五步——预测状态、预测协方差、计算卡尔曼增益、更新状态、更新协方差——在Matlab里非常好写,核心难点其实在雅可比矩阵的构造。由于状态方程里包含CWH矩阵和未知参数耦合项,需要对非线性函数f(x)求偏导。我的处理方式是直接把离散化的状态转移函数写出来,然后用数值差分或者符号求导生成雅可比矩阵。

关键代码结构是这样的:

function [x_est, P_est] = ekf_update(x_est, P_est, z, dt, params) % 预测 [x_pred, Phi] = state_transition(x_est, dt, params); Q = params.Q_ekf; P_pred = Phi * P_est * Phi' + Q; % 更新 H = measurement_jacobian(x_pred); R = params.R_ekf; K = P_pred * H' / (H * P_pred * H' + R); x_est = x_pred + K * (z - H * x_pred); P_est = (eye(size(P_est)) - K * H) * P_pred; end

这里Phi是离散化的状态转移雅可比矩阵,用零阶保持法从连续系统矩阵A_d生成。因为我拓展了状态向量,A_d里会增加参数维度的耦合项,构造时需要一个小的技巧:把原A矩阵拓展一个维度,新增的行列对应参数的自演化与耦合关系。

量测矩阵H也要跟着扩展:相对位置和相对速度的测量对应状态向量的前六维,参数维度对应的列全是零。这个H矩阵必须和状态向量维度完全匹配,否则维度错误会直接让矩阵运算报错。

注意:EKF初始化里最重要的两个量是初始协方差P_0和过程噪声Q。初次复现时我很容易把P_0设得过大,结果滤波器前期剧烈震荡,甚至把追逃轨迹带偏。经验是先根据量测精度推算P_0的量级,比如速度测量精度如果是0.01 m/s,对应协方差就设成0.01^2量级,初始参数误差分量的协方差可以适当放大,但不能大到让滤波发散。

3. 核心模块二:不完全信息下的Epsilon纳什均衡博弈求解

3.1 从完全信息到不完全信息的自然过渡

如果博弈双方参数完全已知,追逃问题就变成一个标准的零和微分博弈,可以尝试求解Hamilton-Jacobi-Isaacs方程。但在末端追逃的工程场景里,HJ方程面对的是非线性、高维、有约束的问题,解析解基本不存在,数值求解也非常吃力。期刊方法的聪明之处在于,它先用EKF把不完全信息问题“翻译”成一个即时参数已知的近似完全信息问题,然后在这个近似问题上求解均衡策略。

这个“翻译”过程并不是一次性的。EKF在每个时刻给出的估计值都不同,所以近似问题是时变的。严格说,每个时刻求解出的策略都是针对当前估计参数的局部均衡,整体上则是一个自适应的近似均衡策略。从数学上讲,我们无法保证这个策略是一个精确的鞍点解,但可以通过限制估计误差和求解误差来使策略满足epsilon纳什均衡条件。

3.2 零和博弈鞍点条件的数值近似求解

在数值实现上,我没法直接解HJ方程,而是采用滚动时域+局部优化的思路。具体策略是:在每一时刻tk,把终端时刻tf固定,用当前EKF估计出的参数值,求解一个从tk到tf的有限时域零和博弈。由于动力学是线性的、代价函数是二次型的,这个子问题可以近似化为一个线性二次零和博弈,通过求解Riccati微分方程获得反馈增益矩阵。

Matlab里可以用ode45直接对Riccati微分方程积分,从终端时刻倒推到当前时刻,得到当前时刻的反馈增益,再计算出追逃双方的控制量:

function [u_r, u_c] = solve_epsilon_equilibrium(t_now, x_rel, x_est, params) tf = params.tf; % 倒推求解Riccati方程 [~, S_series] = ode45(@(t,S) riccati_ode(t, S, x_est, params), [tf t_now], S_f); S_now = S_series(end,:); S_now = reshape(S_now, size(S_f)); % 计算反馈控制 u_r = -params.R_r_inv * params.B_r' * S_now * x_rel; u_c = params.R_c_inv * params.B_c' * S_now * x_rel; end

这里的S_f是终端代价矩阵,Riccati方程里要根据x_est里的参数估计值调整B矩阵和控制代价权重。每次EKF更新后,x_est变了,S_f和Riccati方程里的系数也要跟着变,这就是“自适应”在代码层面的体现。

3.3 估计误差如何影响均衡条件

把EKF估计参数代入Riccati方程求解,真实博弈的策略自然带上了估计误差。理论分析里最关心的问题是:当估计误差有界时,这个近似策略离真实纳什均衡有多远?

我的复现实验显示,当EKF估计收敛良好时(参数估计误差降到5%以内),闭环追逃性能与完全信息情形下的差距很小,终端脱靶量只恶化大约10%~15%。但如果估计值偏差过大,或者滤波出现发散,策略就会变得离谱,逃逸器的机动甚至可能让追方的终端误差大幅增大。这个现象说明epsilon值跟估计误差是强耦合的,调试时需要同时关注两个指标:估计收敛曲线和终端脱靶量,不能只顾其中一个。

4. 自适应博弈主循环与Matlab整体实现

4.1 仿真场景与参数配置

复现工程里,我设定的场景是近圆轨道末端追逃段,追逃双方初始相对距离约5公里,相对速度差约200 m/s。双方推力上限设为不同值,追方推力上限略高,但逃逸器的真实推力系数对追方未知。详细的参数配置如下表所示:

参数符号取值备注
轨道角速度n0.001 rad/s近地轨道量级
初始相对位置r0[5000, 3000, 500] m末段起始点
初始相对速度v0[-200, 50, 20] m/s追赶状态
追方推力上限a_r_max0.5 m/s^2已知
逃逸器推力系数k_c0.7(真实值)追方未知
控制代价权重R_r / R_c0.1 / 0.08调参确定
终端代价权重Q_fdiag([1,1,1,0.1,0.1,0.1])位置权重高
量测噪声标准差sigma_z[10 m, 0.1 m/s]相对测量
过程噪声强度Q_ekf1e-6量级参数维度稍大
仿真步长dt0.1 s固定步长
博弈求解周期T_update1.0 s策略更新间隔

这个表里的参数是我多次实验后确定的基准配置,如果你复现时默认参数跑不出效果,优先检查R_r/R_c的量级,控制权重对均衡策略的形态影响最直接。

4.2 主循环结构与模块接口设计

主循环结构分成三个时间尺度:最内层是动力学积分步长0.1秒,中间层是EKF更新频率,最外层是博弈策略更新周期1秒。三个时间尺度分离的好处是:EKF可以高频利用量测数据提高收敛速度,而博弈求解不需要每次步长都重算,节省算力。主循环的骨架代码长这样:

%% 初始化 x_r = [0 0 0 0 0 0]'; % 追方绝对状态(相对坐标系下) x_c = [5000 3000 500 -200 50 20]'; % 逃逸器相对状态 x_est = [5000 3000 500 -200 50 20 0.3]'; % 初始猜测推力系数0.3 P_est = blkdiag(100*eye(6), 0.25); % 初始协方差 for k = 1:sim_steps t = (k-1)*dt; %% 1. 策略更新(低频) if mod(t, T_update) < dt [u_r, u_c] = solve_epsilon_equilibrium(t, x_rel, x_est, params); end %% 2. 动力学积分 x_rel = rk4_step(@(x) relative_dynamics(x, u_r, u_c, x_est), x_rel, dt); %% 3. 量测生成 + EKF更新(高频) if mod(t, dt_ekf) < dt z = generate_measurement(x_rel, sigma_z); [x_est, P_est] = ekf_update(x_est, P_est, z, dt, params); end end

这里有个容易忽略的接口细节:relative_dynamics函数里的逃逸器真实推力系数,仿真里用的是真实值k_c_true,而solve_epsilon_equilibrium用的是x_est里的估计值。这两者的分离正是“不完全信息”在代码里的核心体现。如果把估计值错误地传给了真实动力学,那整个问题就退化成完全信息博弈了,复现也就失去了意义。

4.3 轨迹可视化与结果验证

复现做完之后,至少要输出三类结果来验证方案有效性:追逃双方相对轨迹、EKF参数估计收敛曲线、终端脱靶量统计。

相对轨迹图能直接看出策略形态,追方通常会呈现一个平滑的拦截弧线,逃逸器则是一边规避一边侧向机动。我印象比较深的是,在EKF估计初期参数偏差大时,追方策略会比较保守,轨迹弧线偏大;随着估计收敛,策略变得激进,轨迹会逐渐“收紧”。

参数估计收敛曲线是判断EKF调得对不对的核心指标。理想情况下,k_c的估计值应该在大约20到30秒内收敛到真实值附近。如果收敛太慢,可以适当增大Q_ekf里参数维度的噪声项,增强滤波器对新观测的响应速度。

终端脱靶量则是整个系统的最终性能指标,我在基准配置下统计了50次蒙特卡洛仿真,脱靶量中位数约为12米,相比完全信息情形的约8米,损失可以接受。如果脱靶量压力大,优先调整策略更新周期和终端权重Q_f。

5. 复现过程中的问题与调试心得

5.1 常见问题速查表

复现过程中最典型的几个问题,我整理成了一张速查表,方便你直接对照排查:

现象可能原因解决办法
EKF估计发散,轨迹剧烈震荡P_0设置过大或Q_ekf偏大缩小初始协方差,按量测精度反推量级
k_c估计值长期不收敛参数可观测性弱增大参数维度过程噪声,或加入机动激励
追方轨迹明显偏离拦截方向R_r/R_c权重失衡调小R_r或增大R_c,提高追方机动积极性
策略更新后控制量跳变过大博弈求解周期过长减小T_update,或对控制量加平滑滤波
终端脱靶量远大于预期终端权重Q_f过小或tf设置偏短增大Q_f的位置分量,合理延长时间窗口
代码速度太慢无法实时运行每次步长都重解Riccati方程提高策略更新周期,让博弈求解低频运行

5.2 独家调试经验三条

第一,EKF初始化不要凭感觉给。很多复现者一上来就把P_0设成单位矩阵,结果滤波器前几十步剧烈震荡,白白消耗了宝贵的博弈窗口。正确的做法是:从量测噪声标准差反推P_0,比如相对位置量测精度10米,那对应位置的协方差就设100量级;未知参数部分可以相对宽松,但也不能比稳态值大太多。

第二,不完全信息博弈最容易崩的地方在可观测性。如果逃逸器一直匀速直线飞行,没有足够的机动激励,EKF根本无法准确估计推力系数——因为参数根本不影响量测。所以在设置仿真场景时,要给逃逸器一个初始的规避机动,让EKF“有机会”从相对运动变化中提取参数信息。这也是个很现实的工程问题:对方不动,你就永远猜不准他的真实能力。

第三,epsilon参数别一开始就纠结怎么精确计算。我复现时的做法是:先把EKF收敛性和博弈求解器分别调通,最后再联合起来看脱靶量。如果脱靶量偏大,先检查EKF估计曲线是否收敛,再检查策略更新时终端条件是否满足预期。实际调试过程中,90%的“蠢问题”都出在估计模块,而不是博弈求解模块上。

5.3 这套方案还能往哪个方向扩展

复现完这套不完全信息epsilon纳什均衡追逃博弈之后,我自己还想到了几个可以继续扩展的方向。一个是把CWH方程换成TH方程,把近圆轨道假设推广到椭圆轨道场景,让末端追逃的时间窗口拉得更长。另一个是引入逃逸器机动模式切换的辨识——真实对抗中,对方可能在不同阶段切换推力策略,用一个固定参数的EKF就不够了,需要考虑多模型估计。再者,多追一逃的合作博弈问题也是值得尝试的方向,那时追方之间还需要额外的协同策略设计。

我个人在实际操作中体会最深的一点是:复现期刊方法,难点从来不是看懂公式,而是把公式里的每个参数都变成代码里一个合理的初值,再把模块之间的数据流理顺。这套追逃博弈方案真正做到“不完全信息自适应”,靠的不是某个单一算法的炫技,而是EKF和博弈求解器之间精准的配合。你把这两个模块各调好五成,再花时间联调,效果就会超出预期。如果后面有读者按这套流程跑通了,期待交流你们在参数敏感性分析里的发现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 10:47:45

算法可解释性与决策透明机制:从概念到工程落地

1. 这个命题到底在解决什么问题做算法久了&#xff0c;很多人会碰到一种时刻&#xff1a;模型上线表现很好&#xff0c;线上AUC也达标&#xff0c;可业务方拿着一个被拒绝的case过来问你&#xff0c;"为什么这个人被拒了&#xff1f;"你看着手里的GBDT、深度网络&…

作者头像 李华
网站建设 2026/10/22 10:46:02

8款论文目录生成器横评:AI识别与自动同步怎么选?

离提交毕业论文还剩两天&#xff0c;你打开文档准备把目录页码更新一遍。改完第三章&#xff0c;第四章页码又全乱了&#xff1b;重新插入目录&#xff0c;自己写的小标题又有一半没被识别。这个场景我经历过太多次&#xff0c;帮人改论文时也见过太多回。目录看着只是文章前面…

作者头像 李华
网站建设 2026/10/22 10:45:56

JSP+SSM毕设实战:第二课堂成绩单系统开发与避坑指南

简介&#xff1a;这是一份基于JSP与SSM框架的大学生第二课堂成绩单系统毕业设计资源包&#xff0c;面向需要完成类似选题、学习SSM整合开发或备战毕业答辩的计算机专业学生。后台区分普通管理员与超级管理员&#xff0c;覆盖密码修改、录入单审核、思想道德与技术修养信息维护、…

作者头像 李华
网站建设 2026/10/22 10:42:54

PostgreSQL UPSERT实践:INSERT ON CONFLICT解决写入冲突

以前做用户行为统计的时候&#xff0c;最头疼的一步不是写SQL&#xff0c;而是怎么把“新用户要插入、老用户要累加”这个逻辑在一个事务里干完。早期方案是先查一次&#xff0c;有了就更新、没有就插入&#xff0c;这在单机低并发下勉强能用&#xff0c;但流量一起来马上踩坑&…

作者头像 李华
网站建设 2026/10/22 10:41:48

养虾热潮的Token黑洞:增长、变现与风控困局

最近一段时间&#xff0c;我身边好几拨人开始“养虾”了。不是去菜市场买虾&#xff0c;也不是真搞水产养殖&#xff0c;而是在某个APP的小程序里养一只虚拟虾——每天签到、看几十秒广告、做一堆琐碎任务&#xff0c;就为了把虚拟虾养大&#xff0c;再兑换一份真实的大虾包邮到…

作者头像 李华
网站建设 2026/10/22 10:41:37

Spark对接Hudi避坑指南:版本兼容与实时入湖实践

1. 先说结论&#xff1a;这套组合为什么容易踩坑 Hudi 和 Spark 的适配问题&#xff0c;本质上是两个开源项目各自迭代节奏不一致导致的。Hudi 作为一个数据湖框架&#xff0c;需要紧跟 Spark 的版本演进&#xff0c;但 Spark 每个大版本升级时&#xff0c;API 变动、二进制兼容…

作者头像 李华