Overview
I joined KOU-Mekatronom in November 2021 and later led the 20-person
autonomous-vehicle team. I led the team through 2024 and have continued to
mentor the following student generations since then. As of 2026 I am still a
mentor, but with very limited time, stepping in mainly on critical points.
Our systems covered nonlinear model predictive control, visual-inertial
localization, obstacle detection, traffic-sign perception, path planning,
parking, and full-size Robotaxi integration. In Teknofest Robotaxi we
progressed from 19th place in 2022 to 6th place in 2023.
Bosch Future Mobility Challenge 2024
I led KOU-Mekatronom's 20-member autonomous-vehicle team and the
technical development of our 1/10-scale vehicle. For the Bosch Future
Mobility Challenge I selected and brought a five-person squad from that
team to the on-site final, where we became the only Turkish finalist in
2024, reaching the global top 24 from 160 international teams.
GitHub•
Detailed README•
Docker Branch•
Bachelor's Thesis•
Anadolu Agency
The Pipeline
- Perceive
ZED 2i vision, YOLO signs, and point-cloud obstacles
- Localize
Encoder and IMU fusion through robot_localization
- Plan
GraphML road network and Dijkstra shortest path
- React
Behavior states, obstacle checks, and route regeneration
- Control
CasADi nonlinear MPC with state-specific tuning
My Role
I served as team captain from 2022 and developed the integrated autonomy
stack represented in the public repository from May 2023 onward. The same
planning and control logic was designed to run in Gazebo and on the real
vehicle. I coordinated competition planning while also owning much of the
integration, testing, and real-track parameter tuning.
I built this project while working full-time at Saha Robotik, mostly during
evenings and weekends. Competition deadlines meant that some scenario logic
remained hard-coded in the working Python implementation. After graduating,
I started a cleaner C++ port and handed the repository to the next student
team rather than presenting the unfinished parts as complete.
The controller used a CasADi nonlinear MPC built around a kinematic bicycle
model. I started from
Mohamed W. Mehrez's open CasADi MPC workshop,
ported and tuned the controller in MATLAB, then carried it into Gazebo
simulation and finally onto the real car, building the whole pipeline myself.
For localization, I fused ZED 2i visual odometry, wheel encoders, and two
IMUs through
robot_localization,
with UWB planned as a future global reference. Instead of a LiDAR, I
converted the ZED point cloud into a 2D scan with
pointcloud_to_laserscan, filtered out the floor, and fed it into
a dynamic and static
obstacle detector.
- Graph-based route representation and start/target selection.
- Dijkstra planning with excluded-node support.
- Dynamic/static obstacle tracking and graph-level replanning.
- Nonlinear MPC waypoint following and real-time parameter tuning.
- YOLO-driven traffic-sign and scenario behavior states.
- Watchdog-style behavior timers for competition maneuvers.
- ZED 2i, wheel-encoder, and IMU localization integration.
- Real/simulation validation and team-wide technical coordination.
How the Algorithm Works
A GraphML node graph
stores the road network. After a start and target node are chosen,
Dijkstra
finds the shortest path and can skip excluded nodes, and the nonlinear MPC
follows the next node_id along that route.
The obstacle detector
passes each object's center_x, center_y, and
velocity to the
MPC.
When an obstacle falls on a graph node, that node is marked blocked and
Dijkstra runs again: on a pass_through node the car pulls into
the left lane, otherwise it
waits until the obstacle clears
and then re-plans the path.
A behavior state machine reacts to
YOLO
detections and obstacle events; with nothing happening it stays in
keep_lane. Each state carries its own
tuned MPC parameters,
and a behaviour_timer works like a watchdog, firing
behaviour_callback to run timed competition maneuvers or to
recover when something goes wrong.
Videos from the Project
Qualification Run and Full Video Series
This is the main qualification run for BFMC. The linked playlist
continues with the individual tests I recorded while building the
stack, including the MATLAB nonlinear-MPC development and the Gazebo
simulation runs.
Watch qualification and playlist
Complete Stack in Simulation
This run shows the components working together: obstacle detection,
GraphML/Dijkstra route planning, nonlinear MPC, traffic-sign behavior,
obstacle avoidance, and route regeneration.
Watch the full simulation
Parking from the Vehicle
A real-vehicle view of the parking behavior with the obstacle-detection
output running at the same time. This was one of the scenarios used to
tune the perception-to-control handoff on the physical car.
Watch the real-car test
Parking and Replanning
The parking locations were stored in the real track coordinate system.
When an obstacle occupied the selected space, the behavior changed the
goal and regenerated the path with Dijkstra. This simulation shows that
decision process clearly.
Watch the replanning test
Code References
Graph and path planning
Configurable GraphML road networks, Dijkstra search, excluded nodes,
and route regeneration when an obstacle invalidates the active path.
Road Graph ·
Dijkstra
Obstacle-aware control
Tracked obstacle position and velocity are checked against the route;
the vehicle either changes lane, waits, or requests a new path.
Obstacle Detector ·
MPC Integration
Behavior management
Perception events change driving modes from the default lane-following
state, with state-specific MPC parameters and timed scenario callbacks.
Behavior Manager ·
Controller Tuning
Runtime and Docker
The complete competition flow runs from mpc.py. The Docker
branch packages the ROS workspace, Gazebo track, RViz configuration,
and supporting nodes into one reproducible environment.
Working Python Node ·
Docker Branch
Code Status and Hand-off
The Python implementation contains the complete competition behavior. The
cleaner C++ port reached dynamic/static obstacle detection, waypoint-based
nonlinear MPC, robot_localization, and obstacle-triggered path
regeneration, but its traffic-sign scenarios were not completed before the
hand-off. I built the stack on the open-source
CasADi MPC workshop,
obstacle_detector,
robot_localization,
and Ultralytics YOLO, then integrated and extended them for the BFMC vehicle.
Teknofest Robotaxi
I led the team through the national full-size autonomous-vehicle program,
starting with OpenCV, YOLO, and direct motor control before integrating
perception, planning, and control into the competition vehicle. We moved
from 19th place in 2022 to 6th place in 2023, and I continued as a mentor
for the 2024 team.
GitHub•
Bachelor's Thesis
2023 Full-Size Competition Vehicle
This is the real vehicle from the 2023 competition. We used OpenCV,
YOLO, and direct motor-control foundations to complete the autonomous
course and finished sixth among the university teams.
Watch the competition run
About the Robotaxi Competition
This overview gives the scale and format of Teknofest Robotaxi, the
national full-size autonomous-vehicle competition in which I led the
KOU-Mekatronom team.
Watch the competition overview