Hdrpano 1.1.9

Hdrpano 1.1.9

Kilian Eisenegger维护。



Hdrpano 1.1.9

  • 作者:
  • Kilian Eisenegger

swift 5.2 platform iOS pod 1.1.9 DJI SDK 4.14 DJI DUX SDK 4.14 license MIT Aircrafts

DUX-iOS from hdrpano

这是什么?

Hdrpano 框架内包含 DJI SDK 以及光学和 GPS 的数学函数。

此 SDK 基于 DJI iOS SDK 的 DJI-SDK-iOS DJI-UXSDK-iOS DJIWidget

本项目使用 Swift 5.2 和 Xcode 12

此 SDK 简化了键和函数的使用。例如

Hdrpano.setMaxHeight(Height: 120)           // Set max flight height EASA, Skyguide rules
Hdrpano.setMaxRadius(Radius: 500)           // Set max distance to EASA, Skyguid rules
Hdrpano.setLowBattery(Low: 30)              // Set low battery to 30%
Hdrpano.setFileFormat(fileFormat: .JPEG)    // Set file format
Hdrpano.setShootMode(shootMode: .single)    // Set shooting mode
Hdrpano.setISO(ISO: .ISO100)                // Set ISO to max resolution

感谢 Xcode 的自动完成功能,您可以看到正确的设置。Xcode 提供了完成选项:如果您输入

