ArduPilot开源飞控之do_failsafe_action

news/2024/11/18 12:44:08/

ArduPilot开源飞控之do_failsafe_action

  • 1. 源由
  • 2. 触发
    • 2.1 初始化RC链路检测
    • 2.2 定时RC链路检测
    • 2.3 电池阈值检测
    • 2.4 HOME位置设置异常
    • 2.5 GCS链路 & DeadReckon检查
    • 2.6 MAVLink指令 (GCS/CompanionComputer)
    • 2.7 强制手动解锁电池检查
    • 2.8 自动导航任务电池检查
    • 2.9 ToyMode
  • 3. 流程
    • 3.1 set_mode_land_with_pause
    • 3.2 set_mode_RTL_or_land_with_pause
    • 3.3 set_mode_SmartRTL_or_RTL
    • 3.4 set_mode_SmartRTL_or_land_with_pause
    • 3.5 set_mode_auto_do_land_start_or_RTL
    • 3.6 set_mode_brake_or_land_with_pause
  • 4. 总结
    • 4.1 代码触发入口
    • 4.2 `FAILSAFE`策略
  • 5. 参考资料

1. 源由

之前在ArduPilot飞控之FAILSAFE机制中,针对Ardupilot的FAILSAFE机制进行了相对完整的介绍。

本章节将从代码的角度来看FAILSAFE策略。

2. 触发

Copter::do_failsafe_action的入口实际在程序中非常多,因此,实际场景非常复杂。这里将从代码角度进行分门别类。

2.1 初始化RC链路检测

系统上电初始化时,对飞控RC信号以及ESC通信进行检查,设置对应的FAILSAFE状态。

Copter::init_ardupilot└──> Copter::esc_calibration_startup_check├──> [delay up to 2 second for first radio input]│   └──> Copter::read_radio/Copter::set_throttle_and_failsafe│       └──> Copter::set_failsafe_radio│           └──> Copter::failsafe_radio_on_event│               └──> Copter::do_failsafe_action└──> <ESCCalibrationModes::ESCCAL_PASSTHROUGH_ALWAYS> └──> Copter::esc_calibration_passthrough└──> Copter::read_radio/Copter::set_throttle_and_failsafe└──> Copter::set_failsafe_radio└──> Copter::failsafe_radio_on_event└──> Copter::do_failsafe_action

2.2 定时RC链路检测

定时250Hz频率进行RC链路的轮询检查,如果出现链路通信问题,则触发FAILSAFE策略。

Copter::rc_loop  // 250Hz task└──> Copter::read_radio/Copter::set_throttle_and_failsafe└──> Copter::set_failsafe_radio└──> Copter::failsafe_radio_on_event└──> Copter::do_failsafe_action

2.3 电池阈值检测

定时10Hz频率进行电池的轮询检查,如果出现电池阈值超限,则触发FAILSAFE策略。

Copter::update_batt_compass  // 10Hz task└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_action

2.4 HOME位置设置异常

EKF设置HOME位置时,对电池进行阈值检查,如果出现电池阈值超限,则触发FAILSAFE策略。

Copter::update_home_from_EKF  // FAST_TASK└──> Copter::set_home_to_current_location└──> Copter::mavlink_compassmot└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_action

2.5 GCS链路 & DeadReckon检查

GCS通信链路异常 或者出现DeadReckon异常,则触发FAILSAFE策略。

Copter::three_hz_loop  // 3.3Hz task├──> Copter::failsafe_gcs_check│   └──> Copter::failsafe_gcs_on_event│       └──> Copter::do_failsafe_action└──> Copter::failsafe_deadreckon_check└──> Copter::do_failsafe_action

2.6 MAVLink指令 (GCS/CompanionComputer)

通过MAVLink指令设置HOME位置/起飞前检查指令,检测电池阈值、油门阈值、RC链路,触发FAILSAFE策略。

