Robotics project · 2025 – 2026

ArUco marker missions: visual servoing and PDDL task planning

One autonomous mission, solved twice: reactively with visual servoing, which I took from simulation to a real Husarion ROSbot 2, and deliberatively with PDDL task planning in PlanSys2.

  • WhereRICE Lab, University of Genova
  • StackROS 2 Jazzy · Gazebo Harmonic · Nav2 · PlanSys2
  • LanguagesPython (servoing) · C++ (PlanSys2 executors)
  • RobotHusarion ROSbot 2 and a simulated differential-drive robot

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:

  1. Search: rotate 360°, collect the unique marker IDs and sort them in ascending order.
  2. 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.
  3. 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.

Architecture diagram of the visual servoing version: robot platforms, ArUco detection, the search-align-visit state machine and its outputs.
Visual servoing architecture: robot platforms → perception → finite-state machine → velocity commands.
Visual servoing in simulation · Watch on YouTube
Visual servoing on the real ROSbot 2 · Watch on YouTube

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.

Architecture diagram of the PlanSys2 version: Gazebo world, perception and Nav2 navigation, PDDL domain with C++ action executors, and the two-phase mission controller.
PlanSys2 architecture: simulation → perception and navigation → PDDL task planning.
Autonomous inspection mission with PlanSys2 · Watch on YouTube

Tech stack

  • ROS 2 Jazzy
  • Gazebo Harmonic
  • Nav2
  • AMCL
  • SLAM Toolbox
  • PlanSys2
  • PDDL
  • OpenCV ArUco
  • Python
  • C++
  • Husarion ROSbot 2