多智能体强化学习(MARL)

Part 0:UAV-MARL 综述

本页面聚焦多无人机(Multi-UAV)任务中的 MARL 方法、挑战与工程实践,保留 MARL 的通用背景但以无人机应用为主线。

多无人机系统(Multi-UAV Systems)简介

多无人机系统由若干自主或半自主 UAV 协同完成任务。常见任务包括围捕(encirclement)、追逃(pursuit–evasion)、对抗/空战、目标跟踪、搜救与编队控制。

典型任务:围捕 / 追逃(Pursuit–Evasion)

围捕任务通常要求多架友军 UAV 协同围堵并拦截目标(敌方 UAV),追逃任务则是高速动态对抗,强调连续动作控制与实时决策。

为什么 MARL 适合 UAV 任务

  • 通信受限:无线带宽和时延限制使得分散式方法更贴合实战。
  • 局部观测:每架 UAV 只能看到局部传感器信息(雷达/相机),适合 CTDE(集中训练、分散执行)范式。
  • 协作需求:多无人机之间需要协同分工、队形控制与协同拦截。

无人机任务中的核心难点

  • 非平稳性:多智能体同时学习导致环境对单个智能体呈非平稳。
  • 可扩展性:随着 UAV 数量增加,策略与训练复杂度上升。
  • 动态拓扑:邻居关系随位置变化,通信/观测图不断变化。
  • 真实物理约束:动力学、速度/加速度限制、碰撞约束、传感器噪声。

Part 1:基础 MARL 方法

本部分介绍在无人机场景中最常用的基础算法,作为工程基线与进阶算法的对照组。

第 1 章:IQL(独立学习基线)

独立学习(IQL)将每架 UAV 视为独立的 RL 智能体,各自学习私有策略。优点是实现简单、无显式通信;缺点是严重的非平稳性,但作为基线非常有用。

适用场景:快速原型、线下单机测试、作为对照组评估复杂协作算法的收益。

第 2 章:VDN / QMIX(价值分解)

VDN 与 QMIX 通过将全局 reward 分解为个体价值项,从而在 CTDE 框架下实现协作学习。QMIX 引入单调性约束使得联合 Q 的表示能力更强,常在小规模围捕任务中产生 emergent 的队形控制与封锁行为。

  • 如何将全局奖励合理分配到个体。
  • QMIX 的结构如何支持局部 greedy 策略与全局最优的近似。

第 3 章:MADDPG / MATD3 / MASAC(连续控制)

无人机动作为连续空间(推力、偏航、俯仰等),因此基于连续动作策略的算法尤为重要。

  • MADDPG:经典的集中式 critic、分散式 actor 框架,易于入门。
  • MATD3:在连续动作上更稳定,适合需要稳定逼近动作策略的场景。
  • MASAC:引入熵正则,探索能力好,适合非平稳对抗与复杂策略搜索。

额外说明:追逃/对抗问题常需要把问题建模为博弈(game),并在 critic 中考虑对手/队友的行为。

Part 2:进阶协作方法

针对围捕、包围、截断与角色分工等任务的高级方法。

第 4 章:COMA(反事实基线)

COMA 引入反事实基准(counterfactual baseline)来区分个体对全局奖励的真实贡献,适合分析围捕中“谁贡献最大”的场景。

第 5 章:MAPPO(多智能体 PPO)

MAPPO 是目前最通用的策略梯度类方法之一,适合大规模编队控制、高维观测输入(图像、雷达)和复杂协作任务。

第 6 章:显式通信(Communication)

显式通信机制能显著提升协作效率:CommNet 的平均消息适合队形同步,TarMAC 的选择性通信适合围捕中的目标分派,DIAL 允许端到端学习通信协议。

Part 3:图神经网络与 MARL

在无人机群体中,通信与观测通常由邻居图决定,GNN/Graph-Attention 是当前研究热点。

第 7 章:Graph-MARL(图方法)

7.1 GAT / GNN 在无人机围捕中的作用

GNN 能动态编码邻居关系、学习注意力权重,帮助实现自适应队形与邻居选择。

7.2 DGN(Deep Graph Network for MARL)

DGN 处理动态拓扑,对编队与合围任务非常适合。

7.3 G2ANet(Graph Attention Actor-Critic)

以注意力机制强化“谁重要”的信息融合,增强局部通信的表达能力。

7.4 Graph-MAPPO / Graph-MADDPG

将 GNN 与集中式 critic 结合,可用于编码邻居信息并提高 critic 的评估能力。

Part 4:对抗性 MARL

第 8 章:对抗性 MARL(博弈论)

介绍常用的对抗算法与博弈论方法:Minimax、Nash Q、PSRO 等,以及其在无人机蓝红对抗中的应用。

Part 5:仿真与实验

