ArduPilot开源代码之FMU+IOMCU设计

news2024/9/24 9:19:43

ArduPilot开源代码之FMU+IOMCU设计

  • 1. 源由
  • 2. 设计概念
  • 3. FMU & IOMCU特点
    • 3.1 FMU(Flight Management Unit)的主要功能
    • 3.2 IOMCU(Input/Output Microcontroller Unit)的主要功能
    • 3.3 主要差异
  • 4. 主/辅助(MAIN/AUX) PWM输出
  • 5. 软件实现
    • 5.1 PWM编号规范
    • 5.2 FMU定义`IOMCU_UART`通信端口
    • 5.3 FMU提供IOMCU固件
    • 5.4 IOMCU配置
  • 6. 总结
    • FMU(Flight Management Unit)
    • IOMCU(Input/Output Microcontroller Unit)
  • 7. 参考资料

1. 源由

早期、高档的飞控常以FMU+IOMCU的方式存在,典型的就是Pixhawk系列,如下图所示:

在这里插入图片描述

2. 设计概念

使用 FMU(Flight Management Unit)+ IOMCU(Input/Output Microcontroller Unit) 方式设计飞控(飞行控制系统)有以下几个主要原因:

  1. 分离核心功能

    • FMU 负责飞行控制算法、姿态计算、导航等高层次的任务。
    • IOMCU 处理输入/输出任务,如接收来自遥控器的信号,驱动电机和舵机,确保与传感器及外围设备的实时通信。
  2. 提高系统的可靠性和安全性

    • 分离功能可以降低系统故障时的影响范围。例如,即使 IOMCU 出现问题,FMU 仍可以继续进行飞行控制,反之亦然。
    • 这种分层结构可以更好地隔离故障,增强系统的健壮性和安全性。
  3. 扩展性和灵活性

    • 采用 FMU+IOMCU 结构,可以更容易地添加新功能或升级现有功能,而无需完全更换整个系统。
    • 开发者可以根据不同应用需求,选择不同的 FMU 或 IOMCU 组件来满足特定要求。
  4. 减少开发复杂性

    • 通过将任务分配给不同的微控制器,可以简化每个组件的设计和开发。FMU 专注于算法和计算,IOMCU 处理具体的输入输出,降低了开发的复杂度。
  5. 提高性能

    • FMU 和 IOMCU 可同时处理各自任务,提高整个系统的运行效率和响应速度。这在需要实时处理大量数据的场景中尤为重要,如无人机飞行中的姿态调整和环境感知。
  6. 标准化和模块化

    • 这种结构有助于标准化飞控系统的设计,促进组件的模块化和互换性,使得不同厂商的组件能够更好地协同工作,推动整个行业的发展。

总的来说,FMU+IOMCU 方式的设计能够提高飞控系统的可靠性、灵活性和性能,同时降低开发复杂性,适用于多种飞行器应用场景。

3. FMU & IOMCU特点

FMU(Flight Management Unit)和IOMCU(Input/Output Microcontroller Unit)是无人机或其他飞行器的自动驾驶仪系统中常见的两个重要组件。它们各自承担不同的任务并协同工作,以实现飞行控制和数据处理功能。以下是它们的主要功能和差异:

3.1 FMU(Flight Management Unit)的主要功能

  1. 飞行控制算法:FMU负责运行主要的飞行控制算法,包括姿态控制、导航和路径规划等。这些算法通过处理传感器数据来调整飞行器的行为。

  2. 数据处理:FMU处理来自各种传感器的数据,如IMU(惯性测量单元)、GPS、气压计等,以确定飞行器的状态和位置。

  3. 系统监控和故障处理:FMU监控整个系统的健康状态,并在检测到故障时采取适当的措施来确保安全。

  4. 任务管理:FMU负责管理飞行任务,包括起飞、巡航、降落以及紧急情况处理。

3.2 IOMCU(Input/Output Microcontroller Unit)的主要功能

  1. 信号输入/输出管理:IOMCU主要负责管理各种输入和输出信号,包括控制信号的接收和执行,如舵机、传感器信号处理等。

  2. 硬件抽象层:IOMCU提供一个硬件抽象层,使得FMU可以通过标准化的接口与不同的传感器和执行器进行通信。

  3. 任务执行:IOMCU执行FMU下达的具体任务指令,如控制电机的转速、调整舵面等。

  4. 实时控制:由于IOMCU通常直接与物理硬件交互,因此它需要具备实时响应能力,以确保控制信号的及时处理和传递。

