← Back to Projects & Works

KOU-Mekatronom Autonomous Vehicle Team

Team Member → Team Lead → Mentor · Kocaeli University

November 2021 - Present

Bosch Future Mobility Challenge track

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.

The Pipeline

  1. Perceive
    ZED 2i vision, YOLO signs, and point-cloud obstacles
  2. Localize
    Encoder and IMU fusion through robot_localization
  3. Plan
    GraphML road network and Dijkstra shortest path
  4. React
    Behavior states, obstacle checks, and route regeneration
  5. 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.

Obstacle-aware control

Tracked obstacle position and velocity are checked against the route; the vehicle either changes lane, waits, or requests a new path.

Behavior management

Perception events change driving modes from the default lane-following state, with state-specific MPC parameters and timed scenario callbacks.

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.

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.

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