GCS::update_receive  // 400Hz task└──> GCS_MAVLINK::update_receive└──> GCS_MAVLINK_Copter::packetReceived└──> GCS_MAVLINK_Copter::handleMessage└──> GCS_MAVLINK::handle_common_message├──> <> GCS_MAVLINK::handle_command_int│   └──> GCS_MAVLINK_Copter::handle_command_int_packet│       └──> GCS_MAVLINK::handle_command_int_packet│           └──> GCS_MAVLINK::handle_command_int_do_set_home│               └──> GCS_MAVLINK_Copter::set_home_to_current_location│                   └──> Copter::set_home_to_current_location│                       └──> Copter::mavlink_compassmot│                           └──> AP_BattMonitor::read│                               └──> AP_BattMonitor::check_failsafes│                                   └──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn│                                       └──> Copter::do_failsafe_action└──> <> GCS_MAVLINK::handle_command_long├──> GCS_MAVLINK_Copter::handle_command_long_packet│   └──> GCS_MAVLINK::handle_command_long_packet│       ├──> <> GCS_MAVLINK::handle_command_do_set_home│       │   └──> GCS_MAVLINK_Copter::set_home_to_current_location│       │       └──> Copter::set_home_to_current_location│       │           └──> Copter::mavlink_compassmot│       │               └──> AP_BattMonitor::read│       │                   └──> AP_BattMonitor::check_failsafes│       │                       └──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn│       │                           └──> Copter::do_failsafe_action│       └──> <> GCS_MAVLINK::handle_command_component_arm_disarm│           └──> AP_Arming_Copter::arm│               └──> Copter::set_home_to_current_location│                   └──> Copter::mavlink_compassmot│                       └──> AP_BattMonitor::read│                           └──> AP_BattMonitor::check_failsafes│                               └──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn│                                   └──> Copter::do_failsafe_action└──> <> GCS_MAVLINK::handle_command_preflight_calibration└──> GCS_MAVLINK::_handle_command_preflight_calibration└──> GCS_MAVLINK_Copter::_handle_command_preflight_calibration└──> Copter::mavlink_compassmot├──> <> AP_BattMonitor::read│   └──> AP_BattMonitor::check_failsafes│       └──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn│           └──> Copter::do_failsafe_action└──> <> Copter::read_radio/Copter::set_throttle_and_failsafe└──> Copter::set_failsafe_radio└──> Copter::failsafe_radio_on_event└──> Copter::do_failsafe_actionAP_Vehicle::setup└──> GCS::setup_console└──> GCS::create_gcs_mavlink_backend└──> GCS::new_gcs_mavlink_backend└──> GCS_Copter::new_gcs_mavlink_backend└──> GCS_MAVLINK_Copter

注:MAVLink链路在setup时建立。

2.7 强制手动解锁电池检查

强制手动解锁电机前,检查电池阈值,超限则触发FAILSAFE策略。

Copter::arm_motors_check  // 10Hz task└──> <yaw right for ARM_DELAY> AP_Arming_Copter::arm└──> Copter::set_home_to_current_location└──> Copter::mavlink_compassmot└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_action

2.8 自动导航任务电池检查

自动导航任务执行时,每次执行任务命令时,对电池阈值进行检测,超限则触发FAILSAFE策略。

AP_Mission::resume└──> AP_Mission::start_command└──> ModeAuto::start_command/_cmd_start_fn└──> ModeAuto::do_set_home└──> Copter::set_home_to_current_location└──> Copter::mavlink_compassmot└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_actionAP_Mission::start/AP_Mission::update/AP_Mission::set_current_cmd└──> AP_Mission::advance_current_nav_cmd└──> AP_Mission::start_command└──> ModeAuto::start_command/_cmd_start_fn└──> ModeAuto::do_set_home└──> Copter::set_home_to_current_location└──> Copter::mavlink_compassmot└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_actionCopter::update_flight_mode // FAST_TASK└──> ModeAuto::run└──> AP_Mission::update└──> AP_Mission::advance_current_do_cmd└──> AP_Mission::start_command└──> ModeAuto::start_command/_cmd_start_fn└──> ModeAuto::do_set_home└──> Copter::set_home_to_current_location└──> Copter::mavlink_compassmot└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_action

