PX4固定翼控制器详解(五)——L1、NPFG控制器

news2024/11/14 6:42:25

之前已经讲解了TECS高度与速度控制器,今天是PX4固定翼控制器系列讲解的最后一期,主题是PX4的位置控制器。PX4 1.12及其之前的版本,使用的位置控制器为L1控制器。1.13及其之后的版本,PX4更新了NPFG控制器。NPFG控制器在较强风速下有着更好的路径跟踪效果,且解决了风速大于空速情况下,可能导致飞机失控的问题。本文将简单介绍L1控制器,着重介绍NPFG控制器。

引言——L1控制器

首先简单介绍一下L1控制器,该控制器[1]由MIT的人员提出。

核心思想方法:

  • 选择参考点:首先在期望路径上选择一个参考点,该参考点位于飞机当前位置的前方一定距离处(距离为L1)。
  • 计算横向加速度期望指令:基于选定的参考点,控制算法生成一个横向加速度命令 a s c m d {a_s}_{cmd} ascmd,使飞机的速度方向逐渐对齐到参考点所在的路径方向。这一加速度命令考虑了飞机的惯性速度,并根据飞机当前位置与参考点之间的相对角度计算。

相关公式计算为:
{ a s c m d = 2 V 2 L 1 s i n η L 1 = 2 R s i n η \begin{cases} {a_s}_{cmd} = 2 \frac{V^2}{L_1}sin{\eta} \\ L_1 = 2Rsin{\eta} \\ \end{cases} {ascmd=2L1V2sinηL1=2Rsinη

滚转指令生成

回看系列第二期文章中的讲解,根据侧向期望加速度,可以根据几何方法计算的得到期望滚转角。
{ L c o s ϕ = m g L s i n ϕ = m a s c m d \begin{cases} Lcos\phi = mg \\ Lsin\phi = m{a_s}_{cmd} \\ \end{cases} {Lcosϕ=mgLsinϕ=mascmd

最终可以得到期望滚转角为 ϕ s p = a r c t a n ( a s c m d / g ) \phi_{sp}=arctan({a_s}_{cmd}/g) ϕsp=arctan(ascmd/g)

关键特性:

  1. 比例-微分控制:对于直线路径,控制律近似为传统的比例-微分(PD)控制器,但对于曲线路径,它包含了前馈控制元素,使得无人机能够紧密跟随复杂的曲线路径。
  2. 前馈控制:控制方法中加入了前馈控制元素,这使得在飞机接近曲线路径时能够提前调整飞行方向,减少路径误差。
  3. 自适应速度调整:算法使用飞机的惯性速度来计算横向加速度命令,这使得控制系统能够适应由于外界扰动(如风)引起的速度变化,从而提高轨迹跟踪的准确性。
    其他详细推导讲解可以查看文末参考文献[1]。

PX4软件适配

在PX4软件中,有两个主要调节的参数为FW_L1_PERIOD和FW_L1_DAMPING。我们查看一下PX4关于L1的代码,位置PX4-Autopilot-main/src/lib/l1/ECL_L1_Pos_Controller.cpp。
代码最末尾的函数规定了几个过程变量的计算方式:
{ L 1 r a t i o = 1 π ∗ L 1 d ∗ L 1 p ω h e a d i n g = 2 ∗ π L 1 p \begin{cases} {L_1}_{ratio} = \frac{1}{\pi}*{L_1}_d*{L_1}_p \\ \omega_{heading} = \frac{\sqrt2*\pi}{{L_1}_p} \\ \end{cases} {L1ratio=π1L1dL1pωheading=L1p2 π

void ECL_L1_Pos_Controller::set_l1_period(float period)
{
	_L1_period = period;
	/* calculate the ratio introduced in [2] */
	_L1_ratio = 1.0f / M_PI_F * _L1_damping * _L1_period;
	/* calculate normalized frequency for heading tracking */
	_heading_omega = sqrtf(2.0f) * M_PI_F / _L1_period;
}

void ECL_L1_Pos_Controller::set_l1_damping(float damping)
{
	_L1_damping = damping;
	/* calculate the ratio introduced in [2] */
	_L1_ratio = 1.0f / M_PI_F * _L1_damping * _L1_period;
	/* calculate the L1 gain (following [2]) */
	_K_L1 = 4.0f * _L1_damping * _L1_damping;
}

主要定义了三种模式下的L1_distance和lateral_accelation的计算方式。

  • navigate_waypoints模式:查看文件中ECL_L1_Pos_Controller::navigate_waypoints函数。相关计算方式为
_L1_distance = _L1_ratio * ground_speed;
 _lateral_accel = _K_L1 * ground_speed * ground_speed / _L1_distance * sinf(eta);

由此可以得到L1_distance和lateral_accelation的计算公式如下:
{ L 1 d i s t a n c e = 1 π ∗ L 1 d ∗ L 1 p ∗ V g r o u n d a s c m d = 4 L 1 2 d V g r o u n d 2 L 1 d i a t a n c e s i n η \begin{cases} {L_1}_{distance} = \frac{1}{\pi}*{L_1}_d*{L_1}_p*V_{ground} \\ {a_s}_{cmd} = \frac{4{{L^2_1}_d} V^2_{ground}}{{L_1}_{diatance}}sin{\eta} \\ \end{cases} {L1distance=π1L1dL1pVgroundascmd=L1diatance4L12dVground2sinη

需要注意的是这里L1的取法和论文中的原版不一致。想要读懂这段代码的逻辑可能会有些复杂,这里我查到了AP中的L1控制器的图解,和PX4中所给出的计算逻辑一致。如下图所示。两者的计算方式也基本一致。

由此可以看出,调试period和damping这两个参数时,先调节period,控制参考点的距离在一个大致合理的范围。随后调节damping来微调震荡情况。可以先调节period到稍微振荡,再将period适当增大2-3;最后微调damping。damping取值范围为0.65-0.85,每次微调变化幅度为0.05。

  • navigate_loiter模式:该模式为盘旋模式,内部分了两种情况。

Capture模式:该模式用于当飞机在圆圈外的飞行控制。在飞机与圆心的连线上选取参考点,使用L1控制器。

_L1_distance = _L1_ratio * ground_speed;
float lateral_accel_sp_center = _K_L1 * ground_speed * ground_speed / _L1_distance * sinf(eta);

Circle模式:当飞机跟踪到圆圈附近时,不再使用L1控制器,改为使用PD控制器加向心加速度前馈。
PD控制:

float xtrack_vel_circle = -ltrack_vel_center;
float xtrack_err_circle = vector_A_to_airplane.length() - radius;
float lateral_accel_sp_circle_pd = (xtrack_err_circle * K_crosstrack + xtrack_vel_circle * K_velocity);

向心加速度前馈:

float tangent_vel = xtrack_vel_center * loiter_direction;
float lateral_accel_sp_circle_centripetal = tangent_vel * tangent_vel / math::max((0.5f * radius), (radius + xtrack_err_circle));

两者叠加:

float lateral_accel_sp_circle = loiter_direction * (lateral_accel_sp_circle_pd + lateral_accel_sp_circle_centripetal);
  • navigate_heading模式:该模式用于定向飞行。代码中相关量计算方式为

{ a s c m d = 2   s i n η   ω v L 1 d i s t a n c e = V g r o u n d / ω h e a d i n g ω v = V g r o u n d   ω h e a d i n g ω h e a d i n g = 2 π / L 1 p \begin{cases} {a_s}_{cmd} = 2\ sin{\eta} \ \omega_v \\ {L_1}_{distance} = V_{ground}/ \omega_{heading}\\ \omega_v = V_{ground} \ \omega_{heading} \\ \omega_{heading} = \sqrt{2} \pi/{L_1}_p \\ \end{cases} ascmd=2 sinη ωvL1distance=Vground/ωheadingωv=Vground ωheadingωheading=2 π/L1p

给出 L 1 d i s t a n c e {L_1}_{distance} L1distance a s c m d {a_s}_{cmd} ascmd的计算方式为
{ a s c m d = 2 2 π   s i n η   V g r o u n d / L 1 p    = 2 V g r o u n d 2 L 1 d i s t a n c e s i n η L 1 d i s t a n c e = V g r o u n d L 1 p 2 π \begin{cases} {a_s}_{cmd} = 2\sqrt{2}\pi\ sin{\eta} \ V_{ground}/{L_1}_p \\ \qquad \ \ = 2\frac{V^2_{ground}}{{L_1}_{distance}}sin\eta\\ {L_1}_{distance} = \frac{V_{ground} {L_1}_p}{\sqrt{2}\pi}\\ \end{cases} ascmd=22 π sinη Vground/L1p  =2L1distanceVground2sinηL1distance=2 πVgroundL1p

小结

综上介绍了L1制导律在PX4中的应用。L1_PERIOD主要决定参考距离的长短,值越大参考距离越大,转弯越缓慢;值越小,参考距离越小,转弯越陡;L1_DAMPING则是微调转弯时候的期望加速度 a s c m d {a_s}_{cmd} ascmd。在调试这两个参数时,先调试period,period越小,转弯越快。当飞机转弯出现些许震荡后,将period适当增大2-3。随后调整damping。

NPFG控制器

在PX41.13及其之后的版本,可以使用NPFG位置控制器,全称Nonlinear Path Following Guidance(非线性路径跟踪制导律)[2]。L1控制器在计算参考方向、参考距离、侧向加速度指令时,大都采用地速作为参考,没有引入空速的闭环控制,因此L1控制器在强风天气下的路径跟踪控制效果较差。NPFG相较于L1,引入了新的期望空速矢量,来抵御强风的干扰,其路径跟踪效果相较于L1有着显著提升。接下来我们来介绍NPFG控制器。英文网站参考链接[3]。

空速圆

如下图所示,我们橙色矢量为空速矢量 V a V_a Va。以飞机起始位置,作风速矢量平移后得到灰色的飞机位置,以灰色飞机位置为圆心,空速大小为半径做圆得到空速圆(橙色虚线圆)。空速圆为空速矢量 V a V_a Va可到达的最大范围,蓝色矢量为风速矢量 V w V_w Vw,空速矢量与风速矢量合成可得到白色矢量地速 V g V_g Vg

当风速大小 ∣ V w ∣ |V_w| Vw小于空速大小 ∣ V a ∣ |V_a| Va时,飞机位置位于空速圆内,合成后的 V g V_g Vg可以指向任意方向。

超出空速圆

如下图所示,当风速较大时,出现”过量风“ ∣ V w ∣ > ∣ V a ∣ |V_w|>|V_a| Vw>Va时,无论空速矢量和风速矢量如何合成,合成后的地速矢量永远在一个锥形区域内,称之为可行方向锥

因此锥内的范围是可飞行方向

锥外的范围是不可飞行方向

空速圆内、可视范围内路径跟踪

∣ V w ∣ < ∣ V a ∣ |V_w|<|V_a| Vw<Va飞机位于空速圆内时,飞机跟踪蓝色期望路径,绿色为期望飞行方向(相对于地面)(选取方法类似L1控制器,在与期望路径最近点初,向前一段选取期望路径点,期望路径点与飞机连线为期望飞行方向)。

有了期望的飞行方向(相对于地面)后,将绿色矢量与空速圆的交点和空速圆圆心连接,即可得到期望的参考空速矢量(橙色虚线)。空速矢量与速度矢量合成后,得到灰色的地速矢量结果。在整个动态飞行过程中,计算是连续的。

空速圆外、可行方向锥内路径跟踪

∣ V w ∣ > ∣ V a ∣ |V_w|>|V_a| Vw>Va飞机位于空速圆外时,如果期望的飞行方向(绿色矢量)位于可行方向锥内,任意方向均可通过空速矢量和风速矢量合成。

极限条件为:期望飞行方向与可行方向锥相切。这种情况下保证最小化到期望路径的位置误差。

空速圆外、可行方向锥外路径跟踪

∣ V w ∣ > ∣ V a ∣ |V_w|>|V_a| Vw>Va飞机位于空速圆外,且期望的飞行方向(绿色矢量)位于可行方向锥外,无论怎样合成空速矢量和风速矢量,均无法到达期望方向。

为了防止强风下失控,这里的安全机制设计为:将偏离航向的发生率降至最低。飞机空速方向与风速方向相反,飞机顶风飞行。但由于风速大于空速,飞机顶着风也会被向后”吹跑“。

空速补偿

根据上面的讲解不难看出,飞行范围主要取决于可行方向锥的范围,那我们是否可以尝试扩大可向方向锥的范围来实现更大范围的飞行?

之前的橙色空速圆为设定的默认空速值,实际上飞机还有可用的最大空速值。对于默认空速值可行方向锥范围外的飞行方向,可以尝试增大空速来获取更大的可行方向锥。

若期望飞行方向(绿色矢量),与橙色空速圆(设定的默认空速)无交点,与红色空速圆(最大空速圆)有交点。

在绿色线上选取圆环内一点,将该点与圆心相连,即可得到期望的空速矢量,空速矢量与风速矢量合成,即可得到灰色地速矢量。这里选取图中飞机位置与垂线外侧的那一部分的点,可以获得较大的地速。

总结

根据上述分析,可以查看以下GIF图。图中总结了如何根据期望飞行方向选择空速方向,并说明了在何种情况下需要启用空速补偿以实现更佳的飞行效果。在开启空速补偿后,即便是在强风情况下,可行方向有着显著改善。

在这里插入图片描述

使用教程

开启方式

如果希望启用NPFG,需要以下条件:

  1. PX4 1.13及其以上版本
    • 仅针对固定翼飞行器有效;
    • 设置参数FW_USE_NPFG=1;
  2. 有效的风速估计
    • 使用空速计;
    • 并/或启用合成侧滑融合 EKF2_FUSE_BETA=1。

调参

NPFG主要改进在于期望空速矢量的选取,该控制器是由L1派生而来,因此NPFG_PERIOD和NPFG_DAMPING可以直接沿用L1_PERIOD和L1_DAMPING的值。越小的NPFG_PERIOD会带来越激进的转弯效果。

自动稳定

如果没有调好NPFG_PERIOD,出现过于激进的转弯,且你想使用自动稳定。可以设置参数NPFG_LB_PERIOD=1,该模式下会自动识别滚转周期来设定合理的NPFG_PERIOD。如果开启该功能,需要正确设定NPFG_ROLL_TC。
为了得到正确的NPFG_ROLL_TC:

  • 需要将日志记录调整为高频率;
  • 在定高或姿态模式下,长周期和短周期下,完整得左右打杆滚转数次,记录下日志;
  • 得到滚转角的输入和输出响应,将其拟合出一阶传递函数;
  • 一阶传递函数的时间常数值设定给NPFG_ROLL_TC。

强风下行为预设

强风下有两种预设行为:
最小前向地速飞行:
设置参数:NPFG_EN_MIN_GSP=1
设定期望的最小前向地速:FW_GND_SPD_MIN
飞机缓慢飞行至期望轨迹处,到达轨迹后,制导保持与最小地速相同的速度。

持续跟踪:
设置参数:NPFG_TRACK_KEEP=1
设定FW_GND_SPD_MIN=0
当飞机离期望轨迹较远时,NPFG_GSP_MAX_TK(m/s)是 NPFG 为返回航迹所命令的最大前向地速;一旦安全回到航迹,命令的地速辅助将被归零。

改进对比

采用NPFG后,强风下的路径跟踪效果有着显著提升。
原制导律路径跟踪效果:

NPFG路径跟踪效果:

总结

本期文章完成了PX4控制器讲解的最后一期,L1控制器+NPFG控制器。NPFG在强风环境下有着显著优势,感兴趣的朋友可以根据文章的介绍调试飞行一下,文末会放上相关文献及参考链接。

参考文献及链接

[1]PARK, Sanghyuk; DEYST, John; HOW, Jonathan. A new nonlinear guidance logic for trajectory tracking. In: AIAA guidance, navigation, and control conference and exhibit. 2004. p. 4900.
[2]STASTNY, Thomas; SIEGWART, Roland. On flying backwards: Preventing run-away of small, low-speed, fixed-wing UAVs in strong winds. In: 2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2019. p. 5198-5205.
[3]https://github.com/PX4/PX4-Autopilot/pull/18810
[4]https://www.youtube.com/watch?v=LY6hYBCdy-0

END

迅翼SwiftWing致力于固定翼技术共享,汇聚固定翼领域技术极客,推动固定翼技术持续创新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

活动目录安全

活动目录安全 1.概述2.常见攻击方式SYSVOL与GPP漏洞MS14-068漏洞Kerberoast攻击内网横移抓取管理员凭证内网钓鱼与欺骗用户密码猜解获取AD数据库文件 3.权限维持手段krbtgt账号与黄金票据服务账号与白银票据利用DSRM账号利用SID History属性利用组策略利用AdminSDHolder利用SSP…

宠物空气净化器去浮毛哪家强?希喂、美的和米家实测分享

要说养宠物后里最让我感到幸福感飙升的家电&#xff0c;必须是宠物空气净化器&#xff0c;没有之一。很多人都喜欢宠物&#xff0c;但应该没有人喜欢清扫&#xff0c;特别是家里宠物多&#xff0c;或者一群宠物在自己家聚在一起之后&#xff0c;要疯狂清除浮毛&#xff0c;真的…

剖解相交链表

相交链表 思路&#xff1a;我们计算A和B链表的长度&#xff0c;求出他们的差值&#xff08;len&#xff09;&#xff0c;让链表长的先多走len步&#xff0c;最后在A,B链表一起向后走&#xff0c;即可相逢于相交节点 实现代码如下&#xff1a; public class Solution {public …

单链表进阶

之前已经介绍过单链表及其一些简单的功能 这次来简单介绍单链表一些的其他接口 1.在指定位置之前插入数据 具体原码&#xff0c;三个参数&#xff0c;phead是链表的指针&#xff0c;pos是节点的地址&#xff0c;x是需要插入的数据。 pos不能为空指针&#xff0c;因为pos为空…

React启动时 Error: error:0308010C:digital envelope routines::unsupported

错误信息&#xff1a; 错误原因&#xff1a;通常与 Node.js 的新版本中 OpenSSL 的默认行为变化有关。从 Node.js 17 开始&#xff0c;OpenSSL 默认启用了 OpenSSL 3.0 的一些新特性&#xff0c;这可能会影响到一些旧的或未更新的库。 解决办法&#xff1a;可以通过设置环境变…

基于STM32设计的室内育苗环境管理系统(物联网)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】ESP8266-WIFI模块【2】MQ135传感器【4】DHT11传感器【5】B1750传感器 …

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要&#xff1a; 近年来&#xff0c;去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能&#xff0c;去噪扩散模…

Flexus X实例全方位指南:智能迁移、跨云搬迁加速与虚机热变配能力的最佳实践

目录 前言 一、云迁移关键挑战 1、企业实例选型关键挑战 2、云算力关键挑战之一 3、云算力关键挑战之二 二、本地IT及其他云搬迁到Flexus X实例上的独有优势 1、Flexus X实例超强性能&#xff0c;遥遥领先同规格友商实例 &#xff08;1&#xff09;底层多重调优&#x…

网络编程——TCP网络通信

通信步骤&#xff1a; 1、连接 2、传输数据 3、关闭连接服务端的创建流程&#xff1a; 1、创建服务端socket对象 socket_family:网络地址类型AF_INET--代表的是ipv4地址类型 socket_type:套接字类型SOCK_STREAM--代表的是tcp套接字SOCK_DGRAM--代表的是udp套接字 2、绑定自己的…

新房安装了约克VRF中央空调真的是明智的选择!

夏天越来越热&#xff0c;新房安装了中央空调真的是太明智了&#xff01;当初装修时&#xff0c;考虑到家里空间大&#xff0c;我就决定装一个中央空调。对比了好多品牌后&#xff0c;朋友推荐了约克VRF中央空调。装好以后&#xff0c;简直惊喜不断&#xff01;      强效除…

基于SpringBoot+Vue+MySQL的美食点餐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化快速发展的今天&#xff0c;餐饮行业也迎来了转型升级的重要机遇。传统餐饮管理方式面临效率低下、顾客体验不佳等问题。为此&#xff0c;开发一款基于SpringBootVueMySQL架构的美食点餐管理系统显得尤为重要。该系统旨…

【Qualcomm】高通SNPE框架简介、下载与使用

目录 一 高通SNPE框架 1 SNPE简介 2 QNN与SNPE 3 Capabilities 4 工作流程 二 SNPE的安装与使用 1 下载 2 Setup 3 SNPE的使用概述 一 高通SNPE框架 1 SNPE简介 SNPE&#xff08;Snapdragon Neural Processing Engine&#xff09;&#xff0c;是高通公司推出的面向移…

Leetcode尊享面试100题-252.会议室

给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 示例 1&#xff1a; 输入&#xff1a;intervals [[0,30],[5,10],[15,20]] 输出&#xff…

记录Mac编译Android源码踩过的坑

学习Android源码&#xff0c;如果电脑配置还不错&#xff0c;最好还是下载一套源码&#xff0c;经过编译后导入到Android Studio中来学习&#xff0c;这样会更加的直观&#xff0c;代码之间的跳转查看会更加方便。因此&#xff0c;笔者决定下载并编译一套源码&#xff0c;以利于…

【C++算法】链表

知识总结 常用技术&#xff1a; 1.画图&#xff01;&#xff01;——>直观形象便于理解 2.引入虚拟”头结点“ 便于处理边界情况方便对链表操作 3.不要吝啬空间&#xff0c;大胆定义变量 4.快慢双指针——判环、找链表中环的入口、找链表中倒数第n个节点 链表中的常用…

电力领域大模型

2023年12月&#xff0c;arXiv预印本平台发表了一篇题为"Large Foundation Models for Power Systems"的研究论文。该文系统探讨了大型基础模型如大型语言模型&#xff08;LLMs&#xff09;在电力系统建模和运行中的应用前景。研究重点关注了大型基础模型在最优潮流计…

php+mysql安装

1.卸载mysql 没启动不停止 2.下载 3.解压 4.点击安装 5.出现成功 端口占用修改 修改端口89或者87 可视化扩展 修改后重启 开启扩展

consul注册中心与容器自动发现实战

consul简介 Consul 是 HashiCorp 公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案&#xff0c;不再需要依赖其它工具&#xff08;比如 ZooKeeper 等&#xff0…

springboot快速开发平台使用达梦数据库

1.首先来到DM管理工具 大致流程是&#xff1a;创建表空间&#xff08;用于给新建的用户使用&#xff09;-》创建用户&#xff08;绑定表空间&#xff09; 文件位置 2.创建用户 来到所属角色页面&#xff0c;第一个权限管理员一定要勾上&#xff0c;其他的看情况 3.来到DM数…

9.24每日作业

1> 思维导图 2> 将昨天的My_string类中的所有能重载的运算符全部进行重载 、[] 、>、、>) 3> 仿照stack类实现my_stack,实现一个栈的操作 text.h #ifndef LIST_H #define LIST_H #include <iostream> #include <string.h>using namespace std;…