获取大疆无人机的飞控记录数据并绘制曲线

机型M350RTK,其飞行记录文件为加密的,我的完善代码如下

git@github.com:huashu996/DJFlightRecordParsing2TXT.git

一、下载安装官方的DJIFlightRecord

git clone git@github.com:dji-sdk/FlightRecordParsingLib.git

飞行记录文件在打开【我的电脑】,进入遥控器内存,
文件路径:此电脑 > pm430 > 内部共享存储空间> DJI > com.dji.industry.pilot > FlightRecord 

二、注册成为大疆开发者获取SDK 密钥

网址如下DJI Developer

注册完之后新建APP获得密钥

  1. 登录 DJI 开发者平台,点击"创建应用",App Type 选择 "Open API",自行填写“App 名称”“分类”和“描述”,点击 "创建"。

  2. 通过个人邮箱激活 App,在开发者网平台个人点击查看对应 App 信息,其中 App Key 即为下文所需的 SDK 密钥参数。 

三、编译运行

编译 

cd FlightRecordParsingLib-master/dji-flightrecord-kit/build/Ubuntu/FlightRecordStandardizationCpp
sh generate.sh

运行

cd ~/FlightRecordParsingLib-master/dji-flightrecord-kit/build/Ubuntu/FRSample
export SDK_KEY=your_sdk_key_value
./FRSample /home/cxl/FlightRecordParsingLib-master/DJrecord/DJIFlightRecord_2023-07-18_[16-14-57].txt

 此时会在终端打印出一系列无人机的状态信息,但还是不能够使用

于是我更改了main.cc文件,使它能够保存数据到txt文件

四、获取单个数据

上一步生成的txt文件由于参数众多是巨大的,这里我写了一个py文件用于提取重要的信息,例如提取经纬度和高度

import json# Read JSON fragment from txt file
with open("output.txt", "r") as file:json_data = json.load(file)# Extract all "aircraftLocation" and "altitude" data
location_altitude_data = []
for frame_state in json_data["info"]["frameTimeStates"]:aircraft_location = frame_state["flightControllerState"]["aircraftLocation"]altitude = frame_state["flightControllerState"]["altitude"]location_altitude_data.append({"latitude": aircraft_location["latitude"], "longitude": aircraft_location["longitude"], "altitude": altitude})# Write values to a new txt file
with open("xyz_output.txt", "w") as f:for data in location_altitude_data:f.write(f"latitude: {data['latitude']}, longitude: {data['longitude']}, altitude: {data['altitude']}\n")print("Values extracted and written to 'output.txt' file.")

就能够生成只有这几个参数的txt文件 

 五、生成轨迹

将经纬度和高度生成xyz坐标和画图,暂定以前20个点的均值作为投影坐标系的原点

