news 2026/6/9 22:45:59

基于Actor-Critic(A2C)强化学习RL的四旋翼无人机UAV悬停控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Actor-Critic(A2C)强化学习RL的四旋翼无人机UAV悬停控制

基于Actor-Critic(A2C)强化学习RL的四旋翼无人机UAV悬停控制
简介:该代码训练了一个优势演员-评论家(A2C)强化学习代理,以控制四旋翼飞行器的电机速度,使其在随机角加速度扰动作用于控制轴(俯仰、横滚和偏航)的情况下保持稳定悬停。A2C控制取代了传统用于稳定和制导的两个比例-积分-微分(PID)控制器。A2C 控制器能够纠正随机加速度并在三秒的模拟过程中使四旋翼飞行器保持在初始点附近。此模拟采用了离散动作空间,因此代理不具备细腻的控制能力,导致无法实现完美悬停
以下文章及示例代码仅供参考
基于A2C强化学习的四旋翼无人机悬停控制仿真

在传统飞行控制系统中,四旋翼无人机通常依赖多层PID控制器实现姿态稳定与位置跟踪。然而,面对复杂扰动(如风扰、电机老化或外部冲击),固定参数的PID控制器往往难以兼顾鲁棒性与适应性。近年来,强化学习(Reinforcement Learning, RL)因其强大的自适应能力,在无人系统控制领域展现出巨大潜力。

本文介绍一种基于优势演员-评论家(Advantage Actor-Critic, A2C)算法的四旋翼无人机悬停控制方法,并通过Python环境下的仿真实验验证其有效性。该方法完全取代了传统双环PID结构,仅依靠A2C代理直接输出电机控制指令,在存在随机角加速度扰动的情况下实现近似悬停。

一、问题设定

目标:使四旋翼在三维空间中保持初始位置(0, 0, 0)和零姿态角(横滚、俯仰、偏航均为0)。

挑战:
环境施加随机角加速度扰动于三个旋转轴;
控制器需实时调整四个电机转速以抵消扰动;
使用离散动作空间(限制控制精度);
无显式模型,完全依靠试错学习。

二、A2C算法简介

A2C是一种on-policy的策略梯度方法,包含两个神经网络:
Actor(策略网络):输出当前状态下各动作的概率分布;
Critic(价值网络):评估当前状态的价值(即预期累积回报)。

通过最小化优势函数(Advantage = Return - Value)的方差,A2C能更稳定地更新策略,相比原始REINFORCE算法具有更低的方差和更快的收敛速度。

三、环境与状态/动作设计
状态空间(State)
包含以下12维信息:
位置 (x, y, z)
线速度 (vx, vy, vz)
欧拉角 (roll, pitch, yaw)
角速度 (p, q, r)
注:所有状态量均经过归一化处理以提升训练稳定性。
动作空间(Action)
为简化实现,采用离散动作空间,共81个动作(每个电机3档:低/中/高 → 3⁴ = 81)。
虽然牺牲了控制细腻度,但显著降低了训练难度,适合初学者理解RL控制流程。
奖励函数(Reward)
设计原则:越接近理想悬停状态,奖励越高。
python
reward = -(
5abs(x) + 5abs(y) + 2abs(z) +
2abs(roll) + 2abs(pitch) + 1abs(yaw) +
0.5(abs(vx)+abs(vy)+abs(vz)) +
0.1(abs§+abs(q)+abs®)
)

负奖励鼓励代理最小化偏差。

四、仿真结果
训练约2000个episode后,A2C代理可有效抑制随机角加速度扰动;
在3秒仿真时长内,无人机基本维持在原点附近(位置误差 < 0.5 m,姿态角 < 10°);
由于动作离散,无法实现“完美”悬停,但表现优于未调参的基准PID(在相同扰动下迅速失稳);
Critic网络能准确预测状态价值,Actor策略随训练逐步优化。
⚠️ 注意:本仿真未考虑电机动力学延迟、电池衰减等真实因素,仅用于算法原理验证。

五、核心代码(PyTorch + 自定义环境)

python
简化版A2C训练框架(完整代码建议封装为类)
import torch
import torch.nn as nn
import numpy as np
from quad_env import QuadrotorEnv # 自定义四旋翼环境

class ActorCritic(nn.Module):
definit(self, state_dim, action_dim, hidden=128):
super().init()
self.actor = nn.Sequential(
nn.Linear(state_dim, hidden), nn.Tanh(),
nn.Linear(hidden, hidden), nn.Tanh(),
nn.Linear(hidden, action_dim), nn.Softmax(dim=-1)
)
self.critic = nn.Sequential(
nn.Linear(state_dim, hidden), nn.Tanh(),
nn.Linear(hidden, hidden), nn.Tanh(),
nn.Linear(hidden, 1)
)

