Summary

A hobbyist roboticist building an AUV (robotic submarine) tried ROS 2 and bounced off it, ultimately building his own message-bus system on NATS + protobuf. The article details specific friction points: Ubuntu-only packaging, version lock-in between ROS and Ubuntu releases, verbose colcon build system, poor Python/C++ interop, and excessive complexity for solo/small projects.

一位業餘機器人愛好者在為 AUV(機器人潛水艇)嘗試 ROS 2 後轉而用 NATS + protobuf 建立自己的訊息匯流排。文章詳述具體痛點:僅支援 Ubuntu、ROS 與 Ubuntu 版本鎖定、冗長的 colcon 建置系統、Python/C++ 互操作性差,以及對個人/小型專案的過度複雜性。

Key Points

  • Ubuntu lock-in: ROS 2 packages are Ubuntu apt packages — RaspiOS (used by 95% of hobbyists) is effectively unsupported without Docker workarounds that add hardware-access complexity
  • Version coupling: each ROS 2 release targets a specific Ubuntu version with frequent breaking changes between releases — creates fragmented ecosystem
  • Build system friction: colcon and ROS-specific package structure add significant boilerplate vs. standard Python/CMake projects
  • Alternative chosen: NATS (pub/sub message bus) + protobuf (typed serialization) — simpler, cross-platform, standard tooling, works on any OS
  • Robot architecture insight: all complex robots follow the same pattern — independent processes/nodes communicate over a message bus; ROS 2 is one implementation, not the only one

Insights

The article is honest about its limitations (“I’m not an expert on ROS 2 — I bounced off it”). The real insight is that ROS 2’s complexity budget makes sense for large teams deploying on known hardware (industrial cobots, research platforms) but is wrong for hobbyists and small teams who need to iterate fast on non-standard hardware. NATS + protobuf is a pragmatic alternative that replicates the core pub/sub node architecture without the platform lock-in. The “prescribed solution is Docker” point is worth noting — Docker adds a layer of indirection that makes GPIO/SPI/serial access harder, which is exactly what robotics projects need.

Connections

Raw Excerpt

I found a lot of architectural decisions that I personally thought weren’t best practice, and that ultimately led me to build my own system on top of a NATS and protobuf message bus.