亿加合和智能车制作

标题: 大疆Onboard SDK移植到STM32 成功控制M100飞行 [打印本页]

作者: wanglichao    时间: 2015-8-1 21:03
标题: 大疆Onboard SDK移植到STM32 成功控制M100飞行
   DJI Onboard SDK的发布扩展了无人机的应用领域,通过OnboardSDK,开发者可以将自己的计算设备挂载到飞行器上,通过有线串口直接控制飞机。
  http://dev.dji.com/cn       http://bbs.dji.com/forum.php?mod ... peid&typeid=182
   现在,DJI官方提供了Linux 命定行例程、windowsQT 例程、ROS例程,然而这三个例程都需要操作系统的支持,对于一般开发者而言,门槛还是比较高的,那么有什么办法能降低这个门槛呢?另外,现有的这三个例程,Windows QT估计不能让飞机实飞,难道挂一个Windows电脑到M100上?挂一个应该也可以,但是我相信谁也不愿意这么干。。。另外Linux命定行和ros例程可以在装有Linux系统的嵌入式板子上运行,可以放到飞机上实飞,但是也需要自己写启动脚本,让程序自动执行。看起来都是比较麻烦的。如果开发者没有这么深层次的嵌入式系统开发经验,只希望简单的方法来控制飞机呢?怎么办?办法当然是有的!!!
  DJI提供了标准的通信协议,我们只要按照协议进行数据收发,那么只需要这个机载设备支持串口通信,理论上都可以控制M100飞行。。。。
   基于这样的想法,我开始学习OnboardSDK的代码,熟悉通信协议,然后在Linux 命定行例程的基础上进行移植裁剪,剥离了操作系统和线程的依赖,希望让类似STM32的这种没有MMU的低资源单片机、嵌入式平台也能实现对飞机的控制。目前通过STM32的移植,简化了Onboard SDK的代码,可以通过STM32串口完成飞机激活、获取控制权、起飞、返航、圆形轨迹飞行,正方体轨迹飞行,自动降落等,并能通过串口传回应答包,在STM32液晶上显示飞机激活、获取控制权结果等等。。。。
  
  好了,废话不再多说了,下面上STM32工程代码
  代码链接:
     https://github.com/Supowang/DJI_Onboard_API_STM32_keil_Sample
参照官方文档也写了个说明,写得有点乱,求理解。。。。
文档有错误的地方也欢迎指出,3Q!!!
说明文档
必备硬件
1.      MATRICE 100 多轴飞行器
2.      DJI串口连接线(包含在Matrice100附件当中)
3.      带液晶的STM32F103ZET6开发板(正点原子战舰开发板)
我使用的是淘宝购买的开发板:
https://item.taobao.com/item.htm?spm=a230r.1.14.63.bdxnXe&id=41676254353&ns=1&abbucket=6#detail
当然,只要你有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.clink.c做少部分修改,test.c重新编写。
COREHARDWARESTM32F10x_FWLibSYSTEM
STM32官方库和正点原子的部分硬件库(包括ledkeydelaylcdsysuart等)
ListobjProject
STM32工程相关目录
User
控制M100的主函数与中断服务程序等
Doc
例程文档
主要功能函数
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调参软件配置发送频率,如果一旦开启,飞控将已固定频率给机载设备发送数据,这时候串口中断接收必然受影响,这样子可能需要进行进一步处理,我想过通过STM32DMA进行接收,目前还没有考虑好,在进一步调试中,有兴趣的朋友可以一起讨论。。。。。。。。
  这个STM32的例程也可以移植到其他低资源平台,比如arduino,这样控制无人机的门槛将越来越低。。。。。。
   


作者: 何俊    时间: 2015-8-2 13:05
66666
作者: soledad928    时间: 2015-9-2 10:32
厉害,!!!!!!!
作者: 1992114    时间: 2017-2-15 11:03
请问用STM32控制大疆M100的例程还有吗,帖子上的链接下载不了了。我刚接触大疆M100,能发一份我研究研究吗,不胜感激。我的邮箱1908154174@qq.com
作者: KendyCris    时间: 2017-4-24 16:12
老师您好,想问下
         activation_msg.app_api_level= 2;
         activation_msg.app_ver= 1;
         memcpy(activation_msg.app_bundle_id,"1234567890123456789012",32);
这些信息您是从哪里获得的,官网注册App信息没有给这个。恳求回答。
作者: lizhuoyinpu    时间: 2017-10-2 14:31
1992114 发表于 2017-2-15 11:03
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,最近我也在接触这个,能加qq交流一下嘛?535919948

作者: xiaoxia_Fu0n4    时间: 2018-11-28 10:25
你好,最近我也在接触这个,能加qq交流一下嘛?774852341




欢迎光临 亿加合和智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2