每天读一点儿APM(PIX)代码

本博客将分享作者在学习、使用及修改ArduPilot飞控代码过程中的经验与心得,涵盖无人机飞行控制、单片机应用及智能系统等领域的实践与思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,出于对反重力的向往,对飞行的热爱,对无人机技术的关注,我从今天开始,和大家一起解读ArduPilot开源飞控代码。希望和志同道合的朋友们在无人机飞行控制、单片机物联网、智能系统以及其他我们感兴趣的一切领域一起沟通,相互学习。

         我首先将会把半年在学习、使用、修改apm飞控代码中遇到的问题、产生的想法都落到文字,记载到这里,希望大家喜欢。

### 关于 Pix2Pix代码实现 #### 定义生成器架构 为了构建一个基本的 Pix2Pix 模型,首先定义生成器。该生成器采用 U-Net 结构来处理输入图像并生成相应的输出图像[^2]。 ```python import torch.nn as nn class UnetGenerator(nn.Module): def __init__(self, input_nc, output_nc, num_downs, ngf=64, norm_layer=nn.BatchNorm2d, use_dropout=False): super(UnetGenerator, self).__init__() unet_block = UnetSkipConnectionBlock(ngf * 8, ngf * 8, input_nc=None, submodule=None, norm_layer=norm_layer, innermost=True) for i in range(num_downs - 5): unet_block = UnetSkipConnectionBlock(ngf * 8, ngf * 8, input_nc=None, submodule=unet_block, norm_layer=norm_layer, use_dropout=use_dropout) unet_block = UnetSkipConnectionBlock(ngf * 4, ngf * 8, input_nc=None, submodule=unet_block, norm_layer=norm_layer) unet_block = UnetSkipConnectionBlock(ngf * 2, ngf * 4, input_nc=None, submodule=unet_block, norm_layer=norm_layer) unet_block = UnetSkipConnectionBlock(ngf, ngf * 2, input_nc=None, submodule=unet_block, norm_layer=norm_layer) self.model = UnetSkipConnectionBlock(output_nc, ngf, input_nc=input_nc, submodule=unet_block, outermost=True, norm_layer=norm_layer) def forward(self, x): return self.model(x) ``` #### 实现鉴别器架构 接着是 patch-GAN 鉴别器的设计。这种类型的鉴别器专注于局部区域而非整张图片,从而提高了效率并且减少了所需参数的数量[^3]。 ```python class NLayerDiscriminator(nn.Module): """Defines a PatchGAN discriminator""" def __init__(self, input_nc, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d): super(NLayerDiscriminator, self).__init__() kw = 4 padw = 1 sequence = [ nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw), nn.LeakyReLU(0.2, True) ] nf_mult = 1 nf_mult_prev = 1 for n in range(1, n_layers): nf_mult_prev = nf_mult nf_mult = min(2 ** n, 8) sequence += [ nn.Conv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=2, padding=padw, bias=False), norm_layer(ndf * nf_mult), nn.LeakyReLU(0.2, True) ] nf_mult_prev = nf_mult nf_mult = min(2 ** n_layers, 8) sequence += [ nn.Conv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw, bias=False), norm_layer(ndf * nf_mult), nn.LeakyReLU(0.2, True) ] sequence += [nn.Conv2d(ndf * nf_mult, 1, kernel_size=kw, stride=1, padding=padw)] self.model = nn.Sequential(*sequence) def forward(self, input): return self.model(input) ``` #### 训练过程概览 在训练期间,对于每一对输入图及其对应的目标图,计算生成损失以及对抗性损失。通过这种方式可以优化生成器以更好地模仿目标分布,并调整鉴别器区分真假样本的能力[^5]。 ```python criterionGAN = GANLoss() optimizer_G = optim.Adam(netG.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999)) optimizer_D = optim.Adam(netD.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999)) for epoch in range(opt.epoch_count, opt.niter + opt.niter_decay + 1): for data in dataset: real_A, real_B = data['A'].to(device), data['B'].to(device) fake_B = netG(real_A) pred_fake = netD(fake_B.detach()) loss_D_fake = criterionGAN(pred_fake, False) pred_real = netD(real_B) loss_D_real = criterionGAN(pred_real, True) optimizer_D.zero_grad() (loss_D_fake + loss_D_real).backward() optimizer_D.step() # Update Generator pred_fake = netD(fake_B) loss_G_GAN = criterionGAN(pred_fake, True) loss_G_L1 = L1_loss(fake_B, real_B) * lambda_L1 loss_G = loss_G_GAN + loss_G_L1 optimizer_G.zero_grad() loss_G.backward() optimizer_G.step() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值