本部分涵盖服务器环境配置以及 PyMARL2 和 HARL 的实验指南。

第 9 章:环境配置与实验指南

在实验室服务器上部署 MARL 环境(PyMARL2 + CUDA + PyTorch)的完整指南。

环境要求: CUDA 12.x + RTX30 系列 GPU + Ubuntu + Conda

1. 在数据盘创建工作区

sudo mkdir -p /disk/haoyun
sudo chown -R haoyun:haoyun /disk/haoyun
mkdir -p /disk/haoyun/projects /disk/haoyun/checkpoints /disk/haoyun/datasets

2. 安装 Miniconda

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc

3. 创建 PyMARL2 环境 (Python 3.9)

conda create -n pymarl2 python=3.9 -y
conda activate pymarl2

4. 克隆 PyMARL2 仓库

cd /disk/haoyun/projects
git clone https://github.com/hijkzzz/pymarl2
cd pymarl2
bash install_dependencies.sh

5. 安装 PyTorch (CUDA 12.1)

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

验证 GPU:

python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"

6. 安装 SMAC

pip install git+https://github.com/oxwhirl/smac.git

7. 运行 PyMARL2 实验

运行 SMAC 任务 (地图: MMM2):

export CUDA_VISIBLE_DEVICES=6
python src/main.py --config=qmix --env=smac --map=MMM2

可视化:

tensorboard --logdir results --port 6006

8. HARL: 安装与避坑指南

安装:

conda create -n harl python=3.8 -y
conda activate harl
git clone https://github.com/PKU-MARL/HARL.git
cd HARL
pip install -e .

常见问题 (避坑):

  • gym==0.21.0: pip install setuptools==65.5.0 pip==21
  • np.bool: pip install "numpy==1.23.5"

运行 HARL(示例)

先在服务器上使用 tmux 创建会话并激活 Conda 环境,示例如下:

tmux new -s harl_session
      # 会话内执行
      cd /disk/haoyun/projects/HARL
      conda activate harl
      # 激活后提示应类似:
      # (harl) haoyun@taizun-AS-4124GS-TNR: /disk/haoyun/projects/HARL$

可分别前台运行以下三条(或加 & 放后台):

# 1) MAPPO
      CUDA_VISIBLE_DEVICES=4 PYTHONPATH=/disk/haoyun/projects/HARL \
      python examples/train.py --algo mappo --env pettingzoo_mpe --exp_name debug_mappo

      # 2) MADDPG
      CUDA_VISIBLE_DEVICES=5 PYTHONPATH=/disk/haoyun/projects/HARL \
      python examples/train.py --algo maddpg --env pettingzoo_mpe --exp_name debug_maddpg

      # 3) MATD3
      CUDA_VISIBLE_DEVICES=6 PYTHONPATH=/disk/haoyun/projects/HARL \
      python examples/train.py --algo matd3 --env pettingzoo_mpe --exp_name debug_matd3

如果想把三个一起放后台运行并分别记录日志,可以使用如下示例(在 tmux 会话内执行):

# 后台运行并把输出写到日志文件(示例)
      CUDA_VISIBLE_DEVICES=4 PYTHONPATH=/disk/haoyun/projects/HARL \
      nohup python examples/train.py --algo mappo --env pettingzoo_mpe --exp_name debug_mappo > mappo.log 2>&1 &

      CUDA_VISIBLE_DEVICES=5 PYTHONPATH=/disk/haoyun/projects/HARL \
      nohup python examples/train.py --algo maddpg --env pettingzoo_mpe --exp_name debug_maddpg > maddpg.log 2>&1 &

      CUDA_VISIBLE_DEVICES=6 PYTHONPATH=/disk/haoyun/projects/HARL \
      nohup python examples/train.py --algo matd3 --env pettingzoo_mpe --exp_name debug_matd3 > matd3.log 2>&1 &

TensorBoard 可视化 (HARL)

在服务器上启动 TensorBoard(将所有接口绑定以支持远程访问):

tensorboard --logdir results --port 6006 --bind_all

在本地建立 SSH 隧道以访问服务器上的 TensorBoard(示例):

ssh -L 6006:localhost:6006 -p 2244 haoyun@172.18.116.149

本地浏览器访问: http://localhost:6006

tmux 常用操作

# 列出会话
      tmux ls
      # 进入(attach)已存在会话
      tmux attach -t harl_session
      # 创建一个命名会话(如果需要新会话)
      tmux new -s my_session
      # 杀掉某个会话
      tmux kill-session -t harl_session

