写在前:2021年9月下旬开始摸索px4飞控的二次开发,从C++零基础到第一个修改算法后的版本稳定运行,大概用了2个月,从12月初改用新版本px4源码到现在又过去了约1个月,期间踩了各种各样的坑,可以说历尽坎坷,一言难尽。网上能查到的还好办,参考-尝试即可,头疼的是实际中还遇到很多搜遍全网都没有的奇奇怪怪问题,有些都不知从何下手。在此简要记述经过摸索基本解决了的问题和方法,以备忘和分享。可能有些问题是由于我的基础太过薄弱,大神勿笑,如果我的理解有误,请多指教。
1.对空值判断语句错误使用,导致循环输出结果为空
px4 V1.12.3版本中,有许多对空值NAN的操作,并且一个数学表达式中,如果一个值为空,则最终结果也为空,这就导致自己写的一个循环输出结果始终未空。要解决这个问题就需要判断一个值是否为空,如果是,就把该值设为0。首先我是这样写的
float a;
if(a==NAN){a=0;}
自以为写的没问题,但输出始终为空的问题并未解决,头疼了许久。
后来才知道,要比较一个变量是否是空,不能用类似a==NAN这样的语句,因为空不与自身相等。要实现判断一个变量是否是空,可以用全局函数IsNan(),比如可以这样写
float a;
if(IsNan(a)){a=0;}
即实现了如果a是空,则将a赋为零的功能。
2.日志消息语句过多,导致控制延迟增大,控制发散
px4 V1.12.3中,多旋翼位置控制mc_pos_control 是一个工作队列任务。不同于Task任务有独立的进程优先级和堆栈空间,多个工作队列共享一个WorkQueueRunner线程,共享同一个堆栈空间,多个工作队列在一个线程中是顺序执行的,这样设计优点是可以减小RAM的使用、可以减少任务切换的次数,缺点是工作队列任务时间过长可能会造成线程中其他队列任务延时,因此队列任务不能运行执行时间过长的任务。
自己在修改mc_pos_control 模块时,为了查找1.中循环输出为NAN的问题,插入了许多日志消息语句,如PX4_WARN(),PX4_INFO(),导致该模块运行时间过长,使得整个navigation & control进程刷新率低至12Hz,定点模式无人机位置控制发散。把这些日志消息语句统统注释掉即可解决 。
3.RTK连接顺序问题
飞控:CUAV V5+;
地面站计算机:Surface Pro 6,Win10家庭版;
地面站软件:QGC V3.5.6;
RTK硬件:雷迅C-RTK 9P;
数传电台:CUAV Supter Radio 915Mhz 500mw,实际就是3DR的电台;
本人用Surface Pro 6作为地面站,小巧便携、性能足够,唯一缺点是仅有一个USB接口,需要接一个一拖三的拓展口。近日终于解决完上述1. 2.点问题,终于准备上RTK进行调试的时,却发现只要一插上RTK地面基站的数据线,数传电台的连接就中断,而且通过插拔数传,拔掉RTK地面基站,插拔一拖三,都无法恢复连接,甚至地面站也无法正常退出,电脑无法正常关机,只能长按电源键强关,再开机。
几经周折试验,发现必须在打开QGC地面站之前,首先连接好数传电台和RTK的数据线,再双击打开QGC地面站软件,即可正常连接。其中原因不甚清楚。
4.每次起飞后首次进入定点模式,飞机都会做“刷锅”运动
每次起飞后首次进入定点模式,飞机都会做“刷锅”运动,半径由小到大再由大到小,位置变化曲线如图:
神奇的是四五圈之后还能稳定回期望的位置,更神奇的是本次起落内,无论怎样变换定点的期望位置,飞机都很稳定,不会再出现“刷锅”现象,但飞机姿态会有一点“抽搐”。
经过与 飞同学z1872385的博客_飞同学_CSDN博客-自用笔记,ROS,QT_QGC领域博主 的交流,并分析日志,指出,主要问题是磁罗盘受到干扰,另外飞控的震动也过大。如图,可以看出磁场强度与油门量呈强相关性,加速度计的数据也显示加速度剧烈的变化,即震动强烈:
解决方法,1)将C-RTK主机架高,远离电源分配板,并做三角支撑使平台稳定;
2)给飞控加减振;如图:
处理完后试飞,效果完美。
ps:
1)关于雷迅的C-RTK9P主机里是否有内置磁航向传感器,官网说明里没有提,产品说明书里也没有写,所以最初装机的时候就没考虑磁罗盘的问题,因为上层板没有合适的位置,就把RTK的主机塞在了电源板和飞控板中间,造成了干扰问题。 最后与他们的技术交流之后才确认有,而且笔者感觉是有两个,因为每次校准磁航向的时候都会多出两个外置磁罗盘,这两个磁罗盘的方向还不一样。
2)关于飞控的振动,一开始比较相信雷迅家的板子,感觉有内置减振,就直接贴在了机架上,事实证明还是不能偷懒啊,该做的减振和抗干扰措施要做足。
3)RTK定位精度是真高啊!稳定悬停时,位置偏差不超过5公分,如图:
当然也有我算法的功劳,PX4原始算法的效果是这个样子:
5. 关于px4编译内存溢出问题
px4源码版本V1.12.3,编译fmu-v5版本固件正常,编译fmu-v2版本固件内存溢出,比1M稍稍大了一点点,无关模块能去的都去了,还是不行。参考文章PX环境搭建编译px4_fmu-v2_default相关问题的解决方法
修改默认的Flash大小,具体路径为:PX4-Autopilot/boards/px4/fmu-v2/nuttx-config/scripts/script.ld,将其中的1008k改为较大的数,如1608k。
修改后,编译时不再报错,但upload时仍然报错,按照提示修改upload为force-upload:
make px4_fmu-v2_default force-uoload
即可成功烧录固件。
6. 关于px4部分机架类型无法选择的问题
实验室有很多雷迅家的pixhack飞控硬件,有很多块飞控板可选机架不全,不能选择垂起机架,如13001双旋翼垂起,烧录各种固件都不行,但同样的固件有的飞控板就没问题。
格式化SD卡也不能解决问题。
手动修改SYS-AUTOSTART参数为13001也不行,修改完刷新参数貌似可以了,但断电重启后仍然显示机架未设定。
问题原因及解决办法尚未找到。
今天烧录V3版本的固件可以解决大部分飞控板的问题,之前一直烧V2版本的。但有一个飞控板提示闪存错误,可能是硬件真的有损坏。
7. 垂起的怠速调节问题
实验室的双旋翼垂起,一解锁旋翼就会有一个初始转速,对于调试很不安全,查资料大多说修改参数PWM_MIN,一方面PX4 V1.12.3版本无此参数,与其相近的应该是PWM_MAIN_MIN,另一方面,经尝试修改PWM_MAIN_MIN并无任何效果。
查看源码发现,VT_IDEL_PWM_MC才是控制垂起机架多旋翼模式怠速的参数,把默认的1080修改为1000,完美解决。注意,该参数修改后须重启才能生效。
今天先写这么多,后边再更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)