3.3 主要差异

  1. 功能层次:FMU主要处理高层次的飞行控制和数据处理,而IOMCU则负责低层次的信号处理和任务执行。

  2. 处理能力:FMU通常配备更强大的处理器,以运行复杂的飞行算法和数据分析。IOMCU则侧重于高效的实时信号处理。

  3. 冗余和可靠性:在某些系统中,FMU和IOMCU可能具有冗余设计,以提高系统的可靠性。FMU通常负责检测和应对故障,而IOMCU则确保关键任务在硬件层面被执行。

总的来说,FMU和IOMCU协同工作,共同完成飞行器的自动化控制和导航任务。FMU负责高层策略和决策,而IOMCU则执行具体的操作指令和实时控制任务。

4. 主/辅助(MAIN/AUX) PWM输出

关于主输出和辅助输出在飞控系统配置方面,为了便于兼容FMU only和FMU+IOMCU两种硬件架构,在配置PWM编号时,规则如下:

  1. 主输出(PWM1-PWM8):
    这些是默认的输出,通常保留用于多旋翼或固定翼应用中的主要电机控制。这种配置与历史上的IOMCU(输入/输出微控制器单元)兼容性一致,确保核心飞行控制功能在不同硬件之间保持稳定和一致。

  2. 辅助输出(PWM9及以上):
    辅助输出用于额外功能,如相机触发器、起落架、舵机和其他非关键组件。使用PWM9及以上可以扩展控制能力,而不会干扰主电机输出。

  3. FMU PWM端口编号:
    尽管在使用上有所区分,FMU中的PWM端口编号通常仍从PWM1开始,以保持配置和编程的一致性和简化性。这使用户能够轻松地将所需的功能映射到正确的输出,而无需重新定义PWM分配的起点。

注:另外要注意一点就是,AUX端口是可以用于GPIO配置,而MAIN端口仅支持PWM配置。

5. 软件实现

在上述硬件架构设计下,开发者和用户可以保持清晰有序的方法来配置他们的飞行控制系统,确保正确管理和控制主和辅助功能。

处理这种默认MAIN 8 ports设计时,通过IOMCU代码上的兼容性设计,其采用了配置+hard coded代码方式完成。

5.1 PWM编号规范

libraries/AP_HAL_ChibiOS/RCOutput.cpp#L726-L735RCOutput::write中过滤MAIN(IOMCU) outputs,映射AUX(FMU) outputs到PWM9及以上编号:

    if (chan < chan_offset) {
        return;
    }

    if (safety_state == AP_HAL::Util::SAFETY_DISARMED && !(safety_mask & (1U<<chan))) {
        // implement safety pwm value
        period_us = 0;
    }

    chan -= chan_offset;

libraries/AP_HAL_ChibiOS/RCOutput.cpp#L100-L109RCOutput::init中初始化8个默认PWM端口:

#if HAL_WITH_IO_MCU
    if (AP_BoardConfig::io_enabled()) {
        // with IOMCU the local (FMU) channels start at 8
        chan_offset = 8;
        iomcu_enabled = true;
    }
    if (AP_BoardConfig::io_dshot()) {
        iomcu_dshot = true;
    }
#endif

5.2 FMU定义IOMCU_UART通信端口

libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef.dat#L80

IOMCU_UART USART6

libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py#L1854-L1869

        if 'IOMCU_UART' in self.config:
            if 'io_firmware.bin' not in self.romfs:
                self.error("Need io_firmware.bin in ROMFS for IOMCU")

            self.write_defaulting_define(f, 'HAL_WITH_IO_MCU', 1)
            f.write('#define HAL_UART_IOMCU_IDX %u\n' % len(serial_list))
            f.write(
                '#define HAL_UART_IO_DRIVER ChibiOS::UARTDriver uart_io(HAL_UART_IOMCU_IDX)\n'
            )
            serial_list.append(self.config['IOMCU_UART'][0])
            f.write('#define HAL_HAVE_SERVO_VOLTAGE 1\n') # make the assumption that IO gurantees servo monitoring
            # all IOMCU capable boards have SBUS out
            f.write('#define AP_FEATURE_SBUS_OUT 1\n')
        else:
            f.write('#define HAL_WITH_IO_MCU 0\n')
        f.write('\n')

5.3 FMU提供IOMCU固件

libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef.dat#L258-L261

