PX4着陆检测

2024-08-31 06:32
文章标签 检测 px4 着陆

本文主要是介绍PX4着陆检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么要着陆检测

对于开发一款飞控而言,起飞和落地的检测是必不可少的,甚至占有举足轻重的地位。比如,飞控内部起飞前控制器的一些初始化设置,落地及时自动加锁等功能都必须要基于这个功能,如果出现判定不准确或者误判的情况,会导致炸鸡的风险。在PX4的代码中着落检测和起飞检测写在了一起,判断函数为_get_landed_state(),如果飞机当前在地面上(还没有起飞或者已经着陆),则返回true,如果在空中则返回false。着陆检测的代码在Firmware\src\modules\land_detector中。下面将结合代码分析。

旋翼的着陆检测

旋翼的着陆检测主要根据解锁情况、油门、GPS的情况以及水平速度、垂直速度、旋转情况来判断。一下的代码摘自MulticopterLandDetector.cpp

	// Time base for this functionconst uint64_t now = hrt_absolute_time();float sys_min_throttle = (_params.maxThrottle + 0.01f);// Determine the system min throttle based on flight modeif (!_ctrl_mode.flag_control_altitude_enabled) {sys_min_throttle = (_params.minManThrottle + 0.01f);}// Check if thrust output is less than the minimum auto throttle param.bool minimalThrust = (_actuators.control[3] <= sys_min_throttle);if (minimalThrust && _min_trust_start == 0) {_min_trust_start = now;} else if (!minimalThrust) {_min_trust_start = 0;}

 首先根据当前的飞行模式,是手动模式还是姿态控制模式得到一个系统最小的油门值sys_min_throttle(maxThrottle和minManThrottle代表的是什么意思?)。然后判断当前油门是否小于这个系统最小的油门值,记录下符合条件的最早时间_min_trust_start,这个时间后面要用到。

	// only trigger flight conditions if we are armedif (!_arming.armed) {_arming_time = 0;return true;} else if (_arming_time == 0) {_arming_time = now;}

根据解锁状态来判断。如果还没有解锁,肯定在地面上,返回true,否则的话记录下解锁时间 ,这个值以后也要用到。

	// If in manual flight mode never report landed if the user has more than idle throttle// Check if user commands throttle and if so, report not landed based on// the user intent to take off (even if the system might physically still have// ground contact at this point).if (_manual.timestamp > 0 && _manual.z > 0.15f && _ctrl_mode.flag_control_manual_enabled) {return false;}

在手动模式下,如果油门值大于0.15(这个0.15是怎么来的?),则认定为在空中,返回false。如果有拉杆的动作,油门值超过0.15说明正要起飞了,或者已经在空中(反正不可能在地面上)。

	// Return status based on armed state and throttle if no position lock is available.if (_vehicleLocalPosition.timestamp == 0 ||hrt_elapsed_time(&_vehicleLocalPosition.timestamp) > 500000 ||!_vehicleLocalPosition.xy_valid ||!_vehicleLocalPosition.z_valid) {// The system has minimum trust set (manual or in failsafe)// if this persists for 8 seconds AND the drone is not// falling consider it to be landed. This should even sustain// quite acrobatic flight.if ((_min_trust_start > 0) &&(hrt_elapsed_time(&_min_trust_start) > 8 * 1000 * 1000)) {return true;} else {return false;}}

这里是根据GPS位置的一个判断。如果没有GPS的数据,或者丢失时间已经超过5秒了,执行下面的判断,如果距离_min_trust_start已经超过8秒,说明这8秒内的油门都是低于系统油门阈值的,认定为在地面上,否则认为在空中。

	float armThresholdFactor = 1.0f;// Widen acceptance thresholds for landed state right after arming// so that motor spool-up and other effects do not trigger false negatives.if (hrt_elapsed_time(&_arming_time) < LAND_DETECTOR_ARM_PHASE_TIME_US) {armThresholdFactor = 2.5f;}

