DDS Content Filter String Parameters in ROS 2

Why DDS Content Filter Parameters Silently Fail for Strings in ROS 2

DDS content filter parameter substitution (%0, %1) silently fails for string fields in ROS 2 with Fast DDS. The root cause is three layers deep — the DDS SQL grammar requires quoted string literals, but no ROS 2 layer adds the quotes. Here’s how I traced it and where to fix it.

April 4, 2026 · 7 min · Pavel Guzenfeld
Fixing O(N²) Entity Addition in ROS 2's CallbackGroup

Fixing O(N²) Entity Addition in ROS 2's CallbackGroup

How a simple erase-remove in every add_timer() call turned entity registration into a quadratic bottleneck — and the 71x speedup from moving cleanup to the right place.

March 23, 2026 · 4 min · Pavel Guzenfeld
Contributing to ROS 2 — A Practical Guide

Contributing to ROS 2 — A Practical Guide from Four Accepted PRs

Everything I learned submitting four pull requests to ROS 2 core repositories — from finding issues and building in Docker to passing DCO checks, handling OSRF’s AI disclosure policy, rebasing across distro branches, and running the full test suites. A warts-and-all field guide.

March 22, 2026 · 15 min · Pavel Guzenfeld
Migrating PX4 ROS Tests from Gazebo Classic to SIH

Migrating PX4's ROS Integration Tests from Gazebo Classic to SIH

PX4’s MAVSDK tests were migrated to SIH but the ROS integration tests were left behind on Gazebo Classic. This post documents the complete migration — the config changes, the CI pipeline surgery, the parameter name pitfall that silently broke GlobalPositionInterfaceTest, and how to reproduce the full 14-test suite locally in Docker.

March 20, 2026 · 9 min · Pavel Guzenfeld
Running px4-ros2-interface-lib Tests Against PX4 SITL

Running px4-ros2-interface-lib Integration Tests Against PX4 SITL: A Deep Technical Journey

A detailed technical account of running px4-ros2-interface-lib integration tests against PX4 SITL — from discovering that the project’s CI never runs them, through three different simulator backends, five distinct failure modes, and the surprising DDS payload mismatch that blocked everything. Every dead end documented.

March 19, 2026 · 13 min · Pavel Guzenfeld