FAQ
Answers to the most commonly asked questions about RosFit.
ROS 1 compatibility
Can I use RosFit with ROS 1?
Yes. RosFit is built for ROS 2, but you can bridge ROS 1 topics into the ROS 2 graph using the official ros1_bridge package, and then connect to RosFit from the ROS 2 side.
The typical setup:
ROS 1 Nodes ──▶ ros1_bridge ──▶ ROS 2 Graph ──▶ RosFit Bridge ──▶ MQTT ──▶ Cloud
Steps:
- Install
ros1_bridgein a workspace that has both ROS 1 and ROS 2 sourced:
source /opt/ros/noetic/setup.bash
source /opt/ros/jazzy/setup.bash
ros2 run ros1_bridge dynamic_bridge
-
Configure
rosfit-bridge.yamlto subscribe to the ROS 2 side of the bridged topics. -
The RosFit bridge does not need to know the topics originated from ROS 1 — it works with the ROS 2 message types.
Limitations: Topic latency increases by 1–2ms due to the extra hop. Service bridging between ROS 1 and ROS 2 is supported but limited to common message types.
Offline operation
Does RosFit work without internet?
Yes. RosFit is fully self-hostable. The entire stack (MQTT broker, API, database, dashboard) runs on your local network with docker compose up. No external services are required.
Common offline scenarios:
| Scenario | Setup |
|---|---|
| Lab testing | All services on one laptop, robots on the same LAN |
| Factory floor | Server in the factory, air-gapped network |
| Field deployment | Rugged mini-PC with the stack, robots on a mesh Wi-Fi |
| Intermittent connectivity | Local stack with optional cloud sync when internet is available |
The bridge continues to buffer messages locally when the MQTT broker is unreachable, and flushes them when connectivity is restored (configurable buffer size in rosfit-bridge.yaml).
Non-ROS devices
Can I connect non-ROS devices like ESP32 sensors or PLCs?
Yes. Any device that speaks MQTT 3.1.1 or 5.0 can connect to RosFit. You do not need to run ROS 2 on the device.
Register the device as type mqtt_device and publish telemetry directly to the MQTT topic namespace:
rosfit/{device_id}/telemetry/{metric_name}
The message payload should be JSON:
{
"temperature": 22.5,
"humidity": 65.3,
"timestamp": "2026-03-30T10:05:00Z"
}
The ESP32 guides cover connecting Arduino/ESP-IDF devices with the PubSubClient or AsyncMqttClient libraries. For PLCs, use an MQTT gateway (e.g., Node-RED, Kepware) to translate Modbus/OPC-UA to MQTT.
Maximum fleet size
How many devices can RosFit handle?
A single RosFit deployment supports 500+ concurrent devices per MQTT broker instance. The actual limit depends on your infrastructure:
| Component | Limit | Scaling Strategy |
|---|---|---|
| EMQX (single node) | ~100k connections | Cluster to 3+ nodes |
| TimescaleDB | ~50k inserts/sec | Tune chunk_time_interval, add read replicas |
| Redis | ~100k ops/sec | Sentinel or Cluster mode |
| API | ~5k req/sec | Horizontal scaling behind load balancer |
| Dashboard | ~100 concurrent users | CDN for static assets |
For fleets larger than 500 devices, we recommend:
- EMQX 3-node cluster with load balancing
- TimescaleDB with compression and retention policies
- Multiple message handler instances with shared MQTT subscriptions
- Redis Cluster for shadow state at scale
The largest known RosFit deployment runs 1,200+ devices across 4 sites.
Custom MQTT broker
Can I use my own MQTT broker?
Yes. RosFit works with any MQTT 3.1.1 or 5.0 compatible broker. Tested brokers include:
| Broker | Version | Notes |
|---|---|---|
| EMQX | 5.x | Default, recommended, bundled with Docker Compose |
| Mosquitto | 2.x | Lightweight, good for small deployments |
| HiveMQ | 4.x | Enterprise features, Kubernetes operator |
| VerneMQ | 1.x | Distributed, clustering support |
| NanoMQ | 0.x | Ultra-lightweight, edge deployments |
| AWS IoT Core | — | Managed, global scale, X.509 auth |
| Azure IoT Hub | — | Managed, Azure ecosystem integration |
To use a custom broker, update the MQTT environment variables:
ROSFIT_MQTT_URL=mqtt://your-broker:1883
ROSFIT_MQTT_USER=rosfit_service
ROSFIT_MQTT_PASS=<password>
The broker must support wildcard subscriptions (rosfit/#) for the message handler to work correctly.
Supported ROS 2 distros
What ROS 2 distributions are supported?
| Distro | Status | EOL |
|---|---|---|
| Jazzy Jalisco | Recommended | May 2029 |
| Iron Irwini | Supported | Nov 2024 (use Jazzy for new projects) |
| Humble Hawksbill | Supported | May 2027 |
| Rolling | Best-effort | — |
The RosFit bridge is tested against Jazzy and Humble in CI. Jazzy is the recommended distro for new projects. Humble remains fully supported and is the LTS choice for teams not ready to upgrade.
The bridge depends on rclpy and standard message packages. It does not use any distro-specific features, so experimental compatibility with older distros (Galactic, Foxy) is possible but not tested.
Supported message types
What ROS 2 message types can I bridge?
RosFit supports any ROS 2 message type that can be serialized to JSON. The bridge uses rosidl_runtime_py for automatic serialization. Commonly used types include:
geometry_msgs:
Twist— velocity commands (/cmd_vel)PoseStamped— navigation goalsPose,Point,Quaternion— position dataTransformStamped— TF transforms
sensor_msgs:
LaserScan— LiDAR dataBatteryState— battery telemetryImu— IMU dataImage,CompressedImage— camera feedsPointCloud2— 3D point cloudsNavSatFix— GPS coordinatesJointState— robot arm joint positions
nav_msgs:
Odometry— odometry dataOccupancyGrid— SLAM mapsPath— planned paths
std_msgs:
String,Int32,Float64,Bool— simple typesHeader— timestamp and frame
Custom messages are also supported. As long as the message package is installed in the bridge's ROS 2 workspace, it will be serialized automatically. Specify the full type in the bridge config:
bridge:
publish:
- ros_topic: /my_custom_topic
mqtt_suffix: telemetry/custom
msg_type: my_package/MyCustomMsg
qos: 1