这里设定一个 解锁的因子,如果距离解锁的时间在LAND_DETECTOR_ARM_PHASE_TIME_US的时间内,这个因子大一点,否则的话小一点。我猜这是因为在解锁到拉杆的这段时间内,着地检测的要求要严格一点,如果超过一定时间了,可以松一点,这样可以防止起飞的时候飞机在地面上移动带来的误判。

	// Check if we are moving vertically - this might see a spike after arming due to// throttle-up vibration. If accelerating fast the throttle thresholds will still give// an accurate in-air indication.bool verticalMovement = fabsf(_vehicleLocalPosition.vz) > _params.maxClimbRate * armThresholdFactor;// Check if we are moving horizontally.bool horizontalMovement = sqrtf(_vehicleLocalPosition.vx * _vehicleLocalPosition.vx+ _vehicleLocalPosition.vy * _vehicleLocalPosition.vy) > _params.maxVelocity;// Next look if all rotation angles are not moving.float maxRotationScaled = _params.maxRotation_rad_s * armThresholdFactor;bool rotating = (fabsf(_vehicleAttitude.rollspeed)  > maxRotationScaled) ||(fabsf(_vehicleAttitude.pitchspeed) > maxRotationScaled) ||(fabsf(_vehicleAttitude.yawspeed) > maxRotationScaled);if (verticalMovement || rotating || !minimalThrust || horizontalMovement) {// Sensed movement or thottle high, so reset the land detector.return false;}return true;

下面是根据上述因子计算得到的阈值。主要有水平方向的移动,垂直方向的移动(这个移动值得应该是速度) 以及旋转角速度的一个阈值。只要有一个超过阈值则认为是起飞状态,否则认定为着陆状态

固定翼的着陆检测

固定翼的着陆检测好像简单点,如果未解锁,返回true,已经在地面上,主要从水平面的速度_velocity_xy_filtered,爬升速度_velocity_z_filtered,空速计速度_airspeed_filtered,水平加速度大小_accel_horz_lp4个指标来判断。只有这4个指标同时小于参数的阈值才认定为除于陆地状态,否则认为起飞。

	// only trigger flight conditions if we are armedif (!_arming.armed) {return true;}bool landDetected = false;if (hrt_elapsed_time(&_controlState.timestamp) < 500 * 1000) {float val = 0.97f * _velocity_xy_filtered + 0.03f * sqrtf(_controlState.x_vel *_controlState.x_vel + _controlState.y_vel * _controlState.y_vel);if (PX4_ISFINITE(val)) {_velocity_xy_filtered = val;}val = 0.99f * _velocity_z_filtered + 0.01f * fabsf(_controlState.z_vel);if (PX4_ISFINITE(val)) {_velocity_z_filtered = val;}_airspeed_filtered = 0.95f * _airspeed_filtered + 0.05f * _airspeed.true_airspeed_m_s;// a leaking lowpass prevents biases from building up, but// gives a mostly correct response for short impulses_accel_horz_lp = _accel_horz_lp * 0.8f + _controlState.horz_acc_mag * 0.18f;// crude land detector for fixedwingif (_velocity_xy_filtered < _params.maxVelocity&& _velocity_z_filtered < _params.maxClimbRate&& _airspeed_filtered < _params.maxAirSpeed&& _accel_horz_lp < _params.maxIntVelocity) {landDetected = true;} else {landDetected = false;}} else {// Control state topic has timed out and we need to assume we're landed.landDetected = true;}return landDetected;
}

需要注意的是,这几个参数的计算都采用了一个低通滤波,但是0.97,0.95,0.99这种参数又是怎么来的呢? 同时这样的判断我觉得也存在一些缺陷,飞机在地面上起飞阶段和降落阶段的滑行会被认为是飞行状态而不是着陆状态,一定要飞机除于比较静止的状态才认为是着陆。

扑翼的着陆检测(设想)

扑翼的起飞是需要用手抛出的,着陆的时候也需要用手接。任何一个最基本的判断是解锁,如果未解锁肯定在陆地上。手抛起飞的检测可以参考固定翼的,不过可能参数要稍微修改下,扑翼的移动速度没有固定翼那么快。最难的部分是手接落地的检测,需要识别到那部分时间是人接住了这个飞机,认定为已经着陆,因为接住飞机之后通常都是发生移动,单纯使用速度和加速度来识别的话容易引起误判。这时可以加上油门的阈值判断,一般手接时候油门都会达到底来让飞机的翅膀不拍动。所以整理流程规划如下:

1、判断是否解锁,没有解锁认为在陆地上。

2、得到飞机的水平移动速度,爬升速度,以及z轴的加速度,只要超过阈值且油门大于一定阈值认定为起飞,否则的话认定为着陆(飞机在手上)

参考资料

https://www.sohu.com/a/135335731_466960

这篇关于PX4着陆检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123155

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

Android模拟器的检测

Android模拟器的检测 需求:最近有一个需求,要检测出模拟器,防止恶意刷流量刷注册。 1.基于特征属性来检测模拟器,比如IMSI,IDS,特殊文件等等。 这个方案局限性太大,貌似现在大部分模拟器默认就是修改了的,还不需要人为的去修改。 经过测试,发现如下图所示。 如果是模拟器的话,这些特殊值应该返回true,比如DeviceIDS,Build。可是居然返回了false,说明特殊值