ROS2 Autonomous Driving & EM Planning

Built a Linux-based autonomous-driving simulation stack that performs trajectory planning, path and speed optimization, and closed-loop tracking through a modular ROS2 pipeline.

Trajectory generation + EM path/speed refinement
Modular ROS2 nodes built with CMake
Autonomous driving simulation results showing curved-road planning, obstacle avoidance, and trajectory telemetry
Simulation results showing curved-road tracking, obstacle avoidance, and trajectory telemetry from the planning stack.

Project Overview

The project focuses on the planning layer of an autonomous vehicle: selecting a safe route around obstacles, converting that route into a smooth drivable trajectory, and passing control-ready reference states through ROS2.

A trajectory seed initializes a collision-free route, and the EM-style planner then alternates between path and speed refinement so the final output is smoother, dynamically feasible, and easier for the downstream controller to track.

System Pipeline

Linux + ROS2

Separated map, planning, vehicle-state, visualization, and control responsibilities into ROS2 nodes with explicit topic interfaces.

C++ + CMake

Implemented performance-sensitive planning modules in C++ and organized packages, dependencies, and executables through CMake.

Trajectory Seed

Generated a collision-free route that serves as a strong initialization for continuous trajectory optimization.

EM Planner

Alternated path and speed optimization to reduce curvature, respect obstacle boundaries, and produce a trackable reference trajectory.

Project Results

Curved-road EM planner output with path, speed, acceleration, and telemetry plots
Path, curvature, speed, and acceleration are inspected together to validate trajectory quality.
Vehicle planning a trajectory around roadside obstacles
The planner offsets from the nominal lane center while preserving a smooth return path.
Vehicle following a green optimized trajectory through a curved roadway
The optimized trajectory remains continuous through changing roadway curvature.
Vehicle following a highlighted trajectory on a straight road segment
The final reference path is published for closed-loop tracking and simulation playback.

What I Learned

Planning is only valuable if it is trackable

I learned that a clean trajectory is not enough on its own. The planner, controller, and vehicle model have to work together so the final path can actually be executed smoothly in closed loop.

Visualization speeds up debugging

RViz views and trajectory plots made failures much easier to understand. Seeing the reference path, ego motion, and obstacles together helped me iterate much faster on both planning and control behavior.

Modularity makes iteration easier

Keeping planning, state estimation, control, and visualization separated as ROS2 components made the stack easier to extend, debug, and improve without rewriting the whole system.