注:关于AP_Mission将在另一个章节再做描述。

2.9 ToyMode

只有使能TOY_MODE_ENABLED时,ToyMode才会被被启用。这里仅仅提供一个入口位置。

ToyMode::update  // TOY_MODE_ENABLED  10Hz├──> <ACTION_ARM_LAND_RTL> ToyMode::action_arm│   └──> AP_Arming_Copter::arm│       └──> Copter::set_home_to_current_location│           └──> Copter::mavlink_compassmot│               └──> AP_BattMonitor::read│                   └──> AP_BattMonitor::check_failsafes│                       └──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn│                           └──> Copter::do_failsafe_action││││└──> <ENABLE_LOAD_TEST> AP_Arming_Copter::arm└──> Copter::set_home_to_current_location└──> Copter::mavlink_compassmot└──> AP_BattMonitor::read└──> AP_BattMonitor::check_failsafes└──> Copter::handle_battery_failsafe/_battery_failsafe_handler_fn└──> Copter::do_failsafe_action

3. 流程

do_failsafe_action被触发后,其内部流程主要有以下几个:

Copter::do_failsafe_action├──> 【1】<FailsafeAction::NONE> return├──> 【2】<FailsafeAction::LAND> set_mode_land_with_pause├──> 【3】<FailsafeAction::RTL>  set_mode_RTL_or_land_with_pause├──> 【4】<FailsafeAction::SMARTRTL> set_mode_SmartRTL_or_RTL├──> 【5】<FailsafeAction::SMARTRTL_LAND> set_mode_SmartRTL_or_land_with_pause├──> 【6】<FailsafeAction::TERMINATE>│   ├──> <ADVANCED_FAILSAFE == ENABLED> g2.afs.gcs_terminate(true, "Failsafe")│   └──> <else> arming.disarm(AP_Arming::Method::FAILSAFE_ACTION_TERMINATE)├──> 【7】<FailsafeAction::AUTO_DO_LAND_START> set_mode_auto_do_land_start_or_RTL├──> 【8】<FailsafeAction::BRAKE_LAND> set_mode_brake_or_land_with_pause└──> 【9】<AP_GRIPPER_ENABLED> <failsafe_option(FailsafeOption::RELEASE_GRIPPER)>└──> copter.g2.gripper.release()enum class FailsafeAction : uint8_t {NONE               = 0,LAND               = 1,RTL                = 2,SMARTRTL           = 3,SMARTRTL_LAND      = 4,TERMINATE          = 5,AUTO_DO_LAND_START = 6,BRAKE_LAND         = 7};

注:NONE:表示不作出任何响应; TERMINATE:直接上锁电机停转。

3.1 set_mode_land_with_pause

  1. sets mode to LAND
  2. triggers 4 second delay before descent starts
  3. descent aircraft
  4. land detected
  5. disarm
// set_mode_land_with_pause - sets mode to LAND and triggers 4 second delay before descent starts
//  this is always called from a failsafe so we trigger notification to pilot
void Copter::set_mode_land_with_pause(ModeReason reason)
{set_mode(Mode::Number::LAND, reason);mode_land.set_land_pause(true);// alert pilot to mode changeAP_Notify::events.failsafe_mode_change = 1;
}

3.2 set_mode_RTL_or_land_with_pause

  1. sets mode to RTL if possible
  2. or LAND triggers 4 second delay before descent starts
