Stuck on a ROS 2 problem? Find it by symptom below. Most guides include numbers measured in a ros:jazzy container, and the reproduction code is on GitHub. New guides appear here as soon as they go live.
Install and build
- MoveIt 2 colcon build RAM: Default Build Fails at 8GB, Sequential Peaks at 2.4GB (Measured)
A default colcon build of MoveIt 2 (Jazzy, 41 packages) was killed at an 8GB cap and peaked at 8.7GiB at 16GB; a sequential build peaked at 2.4GiB… - How Much RAM Does colcon build Need? Nav2 Built at 16, 8 and 4GB
Default colcon build of Nav2 failed at 4GB and peaked at 7.8GiB of 8GiB; a sequential build peaked at 2.7GiB and finished at 4GB. - ROS 2 Humble vs Jazzy vs Iron: Which Distro Before EOL (2026)
As of October 2026, Iron is past EOL and Humble has 7 months left; for longer projects use Jazzy (31 months, Ubuntu 24.04) or Lyrical (55). - ROS 2 local_setup.bash vs setup.bash: ros2: command not found
In a fresh shell, install/local_setup.bash adds only your overlay and no ros2 command; install/setup.bash also loads the underlay it was built on. - colcon build Slow? What Overlays, COLCON_IGNORE and –symlink-install Actually Save, Measured on ROS 2 Jazzy
On ROS 2 Jazzy, a no-change colcon build still cost time per package, and switching one CMake flag cost more than ignoring two packages saved. - colcon build –executor sequential still runs make -jN: measured compilers, memory and build time
In measured runs, colcon --executor sequential built one package at a time but kept make -j2; only MAKEFLAGS=-j1 got it down to one compiler.
Topics and QoS
- ROS 2 Nodes Can’t See Each Other? ROS_AUTOMATIC_DISCOVERY_RANGE
If either node has ROS_AUTOMATIC_DISCOVERY_RANGE=OFF, nothing connects; across hosts, LOCALHOST also needs ROS_STATIC_PEERS on one side. - Gazebo Shows Real Time Factor 1.0. Did Your ROS 2 Control Loop Meet Its Deadline? Measured on Jazzy
In a ROS 2 Jazzy container, /clock held real time factor 1.0 while a 100 Hz callback missed its 10 ms deadline 20 times in 5 s. RTF… - ROS 2 Liveliness vs Deadline: Which One Tells You a Sensor Topic Stopped?
On ROS 2 Jazzy with Fast DDS, a stalled sensor topic fired only deadline events; Automatic liveliness stayed alive until the driver process was killed. - ROS 2 ‘Message Filter dropping message’: Find the Mismatched Clock with One Subtraction
Subtract the latest tf stamp from the laser stamp: a gap of billions of seconds, and its sign, shows which ROS 2 node has use_sim_time set wrong. - ROS 2 transient_local: how many old messages does a late subscriber actually get? (measured)
Depth behaved as documented. A 0.45 s lifespan delivered 4 samples instead of 5 in every run, because history arrives after discovery.
Frames and tf
- ROS 2 tf Frame Offset Doubled? Check static_transform_publisher
A backwards ROS 2 static transform with no rotation puts the child exactly 2x the offset away; with rotation the ratio varies, and under odom the tree breaks.
Basics
- ROS 2 rclpy rate.sleep() Blocks Forever: Why and How to Fix
rclpy rate.sleep() waits for a timer callback only an executor runs: spin in another thread or use MultiThreadedExecutor(num_threads=2). - ROS 2 rclpy publish() Slow With Large Custom Message Arrays
Split Foo[] into uint64[] + uint32[]: rclpy publish() of 10,000 elements dropped from about 10 ms to 0.25 ms on ROS 2 Jazzy. - Gymnasium check_env “share an object” error in ROS 2 robot envs
Your env returns the same NumPy array every step, so every buffer slot holds the latest value; return self._q.copy(), not obs[:] or np.asarray(obs).