ROMFS io_firmware.bin Tools/IO_Firmware/iofirmware_f103_lowpolh.bin
# enable support for dshot on iomcu
ROMFS io_firmware_dshot.bin Tools/IO_Firmware/iofirmware_f103_dshot_lowpolh.bin
define HAL_WITH_IO_MCU_BIDIR_DSHOT 1

注:其中有两个宏定义需要根据情况考虑:HAL_WITH_IO_MCU_DSHOTHAL_WITH_IO_MCU_BIDIR_DSHOT

5.4 IOMCU配置

  • 【PWM】STM32F103xB
  • 【dshot】STM32F103xB

6. 总结

  • 功能分工:FMU负责高层次的决策和算法处理,而IOMCU负责低层次的信号处理和实时任务执行。
  • 协同工作:FMU和IOMCU协同工作,FMU负责计划和策略,IOMCU执行具体任务,确保系统的整体效率和稳定性。
  • 系统可靠性:两者的协同不仅提升了系统的灵活性和可扩展性,还提高了系统的可靠性,通过冗余设计可以进一步增强故障处理能力。

FMU(飞行管理单元)和IOMCU(输入/输出微控制器单元)在飞行控制系统中共同扮演重要角色,它们的协同工作确保了飞行器的稳定和高效运行。总体而言,FMU和IOMCU的组合提供了一个高效、可靠的飞行控制系统框架,使飞行器能够在复杂的环境中自主导航和执行任务。

FMU(Flight Management Unit)

  • 核心功能:运行飞行控制算法、处理传感器数据、导航和任务管理。
  • 高级决策:负责高层策略制定,包括姿态控制、航向规划和系统监控。
  • 数据处理能力:具备强大的处理能力,用于分析飞行数据,优化飞行路径。
  • 安全与监控:监控系统健康状态,并对故障和异常情况进行处理。

IOMCU(Input/Output Microcontroller Unit)

  • 信号管理:管理输入/输出信号,负责硬件层面的信号处理和执行。
  • 硬件接口:提供硬件抽象层,确保FMU可以通过统一的接口与各种传感器和执行器通信。
  • 实时控制:具备实时响应能力,确保控制信号能够及时、准确地传递和执行。
  • 任务执行:根据FMU的指令,执行具体的操作任务,如控制电机速度和舵面调整。

基于一些资料,相信不就得将来,很快会有更为可靠的系统方案,确保飞行的高效和可靠。

相关信息供参考:

  • FMU + IOMCU PWM ports.
  • Boost Your Drone’s IQ with Dual Autopilot Systems Using ArduPilot

7. 参考资料

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

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

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

相关文章

【北京仁爱堂】痉挛性斜颈的早期症状,你了解吗?

在日常生活中&#xff0c;您可能很少听到“痉挛性斜颈”这个名词&#xff0c;但它却是一种不容忽视的疾病。今天&#xff0c;就让我们一起来了解一下痉挛性斜颈的早期症状&#xff0c;以便能够及时发现并采取相应的措施。 痉挛性斜颈是一种局限性肌张力障碍疾病&#xff0c;主要…

Gitlab搭建服务器好做吗 Gitlab搭建服务器操作指南

GitLab是一个强大的开源代码托管和CI/CD工具&#xff0c;广泛用于软件开发的版本控制和自动化构建。对于许多公司和开发团队来说&#xff0c;自行搭建GitLab服务器是一个既具挑战性又有很多好处的选择。本文将详细讨论搭建GitLab服务器的难易程度&#xff0c;提供一份详尽的操作…

死信队列.

“死信”是指在RabbitMQ中那些因为某些原因无法被正常处理的消息。

OpenCV图像滤波(11)中值滤波medianBlur函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 该函数使用中值滤波器对图像进行模糊处理。 该函数采用 ksizeksize 的窗口尺寸对图像进行平滑处理。对于多通道图像&#xff0c;每个通道将被独…

Linux发行版深度对比:Ubuntu、CentOS与Fedora

在Linux的广阔世界中&#xff0c;Ubuntu、CentOS和Fedora作为三大主流发行版&#xff0c;各自拥有独特的生态系统、用户基础和开发理念。它们不仅在技术架构上有着显著的差异&#xff0c;更在用户体验、社区支持、软件更新策略以及安全性能等方面展现出各自的特色。本文将对这三…

红黑树R-B Tree

文章目录 概述红黑树的特性红黑树的原理应用为什么设计红黑树红黑树左旋与右旋的区别 概述 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉查找树&#xff0c;在计算机科学中广泛使用&#xff0c;其典型的用途是实现关联数组。R-B Tree&#xff0c;全称是 R…

