DJI Onboard SDK的发布扩展了无人机的应用领域,通过OnboardSDK,开发者可以将自己的计算设备挂载到飞行器上,通过有线串口直接控制飞机。 现在,DJI官方提供了Linux 命定行例程、windowsQT 例程、ROS例程,然而这三个例程都需要操作系统的支持,对于一般开发者而言,门槛还是比较高的,那么有什么办法能降低这个门槛呢?另外,现有的这三个例程,Windows QT估计不能让飞机实飞,难道挂一个Windows电脑到M100上?挂一个应该也可以,但是我相信谁也不愿意这么干。。。另外Linux命定行和ros例程可以在装有Linux系统的嵌入式板子上运行,可以放到飞机上实飞,但是也需要自己写启动脚本,让程序自动执行。看起来都是比较麻烦的。如果开发者没有这么深层次的嵌入式系统开发经验,只希望简单的方法来控制飞机呢?怎么办?办法当然是有的!!! DJI提供了标准的通信协议,我们只要按照协议进行数据收发,那么只需要这个机载设备支持串口通信,理论上都可以控制M100飞行。。。。 基于这样的想法,我开始学习OnboardSDK的代码,熟悉通信协议,然后在Linux 命定行例程的基础上进行移植裁剪,剥离了操作系统和线程的依赖,希望让类似STM32的这种没有MMU的低资源单片机、嵌入式平台也能实现对飞机的控制。目前通过STM32的移植,简化了Onboard SDK的代码,可以通过STM32串口完成飞机激活、获取控制权、起飞、返航、圆形轨迹飞行,正方体轨迹飞行,自动降落等,并能通过串口传回应答包,在STM32液晶上显示飞机激活、获取控制权结果等等。。。。 好了,废话不再多说了,下面上STM32工程代码
代码链接: 参照官方文档也写了个说明,写得有点乱,求理解。。。。 文档有错误的地方也欢迎指出,3Q!!! 说明文档 必备硬件 1. MATRICE 100 多轴飞行器 2. DJI串口连接线(包含在Matrice100附件当中) 3. 带液晶的STM32F103ZET6开发板(正点原子战舰开发板) 我使用的是淘宝购买的开发板: 当然,只要你有STM32 都可以,没有液晶也可以让飞机飞行,有串口就够了。 4. 24V转5V DC-DC电源模块(用来给STM32开发板供电,不要使用官方串口留出的6V电源,可能会造成STM32烧坏) 必备软件 1. 装有MDK472(或者更高版本)、JlinkV8驱动、DJI N1 PC调参软件、DJISimulator的windows电脑 2. 装有 DJI Pilot (最新版本)的可联网的移动设备 3. DJI_Onboard_API_STM32_keil_SampleV1.0 例程主要文件目录 DJIAPI | 经过移植后的Onboard SDK 代码目录,去除了线程和部分应答数据接收机制,主要是在官方Linux命定行例程基础上修改的,code.c基本不变,APP.c、link.c做少部分修改,test.c重新编写。 | CORE、HARDWARE、STM32F10x_FWLib、SYSTEM | STM32官方库和正点原子的部分硬件库(包括led,key,delay,lcd,sys,uart等) | | | | | | |
主要功能函数 1. 串口配置 voiduart_init(u32 bound);//初始化串口,设置STM32串口波特率 voidUSART1_SendBuffer(uint8_t *buf,uint16_t len);//串口发送一个字节 voidUSART1_IRQHandler(void);//串口中断接收函数,用于接收飞控的应答数据 2. SDK初始化 DJI_Pro_Test_Setup();//配置DJI SDK序列号密钥 初始化通信链路 3 飞机控制命定 DJI_Onboard_API_Activation();//激活API DJI_Onboard_API_Control(1);//获取控制权 voidDJI_Onboard_API_UAV_Control(unsigned char arg);//飞机控制 4起飞 6降落 1 返航 步骤 1. 连接飞机到电脑,使用DJI N1-Assistant_3.4.1 调参软件勾选启用API控制,并设置波特率为230400,使飞机与STM32波特率一致。如下图所示,关闭飞控主动推送标准数据包(全开会影响串口中断)。启动API后,将遥控器模式开关置于F档。 file:///C:/Users/LICHAO~1.WAN/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 2. 连接STM32串口。 如下图所示,是一根串口连接线,官方提供的是6P接口,实际上串口只需要接3P即可,我们将其与3根线去掉。如图对准正反面,从上到下依次是GND PA9(STM32 TXD 飞控的RXD) PA10(STM32RXD 飞控TXD)。最好不要接6P中的串口电源,因为是从飞控引出的6V。 file:///C:/Users/LICHAO~1.WAN/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 3. 例程配置 开发者在编译使用DJI_Onboard_API_STM32_keil_Sample前,需要根据在DJI网站注册获得的app id,api level ,密钥 key修改配置函数。如下图红色部分需要修改。此函数在DJI_Onboard_API_STM32_keil_Sample V1.0\DJIAPI\目录下的DJI_Pro_Test.c文件中: void DJI_Pro_Test_Setup(void) { activation_msg.app_id=10086; activation_msg.app_api_level= 2; activation_msg.app_ver= 1; memcpy(activation_msg.app_bundle_id,"1234567890123456789012",32); key = "be8631fb6d726cc64510dd9e74febe60400192e0b8608593828e"; Pro_Config_Comm_Encrypt_Key(key); Pro_Link_Setup(); } 开发者需要注意保证STM32程序的波特率配置和飞机波特率一致。 4. 编译下载、执行程序 打开DJI_Onboard_API_STM32_keil_Sample V1.0\Project目录,使用MDK打开M100_STM32_DEMO.uvproj工程文件,编译下载到STM32。 启动模拟器DJISimulator 将STM32通过扩展板固定到M100上,复位启动程序,按PE4键,PE4检测到低电平,开始给飞机发送指定,如果操作正确,STM32液晶屏将按顺序依次打印如图信息: 16进制码是飞控传回的应答数据包,转换成字符串打印在液晶屏上,方便调试。 file:///C:/Users/LICHAO~1.WAN/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 如果飞机连接的是模拟器,将会出现如下飞行轨迹,飞行动作包括起飞、绘制正方体、绘制圆,X轴直线运动、返航。 file:///C:/Users/LICHAO~1.WAN/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 如果是实飞,请到开阔空地,注释掉X轴直线运动,并将返航改为降落命定,而且需要修改PE4 按键后的延时,需要延长时间防止飞机起飞人来不及避开被飞机螺旋桨打伤。实飞时请务必注意安全! file:///C:/Users/LICHAO~1.WAN/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 例程不足的地方: 目前接收飞控数据是采用串口中断实现的,基本上是采用发送请求,等待应答方式,这种办法比较简单,也存在问题。如果需要接收飞控发回来的标准数据包就不行了。。。。 飞控的标准数据包是飞控主动推送给机载设备的,通过N1调参软件配置发送频率,如果一旦开启,飞控将已固定频率给机载设备发送数据,这时候串口中断接收必然受影响,这样子可能需要进行进一步处理,我想过通过STM32的DMA进行接收,目前还没有考虑好,在进一步调试中,有兴趣的朋友可以一起讨论。。。。。。。。 这个STM32的例程也可以移植到其他低资源平台,比如arduino,这样控制无人机的门槛将越来越低。。。。。。
|