上期我们讲解了PX4的基础知识(上)大家可以回顾一下,本期继续为大家带来PX4基础知识下半部分内容的讲解。
1. PX4的开发流程
飞控简单来讲,就是通过控制电机速度从而控制飞机飞行状态,例如四旋翼就是通过控制四个电机的转速,控制飞机以期望姿态和位置去飞行的。
这其中我们就需要了解PX4的源码、飞机间的通信协议是什么,以及最后是怎么控制飞机状态的。飞机在飞行时是怎么得到反馈信息再去更新位置的等等,这些相关信息都是需要在开发过程中考虑的。
1.1 源码介绍
整个飞控阶段开发过程可以用流程图来表示:
在源码编辑部分是用C++对源码进行编辑,固件编译部分主要在cmake目录中编译脚本,生成二进制固件。在启动流程中是在ROMFs中启动脚本执行运行相应的代码,最后在srs中实现功能代码。
1.1.1 程序运行前的代码
(Bootloader)
类似于电脑的Boot,在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。Pixhawk中主处理器和协处理器都含有Bootloader。一般不需要修改,只有固件更新时需要使用。
1.1.2 cmake
属于配置文件。主要使用nuttx_px4fmu-v2_default.cmake。cmake管理整个固件的编译过程,生成二进制固件。可以对系统使用的文件的路径进行配置,在PX4系统所有的.CPP和.C文件都是通过在该处进行路径包含的。
1.1.3 ROMFs
属于启动脚本。其功能是将程序的固件代码进行启动,让他们相互独立能够各自处理。ROMFs文件夹里面的rsc是整个启动脚本。
整个启动过程如图:
1.1.4 srs
srs是源码的实现。所有的底层驱动源码的实现,例如I/O端口处理、板子的初始化和传感器等等。该目录下的module比较重要,是功能代码实现的地方。每个文件夹对应不同功能,例如姿态控制、位置控制和基于导航的位置解算等等。
1.2 通信协议库
无人机遥控器之间为S.bus协议,飞机对地面站的通信为Mavlink,而飞机内部之间的通信方式为uORB。下面主要介绍uORB和Mavlink两种协议。
1.3 uORB
飞机内部通信都是uORB。首先要明确为什么要了解uORB,因为源码中每个功能模块,运行起来,都是相互独立的进程,并未通讯,是靠uORB打通数据流的。而对于开发人员来讲,了解uORB是非常重要的,是因为在后续做二次开发时,需要定义自己的数据流,再将其放到编译脚本中才能实现所需要的功能,所以做二次开发要掌握uORB。
关于uORB的创建过程:
(1)创建自己的消息主题(在msg文件中)。
(2)把自己定义的消息主题添加到编译的脚本中(在cMakelist里)
(3)对脚本重新编译(编译完成后会生成新的.h文件,_s的结构体)。
1.4 Mavlink
飞机外部的通信,飞机和地面站,数传通信都是Mavlink。PX4中提供两套,V1版本和V2版本。Mavlink是为小型飞行器和地面站(或者其他飞行器)通讯时常常用到的那些数据制定一种发送和接收的规则并加入了校验(checksum)功能。协议以消息库的形式定义了参数传输的规则。MavLink协议支持无人固定翼飞行器、无人旋翼飞行器、无人车辆等多种类型的无人机。MAVLink协议是在CAN总线和SAE AS-4 标准的基础上设计形成的。
软件层面的启动过程图:
2. 状态控制
主要从四个方面进行介绍。姿态解算、姿态控制、位置解算、位置控制。
姿态控制和位置控制的关系如图所示:
姿态控制和位置控制的关系图
姿态解算解算出位置传给姿态控制;位置解算解算出位置传给位置控制;位置控制分为内环和外环,外环产生期望速度,内环作用速度差产生期望推力,期望推力转化为期望姿态给姿态控制;姿态控制也分为内外环,外环作用姿态差产生角速率,内环用角速率差产生控制量给被控对象。
2.1 坐标系
机体坐标系:向前为x轴,向右为y轴,向下为z轴。飞机从传感器得到的数据基于该坐标系。
地理坐标系称为NED(North、East、Down)。我们看飞机姿态、位置和速度都是应用地理坐标系。
2.2 姿态控制
姿态一共有三种表示方法:欧拉角、旋转矩阵、四元数。
欧拉角
欧拉角是指通过依次绕不同坐标轴的三次连续转动来实现一个坐标系到另一个坐标系的转换。
这个“依次”是要按着一定的顺序的,在这里我们规定选准顺序:先绕Z轴(偏航),再绕Y轴(俯视),最后绕X轴(横滚),按着三个方向的调准,最后三次角度组合就可以达到最后期望的姿态。
旋转矩阵
方向余弦矩阵表示出了机体坐标系在地理坐标系上的投影。它也可以表示姿态,但是即复杂而且也不直观,它的主要用处就在于可以直接在地理坐标系和机体坐标系之间相互转换。
四元数
四元数姿态表达式的基本思路为一个坐标系到另一个坐标系的变化可以通过绕一个定义在参考系中的矢量μ的单次转动来实现。四元数有五种表示方式分别为矢量式、复数式、三角式、指数式和矩阵式。其中的数学运算都是向量和矩阵运算,在初始位置和期望位置中,可以通过旋转轴一步到位。比起方向余弦矩阵表达方式,四元数会更加清晰明了。
三种表达方式彼此之间可以相互转换,彼此也有相应的优缺点。
具体可以看如下表格:
2.3 位置控制
位置控制分为内外两环,外环控制。有关源码的解算思路具体如下图:
源码解算思路图
源码的解算过程中,速度来源于加速度计,用加速度计来测当前机体所受到的加速度,减去加速度偏差,可以得到准确加速度信息,积分一次可以得到速度,两次积分后可以得到位置。
位置控制的过程主要参考当前位置和期望位置,位置有误差需要速度去弥补,速度有误差需要加速度去弥补,进而对当前位置和期望位置进行调整。内环作用于速度差,从而产生期望推力,外环作用于位置差,产生期望速度。最终需要得到的是外环所产生的期望速度。
3. 无人机三大算法
无人机算法分为三种,分别为捷联式惯性导航系统、卡尔曼滤波器、飞行控制PID算法。这里只对PID算法进行简单介绍,其余可以自行去搜寻相关参考资料。
PID简单稳定可靠,满足一般开发人员的需求,所以飞控PID算法也是应用比较多的一种算法。PID是一种反馈的方法,并不是一蹴而就的,是需要不断反馈调节的。PID作用于误差,其效果就是用来消除误差的,让系统的状态能达到期望的状态。在PX4中用到的是位置式的PID表达形式,尤其需要注意的是积分分离和抗积分饱和这种问题。在PX4源码中专门有提供了PID库函数,在module/systemlib/PID中。
4. 实际操作(调试)
实际操作主要分为两个部分,校准和试飞。在校准部分主要流程为:
1. 连接飞控在地面站上,将固件烧录到飞控中。
2. 对传感器(IMU)进行校准。
3. 连接遥控器到地面站,对遥控器进行校准。
4. 选择飞行模式,对应好相应的通道。
5.电调校准。
6.在地面站上重启飞控。
调试和试飞具体过程可以参照视频,视频一共有三部分:
l 调试视频,可以看到飞控如何连接到飞控上
l 在最后成功校准完毕,无人机的启动过程视频(还未安装螺旋桨)
l 试飞视频,在定点模式下的试飞视频
以上所有内容均基于课程《PX4固件二次开发中级课程》
详情可学习铂贝学院相关课程:https://bbs.amovlab.com/plugin.php?id=zhanmishu_video:video&mod=video&cid=1
PX4官方网站:https://www.ncnynl.com/archives/201709/2003.html
作者-阿木实验室:瑶月
- End -
技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把无人机行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在无人机行业,就请关注我们的公众号,我们将持续发布无人机行业最有价值的信息和技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)