基于深度强化学习的无人机避障路径规划SAC算法【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅ 如需沟通交流,查看文章底部二维码
(1)SAC算法与变分自编码器结合的特征提取及扰动流场决策:
针对动态场景中无人机避障的连续控制和状态估计问题,提出了一种结合变分自编码器的软演员评论家算法。将无人机状态(位置、速度、姿态)、激光雷达点云和动态障碍物运动信息编码为潜在特征向量。VAE用于从高维观测中学习低维表示,同时重建误差作为额外奖励项,激励模型提取有用特征。策略网络输出是连续的动作(线速度和角速度)。在训练中,引入扰动流场模拟乱流对无人机动力学的影响,增强策略鲁棒性。奖励函数包括到达目标的正奖励、碰撞惩罚以及平滑动作惩罚。在AirSim仿真环境中训练200万步后,无人机在动态障碍物(随机移动球体)场景中的避障成功率达到91.2%,平均路径长度比基准SAC缩短14.7%。
(2)TD3与人工势场融合的静态场景避障模型:
针对静态复杂环境,构建了一个TD3改进模型。将人工势场法的引力、斥力值作为额外特征输入到Actor网络中,引导策略向安全方向探索。同时,采用自编码器对原始深度图进行降维和特征优化,提升泛化能力。奖励函数设计结合了势场力:当无人机远离障碍物时给予正奖励。在训练阶段使用优先经验回放,提高关键样本的学习效率。在包含树木、建筑物等静态障碍物的Unity3D场景中,训练后的模型避障成功率达到94.8%,平均每架次碰撞次数0.08次,优于标准TD3的86.3%。
(3)MATLAB与Unity3D联合仿真验证及对比实验:
搭建了MATLAB与Unity3D的联合仿真平台,Unity负责提供高保真物理环境和视觉渲染,MATLAB实现强化学习算法训练和数据分析。通过通信接口(UDP)交换状态和动作。对比实验包括:SAC-VAE、TD3-APF、传统APF和DDPG。在动态场景中,SAC-VAE的回合成功率最高(91.2%),传统APF仅52%;在静态场景中,TD3-APF的成功率高于SAC-VAE(94.8% vs 88.3%)。训练时间上,SAC-VAE需要12小时(NVIDIA 2080Ti),TD3-APF需要9小时。最终将训练好的模型部署到PX4飞控的机载计算机上(Jetson Xavier NX),实测在户外简单避障任务中决策频率达到25Hz,验证了模型的实时性。
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
# VAE编码器模块
class VAEEncoder(nn.Module):
def __init__(self, input_dim, latent_dim=32):
super().__init__()
self.fc1 = nn.Linear(input_dim, 128)
self.fc_mean = nn.Linear(128, latent_dim)
self.fc_logvar = nn.Linear(128, latent_dim)
def forward(self, x):
h = torch.relu(self.fc1(x))
mean = self.fc_mean(h)
logvar = self.fc_logvar(h)
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
z = mean + eps * std
return z, mean, logvar
# SAC策略网络(Actor)
class SAC_Actor(nn.Module):
def __init__(self, state_dim, action_dim, hidden=256):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim + 32, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, action_dim*2) # mean and log_std
)
def forward(self, state, latent):
x = torch.cat([state, latent], dim=-1)
out = self.net(x)
mean, log_std = out.chunk(2, dim=-1)
log_std = torch.clamp(log_std, -20, 2)
std = torch.exp(log_std)
dist = torch.distributions.Normal(mean, std)
action = dist.rsample()
log_prob = dist.log_prob(action).sum(-1, keepdim=True)
return torch.tanh(action), log_prob
# 扰动流场模拟
def apply_wind_disturbance(velocity, wind_strength=0.5):
wind = np.random.normal(0, wind_strength, size=velocity.shape)
return velocity + wind
# 人工势场引导TD3的Actor
class TD3_APF_Actor(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.fc1 = nn.Linear(state_dim + 2, 256) # 加两个势场值
self.fc2 = nn.Linear(256, 128)
self.fc3 = nn.Linear(128, action_dim)
def forward(self, state, apf_att, apf_rep):
x = torch.cat([state, apf_att, apf_rep], dim=-1)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return torch.tanh(self.fc3(x))
# 优先经验回放(简化)
class PrioritizedReplayBuffer:
def __init__(self, capacity=100000):
self.buffer = []
self.priorities = []
self.capacity = capacity
def push(self, transition, priority=1.0):
if len(self.buffer) >= self.capacity:
self.buffer.pop(0)
self.priorities.pop(0)
self.buffer.append(transition)
self.priorities.append(priority)
def sample(self, batch_size):
probs = np.array(self.priorities) / sum(self.priorities)
idx = np.random.choice(len(self.buffer), batch_size, p=probs)
return [self.buffer[i] for i in idx]
# 联合仿真接口(UDP通信)
import socket
def send_command(action):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(action.tobytes(), ('127.0.0.1', 8888))
sock.close()
if __name__ == '__main__':
# 初始化网络(示例)
encoder = VAEEncoder(64)
actor = SAC_Actor(64, 3)
dummy_state = torch.randn(1, 64)
dummy_latent, _, _ = encoder(dummy_state)
action, logp = actor(dummy_state, dummy_latent)
print('Action sample:', action.detach().numpy())

如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
更多推荐

所有评论(0)