pixhawk源码编译
‘壹’ gps定位轱辘离地就不好使了
一、无法解锁(黄灯闪烁)
无法解锁的原因会有多种,请按照如下步骤进行检查:
1、初始设置是否全部完成
a、机架类型选择是否正确,或者你根本就没有选择?
注意,新版本的飞控固件在默认参数情况下,需要先在mission planner中设置好机架类型后才会有各个控制通道的输出。
b、加速度计校准(如果没有校准或者上次校准不成功,解锁时姿态窗口会提示);
c、指南针校准(如果没有校准或者上次校准不成功,解锁时姿态窗口会提示);
d、遥控器校准(并且各个通道的正反向正确);
e、飞行模式设置(注意,在PosHold、Loiter模式下,如果GPS没有定位或者定位不佳,是无法解锁的)
f、电调校准(你确定你校准成功了吗?)
2、是否连接了“安全开关”,并解锁。
pixhawk飞控硬件引入了“安全开关”这个外设,飞控默认是使能安全开关的,这就需要你在使用遥控器解锁前先长按安全开关,进行初步解锁,然后再通过遥控器解锁。如果你不想用安全开关,在全部参数列表中将“BRD_SAFETYENABLE”设为“0”即可。(注意,有些参数是立即生效,有的参数是重启生效,建议为稳妥起见,进行一次重新上电操作)
3、会不会是飞控已经解锁了,但是电调并没有工作。
a、会不会是你只给飞控供电了,而没有给电调供电?
b、会不会电调信号线断了?或者信号线插反了?
c、会不会是电调没有校准?
4、会不会打开了地理围栏功能,并且飞机处于地理围栏之外?
二、电台连接缓慢,或者有很大概率连接失败
APM最新版固件很少出现这个问题了,之前的固件与某些电台联合使用的时候会出现这个问题。
原因:全部参数列表中“BRD_SER1_RTSCTS”和“BRD_SER2_RTSCTS”默认是“2”,即“auto 自动”。这个两个参数控制着飞控连接电台的串口是否开启流控制(串口协议里的概念)。0表示不用,1表示用,2表示自动检测。自动检测的原理是飞控初始化的时候先默认是使用,然后收发一些数试试,如果不行,就认为不用,以前的固件这里好像有点bug,导致有时就连不上地面站了。将这两个参数设为0即可。
三、悬停掉高(或者叫定高不好,上下浮动)
定高不好,可能是由以下两个原因造成的:
1、机架震动大,飞控减震没有做到位,导致飞控Z轴加速度出现较大奇异值,从而导致飞控在某些时刻对自身速度、加速度的估计出现错误,明明飞机没有向上走,但是飞控认为飞机在快速向上走,于是控制飞机猛收油门,从而飞机猛地向下掉一下。这类问题导致的定高问题更像是飞机在向上或者向下抽动。
2、气压计受自身螺旋桨气流影响导致高度估计问题。大家一般会在气压计上加一块海绵,但其实对于大飞机这个是不够的,最好再增加2层遮挡物:一、飞控加外壳,外壳透气孔尽量小一点,如果飞控外壳四面透风就意义不大了;二、将飞控装在机身内部,并且尽量使得机身封闭(一般很难做到完全封闭,从而不影响气压计检测外界气压值),这个可能比第一条还关键。
3、如果是缓慢的高度变化,并且变化范围在0.5m以内,那么,可以认为是正常的,因为飞控对自身高度的估计主要来源于气压高度计,而气压随着气温会缓慢变化,再加上飞控旋翼气流影响以及各种测量噪声,飞控对自己的高度的估计会缓慢变化,从而导致高度控制出现漂移。如果想提高定高效果,只能考虑添加“相对高度计”,如超声波、毫米波雷达、激光测距仪等。
四、定点定不住
定点定不住,可能是由如下原因造成的:
1、确认自己已经成功切到PosHold或者Loiter模式!(你以为你切了,实际上没切,或者由于GPS、磁罗盘等问题飞控拒绝切到定点模式)一定要通过地面站看模式,反复确认;
2、GPS信号差,如果有严重遮挡,GPS定位会出现较大幅度的漂移,进而导致定点定不住;
3、遥控器有偏移值。要么你没有校准遥控器,要么不小心拨动了遥控器微调,要么温度变化导致遥控器自己行程飘了,导致摇杆处于中位时飞控收到的是向一边打杆的控制指令……
4、磁航向不正。磁罗盘没有校准,或者磁罗盘歪了,或者磁罗盘受到干扰,导致飞控对机头方向的估计与实际航向不一致,进而导致位置控制时出现刷锅飞行的情况(飞机机头指向不变,飞行轨迹呈现刷锅的感觉)。
五、刷哪种固件?PX4固件?APM固件?
首先应该明白PixHawk、PX4固件、APM固件三者的关系:
PixHawk指的是飞控硬件,相比之前大多数开源飞控使用的AVR单片机,Pixhawk飞控在硬件性能上有了很大的提升,它采用的STM32F427VIT6作为主控,32位,主频168MHz,可以说是相当的牛逼。
PX4固件和APM固件指的是软件,它们都是运行在PixHawk硬件之上的,是两种不同飞控程序。对于刷哪个固件,请看下面的对比:
1、PX4固件的源代码结构明了,对于学习飞控程序的人来说,可能入手更快一点;相比之下,APM代码略微有点复杂;但是,请注意,这里的复杂是相对而言的,根据我个人的经验来看,APM的代码比我见过的所有自己写的代码(自己写的、项目用的、实验室遗留的)相比,编写规范、命名规则、实现方法都要好非常多。 对于只是使用飞控,而不研究代码的人来讲,PX4固件在这一点上没有优势。
2、APM固件历史悠久,功能更加完善,漏洞更少,飞行更稳定(这里的稳定指的是不会因为程序漏洞导致莫名其妙地摔机);相比之下,PX4固件有点薄弱,有很多坑需要填。 对于一个无人机来讲,能稳定可靠地飞行是第一位的,如果不能稳定可靠地飞行,其余优势都是扯淡。
因此,对于只用飞控不改程序的人,我推荐刷APM固件;而对于需要改程序的人,我也推荐APM固件,但是如果是公司用户,请考虑一下APM固件和PX4固件开源协议的区别,酌情考虑(关于这一点,请注意:不要敝帚自珍,一个无人机公司的竞争优势是全方位的,既然用了开源飞控,即使你加上了自己特有的功能,在飞控代码上也不会比别人强太多。那些不会改飞控代码的竞争对手给他程序他也用不了,那些会改代码的公司也不屑于抄你)。
上述论述可能有失公允,毕竟,我是用APM的人 🙂
2019年08月09日更新:
有不少同学还在用APM2.x这款硬件(以AVR单片机作为主控),这种硬件已经被淘汰,最新版固件已经不再支持这款硬件。APM2.0硬件最高支持的固件版本如下:多旋翼:3.2.1,固定翼:3.3.0,无人车:2.5.1。
六、起飞瞬间飞机转头
新装的飞机第一次试飞时起飞瞬间机头向一个方向旋转,赶紧收油门。这时候,应该按照如下步骤进行检查:
1、检查桨是不是装错了,各个机臂上“正反桨”严格按照官网指示图进行检查;如果没有问题,看下一步。
2、把桨卸掉,解锁,检查各个电机转向,注意,是严格按照官方电机转向进行检查,并且注意电机的1、2、3、4可不是按照顺时针排布的;如果没有问题,看下一步。
3、连上地面站,看看飞机的俯仰、横滚、偏航有没有反的。
4、如果至此都没有问题,那么,我可以告诉你,有一部分飞机在调参不好、机架刚性不好、动力不好的情况下,会出现起飞瞬间机头偏转的问题,离地后机头就不再偏转了,并且这还跟起飞瞬间推油门是否果断相关。 这时,如果你是个老手,胆子还很大,试飞场地很宽广并没有围观人群,那么大胆起飞吧,飞高1米看看,但是时刻准备收油门。 但是如果你是个新手,或者胆子跟我一样小,或者飞行场地不理想,那么就老老实实绑飞吧,把四条腿绑在地上,留出5cm左右的自由空间,解锁飞行,看看飞机俯仰、横滚、偏航的反应,没问题后再正常飞。
七、地面站失控保护(GCS Failsafe)
地面站失控保护,顾名思义,当地面站跟飞机失去连接后触发失控保护。但是如果你以为在MissionPlanner中的设置里直接点上地面站失控保护就行了的话,那你就想简单了,你会发现自动模式下,即使把地面电台拔掉了,飞机也不会返航。这是为什么呢?这是因为这个失控保护的是为“使用游戏手柄控制飞机飞行时”设置的(参考官方文档:链接)。
是的,当你使用一个微软的游戏手柄连接地面站电脑后,通过简单设置,地面站软件可以把游戏手柄的控制量通过地面电台转发给飞机,这个控制量会覆盖遥控器的控制信号,从而导致飞机只接受游戏手柄和地面站软件的控制。这时,如果地面站与飞机失联了,飞机就处于完全无控状态了(即使遥控器有信号也白搭),因此这时飞控程序中加了地面站失控保护功能。其触发条件如下:
1、开启了游戏手柄控制飞机功能,并且在使用中;
2、处于自动模式中;
3、地面站已经有5秒钟没有跟飞机通信了;
4、飞控参数中FS_GCS_ENABLE设置为1。
由此可知,如果你想实现超视距飞行中电台断了飞机自动返航,只能改飞控代码。不过,好在这个地方没有那么复杂,比较好改,自己改改就行。
八、绿灯快闪
绿灯慢闪表示GPS已定位,并且没有别的故障,飞控允许解锁;那么绿灯快闪是什么意思呢?官网的解释是:GPS is using SBAS(so should have better position estimate)。这个的意思是绿灯快闪情况下,GPS使用了”星基增强系统”的信号,这时GPS定位会更好,因此,在绿灯快闪的情况下,定点会定的更好一点。
九、推油门飞机起不来
有时你会遇到即使把油门推倒顶,飞机都没法离地的情况,根据我多年踩坑经验,有如下几种可能:
1、电池没电了,并且是彻底没电了,并且是你以为还有电,甚是是满电,但是就是没电了! 不要相信自己的记性,不要以为昨晚刚充满的几块电池,怎么可能没电,问题是偏偏几块充满的电池放在那里,你随手拿了一块没有充电的或者干脆已经坏掉的电池!你唯一可以相信的只有BB响(又称电显)!
2、四个桨的转向反了,推油门风是向上吹的,飞机稳稳地趴在地上。
3、电调没有进行行程校准!导致遥控器给的是满油门,飞控给的也是满油门,可偏偏电调认为你给的是20%油门。注意,新装的飞机,一定要进行电调行程校准,并且注意,是先校准遥控器,后校准电调。(现在不少FOC电调是固定油门的,那么就需要修改遥控器和飞控的行程去适应电调了)
十、起飞瞬间侧翻
新飞机装好后,各种校准完成后,第一次飞行,飞机侧翻(向前翻、向后翻、向左翻、向后翻)。请按照如下步骤检测飞机:
1、检查各个电调与飞控连接的线序是否正确,以四轴为例,右前为1号电机,左后为2号电机,左前为3号电机,右后为4号电机,注意可不是顺时针的1、2、3、4;
2、有条件的话,先将飞机绑在地上(简称“绑飞”),然后进行下面所述测试;
2、解锁飞机,不要推油门,在怠速下检查所有电机的转向是否有反的;
3、如果电机转向无误,检查螺旋桨是否有装反的(顺时针转的电机上装了逆时针转动的桨,甚至是一个螺旋桨的上下都反了);
4、重新校准一下电调的行程试试,如果电调的行程不同,可能导致某些电机先启动;
5、如果还不行,看看飞控是不是装反了,上下颠倒、或者航向转了特定角度,或者参数中设置了飞控的旋转。
十一、舵面输出反向
对于固定翼飞机或者无人船,可能会遇到如下问题:遥控器各个通道设置正确,从地面站上看飞控接收的各个通道的方向也正确,但是某些舵面输出是反向的。这种问题往往是由于舵机实际运动方向与受控方向相反导致的。解决方法如下:
比如反向的舵机连接的是飞控的CH1,那么在全部参数列表中,搜索RC1_REVERSED,将这个值设置为1,即可。
注意,这种问题不能通过在遥控器上设置反向来解决。以方向舵为例,我们需要的运作模式是:遥控器方向摇杆向左打,飞机航向就向左转,其中的控制指令流程是:遥控器摇杆向左打—>飞控收到航向需要向左转的指令—>飞控通过一系列PID运算得出舵机控制PWM值—>舵机收到该PWM值—>舵机转到对应的角度—>舵面在舵机连杆的拉动下转动,由于不同飞机舵机和舵面的安装方式不同,会导致实际舵面运动方向与我们需要的方向相反,因此需要在飞控输出PMW信号时进行反向。如果在遥控器里设置了反向,在手动控制模式下可能输出是对的,但是在定点模式或者自动模式下,飞控收到的控制指令将是反的,从而在进行PID控制时是反的,最终就乱掉了。
十二、飞控不启动
有时候,同一个飞控,之前用的好好的,突然有一天上电后飞控没法完全启动,上电后几个小的LED也是亮的,但是RGB LED不闪烁,用USB连接电脑,设备管理器中也能看到飞控的串口,但是用地面站连不上飞控。遇到这种问题,在确定飞控硬件彻底坏了的之前,尝试一下如下步骤,可能就解决了:
1、移除所有外设连接线(GPS、遥控器接收机、数传电台、电调信号线、外置电源模块线等),使用USB连接飞控,看看飞控是否启动正常,是否能连上地面站,如果能,说明可能是哪个外设有问题,如果不能,下一步;
2、刷最新的固件试试,如果不行,下一步;
3、将SD卡重新格式化一下(windows默认格式),重新插入飞控,上电试一下,这一步大多数情况下就能解决问题,如果还不行,下一步;
4、更换一个SD,重新上电试试,如果还不行,我也没办法了,远程只能帮你到这个地方,不行的话把飞控寄给我看看吧,或者返厂吧。
十三、飞控自动锁定时间太长或者太短
飞机落地后,过一段时间会自动锁定,如果你感觉等待时间太长,或者太短,请调节DISARM_DELAY参数,单位是秒,这个参数决定了等待多长时间后自动锁定。
十四、遥控器无法校准
在遥控器校准页面,发现各个通道的值都为0,动遥控器的各个摇杆都没反应。遇到这种情况,请按照如下步骤检查:
1、检查遥控器接收机上的灯是不是亮的,如果没有亮,应该是接收机没有供上电;
2、检查遥控器接收机是不是亮的绿灯,对于大部分接收机,上电后如果没有接收到遥控器信号,会亮红灯,否则才会亮绿灯。如果是红灯,尝试跟遥控器重新对频;
3、确保你的接收机是跟你手里的遥控器对的频,我遇到过我的接收机跟屋子里另外一个遥控器对上频的情况,而那个遥控器也开着机。
4、如果使用的是接收机的SBUS接口,确保插对口了。如果用的是Futaba的7008SB,注意要插的是底下横着的sbus2接口;
5、确保飞控端插的是RC IN接口。对于原版Pixhawk,上面的sbus字样的接口是飞控sbus信号输出的,不是插那个;
6、检查接收机线的两端有没有插反,会不会“地”和“信号”反了;
7、还不行,换根接收机连接线试试;
8、还不行,重刷最新固件试试;
9、还不行,可能就是飞控坏了。
十五、机头方向和飞控前向不一致
有时候,受限于机体结构,我们安装飞控时无法做到飞控方向与飞机方向一致,比如飞控前向朝后安装,甚至是飞控底部朝上安装,这个都是没有问题的,只需要修改AHRS_ORIENTATION这个参数就行了,该参数默认为0,表示不旋转,我们可以根据全部参数列表中的注释按需要进行修改。
这个参数起作用的原理是在原始传感器数据到来后进行一次旋转,然后再参与姿态解算,这个旋转的工作量很小,因此不用担心这种操作会增加飞控负担导致飞机出问题。
十六、日志不正常
有时候,飞控会不记录日志,在MissionPlanner的姿态窗口显示“Bad logging”,这种情况下,请按照如下步骤进行尝试:
1、重新插拔SD卡(SD接触不良,重新插拔试试);
2、将SD卡使用读卡器用电脑重新格式化一下,格式为FAT32,其余参数默认;
3、如果还不行,换一张SD卡试试;
4、如果还不行,重刷最新版固件试试;
5、如果还不行,恐怕只能怀疑飞控硬件问题了,SD卡座虚焊? 主控CPU虚焊? 不过,概率很小。
十七、无法刷固件
使用MissionPlanner给飞控刷固件的流程是这样的:
1、在飞控与地面站没有连接的情况下(注意,刷固件时,通过USB将飞控与电脑相连,但是不要点击地面站的连接按钮),切换到MissionPlanner的“初始设置”页面,然后点击“安装固件”按钮,这时,会弹出一个小窗口,提示正在获取固件版本,注意,这时地面站是在连接官方服务器,获取最新的稳定版固件的版本号,如果电脑没有联网,就会提示错误;
2、选择你的飞机类型(固定翼、四轴、六轴、X8等),这时MissionPlanner就会从官网网站上下载对应的固件,这时如果网络不好,就有可能下载一半断掉;
3、MissionPlanner从网上将固件下载到电脑上后,开始查找与电脑连接的飞控,找到后,发送重新启动命令,飞控自动重启,飞控重启后首先进入BootLoader,然后BootLoader在MissionPlanner的控制下先擦除飞控,然后开始烧写新的固件,最后提示“请在音乐播放完后拔掉飞控”,这指的是原版飞控连接有蜂鸣器的情况下,会有提示音,提示音结束后表示固件升级才是真正完成,如果你的飞控没有蜂鸣器,弹出这个窗口后等待30秒就可以拔掉USB了;如果弹出个小窗口,提示“请拔掉飞控,然后点击OK”,那么说明MissionPlanner没有找到飞控,这时需要先拔掉USB,然后点击小窗口上的OK,之后立即插入USB,这样大概率情况下地面站就能识别到飞控并开始刷固件。
综上所述,如果遇到无法刷固件的情况,请按照如下步骤检查:
1、电脑是否可以联网;由于APM服务器在国外,因此有时即使电脑能联网,也可能会下载失败;
2、很多时候,刷固件失败的原因是MissionPlanner无法让飞控自动重启,从而无法进入BootLoader中,进而超时后报错,而正常情况下,飞控上电后第一步就是进入BootLoader,然后再跳转到正常飞控代码,利用这一点,我们可以按照如下步骤刷固件:先不要插飞控的USB,直接在MissionPlanner中点击对应固件的图标,等到MissionPlanner下载好固件后,由于扫描不到飞控,会弹出“请拔下控制板,点击OK后再插入”的窗口,直接点击“OK”,这时MissionPlanner开始不断扫描新插入的USB设备,然后此时再插入飞控的USB,一般情况下就会出现擦除、烧写步骤,百试不爽;
3、平常刷固件的时候,MissionPlanner会“偶尔”甚至“经常”出现无响应的情况,感觉整个界面挂了,这时尽量不要动它,80%的情况是图形界面挂了,但是刷固件的进程还是在正常运行着的,耐心等待1分钟后就会弹出刷写成功的提示窗口,并且整个界面恢复正常;
3、检查MissionPlanner是否为最新版本。我多次遇到过旧版MissionPlanner无法下载固件的问题,更换为官网最新版本的MissionPlanner后问题解决,注意下载MissionPlanner请到官网下载,很多时候从论坛中找到的MissionPlanner可能已经是很旧的版本了,我的另一个博客中有官网下载链接:http://www.nufeichuiyun.com/?p=62
4、USB线是否损坏,可以换一条USB线试试;
5、电脑是否连接的有蓝牙串口,我们用蓝牙电台连接电脑后,即使已经断开,电脑中依然有2个虚拟串口,这两个串口的存在会导致MissionPlanner刷固件时无法正常识别到飞控,从而导致刷固件失败,请在windows的蓝牙设置里,将蓝牙电台删除掉(从而设备管理器中2个虚拟串口会消失),然后再刷固件。
5、飞控BootLoader是否损坏,如果已经损坏,需要重刷BootLoader。不过这个概率很小,我还没有遇到过,这种情况只是有存在的可能而已。
十八、无法安装驱动、地面站打不开
有时候,如果你遇到安装MissionPlanner时无法成功安装驱动,并且打开MissionPlanner时闪退或报错,那么大概率你的系统是Ghost版的Win7,这个系统为了精简空间,删除了一些普通用户用不到的系统文件,而这些文件恰好是地面站软件需要用到的(好坑),因此,推荐使用原版的Win7或者Win10,32位版本和64位版本都行。网上可以找到补上这些缺失文件的方法,但是还是建议安装原版纯净系统,天知道Ghost系统还删了别的什么东西,又加了什么不可告人的东西。
十九、提示“Bad AHRS”
如果地面站提示Bad AHRS,说明姿态解算有问题,大部分情况下,重新校准加速度后就可以解决这个问题。
二十、插上数传电台后鼠标乱跑
有时候,我们会遇到插上数传电台后电脑鼠标开始不受控制地乱跑的情况,这种情况出现的原理如下:
1、飞机先上电,飞控和天空端数传电台开始工作,默认情况下飞控开始通过数传电台下发心跳帧,1秒钟一次;
2、然后,插入地面电台,地面电台上电后立即收到了天空端发过来的数据,并开始转发给电脑;
3、在地面电台刚插入时,电脑开始识别地面电台并加载驱动,这时地面电台又在不断发送数据给电脑,从而电脑把地面电台识别成了一个“串口轨迹球”或者“串口鼠标”,进而开始利用地面电台发送过来的数据控制鼠标移动。
基于上述原理,解决方法很简单:先插地面电台,然后再飞机上电。
二十一、固定翼舵机抖动
如果你在调试固定翼的时候,出现舵机奇怪抖动现象,那么请按照如下步骤一步步检测:
数传电台、图传电台的天线是否与舵机信号线挨得太近,我经过大量测试发现,电台天线距离舵机信号太近,特别是二者平行放置时,电台发射出的信号会大量耦合到舵机信号线中,这时通过示波器看舵机信号线上的PWM波,会发现它完全被干扰成了非常杂乱的波形,从而舵机的控制电路会接收到错误的控制信息,进而发生舵机抖动的情况。因此,请尽量将图传天线、数传天线和舵机线的距离保持在5cm以上,并且最好二者处于垂直关系(对于鞭状天线,此时耦合能量最少)。注意,对于电调信号线,这个干扰同样存在,只不过一般不会被大家注意到,大家布线时同样要注意这一点;
连接地面站,在MissionPlanner中遥控器校准页面查看遥控器各个通道的输入值是否在跳动,如果在跳动,请检查遥控器接收机连线是否松动、遥控器本身是否损坏;如果飞控收到的遥控器的输入值没有跳动,说明问题出在“飞控”->“舵机信号线”->“舵机”这一段:a、检查飞控各个输出通道的最大值和最小值是否设置正确,有的模友出现过舵机控制通道最大值设置为1515,最小值设置为1514的情况,此时对飞控来讲输出通道的行程只有1,从而导致程序混乱,飞控输出信号本身就在不断跳动,将这个通道设置为正常的1100~1900范围后舵机不再跳动;b、舵机信号线是否虚接?c、舵机本身坏了?换个舵机试试;
会不会是供电不足导致的?对于较大翼展的飞机,使用了多个较大功率的舵机,同时使用了较小的电源模块,导致峰值功率不足,电源模块反复保护重启?先只保留一个舵机试试? 更换更大的电源模块试试。
二十二、MissionPlanner全部参数列表注释消失
如果遇到以前正常使用的MissionPlanner,有一天连上飞控后全部参数列表中的注释全部消失了,根据我的经验,按如下步骤操作可以解决:
1、在控制面板中卸载MissionPlanner;
2、删除“此电脑” -> “文档” -> “Mission Planner”文件夹;
3、下载并安装最新版MissionPlanner,链接:http://www.nufeichuiyun.com/?p=62,此博文的第二条。
‘贰’ 如何进行pixhawk的串口调试
以下所描述的都是针对px4原生固件,此外,由于固件更新过于频繁,本文描述的是15年7月的固件,主要是举例,有改动的话,自己再研究研究吧(后面换cmake编译方式了,改动蛮大)。
既然要做开发,第一步就是搭好开发环境,根据我的经验,最好是在linux环境下编译,这样效率会很快,以前在windows下编译,经常40分钟以上,这样就太影响开发了;
第二步,大概了解下固件的架构,
如果只涉及应用层的开发,那底层的nuttx系统就可以绕过去了,一般,最好先把uorb模块的机制整明白就好了,从uorb入手,了解每个话题的来源以及作用,整理数据流,清楚每个模块之间的关系即可,比如,要实现手动模式,哪些模块互相交互,auto模式,又有哪些模块起作用,
如果涉及相应算法的开发,要学会定位到相应的算法模块,甚至具体到哪些代码,比如,你想试验你的姿态估计算法,那你就将姿态估计模块替换掉即可,不过相应的接口仍需要和px4环境一样,以姿态估计为例,最后要发布你的vehicle_attitude话题,不然无法与其他模块交互;
另外,不要试图在代码中找main函数,那是单片机思维,你只需看启动脚本即可,\ROMFS\px4fmu_common\init.d\rcs;
第三步,针对你的具体情况,定位相应的模块,进行精读研究,虽然模块基本是用C++写的,但是不会C++也没关系,毕竟又不是让你写,本人倒目前为止,也不会C++,配合注释,看明白就好了,比如,整理下mavlink的控制流程;
px4原生固件模块列表:
系统命令程序
mavlink –通过串口发送和接收mavlink信息
sdlog2 –保存系统日志/飞行数据到SD卡
tests –测试系统中的测试程序
top –列出当前的进程和CPU负载
uORB – 微对象请求代理器-分发其他应用程序之间的信息
驱动
mkblctrl–blctrl电子模块驱动
esc_calib –ESC的校准工具
fmu –FMU引脚输入输出定义
gpio_led –GPIOLED驱动
gps –GPS接收器驱动
pwm –PWM的更新速率命令
sensors –传感器应用
px4io –px4io驱动
uavcan –uavcan驱动
飞行控制的程序
飞行安全和导航
commander –主要飞行安全状态机
navigator –任务,失效保护和RTL导航仪
估计姿态和位置
attitude_estimator_ekf –基于EKF的姿态估计
ekf_att_pos_estimator –基于EKF的姿态和位置估计
position_estimator_inav–惯性导航的位置估计
multirotor姿态和位置控制器
mc_att_control–multirotor姿态控制器
mc_pos_control –multirotor位置控制器
fixedwing姿态和位置控制器
fw_att_control –固定翼飞机的姿态控制
fw_pos_control_l1 –固定翼位置控制器
垂直起降姿态控制器
vtol_att_control –垂直起降姿态控制器
最后提一句,多看看官网的说明,另外根据本人的经验来看,由于大框架,代码人家都写好了,通常你要加功能,所修改的也就几行代码而已,举例说明,比如px4固件只能在手动模式解锁,假如我要修改成定高模式解锁
‘叁’ pixhawk 软件开发用什么编译器
pixhawk 软件开发编译器:
中文官网推荐的是:两款推荐的编译器分别为Sublime Text 3(不受限制的“自由”编译,可在Windows,Linux和Macintosh系统上运行)和Notepad+ +(免费,开源)。 当然可以使用eclipse。
另外官网提供win、linux、mac下的开发包,使用git管理。
‘肆’ 如何用开源飞控Pixhawk进行二次开发
以下所描述的都是针对px4原生固件,此外,由于固件更新过于频繁,本文描述的是15年7月的固件,主要是举例,有改动的话,自己再研究研究吧(后面换cmake编译方式了,改动蛮大)。
既然要做开发,第一步就是搭好开发环境,根据我的经验,最好是在linux环境下编译,这样效率会很快,以前在windows下编译,经常40分钟以上,这样就太影响开发了;
第二步,大概了解下固件的架构,
如果只涉及应用层的开发,那底层的nuttx系统就可以绕过去了,一般,最好先把uorb模块的机制整明白就好了,从uorb入手,了解每个话题的来源以及作用,整理数据流,清楚每个模块之间的关系即可,比如,要实现手动模式,哪些模块互相交互,auto模式,又有哪些模块起作用,
如果涉及相应算法的开发,要学会定位到相应的算法模块,甚至具体到哪些代码,比如,你想试验你的姿态估计算法,那你就将姿态估计模块替换掉即可,不过相应的接口仍需要和px4环境一样,以姿态估计为例,最后要发布你的vehicle_attitude话题,不然无法与其他模块交互;
另外,不要试图在代码中找main函数,那是单片机思维,你只需看启动脚本即可,\ROMFS\px4fmu_common\init.d\rcs;
第三步,针对你的具体情况,定位相应的模块,进行精读研究,虽然模块基本是用C++写的,但是不会C++也没关系,毕竟又不是让你写,本人倒目前为止,也不会C++,配合注释,看明白就好了,比如,整理下mavlink的控制流程;
px4原生固件模块列表:
系统命令程序
mavlink –通过串口发送和接收mavlink信息
sdlog2 –保存系统日志/飞行数据到SD卡
tests –测试系统中的测试程序
top –列出当前的进程和CPU负载
uORB – 微对象请求代理器-分发其他应用程序之间的信息
驱动
mkblctrl–blctrl电子模块驱动
esc_calib –ESC的校准工具
fmu –FMU引脚输入输出定义
gpio_led –GPIOLED驱动
gps –GPS接收器驱动
pwm –PWM的更新速率命令
sensors –传感器应用
px4io –px4io驱动
uavcan –uavcan驱动
飞行控制的程序
飞行安全和导航
commander –主要飞行安全状态机
navigator –任务,失效保护和RTL导航仪
估计姿态和位置
attitude_estimator_ekf –基于EKF的姿态估计
ekf_att_pos_estimator –基于EKF的姿态和位置估计
position_estimator_inav–惯性导航的位置估计
multirotor姿态和位置控制器
mc_att_control–multirotor姿态控制器
mc_pos_control –multirotor位置控制器
fixedwing姿态和位置控制器
fw_att_control –固定翼飞机的姿态控制
fw_pos_control_l1 –固定翼位置控制器
垂直起降姿态控制器
vtol_att_control –垂直起降姿态控制器
最后提一句,多看看官网的说明,另外根据本人的经验来看,由于大框架,代码人家都写好了,通常你要加功能,所修改的也就几行代码而已,举例说明,比如px4固件只能在手动模式解锁,假如我要修改成定高模式解锁
‘伍’ 如何用eclipse编译pixhawk飞控
PIXHAWk飞控介绍
http://wenku..com/link?url=_-c2y0ldnBdsweVfOjC5-WPoa
‘陆’ 如何用开源飞控PIXHAWK进行开发
想快速开发一个飞控,那首先要做的是了解apm的各种参数配置,了解每个参数的影响和起作用的代码功能块,用apm适配自己的机型还是需要修改,优化,和裁剪。正如克里斯安德森说希望APM做无人机行业的安卓,但是安卓的性能也只能是差强人意,比无人机行业的IOS大疆创新来说还差很多。
飞控行业或者研究领域应用,例如开发测绘手机app,无人机送快递等等(倾向于demo性质)...这种应用不需要做一个飞控,首先大概了解飞控的原理,然后只要掌握apm的控制数据协议即可。
发烧级的爱好者或者开发者,迫切的想要了解apm的大部分算法和逻辑,这个真的需要较长的时间,大致的思路就是:底层驱动-》传感器数据和物理意义-》姿态解算-》PID控制器-》飞行模式切换-》参数调优(包含gps悬停刹车什么的很细但是影响手感和性能的参数)初学只是去看apm而不是自己动手去做很难搞懂,建议还是自己做飞控,哪怕复制apm部分功能代码,做飞控的学习顺序和读飞控一样,但对于apm这样一个系统工程相对来说模块更分立。
‘柒’ arino如何输出一个数组如位置坐标(x,y).不是赋值而是输出。
可以试一下把println(x,y);改成:
print("("); print(x); print(","); print(y); println(")");
把数组拆分输出
‘捌’ 编译pixhawk提示-Wfatal出错怎么办
下载一个eclipse IDE for JAVA Developer软件
下载一个ADT插件。
打开eclipse开发环境,点击help----install new software-------add
新建一个android系统环境变量,将SDK文件夹的platform-tools文件夹路径和tools文件夹路径添加上去。
在PATH变量中添加你修改的环境变量,筛选你需要编译的文件。
‘玖’ 怎么给pixhawk空板刷bootloader
步骤:
1.编译最新的bootloader。 从github下载最新的bootloader,make编译,得到px4io_bl.bin和px4fmu2_bl.bin文件;
2. 打开J-Link,注意最好用高版本的,我的用的是V4.74b。刷F100 MCU时,选择STM32F100C8.jflash,如下图:
5. 最后,connect连接,erase chip擦除整块flash,最后program或者Auto下载bin文件,成功了会有success的提示。
6. 这样就可以了,之后就可以用mission planner通过USB刷固件。
‘拾’ ubuntu 环境下怎样编译pixhawk px4源码
Ubuntu环境下Pixhawk原生固件PX4的编译
分类:无人机ubuntu代码编译Pixhawk
(3946) (6)
Ubuntu下Pixhawk原生固件PX4的编译这个问题困扰了两天时间,可能是博主脑力不够,主要是环境搭建不起来,主要原因应该是路径的原因,最后在大师傅的帮助下还好成功将路径搭建好,成功编译。
下面就跟大家分享一下环境搭建的过程。
1.操作环境
每次写文章,环境一定要介绍的,不同的环境总会出现不同的问题
我的环境是Windows下面安装虚拟机,虚拟机跑Ubuntu
Windows:win10 64位
虚拟机:VMware Workstation 12 Pro 12.1.0 build-3272444
Ubuntu:Ubuntu15.10
2.编译环境搭建
(1)权限设置
官方提示:
Warning Never ever fix permission problems by using 'sudo'. It will create more permission problems in the process and require a system reinstallation to fix them.
意思是你会遇到权限问题,不要用sudo解决,那样会带来更多问题,但是我没听他的,我没用,最后也是实现了
官方提供指令
[plain] view plain
然后注销,重新登录生效
(2)安装
更新包列表,安装下面编译PX4的依赖包。PX4主要支持的系列:
NuttX based hardware: Pixhawk, Pixfalcon
Snapdragon Flight hardware: Snapdragon
Raspberry Pi hardware: Raspberry Pi 2
Host simulation: jMAVSim SITL and Gazebo SITL
注意:安装Ninja Build System可以比make更快进行编译。如果安装了它就会自动选择使用它进行编译。
[plain] view plain
卸载模式管理器
[plain] view plain
更新包列表和安装下面的依赖包。务必安装指定的版本的包
[plain] view plain
上面代码中红色部分大家需要一高警惕,gcc-arm-none-eabi版本导致PX4/Firmware编译错误,现在apt-get安装的gcc-arm-none-eabi基本上是4.9的版本,但是这个固件需要gcc-arm-none-eabi 4.8de 版本,所以最后安装好以后,查看你的gcc-arm-none-eabi版本,如果是4.9需要手动安装4.8的版本,安装gcc-arm-none-eabi 4.8的版本的方法如下:
[plain] view plain
【Warning】上面红色的路径一定要添加正确,不然问题很多,我第一次就输入错误,结果结果开不了机了,反复输入密码。博主装的是Ubuntu 64位系统,而上述arm-none-eabi是直接下载的编译好的32位,还需要安装一个东西
[plain] view plain
可以检查arm-none-eabi 4.8.4是否安装成功,输入以下指令:
[plain] view plain
如果出现如上信息,交叉编译环境搭建就搭建成功了
(3)代码编译
根据PX4中文维基官网教程。
安装Git
[plain] view plain
下载代码
[plain] view plain
初始化
先进入Firmware文件夹,进而进行初始化、更新子模块操作,耐心的等待……
[plain] view plain
权限
编译时会遇到权限问题,执行指令
[plain] view plain
-R 是对文件下面包含的子文件权限问题,* 是对所有文件的权限问题
编译
[plain] view plain
注意到“make”是一个字符命令编译工具,“px4fmu-v2”是硬件版本,“default”是默认配置,所有的PX4编译目标遵循这个规则。
最后附一张编译成功的代码,如果这样你还有问题,请给我留言。
[plain] view plain
-- nuttx-px4fmu-v2-default
-- The ASM compiler identification is GNU
-- Found assembler: /opt/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-gcc
-- Found pythonInterp: /usr/bin/python (found version "2.7.10")
-- Using C++03
-- Release build type: RelWithDebInfo
-- Adding UAVCAN STM32 platform driver
-- Configuring done
-- Generating done
-- Build files have been written to: /home/lihongwei/Documents/Firmware/build_px4fmu-v2_default
#+@Tools/check_submoles.sh
PX4 CONFIG: px4fmu-v2_default
Scanning dependencies of target git_mavlink
Scanning dependencies of target git_uavcan
Scanning dependencies of target git_gencpp
Scanning dependencies of target git_genmsg
[ 0%] Generating git_init_mavlink_include_mavlink_v1.0.stamp
[ 0%] Generating git_init_src_moles_uavcan_libuavcan.stamp
[ 0%] Generating git_init_Tools_genmsg.stamp
[ 0%] Generating git_init_Tools_gencpp.stamp
[ 0%] Built target git_uavcan
[ 0%] Built target git_mavlink
[ 0%] Built target git_genmsg
[ 0%] Built target git_gencpp