// set_mode_RTL_or_land_with_pause - sets mode to RTL if possible or LAND with 4 second delay before descent starts
//  this is always called from a failsafe so we trigger notification to pilot
void Copter::set_mode_RTL_or_land_with_pause(ModeReason reason)
{// attempt to switch to RTL, if this fails then switch to Landif (!set_mode(Mode::Number::RTL, reason)) {// set mode to land will trigger mode change notification to pilotset_mode_land_with_pause(reason);} else {// alert pilot to mode changeAP_Notify::events.failsafe_mode_change = 1;}
}

3.3 set_mode_SmartRTL_or_RTL

  1. sets mode to SMART_RTL if possible
  2. or RTL if possible
  3. or LANDtriggers 4 second delay before descent starts
// set_mode_SmartRTL_or_RTL - sets mode to SMART_RTL if possible or RTL if possible or LAND with 4 second delay before descent starts
// this is always called from a failsafe so we trigger notification to pilot
void Copter::set_mode_SmartRTL_or_RTL(ModeReason reason)
{// attempt to switch to SmartRTL, if this failed then attempt to RTL// if that fails, then landif (!set_mode(Mode::Number::SMART_RTL, reason)) {gcs().send_text(MAV_SEVERITY_WARNING, "SmartRTL Unavailable, Trying RTL Mode");set_mode_RTL_or_land_with_pause(reason);} else {AP_Notify::events.failsafe_mode_change = 1;}
}

3.4 set_mode_SmartRTL_or_land_with_pause

  1. sets mode to SMART_RTL if possible
  2. or LAND with 4 second delay before descent starts
// set_mode_SmartRTL_or_land_with_pause - sets mode to SMART_RTL if possible or LAND with 4 second delay before descent starts
// this is always called from a failsafe so we trigger notification to pilot
void Copter::set_mode_SmartRTL_or_land_with_pause(ModeReason reason)
{// attempt to switch to SMART_RTL, if this failed then switch to Landif (!set_mode(Mode::Number::SMART_RTL, reason)) {gcs().send_text(MAV_SEVERITY_WARNING, "SmartRTL Unavailable, Using Land Mode");set_mode_land_with_pause(reason);} else {AP_Notify::events.failsafe_mode_change = 1;}
}

3.5 set_mode_auto_do_land_start_or_RTL

  1. Sets mode to Auto and jumps to DO_LAND_START

This can come from failsafe or RC option

// Sets mode to Auto and jumps to DO_LAND_START, as set with AUTO_RTL param
// This can come from failsafe or RC option
void Copter::set_mode_auto_do_land_start_or_RTL(ModeReason reason)
{
#if MODE_AUTO_ENABLED == ENABLEDif (set_mode(Mode::Number::AUTO_RTL, reason)) {AP_Notify::events.failsafe_mode_change = 1;return;}
#endifgcs().send_text(MAV_SEVERITY_WARNING, "Trying RTL Mode");set_mode_RTL_or_land_with_pause(reason);
}

3.6 set_mode_brake_or_land_with_pause

  1. Sets mode to Brake
  2. or LAND with 4 second delay before descent starts
// Sets mode to Brake or LAND with 4 second delay before descent starts
// This can come from failsafe or RC option
void Copter::set_mode_brake_or_land_with_pause(ModeReason reason)
{
#if MODE_BRAKE_ENABLED == ENABLEDif (set_mode(Mode::Number::BRAKE, reason)) {AP_Notify::events.failsafe_mode_change = 1;return;}
#endifgcs().send_text(MAV_SEVERITY_WARNING, "Trying Land Mode");set_mode_land_with_pause(reason);
}

4. 总结

do_failsafe_action大体上有以下代码触发入口,以及对应的应对策略。

4.1 代码触发入口

  • 1 初始化RC链路检测
  • 2 定时RC链路检测
  • 3 电池阈值检测
  • 4 HOME位置设置异常
  • 5 GCS链路 & DeadReckon检查
  • 6 MAVLink指令 (GCS/CompanionComputer)
  • 7 强制手动解锁电池检查
  • 8 自动导航任务电池检查
  • 9 ToyMode

