APM飞控添加新的外设驱动

本文为《无人机飞控固件开发教程》系列视频的辅助资料,已经在“网易云课堂”上线 , 链接如下: https://study.163.com/course/introduction/1209568864.htm?share=1&shareId=1448054983

无人机调试,飞控硬件定制、固件修改,日志分析,请QQ联系:3500985284


 本节课讲解飞控如何与外设通信,如何添加新的外设驱动程序。我们将会使用一个由“星瞳科技”出品的“OpenMV4 H7版”模块对特殊图案进行图像识别,然后通过串口将图像识别结果发送给飞控,飞控接收并处理这些信息,为下一节课将要讲的使用OpenMV引导飞机飞行做准备。

本章节源程序地址:https://github.com/nufeichuiyun/ardupilot   对应git分支(branch): TestOpenMV_p

如果你从github上下载源代码速度非常慢,或者更新子模块总是失败,可以直接下载我已经切换到这个分支并且更新好子模块的源代码压缩包。解压缩后可以直接编译,对于这个分支不需要再更新子模块(注意,只是对于这个分支不需要更新子模块,如果切换到其他分支,还是需要更新子模块)。

  链接:https://pan.baidu.com/s/1p9pxl58X0yp1FP_nnxLQlQ

  提取码:nfcy

文件名为“ardupilot-切换到TestOpenMV_p分支-已经更新子模块-解压后可以直接编译.rar”


 硬件信息:

  星瞳科技OpenMV4 H7版,主频400MHz,2M Flash,1M RAM。

 OpenMV硬件采购链接:淘宝链接

一、OpenMV端程序

   OpenMV端程序是在其官方例程“Find_apriltags.py”的基础上修改的,修改内容如下:

   1、精简识别目标,只识别TAG16H5;

   2、添加通过串口输出识别结果的功能;

具体修改方法以视频教程为准

# 初始化串口
from pyb import UART
uart = UART(3, 115200)

# 自定义帧发送函数
def send_frame(cx, cy):
     uart.writechar(0xA5)
     uart.writechar(0x5A)
     uart.writechar(cx)
     uart.writechar(cy)
     uart.writechar(cx + cy)

# 发送一帧识别结果到飞控
send_frame(tag.cx(), tag.cy())

二、Pixhawk与OpenMV硬件连线

   1、Pixhawk给OpenMV提供5V电源。Pixhawk的所有串口接口都支持对外5V供电,将OpenMV的“VIN”和“GND”接到Pixhawk上的任意串口的供电引脚上就行;

   2、OpenMV连接到Pixhawk的5个串口中的任何一个上面,TX和RX交叉。我们的例程中使用的是OpenMV的UART3与飞控通信,因此大家将OpenMV的UART3_TX接到飞控任意串口的RX引脚上即可。此例程中只有OpenMV向飞控发送数据,没有飞控向OpenMV发送数据,因此OpenMV的UART3_RX不需要接到飞控上面。

三、APM端驱动编写

   1、新建分支

   2、添加驱动文件;

   3、添加顶层调用;

  注意:视频教程中漏掉了openmv对象的初始化步骤的讲解,请大家按照下面步骤添加:

  (1)如下图所示,在“ArduCopter/Copter.h”86行,添加包含openmv头文件:

  (2)如下图所示,在 “ArduCopter/Copter.h” 235行,添加openmv对象的定义:

  (3)如下图所示,在“ArduCopter/system.cpp”164行,添加openmv的初始化:

   4、添加Debug输出。

四、应用展望

 通过测试发现,OpenMV的性能基本满足大学生电子设计竞赛级别的应用需求,但是对于对于更加复杂的应用来讲,OpenMV的性能就略显不足了,后期我们的课程将会添加使用“NVIDIA Xavier NX”来实现更加复杂的AI技术来引导无人机飞行的例程,敬请期待!

 但是,“技术实现”不同于单纯的“科学研究”,它是一个不断权衡利弊、不断折中的过程。OpenMV在易用性、低功耗、体积、重量、成本方面,比“NVIDIA Xavier NX”要强很多,因此将OpenMV集成到无人机上,并不代表者“低端”,一切都需要从实际需求角度出发来进行选择。

五、更进一步(串口发送)

 本例程实现的是串口数据的接收,实际上,我们飞控的上的串口都是全双工的,也就是任何一个串口在接收数据的同时也支持数据的发送。

 一般大型的开源项目为了实现编程接口的统一,都会将“数据的接收或读取”用“read()”函数来实现,而将“数据的发送或写入”用“write()”函数来实现,并且这两个函数一般是成对出现的,其定义和实现代码也一般都是挨在一起的,找到一个,一般就能找到另外一个。

 以我们这个项目中用到的串口数据的读取为例,如上图所示,我们使用了“_port->read()”来读取一个字节的串口接收到的数据。如下图所示,我们在其定义附近可以看到有两个“write”函数,一个是发送一个字节数据,另一个是发送一串数据。

 搜索源代码已有的调用示例时,由于直接全局搜索“write”会出现太多结果,因此我们改为搜索“_port->write”来缩小搜索范围,于是在代码中搜到了有限个结果,实时上,只要你有点编程基础,看一眼搜索结果就知道自己该怎么做了。

六、疑难解答

 本节的例程虽然代码量不大,但是由于牵涉到两个硬件设备的联调,因此请大家不要指望能非常顺利地一遍走通所有步骤,遇到问题的时候,请按照如下步骤进行检测:

1、将OpenMV通过USB接电脑,在线运行,确保它的确是识别到了目标物体;

2、使用USB转串口模块接OpenMV的串口TX引脚,在电脑上的“串口调试助手”上查看原始的帧是否正确发送了出来,波特率是否正确;

3、检查连线是否正确,注意OpenMV的串口TX接的是飞控的串口RX;

4、检查飞控的全部参数列表中对应串口的参数是否设置正确(以视频教程里的讲解为准);

5、如果以上各个步骤检查无误,并且如果你是按照教程里的讲解自己手写的代码,请直接使用教程中的代码试试,如果教程中的代码可以正常运行,而你的代码不行,请使用Github Desktop这个软件一行行对比你写的代码哪里有问题。

无人机调试,飞控硬件定制,固件修改,log日志分析,飞控驱动添加
请QQ联系:3500985284

微信公众号:“怒飞垂云”,扫描下图添加

京ICP备19049723号   |   京公网安备 11010502039327号