STM32读取Guidance数据——Guidance SDK
更新记录:2019/11/14 更新STM32(F407VET6)读取Guidance数据 Github地址。
背景:想要将祖传的Guidance用于DJI A3/新固件的N3飞控。DJI已经停止对于Guidance的更新以及维护工作,Guidance无法和A3、新版固件的N3兼容。拟利用STM32做一块转接板读取Guidance数据发送给A3,并测试Guidance的性能。
DJI 官方开源了Guidance SDK但是目前仅对Windows、Linux、ROS、ARM_Ubuntu有直接的支持(即提供了示例工程,可以直接编译运行读取Guidance数据)。如果所做项目的主处理器是Intel的处理器、树莓派、TX系列处理器等可以直接跑官方例程。但是仅为了在飞控和Guidance之间做一个中转的话,使用32则是性价比较高的选择。
官方文档地址:https://developer.dji.com/cn/guidance-sdk/documentation/quick-start/index.html
官方文件包地址:https://github.com/dji-sdk/Guidance-SDK
Guidance调参软件下载地址:https://www.dji.com/cn/downloads/softwares/other-guidance
官方提供的Guidance通信例程,我只试用了Windows环境下的,遇到几个问题,总结如下:
1、由于Guidance官方例程是VS2010工程文件,我使用的是VS2015,无法直接编译。
参考网址:http://www.itkeyword.com/doc/2055553052695740x495
右键工程文件-属性-配置属性-常规
其中平台工具集显示的是 Visual Studio 2010(v100)(未安装),修改,选为:Visual Studio 2015 (v140),应用。
2、无法打开文件opencv_world341d.lib,官方提供的SDK允许通过USB读取图像信息,进而调用Opencv做图像相关工作,但是我的Windows中没有配置Opencv,而我只需要读取Guidance的光流的速度数据和超声波数据,因此不需要使用Opencv,
参考网址:https://blog.csdn.net/Rhoda617/article/details/94358984
通用属性-链接器-输入-附加依赖项
直接删除如下依赖项(如果没有对该例程做其他配置,此处应该只有这一条,全都删掉就好)
3、编译报错:已加载“C:\Windows\System32\ntdll.dll”。无法查找或打开 PDB 文件。
我的编译选项:
参考网址:https://blog.csdn.net/weixin_42586210/article/details/88291438
工具-选项-常规-启用源服务器支持
符号-Microsoft符号服务器
编译时等待加载符号,可能时间会很久,加载完之后就正常了。
4、当使用串口读取数据时,需要根据实际使用的COM口,修改代码中的宏定义(在main.cpp中)。
官方文档修正:
通信协议表格中,LEN与VER字段顺序反了(参照Windows平台的例程代码)
且实际有效数据(即以上表格中DATA字段)的长度 = LEN - 16(减去数据头和数据尾)
此处字长LEN的10位数据,经过推测我认为是字节偏移量为2的字节为高位,偏移量为1的字节中剩下的两个BIT为低位,而在实际读取的数据中,低位两个BIT始终为0。故有:
此处的数据长度困扰了我半天的时间,最终虽能读取我需要的数据,但是也没有搞太懂,收到的数据长度似乎和目标结构的长度不等,如果发现问题欢迎交流。
读取方案问题:本来想要采用串口空闲中断+DMA的通信策略,但是尝试发现无法进入空闲中断,不知道什么原因。猜测可能Guidance会毫无间断的发送数据?
后来只能采用串口接收中断,每次读取一个字节,再采用一个状态机做数据解算。详见代码。
STM32(F407VET6)读取Guidance数据 Github地址:https://github.com/W-yt/YuTian_Pro/tree/master/Guidance_Read
注意:我这里只需要光流的速度信息和超声波信息(且我只是用了Guidance5个传感模块的一个,即对地的模块,只把它当做双目光流和超声波定高模块使用)。其他的数据可能读取是错误的,我没有检查核对,如果发现问题,欢迎提出修改意见。
首先使用调参软件,设置Guidance通信模式为UART,默认波特率115200。注意需要给Guidance上电(3S~6S电池),等待传感器模块和处理器模块都亮绿灯即可继续操作。上电后超声波模块可能会发出声音,属正常情况(可能是因为功率较大)。
使用官方例程验证Guidance发送数据是否正常,直观的可以验证超声波数据,融合后的障碍物距离数据,和光流的速度数据。
连接Guidance到STM32开发板(可能需要自己做线),Guidance的TX接STM32的PD6接口(USART2 Rx),共地。
调试程序观察是否可以进入串口接收中断。
如果可以进入接受中断,则全速运行,观察想要检查的数据,判断是否合理(最好在相同条件下和示例中的数据比对,以确保数据正确),如果有问题欢迎交流。
—— cloud over sky
—— 2019/10/20