✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、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())


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

Logo

更多推荐