DJI的OSDK可以说是无人机软件developer的一个大门,想起在当年大三的时候某学长们做的视觉跟踪无人机,由于重点在于视觉跟踪算法,不想开发飞控,他们买了DJI naza飞控作为飞机飞控。可是遇到问题了:怎么用程序控制飞机?
当时DJI仍未有OSDK接口,他们于是发挥充分的想象力,直接把遥控器拆了,是的,用树莓派对遥控器进行改装,改掉杆位和滑轮电位器变成由程序控制,强行把遥控器做成了API接口来控制飞机……
这种需求在DJI OSDK发布之后已经变成小菜一碟。
Onboard SDK,顾名思义就是跑在板子上的一套SDK接口,通过串口与飞控进行通信,通过调用这些接口,developer就可以实现对DJI A3/N3/M100飞控进行起飞、降落、悬停、移动、拍照录像、控制云台等等功能。DJI的飞控做得稳如狗,如果仅仅可通过遥控和DJI专用APP操作飞机,这就限制了DJI飞控在各行各业上的拓展。因此DJI的SDK接口可谓为飞控的拓展和发展提供一条很“生态”的发展道路。
DJI的OSDK有以下几种:
其中Mobile SDK主要为IOS和Android系统提供APP上的SDK调用接口,链路为APP通过手机数据线连接遥控进行数据传输。Mobile SDK能完成比Onboard SDK更多的功能,但是实时性上比直接硬件连飞控的Onboard低,除此之外一旦飞机断开遥控器连接,Mobile SDK对飞机的操作将无能为力。
Guidance SDK则是Guidance避障系统的一套SDK接口,主要用于提供超声波以及双目的避障信息。
Payload SDK则是通过云台负载接口为云台挂载设备developer提供一些上位机以及订阅信息接口。
好的,回来,我所说的主题是Onboard SDK,在下面将简称为OSDK。
OSDK总体上可以分为上图四类,LINUX和ROS接口可以跑在linux板子上,Qt接口则可以跑在x86系统上,STM32接口可以泡在单片机上。其中我的博客都是基于STM32接口进行开发的,其实只要你把源码架构看一遍比较一下就知道,这几个平台调用的核心API源码其实是一样的,这几种平台接口只是在不同平台对核心API接口进行封装和适配。
所以在哪可以下载源码和说明文档呢?在这里:
https://developer.dji.com/cn/onboard-sdk/ (DJI Onboard SDK官网)
https://developer.dji.com/onboard-api-reference/index.html (DJI Onboard SDK官网API参考文档)
https://github.com/dji-sdk/Onboard-SDK (github下载源码)
STM32 SDK的源码用C++/C混合编写,开发IDE用的Keil5,对于一直使用C语言做单片机开发的developer来说可能会有点不习惯。但是当你真正了解过OSDK源码结构后,你会发现这套源码的水平的确很高,很多地方可以借鉴到自己的程序上,毕竟这些源码都是中国和美国的大神们编写的。OSDK细分成很多类:
Vehicle类,这是一个代表飞机整体的一个总的类,关于飞机的一切操作你都可以通过Vehicle类找到,里面包含了许多子类:
从子类的名字含义理解非常好理解
OpenProtocol类提供处理OSDK协议、发包解包、内存管理接口等相关函数(stm32 osdk的内存分配函数比较有意思,后续的博客会提到);
DataSubscription类与DataBroadcast类类似,都是用于获取飞控数据的接口。通俗来说,前者问啥发啥,不问不发;后者在调参软件指定好发什么后,一上电就会自动发。可以获取的飞行数据包括四元数、位置、高度、GPS信息、加速度、角速度等等等等。而且频率非常高,例如四元数获取的频率就可以达到400Hz;
Control类顾名思义就是提供控制飞机运动的接口,包括起飞降落动作、控制速度\姿态\位移、控制高度等等;
Camera类用于控制相机拍照录像;
Gimbal类用于控制云台pitch/roll/yaw运动,可以通过接口控制角度或者角速度来操作云台;
MFIO类用于MFIO功能,即可以把飞控上的某些管脚当做developer的GPIO、PWM输出、ADC管口等等(对于硬件板子高度定制的STM32开发者来说,貌似没什么用?);
MobileCommunication类用于和Mobile SDK进行数据透传,链路大概是:
STM32 <---串口---> 飞控 <---遥控---> MSDK
HardwareSync类用于与外部设备硬件同步;
VirtualRC类顾名思义虚拟一个遥控控制飞机,不过该功能不建议使用,在后面估计也没有了;
AdvancedSensing类仅支持M200系列,可以获取避障模块的信息;
接下来的几篇我会和大家讨论一下STM32 Onboard SDK的各种机制,包括协议、协议的发送接收、解包、内存管理等等等。