0.前言
我们在使用DJI无人机进行某种应用的实验的时候,很容易出现的一个场景是:不仅仅需要无人机记录的摄像机拍摄的视频,还需要某次飞行的具体数据,例如在飞行的采样时刻时的飞行速度、高度、经纬度、偏航,滚转,俯仰角等信息。这些信息通常并不是直接显式地、简单地能够通过DJI提供的简单用户界面,例如通过DJI FLY APP就能够获取的,需要我们通过开发者套件去得到具体的飞行数据。
0.1 实验环境
本文实验的环境:
- 无人机型号:Mavic 3
- 手机信息:Android 13安装的最新版本DJI FLY APP*
本文以下的行文皆默认在此实验环境下讨论。
*注:使用第三方或者iOS端的DJI遥控飞行APP会产生与本文介绍的飞行记录数据格式§1.1 手机端DJI TXT logs不同,如果读者的环境与本文不符,请参考本节§1.3 本节其他参考文献 末尾的的参考文献。1.飞行数据类型
DJI Drone在飞行过程中,在不同的设备载体中可能会存在不同的飞行记录(Flight log)。
值得注意的是,DJI Drone产品的推出持续了一定的年份。在讨论DJI的飞行数据时,不得不考虑实验设备差异的问题,即不同型号和不同固件版本的无人机与遥控器、不同手机操作系统的手机、不同的飞行APP(DJI推出的用于操控无人机的手机APP有数次变更,同时DJI允许第三方APP通过DJI SDK开发飞行APP)等也会在不同的时间阶段产生不同的飞行数据,针对它们的解密方法五花八门。在这里我们只讨论Mavic3之后的
DJI Drone在某次飞行结束后产生的飞行记录的类型是较多的,但是我们主要关注如下几个:
- 手机端DJI TXT logs;
- 飞行器DAT文件(黑匣子数据)。
1.1 手机端DJI TXT logs
这个是我们唯一能够解密的飞行数据信息。
关于该TXT的信息简介如下:
- 数据格式:加密.txt文件
- 创建方式:DJI SDK
- 记录范围:电机启动到停止(或丢失信号的最后时刻)
- 采样频率:0.2s/次,10Hz
- 传输链路:无人机到遥控器到手机
- 数据类型:IMU计算后的数据,
非传感器原始数据 - 信息类型:采样时间、设备,电池信息、飞行距离、飞行速度、飞行高度、经纬度、偏航,滚转,俯仰角等
- 缺点:采样频率较低,无传感器原始数据
- 空间占用:数MB
1.1.1 获取方法
按照本文的实验环境,安卓端的DJI FLY APP的飞行记录保存在 Android\data\dji.go.v5\files\FlightRecord
。
LOG的命名具有规律,例如:DJIFlightRecord_2023-09-21_[15-21-40].txt,包含有飞行起始时间。
如需了解其他版本或手机的更多获取方法,请参考网址:
1.1.2 具体信息
通过DJI SDK解密或者通过PhantomHelp or AirData网站上传飞行记录可获取到飞行记录的明文。
这里简单节选个别重要参数介绍一下飞行记录包含的项目。
飞行记录明文在结构上主要分为两个一级项目:
- summary:飞行器的硬件信息以及本次飞行总览和起始信息;
- info:以0.2s/次为采样频率采集的当前采样时刻的具体数据。
1.1.2.1 summary:
summary下二级项目 | 三级项目1 | 三级项目2 | 备注 |
---|---|---|---|
batteriesInformation | firmwareVersion | serialNumber | |
camerasInformation | firmwareVersion | serialNumber | |
gimbalsInformation | firmwareVersion | serialNumber | |
remoteControllerInformation | firmwareVersion | serialNumber | |
flightControllerInformation | firmwareVersion | serialNumber | |
startTime | \ | \ | Unix 时间戳 |
startCoordinate | latitude | longitude | |
totalDistance | \ | \ | 英尺 |
totalTime | \ | \ | 秒 |
samplingRate | \ | \ | 采样率=10 |
maxHeight | \ | \ | 米 |
maxHorizontalSpeed | \ | \ | 米每秒 |
maxVirticalSpeed | \ | \ | 米每秒 |
其中第一行指的是summary这个一级项目下的部分二级项目,表格的列代表当前二级项目下包含的三级项目。
为了方便理解,以电池信息这个二级项目为例:
1 |
|
1.1.2.2 info:
该一级项目的分项目极多,取决于你的飞行时间。我们取某次采样时刻的json信息节选部分如下:
某采样时刻下的二级项目 | 备注 | ||
---|---|---|---|
flightControllerState | attitude | \ | attitude包括pitch, yaw, roll |
homeLocationCoordinate | latitude | longitude | 精度足够,参考见表格下方json参考 |
takeoffLocationAltitude | \ | \ | |
aircraftLocation | latitude | longitude | 精度足够,参考见表格下方json参考 |
altitude | \ | \ | 米 |
flightMode | \ | \ | |
GPSSignalLevel | \ | \ | |
satelliteCount | \ | \ | 卫星数量 |
isFlying | \ | \ | |
areMotorsOn | \ | \ | |
velocity | \ | \ | 通过IMU计算的速度,包括X, Y, Z速度 |
flightTimeInSeconds | \ | \ | 飞行时间,单位秒 |
cumulativeFlightDistance | \ | \ | 米 |
cameraState | mode | remainingSpaceInMB | |
gimbalState | atitude | \ | attitude包括pitch, yaw, roll |
为了方便理解,以某个采样时刻的json信息为例:
1 |
|
可见经纬度和时间信息可以满足精度要求。
*注:为保护隐私,举例的信息数值中的经纬度系随机伪造,非真实信息。1.2 飞行器DAT文件(黑匣子数据)
飞行器DAT文件包含有包括传感器的原始数据的完整的信息,文件很大,大概在几GB左右,但是较新的机型无法解密。唯一能够解密的是DJI,因包含一些机密信息,DJI不可能提供解密方法。
因此总结一句话,该文件对我们
1.3 本节其他参考文献
2.解密方法
实际的解密方法有很多,也很简单,如果不担心飞行记录泄密,大可在PhantomHelp或AirData 上传你的飞行记录。如果你希望利用DJI SDK离线解密,可以参考如下方法。
本文实验环境:
- PC操作系统:Ubuntu 22.04
- 材料:准备好某次飞行log:
DJIFlightRecord_2023-09-21_[15-21-40].txt
2.1 DJI SDK:FlightRecordParsingLib
利用DJI SDK中的FlightRecordParsingLib
示例程序即可轻松解密。
仓库地址:
2.2 解密步骤
主要介绍在Ubuntu下解密的步骤,docker的方法其实就是创建一个Ubuntu镜像运行该脚本,异曲同工。
注册DJI开发者账号并获取APP KEY
🔗开发者注册链接->点击此处
克隆项目:
安装相关依赖:
*注:缺乏相关依赖会无法编译,按照官方库的参考文档,会因缺少 `libcurl4-openssl-dev` 和 `zlib1g-dev` 而无法编译。编译
1
2
3cd dji-flightrecord-kit/build/Ubuntu/FRSample
sh generate.sh
./FRSample导出
首先在终端导入你的APP KEY:1
export SDK_KEY=your_APP_KEY
导出解密明文:
1
./FRSample DJIFlightRecord_2023-09-21_[15-21-40].txt > output.json
最后检查导出的文件即可。
2.3 本节参考文献
- https://github.com/dji-sdk/FlightRecordParsingLib/issues/8
- https://github.com/dji-sdk/FlightRecordParsingLib/issues/13
3. 小结
本文简单介绍了DJI无人机飞行记录的类型和形式,罗列了关键的部分项目,并提供了部分解释和例子。另外,介绍了使用DJI SDK离线解密DJI飞行记录的方法,修正了官方SDK仓库使用文档的问题,能够在Ubuntu和Docker下运行解密。