4.2 FAILSAFE策略

  • 1 NONE
  • 2 LAND
  • 3 RTL
  • 4 SMARTRTL
  • 5 SMARTRTL_LAND
  • 6 TERMINATE
  • 7 AUTO_DO_LAND_START
  • 8 BRAKE_LAND
  • 9 GRIPPER_RELEASE

5. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot飞控之FAILSAFE机制
【3】ArduPilot之开源代码Task介绍
【4】ArduPilot飞控启动&运行过程简介


http://www.ppmy.cn/news/1041491.html

相关文章

大气环流形成

气循环模型 地平线上太阳的倾角不同&#xff0c;云的分布也并不均匀&#xff0c;故不同地区的情况相差较大。这就导致了如图1.4所示的赤道和热带区域的最大隔热(TM)和极地区域的最小隔热 (AM)。随之&#xff0c;极地地区的压力最大(极地高压), 接近赤道地区的压力最小 (赤道低…

关于vue中v-for绑定数据重新渲染的问题

我修改被v-for绑定的数据&#xff0c;发现居然不能重新渲染。 查找后得知一下方法: $set 是 Vue 提供的一个全局方法&#xff0c;用于向响应式对象中添加或更新属性&#xff0c;并触发视图更新。它接受三个参数&#xff1a;对象、要添加/更新的属性名或索引&#xff0c;以及新…

【Ubuntu】从Graylog到Grafana Loki:构建更强大的网络设备管理和监控系统

在将Graylog部署到生产环境时&#xff0c;我们遇到了一些问题&#xff0c;其中最主要的是无法安装MongoDB并且无法随时重启机器去修改BIOS设置来修复问题 【WARNING: MongoDB 5.0 requires a CPU with AVX support, and your current system does not appear to have that! 】。…

【傅里叶级数与傅里叶变换】数学推导——2、[Part2:T = 2 π的周期函数的傅里叶级数展开] 及 [Part3:周期为2L的函数展开]

文章内容来自DR_CAN关于傅里叶变换的视频&#xff0c;本篇文章提供了一些基础知识点&#xff0c;比如三角函数常用的导数、三角函数换算公式等。 文章全部链接&#xff1a; 基础知识点 Part1&#xff1a;三角函数系的正交性 Part2&#xff1a;T2π的周期函数的傅里叶级数展开 P…

常见的 JavaScript 框架比较

以下是10种常见的JavaScript框架的比较&#xff1a; React&#xff1a;是由Facebook开发和维护的开源JavaScript库&#xff0c;用于构建用户界面。它允许你使用组件来构建复杂的UI&#xff0c;并专注于每个组件的内部逻辑&#xff0c;而不必担心管理整个应用程序的状态。WebBu…

ISP(Internet Service Provider)

ISP 是互联网服务提供商&#xff08;Internet Service Provider&#xff09;的缩写&#xff0c;它指的是为个人、家庭或企业提供上网连接和其他网络服务的公司或组织。ISP 是连接用户与全球互联网的桥梁&#xff0c;它提供了各种类型的网络服务&#xff0c;包括宽带、移动网络、…

mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ

省流&#xff1a; 十几年前&#xff0c;淘宝的notify&#xff0c;借鉴ActiveMQ。京东的ActiveMQ集群几百台&#xff0c;后面改成JMQ。 Linkedin的kafka&#xff0c;因为是scala&#xff0c;国内很多人不熟。淘宝的人把kafka用java写了一遍&#xff0c;取名metaq&#xff0c;后…

Docker入门——实战图像分类

一、背景 思考&#xff1a; 在一个项目的部署阶段&#xff0c;往往需要部署到云服务器或者是终端设备上&#xff0c;而环境的搭建往往是最费时间和精力的&#xff0c;特别是需要保证运行环境一致性&#xff0c;有什么办法可以批量部署相同环境呢&#xff1f; Docker本质——…