APM飞控添加自定义参数

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

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

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

一、功能目标

 上节课中我们实现了一键自动飞行五角星航线的功能,但是五角星的大小是在飞控代码中是固定不变的,如果想调整五角星的大小,需要重新编译固件,非常不方便。本节课中,我们将五角星的大小定义为一个参数,并且可以在MissionPlanner中修改它,从而控制五角星的大小。

二、实现步骤

 1、添加参数变量;

 2、添加参数定义;

 3、使用参数控制五角星大小;

 4、仿真飞行,在MissionPlanner中可以直接看到并修改此参数。

三、效果图

四、扩展讲解

 事实上,APM的参数定义不止出现在Parameters.cpp/Parameters.h这两个文件中,还有不少参数是在各个库文件中的。总的来说,对于与载具特性相关的参数,是出现的在对应载具顶层文件夹中的(也不绝对,毕竟搞固定翼的是没法要求搞多旋翼的跟他协调的,毕竟大家没有顶层代码同步开发的需求):

  • 对于多旋翼,与载具特性相关的参数在ArduCopter/Parameters.cpp中;
  • 对于固定翼和垂直起降固定翼,与载具特性相关的参数在ArduPlane/Parameters.cpp中;
  • 对于无人车, 与载具特性相关的参数在APMrover2/Parameters.cpp中 。

 对于各种载具共用的库文件,不同模块的参数是放在不同模块内的,比如:

  • libraries/AP_GPS/AP_GPS.cpp文件的顶部,就定义了与GPS相关的参数(如GPS类型等);
  • libraries/AP_RangeFinder/ AP_RangeFinder.cpp文件的顶部,就定义了与测高设备相关的参数。

 这些库里的参数定义方法与顶层的参数定义方法略有不同,但是也大差不差,大家可以照猫画虎自己探索一下。咱们这个视频教程更核心的意图是教会大家如何通过研究飞控中现有的代码,去写出自己的代码,来实现自己需要的功能,而不是把我的那些例程抄一遍。

 上图中有个问题:这里定义的是GPS的类型,但是我们在MissionPlanner的全部参数列表中找到对应参数是“GPS_TYPE”和“GPS_TYPE1”这两个参数,那么请问其中的参数名前缀“GPS_”是在哪里定义的呢?对于多旋翼,在“ArduCopter/Parameters.cpp”中可以找到下图所示内容,这里面就定义了“GPS_”,并且与“AP_GPS”这个类关联了起来,从而一切都说得通了。

 还有一个问题:我最初探索APM代码的时候,遇到的了在源代码中全局搜索时找不到“GPS_TYPE”这个参数的问题。遇到这种情况,我们该如何解决呢?

 1、首先,我们去AP_GPS中找,发现能找到“TYPE”、“TPYE1”之类大概能跟全部参数列表对应的上的代码,根据注释可以确定这就是那些参数的真正定义的地方。那么此时问题就变成了“GPS_”这个前缀在哪来定义的呢?

 2、于是我全局搜索“GPS”,结果出来了一堆东西,太多了。然后搜索“GPS_”,然后就找到了上图所示的代码,然后就豁然开朗了。

上述解决问题的方法希望大家能够掌握。

四、更进一步

 2020年10月17日更新,有时候,我们有这样的需求:飞控程序运行中,在某种状态下自动调节某个参数的值并保存,下次重新上电时这个参数的值保持为修改后的状态,其效果等同于平常我们使用MissionPlanner在全部参数表中修改参数。下面以本节课添加的“star_radius_cm”变量对应的“SRAT_R_CM”参数为例,讲述两种在程序中修改参数的方法:

// 方法一,直接修改star_radius_cm变量的值,修改后的值只在飞控本次断电之前有效,并不会写入飞控的非易失存储器中,重新上电后此值被恢复为修改前的值
g2.star_radius_cm.set(1);

// 方法二,直接修改star_radius_cm变量的值,并将此值保存在飞控的非易失存储器中,重新上电后对应参数的值还保持为本次修改后的值
g2.star_radius_cm.set_and_save(1);

五、疑难解答

1、添加完某个参数之后飞控无法正常启动,地面站也连不上

  造成这种情况的原因有如下几种:

  a、如下图所示,序号不对,所有序号应该从上往下依次增加,由于我们添加新的参数时一般是复制粘贴的,因此经常可能会忘掉将序号加一,这里请慎之又慎。

  b、参数名过长。APM规定参数名的总长不能超过16个字符,否则就会导致飞控无法启动。这种情况又分两种状况:

   (i)在顶层文件夹中的Parameters.cpp中添加参数,这里的参数名直接就是代码里写的,其长度超过16就会崩溃:

   (ii)在库文件中添加参数,由于隐含的有前缀,应该是总长不能超过16。如下图所示,在libraries/AP_Camera/AP_Camera.cpp文件中,虽然代码里显示的只是“TYPE”,但是实际上在MissionPlanner中会加上前缀“CAM_”,组成“CAM_TYPE”,如果这个“CAM_TYPE”总长超过16,会引起崩溃。

  注意,如下图所示,以多旋翼为例,这个“CAM_”前缀是在ardupilot/ArduCopter/Parameters.cpp中定义的:

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

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

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