9. PyCharm 远程调试与代码修改

  1. 解释器配置:
    • 打开 Settings -> Project: ... -> Python Interpreter
    • 点击齿轮图标 -> Add -> SSH Interpreter
    • 输入 Host (例如 10.5.54.215) 和 Username (haoyun)。
    • 选择服务器上的 Conda 环境可执行文件 (例如 /home/haoyun/miniconda3/envs/pymarl2/bin/python)。
  2. 运行配置 (Run/Debug Configurations):
    • 点击右上角 Edit Configurations -> + -> Python
    • Script path:
      • PyMARL2: src/main.py
      • HARL: /disk/haoyun/projects/HARL/examples/train.py
    • Parameters:
      • PyMARL2: --config=qmix --env=smac --map=MMM2
      • HARL: --algo mappo --env pettingzoo_mpe --env_args.task=simple_spread --exp_name mappo_spread --seed 1 --device cuda
    • Environment variables:
      • 通用: CUDA_VISIBLE_DEVICES=5
      • HARL: PYTHONUNBUFFERED=1;CUDA_VISIBLE_DEVICES=5
    • Working directory:
      • PyMARL2: /disk/haoyun/projects/pymarl2
      • HARL: /disk/haoyun/projects/HARL/examples
  3. 修改算法结构:
    • PyMARL2: 核心算法逻辑在 src/controllers (控制器) 和 src/modules/agents (智能体网络) 中。Mixer 网络在 src/modules/mixers
    • HARL: 算法实现位于 harl/algorithms/actors (Actor) 和 harl/algorithms/critics (Critic)。
  4. 修改环境信息:
    • PyMARL2: 环境封装在 src/envs。SMAC 的具体配置在 src/config/envs/smac.yaml
    • HARL: 环境接口在 harl/envs。可以在 harl/common/val_logger.py 中修改日志记录方式。

Part 6:工程与部署

本部分涵盖完整的 Sim-to-Real 流程以及在 RK3588 边缘设备上的部署。

第 11 章:Sim-to-Real 流程

在无人机上部署 RL 算法的 7 步闭环流程:训练 -> 转换 -> 推理 -> 控制。

步骤 1: 训练 RL 策略 (仿真)

环境: PX4 SITL + Gazebo, AirSim, Isaac Gym。

输出: policy.pth。动作空间: 速度 (vx, vy, vz) 或姿态角速率。

步骤 2: 模型转换 (PyTorch -> ONNX -> RKNN)

policy.pth 转换为 ONNX,然后使用 RKNN Toolkit2 转换为 RKNN

步骤 3: RK3588 上的 ROS2 (推理)

在 RK3588 上运行 ROS2 节点: 订阅状态 -> 构建观测 -> RKNN 推理 -> 发布动作。

步骤 4: RL 动作到飞控 (ROS2 + MAVROS)

发布动作到 /mavros/setpoint_velocity/cmd_vel_unstamped

步骤 5: PX4 Offboard 模式

PX4 必须处于 OFFBOARD 模式 以接收外部控制指令。

步骤 6: 飞控与电机驱动

PX4 处理底层稳态控制与电机混控。

步骤 7: 三层测试

  1. SITL 仿真: 验证闭环。
  2. 室内测试: 带安全网。
  3. 室外测试: 开阔场地。

第 12 章:RK3588 部署指南

在 Ubuntu 上设置 RKNN Toolkit2 环境并转换模型的指南。

📺 视频教程: RKNPU 简介
了解 NPU 架构与工具链。
在 Bilibili 观看

1. Ubuntu 虚拟机设置

推荐: Windows + VirtualBox + Ubuntu 20.04 LTS。

  • 下载: Ubuntu 20.04 LTS
  • VirtualBox 设置:
    • CPU: 2+ 核心, 内存: 4GB+, 硬盘: 60GB+
    • 网络: 桥接模式 (SSH 需要)。

2. Miniconda 设置

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc
conda create -n rknn python=3.8 -y
conda activate rknn

3. RKNN Toolkit2 安装

📥 RKNN Toolkit2 离线包
链接: 百度网盘 (提取码: v6ah)
pip install -r requirements_cp38-2.3.2.txt
pip install rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

验证: python -c "from rknn.api import RKNN; print('RKNN OK')"

4. FileZilla + SSH 连接配置

确保 Ubuntu 上 SSH 正在运行: sudo systemctl start ssh

📌 FileZilla 填写示例:

Host (主机) Username (用户名) Password (密码) Port (端口)
10.5.54.215 haoyun 你的密码 22

5. 部署工作流

步骤 1: 训练 (PC) -> policy.pth

步骤 2: 导出 ONNX

torch.onnx.export(model, dummy_input, "policy.onnx", input_names=['obs'], output_names=['action'])

步骤 3: 转换为 RKNN

from rknn.api import RKNN
rknn = RKNN()
rknn.load_onnx('policy.onnx')
rknn.config(target_platform="rk3588")
rknn.build(do_quantization=False)
rknn.export_rknn('policy.rknn')

步骤 4: 板端运行 -> 上传 policy.rknn 和推理脚本。