DJI SDK 代码分析
本文分析了DJI SDK的接口和技术实现,涵盖了硬件拓扑、控制功能、管理功能和扩展功能,包括时间同步、基础控制、运动规划、消息管理、云台和相机管理等。还介绍了SDK的激活流程和分层结构,以及后台的技术分析,如广播和请求应答机制。
type
status
date
slug
summary
tags
category
icon
password
1 概述2 硬件拓扑3 功能3.1 控制类功能3.1.1 时间同步3.1.2 基础控制3.1.3 运动规划3.2 管理类功能3.2.1 消息管理3.2.2 云台管理3.2.3 相机管理3.3 拓展类功能3.3.1 SDK 互联互通3.3.2 高级视觉4 激活流程5 SDK分层5.1 Hal层5.2 Osal层6 后台技术分析6.1 广播6.2 请求应答6.3 libdji-linker.a库分析6.4 其数据交互接口函数6.5 技术框架
1 概述
分析DJI SDK提供的接口,反推技术实现,帮助我们更好地理解和开发DJI SDK
2 硬件拓扑
3 功能
3.1 控制类功能
3.1.1 时间同步
获取NMEA数据:获取无人机使用的定位系统的数据,如GPS、伽利略、北斗及GLONASS 等
获取PPS数据:获取无人机的硬件触发脉冲信号
获取UTC时间:获取统一的UTC时间
3.1.2 基础控制
设置或获取无人机飞行控制器的参数,如返航高度,避障状态等
执行基本的飞行任务,如起飞、降落及返航等
无人机基础控制功能,如速度控制、姿态控制和位置控制
起飞降落
自动起飞
自动降落
取消自动降落
降落确认
强制降落
锁定: 解锁|上锁
返航: 返航|取消返航
置无人机使用的坐标系
水平控制的模式
垂直控制的模式
yaw角度控制的模式
悬停模式
3.1.3 运动规划
航点任务:控制DJI 的无人机按照预设的多个航点实现自主飞行
热点任务:控制无人机围绕设置的兴趣点环绕飞行
航点
航点数量(65535)
航点类型
曲率飞行
直线飞行
动作(任务动作)
动作信息
动作数量
动作管理
动作触发
速度控制
3.2 管理类功能
3.2.1 消息管理
广播:使用OSDK 开发的应用程序能够接收无人机主动推送给其他模块的数据,同时将第三方传感器的数据广播给第三方信息接收设备
消息订阅:使用OSDK 开发的应用程序能够记录用户所需订阅的数据
3.2.2 云台管理
云台控制:控制云台转动的角度和角速度
信息获取:获取云台当前的角度和角速度
3.2.3 相机管理
参数设置:设置相机如光圈、曝光时间及分辨率等各项参数
相机控制:控制相机实现拍照、录像及指点变焦等功能
码流获取:获取相机的RGB 码流和H.264 码流
3.3 拓展类功能
3.3.1 SDK 互联互通
与基于MSDK 开发的移动端APP 间通信
与基于PSDK 开发的负载设备间通信
3.3.2 高级视觉
对象识别
获取感知灰度图
4 激活流程
图 DJ第三方开发权限激活流程
飞机平台通过网络或者串口链接到DJ助手,DJ助手链接到DJ云,把飞机绑定到自己的账号上,买对应的功能,然后获取到应用ID和应用KEY,然后用KEY激活对应的功能。
5 SDK分层
图 sdk分层框图
5.1 Hal层
Hal(Hardware Abstraction Layer,硬件接口层)是OSDK 硬件接口抽象层,位于操作系统、应用程序和硬件接口间,开发者需要按照指定接口中的函数原型,实现并将适配Hal 层的函数注册到应用程序中,使基于OSDK 开发的应用程序通过Hal 层直接访问不同计算平台硬件的底层资源,并与无人机通信。
串口Demo
自己实现的函数
注册回调
注册到底层
5.2 Osal层
Osal(Operating System Abstraction Layer,操作系统抽象层)是OSDK 的操作系统抽象层,位于应用程序和操作系统间。开发者需要按照PsdkPlatform_RegOsalHandler()接口中的函数原型,实现并将适配Osal 层的函数注册到应用程序中,使基于OSDK 开发的应用程序通过Osal 层直接访问操作系统以及操作系统内核的资源,将应用程序移植到不同的操作系统上。
Demo
系统函数linux实现
回调注册
注册到底层
6 后台技术分析
6.1 广播
用订阅发布模式,把所有飞机自身的数据和传感器产生的数据都广播出来。
订阅规则:
消息订阅功能最多支持订阅0Hz、1Hz、10Hz、50Hz、100Hz,5类频率,每个订阅项只能被订阅一次。
指定订阅频率时,任何参数的订阅频率不能小于或等于0 ,相同订阅频率的主题的数据长度总和须小于或等于242。
函数接口:
广播初始化接口
启动广播,第一个是异步接口,第二个是同步接口
移除订阅消息,取消广播
6.2 请求应答
请求应答用于功能设置和参数查询地方。参考6.1请求应答功能底层也是注册回调函数然后响应,只不过用的同步函数接口。
DEMO 起飞
起飞函数逻辑
最底层调用libdji-linker.a库
6.3 libdji-linker.a库分析
图 libdji-linker.a的部分函数地址
通过用readelf工具分析,库中没有socket相关函数,反而有OsdkMsgq_xxx函数,可以得出结论这里是没有直接用网络通信,或者依赖其他库进行数据传递。
6.4 其数据交互接口函数
6.5 技术框架
Loading...