If software development is 10% writing code and 90% wrestling with environment variables, then ROS 2 development is 99% standing in front of a terminal screaming at CLI flags.
π¦ The Task
The objective was simple:
- Record a live telemetry stream from a robot chassis using
ros2 bag record. - Publish an update to
@pyintel/arcdependency packages. - Call it a day and go to sleep.
Total estimated time: 12 minutes.
π The 3-Hour Dependency Loop
What actually happened:
- I ran
ros2 bag record -a. ROS 2 immediately crashed becauseStoragePluginStatusfailed to resolvemcap. - I installed
ros-humble-rosbag2-storage-mcap. - Installing that package updated
systemddependencies, which silently broke my local Node.js environment paths. - I tried to push
@pyintel/arcvianpm publish. NPM failed becauseGLIBCXX_3.4.30was missing from the updated ROS library path. - I tried to source
~/.bashrcagain. The terminal printed 47 lines of conflicting Pythonsite-packageswarnings.
[ros2 bag record] ββ> [Missing mcap] ββ> [Apt Install] ββ> [Broken Node Path]
β² β
βββββββββββββββββ (3 Hours of Pain) βββββββββββββββββββββββββ
π‘ The Takeaway
- Modern robotics toolchains are complex towers of C++ libraries, Python bindings, ROS middleware, and system environment variables.
- When a simple 1-line command fails, 9 times out of 10 itβs not your code β itβs a missing environment flag or conflicting
LD_LIBRARY_PATH. - Containerize your ROS 2 recording environments so your system Node/NPM dependencies never have to fight your robotics libraries. π οΈ