ArduPilot开源代码之FMU+IOMCU设计

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配置

6. 总结

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

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

FMU(Flight Management Unit)

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

IOMCU(Input/Output Microcontroller Unit)

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

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

相关信息供参考:

7. 参考资料

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

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值