更新记录: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则是性价比较高的选择。

官方文档地址:快速入门 - DJI Mobile SDK Documentation

官方文件包地址:GitHub - dji-sdk/Guidance-SDK: The official Guidance SDK package for Windows, Ubuntu and XU3.

Guidance调参软件下载地址:Guidance调参软件和驱动 - 下载中心 - DJI 大疆创新

官方提供的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,

    通用属性-链接器-输入-附加依赖项

    直接删除如下依赖项(如果没有对该例程做其他配置,此处应该只有这一条,全都删掉就好)

    

opencv通过串口和stm23通信 opencv可以在stm32上_Guidance

3、编译报错:已加载“C:\Windows\System32\ntdll.dll”。无法查找或打开 PDB 文件。

    我的编译选项:

opencv通过串口和stm23通信 opencv可以在stm32上_Guidance_02

 

    工具-选项-常规-启用源服务器支持

    符号-Microsoft符号服务器

    编译时等待加载符号,可能时间会很久,加载完之后就正常了。

4、当使用串口读取数据时,需要根据实际使用的COM口,修改代码中的宏定义(在main.cpp中)。

官方文档修正:

    

opencv通过串口和stm23通信 opencv可以在stm32上_DJI_03

    通信协议表格中,LEN与VER字段顺序反了(参照Windows平台的例程代码)

    且实际有效数据(即以上表格中DATA字段)的长度 = LEN - 16(减去数据头和数据尾)

    此处字长LEN的10位数据,经过推测我认为是字节偏移量为2的字节为高位,偏移量为1的字节中剩下的两个BIT为低位,而在实际读取的数据中,低位两个BIT始终为0。故有:

opencv通过串口和stm23通信 opencv可以在stm32上_Guidance_04

    此处的数据长度困扰了我半天的时间,最终虽能读取我需要的数据,但是也没有搞太懂,收到的数据长度似乎和目标结构的长度不等,如果发现问题欢迎交流。

读取方案问题:本来想要采用串口空闲中断+DMA的通信策略,但是尝试发现无法进入空闲中断,不知道什么原因。猜测可能Guidance会毫无间断的发送数据?

后来只能采用串口接收中断,每次读取一个字节,再采用一个状态机做数据解算。详见代码。

STM32(F407VET6)读取Guidance数据 Gitee 地址:

Guidance_Read.zip · W-yt/yutian_sundry_zip - 码云 - 开源中国

注意:我这里只需要光流的速度信息和超声波信息(且我只是用了Guidance5个传感模块的一个,即对地的模块,只把它当做双目光流和超声波定高模块使用)。其他的数据可能读取是错误的,我没有检查核对,如果发现问题,欢迎提出修改意见。

    首先使用调参软件,设置Guidance通信模式为UART,默认波特率115200。注意需要给Guidance上电(3S~6S电池),等待传感器模块和处理器模块都亮绿灯即可继续操作。上电后超声波模块可能会发出声音,属正常情况(可能是因为功率较大)。

    使用官方例程验证Guidance发送数据是否正常,直观的可以验证超声波数据,融合后的障碍物距离数据,和光流的速度数据。

    连接Guidance到STM32开发板(可能需要自己做线),Guidance的TX接STM32的PD6接口(USART2 Rx),共地。

    

opencv通过串口和stm23通信 opencv可以在stm32上_STM32_05

    调试程序观察是否可以进入串口接收中断。

    如果可以进入接受中断,则全速运行,观察想要检查的数据,判断是否合理(最好在相同条件下和示例中的数据比对,以确保数据正确),如果有问题欢迎交流。

—— cloud over sky

—— 2019/10/20