Autonomous Parking Surveillance Rover

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.

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

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.
Navigation and Mapping
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.