// the find
mgonzs13/yolo_ros
Ultralytics YOLOv8, YOLOv9, YOLOv10, YOLOv11, YOLOv12 for ROS 2
A ROS 2 wrapper that plugs the entire Ultralytics YOLO family (v3 through v26, YOLO-World, YOLOE) into a ROS 2 node with detection, tracking, instance segmentation, pose estimation, and depth-based 3D bounding boxes. Actively maintained across every supported ROS 2 distro with Docker images for each. For robotics teams who need YOLO perception in a real robot stack without writing their own ROS integration.
Custom message definitions (yolo_msgs) are well-scoped — BoundingBox2D/3D, KeyPoint2D/3D, Mask — which means downstream nodes get typed data, not raw image blobs. Lifecycle node support is a real engineering decision: inactive state drops bandwidth to near-zero and halves VRAM usage, which matters for battery-powered robots. CI is set up properly — separate build/push workflows per distro, formatter checks, Doxygen deployment — not just a GitHub Actions badge on a project that never passes. Support for all current Ultralytics models including YOLOE and YOLOv26 means you won't be stuck waiting for a wrapper update when a new model drops.
The 3D detection is naive: it crops the depth image by the 2D bounding box and takes min/max values. This works in clean environments but will give garbage 3D boxes whenever objects partially overlap or sit against cluttered backgrounds — there's no point cloud fusion or proper depth filtering. Tests are only linting and copyright checks (test_pep257, test_flake8, test_copyright) — no functional tests at all, so you won't know if a model integration is broken until you run it on hardware. No latency telemetry published to ROS topics, so you can't monitor detection lag from your orchestration layer without adding instrumentation yourself. The depth_image_units_divisor parameter being a magic number you have to know per-camera is a footgun — wrong value silently produces 3D boxes at absurd scales.