from pyproj import Proj
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as mplot3d
def read_coordinates_from_txt(file_path):coordinates = []with open(file_path, 'r') as file:for line in file:parts = line.strip().split(',')latitude = float(parts[0].split(':')[1].strip())longitude = float(parts[1].split(':')[1].strip())altitude = float(parts[2].split(':')[1].strip())coordinates.append((latitude, longitude, altitude))return coordinatesdef calculate_avg_coordinates(coordinates):num_points = len(coordinates)avg_latitude = sum(coord[0] for coord in coordinates) / num_pointsavg_longitude = sum(coord[1] for coord in coordinates) / num_pointsreturn avg_latitude, avg_longitudedef project_coordinates_to_xyz(coordinates, avg_latitude, avg_longitude, origin_x, origin_y):# Define the projection coordinate system (UTM zone 10, WGS84 ellipsoid)p = Proj(proj='utm', zone=20, ellps='WGS84', preserve_units=False)# Project all points in the coordinates list to xy coordinate systemprojected_coordinates = [p(longitude, latitude) for latitude, longitude, _ in coordinates]# Calculate the relative xyz values for each point with respect to the originrelative_xyz_coordinates = []for (x, y), (_, _, altitude) in zip(projected_coordinates, coordinates):relative_x = x - origin_xrelative_y = y - origin_yrelative_xyz_coordinates.append((relative_x, relative_y, altitude))return relative_xyz_coordinatesdef three_plot_coordinates(coordinates):# Separate the x, y, z coordinates for plottingx_values, y_values, z_values = zip(*coordinates)# Create a new figure for the 3D plotfig = plt.figure()ax = fig.add_subplot(111, projection='3d')# Plot points as a 3D scatter plotax.scatter(x_values, y_values, z_values, c='blue', label='Points')# Connect points with linesfor i in range(1, len(x_values)):ax.plot([x_values[i - 1], x_values[i]], [y_values[i - 1], y_values[i]], [z_values[i - 1], z_values[i]], 'k-', linewidth=0.5)# Add labels and titleax.set_xlabel('X (meters)')ax.set_ylabel('Y (meters)')ax.set_zlabel('Z (meters)')ax.set_title('Projected Coordinates - 3D')# Display the 3D plot in a separate windowplt.show()def two_plot_coordinates(coordinates):# Separate the x, y, z coordinates for plottingx_values, y_values, z_values = zip(*coordinates)# Create a new figure for the 2D plotfig = plt.figure()# Plot pointsplt.scatter(x_values, y_values, c='blue', label='Points')# Connect points with linesfor i in range(1, len(x_values)):plt.plot([x_values[i - 1], x_values[i]], [y_values[i - 1], y_values[i]], 'k-', linewidth=0.5)# Add labels and titleplt.xlabel('X (meters)')plt.ylabel('Y (meters)')plt.title('Projected Coordinates - 2D')plt.legend()# Display the 2D plot in a separate windowplt.show()if __name__ == "__main__":input_file_path = "xyz_output.txt"  # Replace with the actual input file pathcoordinates = read_coordinates_from_txt(input_file_path)# Use the first 10 points to define the projection coordinate systemnum_points_for_avg = 20avg_coordinates = coordinates[:num_points_for_avg]avg_latitude, avg_longitude = calculate_avg_coordinates(avg_coordinates)# Project the average latitude and longitude to xy coordinate systemp = Proj(proj='utm', zone=20, ellps='WGS84', preserve_units=False)origin_x, origin_y = p(avg_longitude, avg_latitude)print(f"Average Latitude: {avg_latitude}, Average Longitude: {avg_longitude}")print(f"Projected Coordinates (x, y): {origin_x}, {origin_y}")# Project all points in the coordinates list to xy coordinate systemfirst_coordinates = [(0, 0, 0)] * min(len(coordinates), num_points_for_avg)projected_coordinates2 = project_coordinates_to_xyz(coordinates[num_points_for_avg:], avg_latitude, avg_longitude, origin_x, origin_y)projected_coordinates = first_coordinates+projected_coordinates2# Save projected coordinates to a new text fileoutput_file_path = "projected_coordinates.txt"with open(output_file_path, 'w') as output_file:for x, y, z in projected_coordinates:output_file.write(f"x: {x}, y: {y}, z: {z}\n")three_plot_coordinates(projected_coordinates)two_plot_coordinates(projected_coordinates)

生成xyz的txt文档 

 

 

上述只以坐标为例子,想获取其他数据,改变参数即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构型设计模式之装饰器模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

LiveNVR监控流媒体Onvif/RTSP功能-支持无人机、IPC等设备RTMP推流转码分发H5无插件播放也支持GB28181输出

LiveNVR支持无人机、IPC等设备RTMP推流转码分发H5无插件播放也支持GB28181输出 1、无人机推流转国标2、获取RTMP推流地址2.1、RTMP推流地址格式2.2、推流地址示例 2、设备RTMP推流3、配置拉转RTMP3.1、直播流地址格式3.2、直播流地地址示例3.3、通道配置直播流地址 4、配置级联…

深入浅出多种开发语言对接淘宝京东1688阿里巴巴等电商平台,获取实时商品详情数据API接口介绍

api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口,可以帮助API使用者更好地了解、使用和集成,同时帮助人们有效地维护它每个产品都需要使用手册,API也不例外在API领域,可以将设计视为服务器和客户端之…

IDE /完整分析C4819编译错误的本质原因

文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…

属猴人性格及一生运势怎么样?

生肖属猴的人聪明,才华出众,是个非常会处理人际关系的生肖, 开朗,大方,人缘好,而且能说会道,嘴巴甜,也特别擅长社交,喜欢热闹, 所以属猴人不管在哪都容易受到…

数仓学习---13、报表数据导出

星光下的赶路人star的个人主页 莫见长安行乐处,空令岁月易蹉跎 文章目录 一、报表数据导出1.1 MySQL建库建表1.1.1 创建数据库1.1.2 创建表 1.2 数据导出1.2.1 DataX配置文件生成脚本1.2.2 编写每日导出脚本 一、报表数据导出 为方便报表应用使用数据,需…

Java诊断利器 Arthas-- 一款释放潜力的神器

嘿,你是不是对Java开发中的调试和诊断问题感到头疼? 别担心,我要告诉你一个秘密武器!它就像是一位超级英雄,能够释放你的潜力,解决你的烦恼!它的名字叫做Arthas,是一款Java诊断利器…