def forward(self, x):
return self.actor(x), self.critic(x)

def compute_returns(rewards, gamma=0.99):
R = 0
returns = []
for r in reversed(rewards):
R = r + gamma R
returns.insert(0, R)
return returns
超参数
EPISODES = 2000
GAMMA = 0.99
LR = 1e-3

env = QuadrotorEnv()
agent = ActorCritic(state_dim=12, action_dim=81)
optimizer = torch.optim.Adam(agent.parameters(), lr=LR)

for ep in range(EPISODES):
state = env.reset()
log_probs, values, rewards = [], [], []

for t in range(300): # 3秒,dt=0.01
state_tensor = torch.FloatTensor(state).unsqueeze(0)
probs, value = agent(state_tensor)
dist = torch.distributions.Categorical(probs)
action = dist.sample()

next_state, reward, done, _ = env.step(action.item())

log_probs.append(dist.log_prob(action))
values.append(value)
rewards.append(reward)
state = next_state

if done:
break

计算优势

returns = compute_returns(rewards, GAMMA)
returns = torch.FloatTensor(returns)
values = torch.cat(values).squeeze()
advantage = returns - values

actor_loss = -(torch.stack(log_probs) advantage.detach()).mean()
critic_loss = advantage.pow(2).mean()
loss = actor_loss + 0.5 * critic_loss

optimizer.zero_grad()
loss.backward()
optimizer.step()

if ep % 100 == 0:
print(f"Episode {ep}, Total Reward: {sum(rewards):.2f}")
📌 quad_env.py 需自行实现四旋翼动力学模型(可基于牛顿-欧拉方程),并集成随机角加速度扰动。

六、改进方向

  1. 连续动作空间:改用DDPG、TD3或SAC,实现更精细的电机控制;
  2. 引入参考轨迹:从悬停扩展到轨迹跟踪;
  3. 域随机化训练:提升模型在真实环境中的泛化能力;
  4. 结合模仿学习:用专家PID数据预训练,加速收敛。

结语

本文展示了如何利用A2C强化学习算法实现四旋翼无人机的抗扰悬停控制。尽管受限于离散动作空间,该方法仍展现出良好的自适应能力,为智能飞行控制提供了新思路。强化学习不是万能药,但在不确定性强、建模困难的场景中,它确实是一把值得尝试的“新钥匙”。
💡 提示:实际部署前务必在高保真仿真器(如Gazebo+PX4)中充分验证安全性。



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

【Docker】核心概念 常用指令总结 Docker Compose

文章目录 核心概念指令一、守护进程&#xff08;Docker Daemon&#xff09;二、镜像&#xff08;Image&#xff09;三、容器&#xff08;Container&#xff09;四、卷管理五、容器挂载卷 数据卷多个容器挂载数据卷容器 Docker 容器和镜像的细节Docker镜像原理Dockerfile关键字D…

作者头像 李华
网站建设 2026/6/9 23:51:40

python数据结构之栈和队列

一、栈&#xff08;Stack&#xff09;栈是一种后进先出&#xff08;LIFO&#xff09;的线性数据结构。就像往手枪弹夹里装子弹时&#xff0c;子弹从弹夹口依次压入&#xff08;入栈 push&#xff09;&#xff0c;先装的子弹会沉到弹夹底部&#xff1b;开枪时&#xff0c;最上面…

作者头像 李华
网站建设 2026/6/6 5:39:02

springboot养殖畜牧业养牛可视化大屏设计与实现vue

目录摘要开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 SpringBoot与Vue结合的养殖畜牧业养牛可…

作者头像 李华
网站建设 2026/5/25 20:56:17

ssm springboot人脸识别物流运输管理系统vue

目录 摘要技术栈 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 基于SSM&#xff08;SpringSp…

作者头像 李华
网站建设 2026/6/10 2:00:03

通达信五行金针选股指标公式

VAR1:REF(CLOSE,1); VAR2:SMA(MAX(CLOSE-VAR1,0),7,1)/SMA(Abs(CLOSE-VAR1),7,1)*100; VAR8:SMA(MAX(CLOSE-VAR1,0),14,1)/SMA(ABS(CLOSE-VAR1),14,1)*100; VAR9:SMA(MAX(CLOSE-VAR1,0),21,1)/SMA(ABS(CLOSE-VAR1),21,1)*100; 五行金针:VAR2<15 AND VAR8<25 AND VAR9<…

作者头像 李华