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:

  1. Install ros1_bridge in 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
  1. Configure rosfit-bridge.yaml to subscribe to the ROS 2 side of the bridged topics.

  2. 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:

ScenarioSetup
Lab testingAll services on one laptop, robots on the same LAN
Factory floorServer in the factory, air-gapped network
Field deploymentRugged mini-PC with the stack, robots on a mesh Wi-Fi
Intermittent connectivityLocal 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:

ComponentLimitScaling Strategy
EMQX (single node)~100k connectionsCluster to 3+ nodes
TimescaleDB~50k inserts/secTune chunk_time_interval, add read replicas
Redis~100k ops/secSentinel or Cluster mode
API~5k req/secHorizontal scaling behind load balancer
Dashboard~100 concurrent usersCDN 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:

BrokerVersionNotes
EMQX5.xDefault, recommended, bundled with Docker Compose
Mosquitto2.xLightweight, good for small deployments
HiveMQ4.xEnterprise features, Kubernetes operator
VerneMQ1.xDistributed, clustering support
NanoMQ0.xUltra-lightweight, edge deployments
AWS IoT CoreManaged, global scale, X.509 auth
Azure IoT HubManaged, 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?

DistroStatusEOL
Jazzy JaliscoRecommendedMay 2029
Iron IrwiniSupportedNov 2024 (use Jazzy for new projects)
Humble HawksbillSupportedMay 2027
RollingBest-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 goals
  • Pose, Point, Quaternion — position data
  • TransformStamped — TF transforms

sensor_msgs:

  • LaserScan — LiDAR data
  • BatteryState — battery telemetry
  • Imu — IMU data
  • Image, CompressedImage — camera feeds
  • PointCloud2 — 3D point clouds
  • NavSatFix — GPS coordinates
  • JointState — robot arm joint positions

nav_msgs:

  • Odometry — odometry data
  • OccupancyGrid — SLAM maps
  • Path — planned paths

std_msgs:

  • String, Int32, Float64, Bool — simple types
  • Header — 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