[C++][opencv]基于opencv实现photoshop算法亮度和对比度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 #include <iostream> #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp"using namespace std; using namespace cv;#defi…

【区块链+食品安全】食药产业全流程可追溯平台 | FISCO BCOS应用案例

为响应国家强化食品安全追溯监管的号召&#xff0c;吉科软信息技术有限公司基于 FISCO BCOS 联盟链开源技术&#xff0c;推出了 食药产业全流程可追溯平台&#xff0c;并应用于吉林省白山市。该平台建立了从食药产品种养殖、生产加工、冷链运输、 流通到消费的全链条可追溯体系…

掌握Python eval()函数:解析动态代码执行的神奇之处

eval() 是 Python 提供的一个内置函数&#xff0c;用于动态执行字符串形式的表达式。 虽然它功能强大&#xff0c;但同时也伴随着一定的风险和局限性。在本文中&#xff0c;我们将详细介绍 eval() 的用法、注意事项以及一些常见的应用场景。 一、eval() 函数的基本用法 基本语…

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…

Supervision 计算机视觉工具

简介 Supervision库是Python计算机视觉低代码工具&#xff0c;旨在为用户提供便捷高效的接口&#xff0c;以便处理数据集并直观地展示检测结果。绘制检测结果&#xff0c;统计指定区域内检测目标数量Supervision都提供了相应的接口 安装库 要求Python版本>3.8 1.安装无图像…

【机器学习】反向传播算法的直观解释、微积分原理以及反向传播中的链式法则

引言 正如有句话说的好&#xff0c;neurons-that-fire-together-wire-together&#xff08;一同激活的神经元关联在一起&#xff09; 文章目录 引言一、反向传播算法的直观解释1.1 前向传播1.2 计算误差1.3 反向传播误差1.4 更新权重 二、微积分原理2.1 损失函数 L L L2.2 链式…

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理&#xff1a;添加以下http响应头2.3. 四种跨域实现方式及优先级&#xff08;从高到低&#xff09; 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…

数字孪生模型制作教程虚拟现实城市模型制作3dmax数字城市glb/gltf

需要做数字孪生可以QQ可以联系这里&#xff0c;谢谢 下面开始教程 1打开3dmax软件&#xff0c;和需要做的建筑图片 2 在3dmax安图片先建一个长方体框架 3先给长方体贴一个墙体贴图 4在ps做贴图 5 做好贴图贴到3dmax中 6 然后ps再做下一张贴图 7 做好贴图贴到3dma…

[Redis] Redisson分布式锁原理及源码分析

目录 基于 Redis 的分布式锁 Redisson实现分布 Redisson分布式锁原理图 RedissonLock实现分布式锁源码分析 RedissonLock构造方法 lock()加锁 获取锁 锁续命逻辑 tryLockInnerAsync加锁lua脚本分析 unlock()解锁 基于 Redis 的分布式锁 实现方式: 使用 Redis 的 SE…

Idea2023.3版本创建spring Initializr没有JDK8

解决方法&#xff1a; https://start.aliyun.com

SOMEIP_ETS_037:echoUINT8RELIABLE_client_closes_TCP_connection_automatically

测试目的&#xff1a; 验证当所有服务停止时&#xff0c;DUT不会关闭TCP连接。 描述 本测试用例旨在检验DUT在停止所有服务时&#xff0c;是否能够保持TCP连接的活跃状态&#xff0c;而不发送FIN,ACK以关闭连接。 测试拓扑&#xff1a; 具体步骤&#xff1a; TESTER&#…

STM32学习笔记3 ---中断,定时器

目录 EXTI外部中断 NVIC嵌套中断向量控制器 EXTI外部中断 AFIO 旋转编码器 定时器TIM TIM定时中断 ​编辑​编辑 ​编辑 TIM输出比较&#xff08;OC&#xff09; 引脚重映射 舵机 直流电机 TIM输入捕获&#xff08;IC&#xff09; ​编辑 TIM编码器接口 附&#…

漏洞挖掘 | 某系统webpack接口泄露引发的一系列漏洞

信息搜集 这里找到从小穿一条裤子长大的兄弟&#xff0c;要挟他交出来他的统一账号&#xff0c;否则把小时候的照片挂网上&#xff0c;开始某大学的资产搜集&#xff0c;直接hunter搜索此大学域名 看有价值的站点&#xff0c;ok找到下面的站点 未授权敏感信息泄露越权任意用…

力扣高频SQL 50题(基础版)第四十二题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…