// the find
ros-controls/ros2_control
Generic and simple controls framework for ROS 2
ros2_control is the standard hardware abstraction and controller management framework for ROS 2 robots. It sits between your robot's hardware drivers and the controllers (PID, MoveIt, etc.) that command them, providing a real-time-safe interface via loaned command/state handles. If you're building anything with actuators in ROS 2, this is what you build on — it's not optional infrastructure, it's the infrastructure.
The loaned interface pattern (LoanedCommandInterface/LoanedStateInterface) is a smart design: controllers claim interfaces exclusively, preventing concurrent writes without locks, which matters in real-time loops. Controller chaining is genuinely useful — you can pipe the output of one controller into the input of another (e.g., a trajectory controller feeding a PID), and the framework handles the ordering. The semantic components layer (IMUSensor, ForceTorqueSensor, etc.) saves you from manually wiring up individual interfaces every time. CI discipline is exceptional — per-distro workflows, ABI compatibility checks, downstream builds, and coverage, all running on every PR.
The learning curve is steep and the onboarding documentation, while present, assumes you already understand ROS 2 lifecycle nodes and the hardware abstraction layer — newcomers will spend significant time just understanding what a 'loaned interface' is before they write a single controller. The framework's real-time guarantees are real, but fragile in practice: one allocation or ROS service call in your update() loop breaks them, and there's no enforcement — you'll find out at runtime. Windows support is experimental and clearly second-class (one semi-binary build workflow vs. five Linux variants). The URDF-based hardware description approach works but is verbose and doesn't scale well when you have many joints with complex configurations.