Hdrpano.setISO(ISO: .
                    .AUTO 
                    .ISO100
                    .ISO200

您将看到所有可能的逻辑

此 SDK 中有一些强大的功能

self.panoSettings = Hdrpano.getSettings(modelName: self.aircraftModel)

此函数返回飞机的行、列、焦距、最大俯仰角和最小俯仰角的最佳设置数组。不要更改这些值!任务的 最大俯仰角和 Mavic 2 飞机的限制是 +25°,而不是 +30°。如果您更改此值,任务代码将无法工作。DJI 在他们的内部全景功能中仅使用 +13°。

let grid = Hdrpano.createGridLinear(cols: self.panoSettings[1], rows: self.panoSettings[0], 
           maxGimb: Float(self.panoSettings[3]), maxNadir: self.panoSettings[4])

此函数返回您飞机的全景位置数组。使用此数组,可以轻松移动飞机和云台以进行全尺寸全景拍摄。此 SDK 还创建一个 Papywizard xml 文件 用于此网格。您可以使用 AirDrop 保存此文件。此 Papywizard xml 文件与 Autopano 和 PTGui 兼容。观看我的视频,了解如何使用飞机拍摄 5 枚俯视拍摄。

func xmlGenerateGeneric() -> String {
    // Creates a Papywizard xml file for stitching in Autopano and PTGui
    self.panoSettings = Hdrpano.getSettings(modelName: self.aircraftModel)
    let grid = Hdrpano.createGridLinear(cols: self.panoSettings[1], rows: self.panoSettings[0], 
               maxGimb: Float(self.panoSettings[3]), maxNadir: self.panoSettings[4])
    NSLog("Grid settings for xml \(grid) \(grid.count)")
    var xml: String = ""
    xml += Hdrpano.xmlHeader(modelName: self.aircraftModel, panoSettings: self.panoSettings)
    xml += Hdrpano.createGenericXML(grid: grid, modelName: self.aircraftModel)
    xml += Hdrpano.xmlEnd(counter: grid.count, heading: 0, zenith: 5)
    return xml
}

let fileName = Hdrpano.saveGenericXmlFile(xml: self.xmlGenerateGeneric(), modelName: self.aircraftModel)
self.airdropXML(fileName: fileName)

像 Phantom 4 Pro 或 Mavic 这样的飞机具有连续自动对焦 AFC。如果相机指向例如蓝天,AFC 模式则不起作用。相机无法在蓝天上找到焦点。照片捕捉会停止。我添加了一个功能,可以将 AFC 模式重置为简单的自动曝光模式。此功能会检查 AFC 是否可用。

Hdrpano.setFocusModeAuto()

Watch the video

安装

1. 安装 CocoaPods

打开终端,切换到下载项目的目录,输入以下命令进行安装

sudo gem install cocoapods

此过程可能需要较长时间,请耐心等待。有关更详细的安装说明,请参阅此指南

2. 使用 CocoaPods 在项目中安装 UX SDK 和 DJIWidget

DUX-iOS 路径下运行以下命令

pod install

如果安装成功,你应该会看到以下类似的输出信息

Analyzing dependencies
Downloading dependencies
Installing Hdrpano (1.1.9)
Installing DJI-SDK-iOS (4.14)
Installing DJI-UXSDK-iOS (4.14)
Installing DJIWidget (1.6.4)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `DUX-iOS.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

注意:如果在 pod install 过程中遇到“Unable to satisfy the following requirements”问题,请运行以下命令以更新您的 pod repo 并重新安装 pod

pod repo update
pod install

现在您可以在 swift 文件中导入该框架。

import UIKit
import DJIUXSDK
import DJISDK
import Hdrpano

DJIWidget 集成

从 DJI iOS SDK 4.7 版本开始,DJI 用 DJIWidget 替换了 VideoPreviewer 用于视频解码。

DUX-iOS 项目使用 DJIWidget 框架中的 DefaultViewController。我已在默认视图中添加了额外的部件。

Gimbal Status Bar 
Yaw Status Bar
Coordinates widget 
Focal length widget 
AE button

AE 按钮会将自动曝光设置(如 ISO、光圈、曝光和 EV)复制到手动设置中。这对于在手动模式下进行的全景拍摄非常重要。我们使用此功能与

Hdrpano.setAE2AM()

全景功能

框架根据航向和俯仰坐标计算了一个数学上的全球形网格的重叠(与地荡位置无关),这种重叠与图像的相同。我们将其称为全球形全景,顺序为左 - 右 - 左... 线性网格顺序为上 - 下 - 上,并不总是有相同重叠。框架首先生成一个带有航向和俯仰坐标的数组。它还可以为 Inception 飞行生成 GPS 数组。另一个函数读取此数组,并将信息转换为无人机航向和云台俯仰。

每个全景都有列和行,这取决于镜头的焦距。我们可以使用以下函数获得这些值。

let panoSettings = Hdrpano.getSettings(modelName: aircraftModel)

现在,我们使用这些数组值创建一个网格。

var grid: [[Float]]
grid = Hdrpano.createGridSpheric(cols: panoSettings[1], 
                                 rows: panoSettings[0],
                                 maxGimb: Float(panoSettings[3]), 
                                 maxNadir: Float(panoSettings[4]), 
                                 Nb: 0)

当我们有了网格数组后,我们可以将这些值翻译到时间线任务代码中。

let error = DJISDKManager.missionControl()?.scheduleElements(Hdrpano.shootTLPano(grid: grid))

函数 Hdrpano.shootTLPano(grid: grid) 返回一个基于网格数组的活动时间线数组。航向动作是简单的飞机翻身命令。如果我们想移动云台,我们使用其他函数:Hdrpano.shootTLPanoInspire(grid: grid)。此功能不随基本框架密钥提供。

if error != nil {
        self.showAlert(title: "Error building timeline mission", message: String(describing: error))
} else {
    DJISDKManager.missionControl()?.startTimeline()
}

现在我们已经启动了时间线任务。

DJISDKManager.missionControl()?.pauseTimeline()

使用此函数,我们可以暂停任务。

DJISDKManager.missionControl()?.resumeTimeline() 

此外,使用 resume 我们可以继续任务。

DJISDKManager.missionControl()?.stopTimeline()
DJISDKManager.missionControl()?.unscheduleEverything()

使用 stopunschedule 我们可以停止任务并清理任务控制堆栈。

数字摄影测量

我已将3D数字摄影测量算法集成到此框架中。

DJI SDK更新

如果您使用pod安装更新DJI SDK,Hdrpano框架将始终使用此最新版本。只有当DJI SDK添加新功能时,Hdrpano框架才需要更新。

时间线任务

每架飞机具有不同的焦距和摄像头能力。此框架处理所有镜头(除X3外)。支持的变焦镜头:X5、X5S、X7...

此框架与时间线任务代码一起工作。飞机、摄像头和云台在时间线操作中移动到完整任务。此任务可以暂停、继续和停止。摄像头时间线动作只能处理单次曝光图像。例如AEB或超光线(多帧)是不可能的。那是时间线代码的很大缺点。在复杂任务中,处理复杂的摄像头功能很困难。飞机和云台必须等待照片拍摄和存储完成。三次图像AEB RAW拍摄在所有照片拍摄并存储之前可能需要5到30秒。任务代码必须处理设备的拍摄和存储反馈。我们可以使用Xcode的出色中央调度GCD来处理。GCD编程并不容易做。这就是为什么时间线更容易使用的原因。内部DJI GO 4全景内置功能仅使用单次曝光,就像时间线任务代码一样。Litchi或hdrpano之类的应用程序使用自己的GCD任务代码。因此,我们将从时间线任务代码开始。

在线跟踪

此框架已准备好用于Airmap使用,这意味着在线遥测。

DJI 开发工作流程

从注册为开发者到部署应用程序,以下内容将带您全面了解移动 SDK 应用程序开发流程。

如何使用

运行 pod install 就可以了!

如果您想学习如何使用它,请关注我的 YouTube 频道

团队

本框架仅由 hdrpano 支持。您可以在我的 YouTube 频道 上找到许多教程。