Integrating resource-constrained microcontrollers into ROS 2 using micro-ROS often introduces significant friction in real-world robotics hardware. Embedded developers frequently encounter serial buffer saturation at publication rates above 500 Hz, fragile client-agent sessions that fail to recover after physical link disconnections, and cumbersome build pipelines where adding a custom message requires recompiling the static client library inside a Docker container.
Bloom is an open-source C middleware designed to provide a minimal, modular alternative. By decoupling the top-level application API from the underlying protocol and physical transport, Bloom allows developers to implement ROS 2 communication over UART, CAN, or UDP with minimal memory overhead and deterministic execution on microcontrollers such as STM32, ESP32, and RP2040.
Core Deliverables
Automated Connection State Machine
Built-in connection lifecycle management that monitors session health, detects physical link failures, and handles reconnection automatically without blocking client execution loops.
Deterministic Error Reporting
Granular return codes and runtime diagnostics that distinguish between physical transport timeouts, session disconnections, and memory allocation issues, helping prevent silent failures and hardware faults.
Streamlined Message Definitions
A lightweight serialization layer that allows developers to add or modify custom message schemas without rebuilding the entire middleware toolchain.
POSIX-Independent C Implementation
A clean C11 core that eliminates dependencies on POSIX headers, such as sched.h and clock_gettime, allowing straightforward integration into PlatformIO, ESP-IDF, and bare-metal environments.
Portable Hardware Abstraction
A minimal transport interface based on function pointers, including init, read, write, and close, making it straightforward to port Bloom to different microcontroller peripherals.
Centralized Configuration
A single, readable configuration header for defining topic IDs, buffer capacities, and transport parameters with minimal boilerplate code.
Native ROS 2 Workspace Build
Direct compatibility with standard ROS 2 workspaces through conventional CMake and package.xml build workflows.
Low-Overhead Framing and Verification
Implementation of Consistent Overhead Byte Stuffing (COBS) and table-driven CRC-16 checks to reduce the variable byte-stuffing overhead associated with HDLC during high-frequency sensor streaming.
Configurable Buffer Allocation
User-configurable static buffers for individual publishers and subscribers to ensure deterministic memory usage without requiring dynamic heap allocations.
Direct MCU-to-MCU Bus Communication
Support for peer-to-peer messaging over shared buses such as CAN, enabling tight control loops, such as motor controllers reading remote encoder data, to operate without routing every packet through a host Linux agent.