APM固件二次开发(自定义Mavlink消息)问题记录

  记录一下自己的开发过程。

  需求是想把机载电脑的数据通过飞控中转,发送给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源码还是要多去熟悉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值