Autonomous Parking Surveillance Rover

Pomona with a parking lot in the background

As part of a hands-on university project at ELTE University, I developed an autonomous parking surveillance application for Pomona, an AgileX Scout 2.0 rover together with a team of three other students. The system combines localization, navigation, perception, and mapping into a complete robotics stack deployed on a physical platform.

GIF Demo

The rover builds an occupancy map of its environment and detects vehicles and license plates with its onboard RGB-D camera. Detected license plates are localized and visualized alongside the environment map.

Hardware

AgileX Scout 2.0 Rover

The robotic platform we used is the AgileX Scout 2.0, a versatile mobile base designed for research and development. It features a differential drive system more than capable of navigating outdoor parking lots. The rover is equipped with a Velodyne LiDAR, an Intel RealSense RGB-D camera, and an Xsens IMU and GNSS module. The onboard NVIDIA Jetson Xavier provides the necessary computational power for real-time processing of sensor data.

System Architecture

---
config:
    themeVariables:
        fontSize: "20px"
---
flowchart TD

    subgraph "`**Sensors**`"
        IN_CAMERA[/ RGB-D Camera /]
        IN_LIDAR[/ LIDAR /]
        IN_ODOMETRY[/ Wheel Odometry /]
        IN_GNSS[/ GNSS /] 
        IN_IMU[/ IMU /]
    end

    subgraph "`**Localization**`"
        ICP("KISS ICP")
        KALMAN("Kalman Filter Node")
    end

    subgraph "`**Navigation**`"
        GLOBAL_PLANNER("RRT*")
        CONTROLLER("Controller")
    end

    subgraph "`**Perception**`"
        DETECTOR("Car & License Plate Detector")
    end

    subgraph "`**Mapping**`"
        DETECTION_MAPPER("Detections to 3D Node")
        MAP("Octomap Server")
    end

    subgraph "`**Outputs**`"
        OUT_MAP[\ Map \]
        OUT_TWIST[\ Twist \]
    end


    IN_GNSS --> KALMAN 
    IN_ODOMETRY --> KALMAN
    IN_IMU --> KALMAN
    IN_CAMERA ---> DETECTOR
    IN_LIDAR --> MAP
    IN_LIDAR --> ICP

    ICP --> KALMAN
    GLOBAL_PLANNER --> CONTROLLER
    DETECTOR & KALMAN & IN_CAMERA --> DETECTION_MAPPER
    KALMAN --> MAP
    KALMAN --> GLOBAL_PLANNER

    MAP --> OUT_MAP
    DETECTION_MAPPER --> OUT_MAP
    CONTROLLER --> OUT_TWIST

Localization

An Extended Kalman Filter fuses wheel odometry, IMU data, GNSS, and LiDAR odometry from KISS-ICP. Combining these complementary sources provides a more stable pose estimate, particularly when wheel slip affects the mobile base.

The navigation stack uses OctoMap to represent obstacles and a custom Python implementation of RRT* to plan collision-free paths. A controller converts the planned trajectory into movement commands, while dynamic obstacle avoidance supports operation in changing environments. The resulting occupancy map is displayed with estimated positions of license plates, providing a spatial overview of the parking area.

Perception

Two YOLO-based detection models identify cars and license plates in the camera feed. Optical character recognition extracts the plate text, and the RGB-D data is combined with the robot pose to estimate the 3D position of each detection. An annotated camera stream is published for visualization.

Outcome

For the source code and project details, visit the SLAM Parking Inspector repository.

Indoor Localization and Mapping Example

Indoor Proof of Concept

Outdoor Proof of Concept