记录一下自己的开发过程。
需求是想把机载电脑的数据通过飞控中转,发送给QGC。这涉及到机载电脑mavros的二次开发,飞控的mavlink自定义消息和QGC的二次开发。具体的自定义消息网上已经有很多教程了,这里不再叙述。
通信流程图:
开发过程中遇到的坑以及发现的方法:
1)APM有多个mavlink通道,每个通道有相应的GCS_Mavlink类。具体实现在GCS_Common.cpp中(见下图),每个chan就是一个GCS_Mavlink类。
为了保存机载电脑发送的mavlink消息,我在GCS_Mavlink类中定义了三个数组。数组均在类中被初始化。由于GCS_Mavlink类有多个对象,这就造成了混乱:明明检测到数组的值已经被修改,但是QGC接收到的数组却仍然是初始值。其实原因很简单:mavlink有多个通道,每个通道都会接收mavlink消息,为了接收消息,各自定义了一个GCS_Mavlink对象。但是只有接收到机载电脑的mavlink消息的那条通道才会去修改数组,其他通道仍保持原来的数据。而发送给地面站的不一定是收到机载电脑的那条通道。
为了保证数组能被正确修改然后传出,只能寻找独一无二的类,在其中定义数组数据。比如GCS类。该类在GCS_Mavlink中也能被调用(就是下图中的gcs()):
2)APM的debug方法大多比较麻烦,有用can信号分析仪的,有用串口打印的,后面发现了一种简单的辅助判断的方法,直接使用APM自定义的文件系统,保存文件和写入文件内容,在飞控的SD卡中可以查看。不过目前只能创建文件,内容写入无效,还没弄清楚原因。
3)使用APM时,QGC接收自定义消息的话需要在ardupilotMega.h中添加mavlink消息的id号、校验码等信息,否则会接收不到APM飞控发来的消息。具体参考:
https://blog.csdn.net/Sense97/article/details/122000036
然后是一点体会:之前也做过PX4固件的二次开发,PX4相比于APM多了一个内部数据流通的机制uORB,所以收到的数据都会publish出去,这就使得数据是独一无二的,也就没有这么多问题。
综上,由于APM飞控在通信过程中相当于一个黑盒子,所以花了很长时间debug,以后对APM源码还是要多去熟悉。