飞控发送自定义信息到地面站

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

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

 由于飞控系统的特殊性,搞飞控的时候大家基本可以忘记ST-Link+Keil那种打断点调试方法了。如果你打了硬件断点,飞控的姿态解算部分大概率会乱掉。因此,对我们来说大部分时间是“编译——仿真运行——有问题——修改代码——编译——仿真运行——没问题——实际飞行”这种套路。而在这个过程中,如果能实时看到飞控中变量的值,将对我们的调试工作带来巨大的便利,本章节我们讲述如何发送自定义信息到地面站。

  由于飞控与地面站之间的通信链路带宽有限,一般是57600波特率的串口,因此我们不可能一直发送信息,必然是满足某种触发条件的时候发送信息,比如:1、状态变化时发送一次信息(如模式切换、触发失控保护瞬间);2、定时发送,每隔固定时间间隔发送一次。下面,我们通过如下例子讲述如何发送自定义信息到地面站:

本章节源程序地址:https://github.com/nufeichuiyun/ardupilot

本章节对应git分支(branch):TestSentMessage

 在我提供的源代码中,使用如下命令可以切换到这个分支(切换分支后注意更新子模块!):

git checkout TestSentMessage

一、目标

 飞控每隔1秒钟发送一次当前高度到地面站。

二、实现方法:

   1、在Copter-3.6.10分支基础上新建一个分支,命名为TestSendMsg(如果你是2021年4月10日之后看的本教程,建议在Copter-4.0.7或者后续更加新的稳定版基础上修改程序);

   2、在ArduCopter.cpp文件中,在one_hz_loop()函数的第一行添加如下代码:

gcs().send_text(MAV_SEVERITY_CRITICAL, 
                 "Current altitude: %.1fm", 
                 copter.flightmode->get_alt_above_ground()/100.0f);

2021年4月10日更新:

 如果你是在Copter-4.0.x(比如Copter-4.0.7)基础上修改的,由于APM固件Copter-3.6.x版本与Copter-4.0.x版本部分函数名有所不同,上面的代码是会报错的,请使用下面的代码:

gcs().send_text(MAV_SEVERITY_CRITICAL, 
                "Current altitude: %.1fm",
                 copter.flightmode->get_alt_above_ground_cm() / 100.0f);

 两者唯一的区别是“get_alt_above_ground()”函数名改为了“get_alt_above_ground_cm()”,在函数名尾部添加了“_cm”,用来指示返回值的单位。这是一种非常好的编程习惯,能有效避免函数调用的时候把单位弄错,希望大家平常编程的时候也尽量这样写,会省去很多自己挖坑自己跳的麻烦,真的。

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

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

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