手写Nacos基本原理——服务注册 配置管理

手写Nacos基本原理 一、背景介绍二、 思路方案三、过程nacosService代码pom文件配置文件具体类 nacosSDK代码pom文件配置类具体类 serviceA代码pom文件配置文件具体类 serviceB代码pom文件配置文件具体类 实现效果四、总结五、升华 一、背景介绍 之前在项目开发的过程中&#…

C# List 详解五

目录 26.GetType() 27.IndexOf(T) 28.IndexOf(T, Int32) 29.IndexOf(T, Int32, Int32) 30.Insert(Int32, T) 31.InsertRange(Int32, IEnumerable) 32.LastIndexOf(T) 33.LastIndexOf(T, Int32) 34.LastIndexOf(T, Int32, Int32) …

【CAS6.6源码解析】调试Rest API接口

CAS的web层默认是基于webflow实现的,ui和后端是耦合在一起的,做前后端分离调用和调试的时候不太方便。但是好在CAS已经添加了支持Rest API的support模块,添加相应模块即可。 文章目录 添加依赖并重新build效果 添加依赖并重新build 具体添加…

32位Cortex-M4 MCU:LPC54607J256ET180E、LPC54605J512BD100K 180MHz嵌入式微控制器

LPC546xx 32 位微控制器(MCU) 具有丰富的外设集、极低的功耗和增强的调试功能。 LPC546xx MCU系列采用ARM Cortex-M4内核,可提供以太网支持,并设有一个TFT LCD控制器和两个CAN FD模块。LPC546xx MCU旨在提高灵活性和性能可扩展性,可提供高达1…

Vue3 Vite electron 开发桌面程序

Electron是一个跨平台的桌面应用程序开发框架,它允许开发人员使用Web技术(如HTML、CSS和JavaScript)构建桌面应用程序,这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…

ABAP 为N的一个数,在原来基础上浮动在-30~30

需求:为N的一个数,在原来基础上浮动在-30~30 *&---------------------------------------------------------------------* *& Report ZZZZ111 *&---------------------------------------------------------------------* *& 需求&…

【算法基础:搜索与图论】3.4 求最短路算法(Dijkstrabellman-fordspfaFloyd)

文章目录 求最短路算法总览Dijkstra朴素 Dijkstra 算法(⭐原理讲解!⭐重要!)(用于稠密图)例题:849. Dijkstra求最短路 I代码1——使用邻接表代码2——使用邻接矩阵 补充:稠密图和稀疏…

npm i babel-plugin-import -D之后报错

替换modules/.bin/XX文件 1.vue-cli-service #!/bin/sh basedir$(dirname "$(echo "$0" | sed -e s,\\,/,g)")case uname in*CYGWIN*) basedircygpath -w "$basedir";; esacif [ -x "$basedir/node" ]; then"$basedir/node"…

【NLP】视觉变压器与卷积神经网络

一、说明 本篇是 变压器因其计算效率和可扩展性而成为NLP的首选模型。在计算机视觉中,卷积神经网络(CNN)架构仍然占主导地位,但一些研究人员已经尝试将CNN与自我注意相结合。作者尝试将标准变压器直接应用于图像,发现在…

CAXA中.exb或者.dwg文件保存为PDF

通常CAXAZ中的文件为.exb或者.dwg格式,我们想打印或者保存为PDF文件格式,那么就用一下的方法: CAXA文件如图所示: 框选出你要打印的图纸!!!! 我们选择"菜单"->"…

【算法基础:搜索与图论】3.5 求最小生成树算法(PrimKruskal)

文章目录 最小生成树介绍朴素Prim算法算法思路⭐例题:858. Prim算法求最小生成树 Kruskal算法算法思路⭐例题:859. Kruskal算法求最小生成树 最小生成树介绍 最小生成树 有关树的定义 生成子图:生成子图是从原图中选取部分节点以及这些节点…

Keepalived热备、Keepalived+LVS、HAProxy监控及后端服务器健康检查、负载均衡调度器对比

day02 day02KeepAlived高可用集群配置高可用的web集群监控本机80端口,实现主备切换实现原理实施配置高可用、负载均衡的web集群配置高可用、负载均衡HAProxy配置haproxy负载均衡调度器比较LVS(Linux Virtual Server)NginxHAProxy KeepAlive…

Pytorch个人学习记录总结 08

目录 神经网络-搭建小实战和Sequential的使用 版本1——未用Sequential 版本2——用Sequential 神经网络-搭建小实战和Sequential的使用 torch.nn.Sequential的官方文档地址,模块将按照它们在构造函数中传递的顺序添加。代码实现的是下图: 版本1—…