无人机集群(Drone Swarm)作为新兴的研究热点,越来越多地出现在物流、救援、军事侦察等领域。然而,要让多架无人机在复杂环境中进行协同飞行和路径规划,并不如想象中的简单。如何在有限的计算资源与不确定的外界干扰下,快速得到一套具备较优解的群体协作策略?博弈论可以为我们提供不少启示。本篇博客将给大家展示一份采用 OpenAI Gym 环境、集成 博弈策略、支持 命令行配置、CSV 日志记录、动画可视化 等功能的无人机集群协同路径规划仿真代码,并详细讲解设计思路和使用方法。

一、项目简介

在本项目中,我们搭建了一个基于 Python 的 无人机集群仿真环境,能够模拟:

  • 多架无人机在三维空间中移动
  • 障碍物对飞行路径的影响
  • 随机风暴与电磁干扰对动作的扰动
  • 多架无人机分别具有自己的目标点,每当靠近目标后就会被分配新的目标

此外,还可以根据需求切换不同的决策策略,如:

  • Nash 决策(纳什均衡的启发式选择)
  • Random 决策(简单的随机动作,便于对比效果)

为了方便对比和记录,我们支持:

  • CSV 文件输出仿真结果(如:平均奖励、回合数、步骤数等)
  • Matplotlib 实时绘制 3D 轨迹图奖励曲线
  • FuncAnimation 生成 MP4 动画展示无人机运动轨迹

简单来说,这是一份“多功能、高可扩展性”的无人机集群博弈仿真项目,实现了从环境定义策略设计再到可视化输出的完整流程。


二、代码结构概览

该项目的核心代码结构大致可以分为以下五个部分:

  1. 环境定义 DroneSwarmEnv

    • 继承了 gym.Env,定义了状态空间(观测空间)、动作空间、奖励计算方式、环境重置、环境步进逻辑等等。
  2. 决策策略

    • nash_equilibrium_decision(env): 使用基于纳什均衡思路的启发式搜索,遍历每个无人机的 7 种动作,选择期望奖励最高的动作。
    • random_decision(env): 完全随机的策略,主要用于对比基准效果。
  3. 可视化功能

    • visualize_episode(...): 回合结束时,用 3D 图展示所有无人机的飞行轨迹,并用二维折线图展示奖励变化。
    • animate_episode(...): 生成 Matplotlib 动画,并导出 MP4 视频。
  4. CSV 日志记录

    • log_results(...): 将每回合的关键指标(总步数、平均奖励、仿真时长、使用策略等)追加写入一个 CSV 文件,便于后续数据分析或可视化。
  5. 主函数入口 if __name__ == "__main__":

    • 解析命令行参数,初始化环境,循环运行多回合仿真,并调用对应的可视化和日志记录函数。

项目中还引入了 tqdm 来实现进度条展示(如果安装了该库),在大量仿真时便于观察进度。

三、核心功能与实现细节

1. 环境定义

class DroneSwarmEnv(gym.Env):
    def __init__(self, num_drones=3, num_obstacles=5, world_size=(50, 50, 10), max_steps=200):
        # 1. 定义无人机数量、障碍物数量、环境尺寸、最大步数等
        # 2. 设定观测空间 (observation_space) 和动作空间 (action_space)
        # 3. 调用 reset() 初始化环境

    def reset(self):
        # 初始化无人机位置、目标位置、障碍物位置等
        # 返回观测值

    def step(self, actions):
        # 1. 解析动作,进行干扰模拟(风暴、大概率小扰动,电磁干扰导致动作失效)
        # 2. 更新无人机位置,并限制在边界内
        # 3. 计算奖励(到目标的负距离、到达目标的额外奖励、碰撞障碍物的扣分)
        # 4. 增加步数,判断是否结束
        # 5. 返回新的观测值、奖励、done 标志、信息

    def render(self, mode='human'):
        # 以日志方式输出位置信息(也可根据需求自定义 2D/3D 渲染)

 

可以看到,我们给每架无人机都分配了一个目标点 targets[i],只要该无人机距离目标点小于 2.0,就会获得 额外奖励(+100 分),同时 目标被重置,让无人机继续探索新的目标。此外,我们还根据障碍物碰撞(距离 < 1.0)进行扣分(-50 分),使得无人机尽量避障。

2. 决策策略

纳什均衡决策

def nash_equilibrium_decision(env):
    actions = [0] * env.num_drones
    # 对每架无人机,遍历 7 种可行动作
    for i in range(env.num_drones):
        best_action = 0
        best_value = -np.inf
        for action in range(7):
            # 基于动作 move,评估新位置距离目标的负距离和障碍物碰撞风险
            # 选择能让奖励最高的那个动作
        actions[i] = best_action
    return actions
 

这里的“纳什均衡”其实是一个简单的单机启发式搜索,并没有真正实现多智能体博弈中的精确纳什解,但可以作为一个初步近似。在实际复杂环境中,我们往往还需考虑其他无人机的动作联动与冲突,这就会引入多智能体强化学习或更复杂的博弈理论方法。

随机决策

def random_decision(env):
    return env.action_space.sample()
 

 

随机策略用来做基准对比:看在同样的环境下,随机动作能获得多少平均奖励?与纳什策略相比能有多大差距?有助于我们理解策略质量和环境难度。

3. 可视化与动画

  • visualize_episode(...) 用于在单回合结束时绘制 3D 无人机轨迹奖励曲线
  • animate_episode(...) 进一步利用 Matplotlib 的动画功能,为每一帧更新无人机当前位置,通过 FuncAnimation 将其保存为 MP4 文件。

可视化可以帮助我们更直观地理解无人机飞行过程中的碰撞、抖动、到达目标点、重新分配目标等动态变化。

4. 日志记录

为了方便后续分析或嵌入到自动化实验流程中,我们在每回合结束后,将结果写入 CSV:

def log_results(csv_filename, episode, steps, avg_reward, strategy, simulation_time):
    # fields = ['episode', 'steps', 'avg_reward', 'strategy', 'simulation_time']
    # 追加模式写入到 csv_filename
 

 

生成的 CSV 文件可能包含如下多行记录:

episodestepsavg_rewardstrategysimulation_time
1200-12.35nash1.57
2200-20.49nash1.68
...............

有了这份日志,我们就能轻松导入到 Pandas 或其他分析工具中做统计可视化。


四、如何运行

  1. 安装依赖库

    • gym(或 gymnasium),numpymatplotlibargparse
    • 如果需要动画功能,要安装 ffmpeg 用于导出 mp4
    • 进度条功能需要安装 tqdm(可选)

pip install gym numpy matplotlib tqdm

 

五、效果展示

以下是一些示例展示(假设用 3 架无人机、5 个障碍物,在一个 50×50×10 的三维空间内随机初始化):

六、总结与展望

在这份 增强版无人机集群协同路径规划 项目中,我们结合了 OpenAI Gym 环境构建、博弈决策策略可视化CSV 日志记录 等功能,为研究和演示 多智能体博弈协同路径规划 提供了一套基础框架:

  • 对初学者而言,这是一个在 强化学习博弈论 场景中自定义环境的简明示范;
  • 对进阶读者而言,可以轻松插入更多高阶策略,如Q-learningDeep Reinforcement Learning,并衡量策略性能;
  • 对实际应用而言,可以进一步逼真地模拟外界干扰(风向时变、障碍动态移动),或引入编队约束、无人机间通信等复杂因素。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