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 远程调试与代码修改
- 解释器配置:
- 打开
Settings->Project: ...->Python Interpreter。 - 点击齿轮图标 ->
Add->SSH Interpreter。 - 输入 Host (例如
10.5.54.215) 和 Username (haoyun)。 - 选择服务器上的 Conda 环境可执行文件 (例如
/home/haoyun/miniconda3/envs/pymarl2/bin/python)。
- 打开
- 运行配置 (Run/Debug Configurations):
- 点击右上角
Edit Configurations->+->Python。 - Script path:
- PyMARL2:
src/main.py - HARL:
/disk/haoyun/projects/HARL/examples/train.py
- PyMARL2:
- 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
- PyMARL2:
- 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
- PyMARL2:
- 点击右上角
- 修改算法结构:
- PyMARL2: 核心算法逻辑在
src/controllers(控制器) 和src/modules/agents(智能体网络) 中。Mixer 网络在src/modules/mixers。 - HARL: 算法实现位于
harl/algorithms/actors(Actor) 和harl/algorithms/critics(Critic)。
- PyMARL2: 核心算法逻辑在
- 修改环境信息:
- PyMARL2: 环境封装在
src/envs。SMAC 的具体配置在src/config/envs/smac.yaml。 - HARL: 环境接口在
harl/envs。可以在harl/common/val_logger.py中修改日志记录方式。
- PyMARL2: 环境封装在
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: 三层测试
- SITL 仿真: 验证闭环。
- 室内测试: 带安全网。
- 室外测试: 开阔场地。
第 12 章:RK3588 部署指南
在 Ubuntu 上设置 RKNN Toolkit2 环境并转换模型的指南。
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 安装
链接: 百度网盘 (提取码: 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 和推理脚本。