ArduPilot开源飞控之AP_Relay

2023-10-21 11:20
文章标签 开源 ardupilot ap 飞控 relay

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

ArduPilot开源飞控之AP_Relay

  • 1. 源由
  • 2. 框架设计
    • 2.1 启动代码
    • 2.2 任务代码
      • 2.2.1 AP_Camera_Relay::update
      • 2.2.2 AP_Parachute::update
      • 2.2.3 MAVLink命令
  • 3. 重要例程
    • 3.1 AP_Relay::AP_Relay
    • 3.2 AP_Relay::init
    • 3.3 AP_Camera_Relay::update
    • 3.4 AP_Parachute::update
    • 3.5 AP_Parachute::arming_checks
    • 3.6 AP_Camera_Relay::trigger_pic
    • 3.7 AP_ServoRelayEvents::update_events
  • 4. 总结
  • 5. 参考资料

1. 源由

开关动作基本上都是Relay来完成的。

从工作原理上来说,就是控制GPIO的高低电平,触发后续机械动作,比如:伺服开关/相机拍照等。

2. 框架设计

2.1 启动代码

Copter::init_ardupilot└──> AP_Relay::init

2.2 任务代码

2.2.1 AP_Camera_Relay::update

SCHED_TASK_CLASS(AP_Camera,            &copter.camera,              update,          50,  75, 111)└──> AP_Camera::update└──> AP_Camera_Relay::update

2.2.2 AP_Parachute::update

FAST_TASK(update_land_and_crash_detectors),└──> Copter::update_land_and_crash_detectors└──> Copter::parachute_check└──> AP_Parachute::update

2.2.3 MAVLink命令

  • AP_Parachute::arming_checks
  • AP_Camera_Relay::trigger_pic
  • AP_ServoRelayEvents::update_events
SCHED_TASK_CLASS(GCS,                  (GCS*)&copter._gcs,          update_receive, 400, 180, 102)└──> GCS::update_receive└──> GCS_MAVLINK::update_receive└──> GCS_MAVLINK::packetReceived└──> GCS_MAVLINK_Copter::handleMessage└──> GCS_MAVLINK::handle_common_message├──> GCS_MAVLINK::handle_command_long│   └──> GCS_MAVLINK_Copter::handle_command_long_packet│       └──> GCS_MAVLINK::handle_command_long_packet│           ├──> GCS_MAVLINK::handle_command_run_prearm_checks│           │   └──> AP_Arming_Copter::pre_arm_checks│           │       └──> AP_Arming::pre_arm_checks│           │           └──> AP_Arming::system_checks│           │               └──> AP_Parachute::arming_checks│           └──> GCS_MAVLINK::handle_command_camera│               └──> AP_Camera::handle_command_long│                   └──> AP_Camera::take_picture│                       └──> AP_Camera_Backend::take_picture│                           └──> AP_Camera_Relay::trigger_pic└──> GCS_MAVLINK::handle_command_int└──> GCS_MAVLINK::handle_command_int_packet└──> GCS_MAVLINK::handle_servorelay_message├──> AP_ServoRelayEvents::do_repeat_servo│   └──> AP_ServoRelayEvents::update_events└──> AP_ServoRelayEvents::do_repeat_relay└──> AP_ServoRelayEvents::update_events

3. 重要例程

3.1 AP_Relay::AP_Relay

SITL和Linux板子有特殊默认引脚,其他板子默认没有pin脚定义。

AP_Relay::AP_Relay(void)├──> AP_Param::setup_object_defaults(this, var_info)├──> <CONFIG_HAL_BOARD == HAL_BOARD_SITL> <singleton != nullptr>│   └──> AP_HAL::panic("AP_Relay must be singleton")└──> singleton = this

3.2 AP_Relay::init

默认启动Relay IO配置为0输出,可通过RELAY_DEFAULT配置。

