The mission
A robot is placed in an environment with several ArUco markers. It has to find all of them, sort them by ID and visit them in order. I solved this mission twice, in ROS 2 Jazzy and Gazebo Harmonic, to compare a reactive controller with a deliberative planner on the same task.
1 · Reactive: visual servoing
A finite-state machine drives the robot directly from the camera image:
- Search: rotate 360°, collect the unique marker IDs and sort them in ascending order.
- Align: proportional control on the marker's horizontal offset in the image for heading, and on its distance to hold a 1.0 m standoff.
- Visit: verify the ID, circle the target in a debug image and move on to the next marker.
The pipeline runs in Gazebo Harmonic (camera through ros_gz_bridge) and on a physical Husarion
ROSbot 2 with its onboard camera, so the controller was taken from simulation to the real robot.

2 · Deliberative: PDDL planning with PlanSys2
The second version plans the mission symbolically. A PDDL domain defines three durative actions,
move, survey and take_picture, and C++ PlanSys2 action executors connect them
to the robot: move sends Nav2 goals, survey performs a 360° scan and
take_picture centers the marker and captures it.
A two-phase mission controller first surveys every waypoint, then visits the detected markers in ascending ID order. The map is built with SLAM Toolbox, the robot localizes on it with AMCL, and an OpenCV ArUco detector publishes marker IDs and poses.
