Intro

I'm a robotics software engineer focused on autonomous navigation, perception and ROS. This site collects the projects I have worked on, from university research to autonomous robots in industry.

Today you can go through the whole process of building a robot from home: the Robot Operating System (ROS) gives you the libraries and tools to build the application, Gazebo lets you design and test your own robots (or reuse existing models), and Arduino, with its huge amount of tutorials and code, lets you build them physically.

Projects

Autonomous Mobile Robot in a warehouse

Differential drive · Indoor navigation

  • ROS
  • StarTracker
  • move_base
  • TEB local planner
  • Spatio-Temporal Voxel Layer
  • Intel RealSense D435
Differential AMR navigation in a warehouse

A differential-drive autonomous mobile robot (AMR) navigating a warehouse.

  • Global localisation based on StarTracker.
  • Navigation with ROS move_base and the TEB local planner, using three Intel RealSense D435 cameras to perceive the environment.
  • 3D obstacle mapping with a Spatio-Temporal Voxel Layer built from the RealSense point clouds (PointCloud2).
Navigation with move_base and the TEB local planner
Spatio-Temporal Voxel Layer from a RealSense D435

From trolley to autonomous robot

Differential drive

  • StarTracker
  • Differential motor controller
  • Path following
Conversion of a trolley into a differential AMR

Conversion of an ordinary trolley into a differential-drive autonomous mobile robot.

  • Global localisation with StarTracker.
  • Drive: a differential motor controller was added to the trolley.
  • Minimal hardware: with no cameras, no other sensors and no obstacle avoidance, the robot follows a planned route with very high precision.

Industrial AGV

Industry · Full software lifecycle

  • ROS
  • TEB local planner
  • Intel RealSense D435i
  • StarTracker
  • RTK GPS / NTRIP
  • Modbus RS485
  • Arduino · rosserial

The most complex project I have worked on: making an AGV (Automated Guided Vehicle) navigate autonomously in an industrial environment, both indoors and outdoors.

  • Local navigation with the TEB local planner, handling static and dynamic obstacles (moving at constant velocity). Obstacles were detected with four Intel RealSense D435i cameras.
  • Indoor global localisation with StarTracker, accurate to around 1 mm.
  • Outdoor global localisation with RTK GPS at centimetre precision, using a base–rover setup over radio or an NTRIP caster. The AGV switched automatically between StarTracker and GPS when moving between indoors and outdoors, including when reversing.
  • Drive system: tricycle kinematic model with a 48 V TZ09 brushless DC motor and two encoders (one on the motor and a more accurate one on the steering wheel), read over Modbus RS485.
  • Actuators without a hardware interface were connected through an L298N H-bridge to an Arduino, which talked to ROS on an Intel NUC via rosserial_arduino, switching them on and off depending on the AGV's position.

Simulation & computer vision

NVIDIA Isaac Sim · Omniverse

  • NVIDIA Isaac Sim
  • Omniverse
  • Instance segmentation

Isaac Sim is an NVIDIA Omniverse application for photorealistic simulation. Its graphics engine simulates realistic textures and lighting, which makes it possible to train and test navigation and perception systems in an environment that is as close to reality as possible.

Photorealistic warehouse in NVIDIA Omniverse
Comparing computer vision algorithms in a simulated environment
Instance segmentation in Isaac Sim

Person tracking with a robotic camera

Computer vision · Robotic camera control

  • MMPose
  • YOLOX
  • OpenMMLab
  • Pose estimation
  • Multi-person tracking
  • Robotic camera
Person tracking

A real-time person tracking system built with neural networks from the OpenMMLab ecosystem, which also moves a robotic camera to follow the tracked person automatically.

  • Person detection with YOLOX, which finds every person in the camera image and draws a bounding box around them.
  • Pose estimation with MMPose, which estimates the body keypoints of each person (head, shoulders, arms, hips and legs) to build their skeleton.
  • Multi-person tracking: each person receives a unique identifier that is kept from frame to frame, so the system can tell different people apart and keep following the right one.
  • Robotic camera control: the position of the tracked person in the image is turned into movement commands for a robotic camera, which turns to point in their direction and follows them as they move around the set.

Valkyrie humanoid: motion detection

University research project

  • Point Cloud Library
  • OpenCV
  • Segmentation
  • Object tracking

Research project in my final year at university, supervised by Dr Manuel Ocaña, in collaboration with the University of Edinburgh, who provided videos of the Valkyrie robot performing different behaviours.

The goal was to detect and identify the robot's movements using the Point Cloud Library (PCL). I compared several of the library's segmentation algorithms to find which one suited this task best.

Point cloud segmentation of the scene used to detect the Valkyrie robot

I also used OpenCV for object tracking. The same library can recognise faces, and even tell apart different people in the same scene.

OpenCV object tracking, first example OpenCV object tracking, second example

Robotic arm for automated testing

Industry

  • HAN'S ROBOT arm
  • Motion programming
  • ROS · MoveIt

I used a HAN'S ROBOT arm to automate testing the behaviour of devices over long periods of time. The arm comes with its own interface to program, record and replay movements automatically. It can also be controlled from ROS, where MoveIt is a very useful package.

amigoBot

University

  • Sensor fusion
  • Ultrasonic · Laser
  • Vector Field Histogram

My first contact with a real robot: the amigoBot, a mobile robot used for education and research. It was very useful to learn sensor fusion with ultrasonic and laser sensors.

Vector Field Histogram (VFH) was one of the first motion planning algorithms I tested. It is a fast and robust algorithm that builds a histogram grid, a statistical representation of the obstacles collected from the sensor readings, to decide where the robot can move.