ValueMeaning
0off
1on
2no change
AP_Relay::init├──> <_default != 0 && _default != 1>│   └──> return└──> <for (uint8_t i=0 i<AP_RELAY_NUM_RELAYS i++)>└──> set(i, _default)

3.3 AP_Camera_Relay::update

// update - should be called at 50hz
AP_Camera_Relay::update││  /********************************************************************************│   * Trigger delay                                                                *│   ********************************************************************************/├──> <trigger_counter > 0>│   └──> trigger_counter--││  /********************************************************************************│   * On/Off                                                                       *│   ********************************************************************************/├──> < else >│   ├──> AP_Relay *ap_relay = AP::relay()│   ├──> <ap_relay == nullptr>│   │   └──> return│   ├──> <_params.relay_on>│   │   └──> ap_relay->off(0)│   └──> < else >│       └──> ap_relay->on(0)││  /********************************************************************************│   * call parent update                                                           *│   ********************************************************************************/└──> AP_Camera_Backend::update()

3.4 AP_Parachute::update

降落伞状态控制。

/// update - shuts off the trigger should be called at about 10hz
AP_Parachute::update││  /********************************************************************************│   * exit immediately if not enabled or parachute not to be released              *│   ********************************************************************************/├──> <_enabled <= 0>│   └──> return││   // calc time since release├──> uint32_t time_diff = AP_HAL::millis() - _release_time├──> uint32_t delay_ms = _delay_ms<=0 ? 0: (uint32_t)_delay_ms│├──> bool hold_forever = (_options.get() & uint32_t(Options::HoldOpen)) != 0││   // check if we should release parachute├──> <(_release_time != 0) && !_release_in_progress>│   │/********************************************************************************│   │ * release parachute                                                            *│   │ ********************************************************************************/│   ├──> <time_diff >= delay_ms>│   │   ├──> <_release_type == AP_PARACHUTE_TRIGGER_TYPE_SERVO> │   │   │   │   // PWM output│   │   │   └──> SRV_Channels::set_output_pwm(SRV_Channel::k_parachute_release, _servo_on_pwm)  // move servo│   │   └──> < else if (_release_type <= AP_PARACHUTE_TRIGGER_TYPE_RELAY_3)> <AP_RELAY_ENABLED>│   │       │   // High voltage output│   │       ├──> AP_Relay*_relay = AP::relay() // set relay│   │       └──> <_relay != nullptr> _relay->on(_release_type)│   ├──> _release_in_progress = true│   └──> _released = true└──> < else if ((_release_time == 0) || (!hold_forever && time_diff >= delay_ms + AP_PARACHUTE_RELEASE_DURATION_MS))>│/********************************************************************************│ * release parachute end                                                        *│ ********************************************************************************/├──> <_release_type == AP_PARACHUTE_TRIGGER_TYPE_SERVO>│   │   // PWM output│   └──> SRV_Channels::set_output_pwm(SRV_Channel::k_parachute_release, _servo_off_pwm) // move servo back to off position├──> < else if (_release_type <= AP_PARACHUTE_TRIGGER_TYPE_RELAY_3)> <AP_RELAY_ENABLED>│   │   // Low voltage output│   ├──> AP_Relay*_relay = AP::relay()  // set relay back to zero volts│   └──> <_relay != nullptr> _relay->off(_release_type)││   // reset released flag and release_time├──> _release_in_progress = false├──> _release_time = 0││   // update AP_Notify└──> AP_Notify::flags.parachute_release = 0

3.5 AP_Parachute::arming_checks

解锁降落山配置检查。

// check settings are valid
AP_Parachute::arming_checks├──> <_enabled > 0>│   │/********************************************************************************│   │ * Parachute Configuration Check                                                *│   │ ********************************************************************************/│   ├──> <_release_type == AP_PARACHUTE_TRIGGER_TYPE_SERVO) {│   │   └──> <!SRV_Channels::function_assigned(SRV_Channel::k_parachute_release)>│   │       ├──> hal.util->snprintf(buffer, buflen, "Chute has no channel")│   │       └──> return false│   ├──> < else >│   │   ├──> <AP_RELAY_ENABLED>│   │   │   ├──> AP_Relay*_relay = AP::relay()│   │   │   └──> <_relay == nullptr || !_relay->enabled(_release_type)>│   │   │       ├──> hal.util->snprintf(buffer, buflen, "Chute invalid relay %d", int(_release_type))│   │   │       └──> return false│   │   └──> <else>│   │       └──> hal.util->snprintf(buffer, buflen, "AP_Relay not available")│   └──> <_release_initiated>│       ├──> hal.util->snprintf(buffer, buflen, "Chute is released")│       └──> return false││  /********************************************************************************│   * No Parachute Configuration                                                   *│   ********************************************************************************/└──> return true

3.6 AP_Camera_Relay::trigger_pic

拍照控制。

// entry point to actually take a picture.  returns true on success
AP_Camera_Relay::trigger_pic│   // fail if have not completed previous picture├──> <trigger_counter > 0>│   └──> return false││  /********************************************************************************│   * On/Off                                                                       *│   ********************************************************************************/│   // exit immediately if no relay is setup├──> AP_Relay *ap_relay = AP::relay()├──> <ap_relay == nullptr>│   └──> return false├──> <_params.relay_on>│   └──> ap_relay->on(0)├──> < else >│   └──> ap_relay->off(0)││  /********************************************************************************│   * set counter to move servo to off position                                    *│   * after this many iterations of update (assumes 50hz update rate)              *│   ********************************************************************************/├──> trigger_counter = constrain_float(_params.trigger_duration * 50, 0, UINT16_MAX)└──> return true

3.7 AP_ServoRelayEvents::update_events

/*update state for MAV_CMD_DO_REPEAT_SERVO and MAV_CMD_DO_REPEAT_RELAY
*/
AP_ServoRelayEvents::update_events││  /********************************************************************************│   * repeat condition check                                                       *│   ********************************************************************************/├──> <repeat == 0 || (AP_HAL::millis() - start_time_ms) < delay_ms>│   └──> return│├──> start_time_ms = AP_HAL::millis()││  /********************************************************************************│   * EVENT_TYPE_SERVO                                                             *│   ********************************************************************************/├──> <case EVENT_TYPE_SERVO>│   ├──> SRV_Channel *c = SRV_Channels::srv_channel(channel-1)│   └──> <c != nullptr>│       ├──> <repeat & 1>│       │   └──> c->set_output_pwm(c->get_trim())│       └──> < else >│           ├──> c->set_output_pwm(servo_value)│           └──> c->ignore_small_rcin_changes()││  /********************************************************************************│   * EVENT_TYPE_RELAY                                                             *│   ********************************************************************************/├──> <case EVENT_TYPE_RELAY> <AP_RELAY_ENABLED>│   ├──> AP_Relay *relay = AP::relay()│   └──> <relay != nullptr>│       └──> relay->toggle(channel)││  /********************************************************************************│   * set counter to move servo to off position                                    *│   ********************************************************************************/├──> <repeat > 0>│   └──> repeat--└──> < else > // toggle bottom bit so servos flip in value└──> repeat ^= 1

4. 总结

Relay目前有以下几个应用场景:

  1. AP_Parachute
  2. AP_Camera_Relay
  3. AP_ServoRelayEvents

配置参数:

  • RELAY_ Parameters
  • BTN_ Parameters
  • ADSB_ Parameters
  • CHUTE_ Parameters
  • RC Parameters
  • SERVO Parameters

5. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计

这篇关于ArduPilot开源飞控之AP_Relay的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

开源Apache服务器安全防护技术精要及实战

Apache 服务简介   Web服务器也称为WWW服务器或HTTP服务器(HTTPServer),它是Internet上最常见也是使用最频繁的服务器之一,Web服务器能够为用户提供网页浏览、论坛访问等等服务。   由于用户在通过Web浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而Web在Internet上一推出就得到了爆炸性的发展。现在Web服务器已

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc