Yousri Belhadj

I’ve always loved technology, from CAD to electronics and code. I started my studies in naval electromechanics, where a teammate and I designed and built an underwater inspection robot. I then moved into computer science and embedded systems and designed a control station to pilot underwater robots. I’m now looking for an opportunity to refine my skills and keep growing.

Based in Québec (QC) · Works in French and English · Open to relocating anywhere in Canada

Email·LinkedIn

I

Inspection ROV

Remotely operated underwater robot for ship hull inspection

Licence final project · CTN / MarConEx · ISET Kélibia · 2019 · Two-person team

A camera-equipped underwater robot with 8 thrusters, built to inspect ship hulls without dry-docking the ship or sending in a diver. I designed it in SolidWorks and built it by hand.

  1. 1The vehicle, as designedSolidWorks model · drag to rotate
  2. 2Beside the hull it was built forQuay test beside a CTN ferry, 2019
  3. 3Before the waterFinal checks before the buoyancy test.
1
Loading model…
2
3

Process: from raw sheet to the quay

    Click a step to see all its photos.

    How it moves: six degrees of freedom

    Lateral thrusters at 45°Vertical thrusters

    Thruster layout taken from the SolidWorks model; the motion is an illustration, not a physics simulation. Drag to rotate.

    Hull-inspection mission in a simplified simulation: the ROV’s real thruster layout, my control-box interface, tether and battery management, and an automatic inspection report.
    Read the full project

    Why it was needed

    In Tunisia, hull inspections meant either pulling the ship out of the water, which is slow and expensive, or sending in a diver, which is risky. With the Compagnie Tunisienne de Navigation and MarConEx, we designed and built a small observation robot that streams live video from underwater.

    What I built

    The vehicle was modelled in SolidWorks, with water-flow simulations on the body and the propellers. Eight brushless thrusters, four vertical and four lateral, sit in PVC ducts and give the robot full movement on all six axes.

    The watertight housing is a Ø110 mm PVC pressure tube with plexiglass end caps, flat gaskets and 14 stainless-steel screws. Cable glands and the junction box were sealed with resin, so fewer holes go into the main housing.

    Inside are a Pixhawk running ArduSub, 8 motor controllers, two LiPo batteries, a pressure sensor for holding depth, and a Raspberry Pi 3B with a camera streaming HD video to the surface over Ethernet. The pilot flies it from QGroundControl over MAVLink with an Xbox controller, with automatic depth and heading hold.

    Around the build we did the engineering studies (6-axis motion modelling, buoyancy calculations, functional analysis, and a full bill of materials with costing), then the hands-on work: CNC cutting, lathe machining, soldering, resin sealing and final assembly.

    Software & control

    ArduSub / ArduPilot, MAVLink, QGroundControl, Raspberry Pi, Arduino

    Electronics

    Pixhawk, BLHeli_32 ESCs, brushless motors, LiPo

    Mechanical

    SolidWorks (CAD and flow simulation), PVC / polyethylene / plexiglass, CNC, lathe machining

    II

    ROV Control Box

    Rugged dual-screen ground station for underwater robots

    Engineering final project · SeaBot, Nabeul, Tunisia · 2022

    Design stage: software and test rig built

    A waterproof, portable control station designed to pilot SeaBot’s underwater robots, with a custom Qt/QML pilot interface, live video, and an Ethernet link over a 300 m tether.

    1. 1The station, as designedSolidWorks model, shown with the pilot interface
    2. 2The pilot’s viewQt/QML interface, animated here with simulated data
    1
    Loading model…

    Inside the case: the 4S12P battery pack with its protection board, the motherboard and Fathom-X on metal standoffs, and 16 3D-printed ApolloX brackets.

    2
    Recreation of my Qt/QML pilot interface, running on simulated dive data

    System overview: how the station works

    SURFACE · CONTROL BOXROBOT · TEST RIG Joystickpilot inputKeyboard · touchpadsetup and tuning Embedded PC · Qt/QML pilot appIntel i5 · NVMe · C++ backend 17.3″ 4K displaylive video · navigation7″ touchscreensonar · instruments Battery 4S12P + BMS14.4 V · ≈43 Ah · ≈145 WFathom-XEthernet over the tether 300 m+ TETHER commands · JSON / TCPtelemetry · JSONvideo · GStreamer Fathom-XEthernet over the tether Companion computerUbuntu · Python bridges ESP32 + MPU-9250motion dataCameralive videoESP8266thrust commands ESCs → thrustersPWM Commands Telemetry Video Power Ethernet
    How the station talks to the robot. Pilot commands go out as JSON over TCP; telemetry and the GStreamer video stream come back over the same Ethernet link, carried by a Fathom-X board at each end of the tether. The robot side is the test rig I built to validate the station end to end.

    Software architecture

    PILOT APP · Qt/QML + C++COMPANION COMPUTER · UBUNTU SERVER · 192.168.2.1 INTERFACE · QML Summary pagegauges · live video · leak alertsFrame selectionrobot configuration Thrusters testPWM slider per thruster (0–255)Joystick setupQML Gamepad mapping Qt property bindings BACKEND · C++ Gamepad inputaxes → motion commandsJSON codecencode commands · parse data TCP socketsclient to 192.168.2.1Video receiverGStreamer · Qt Multimedia ETHERNET LINK commands → :6546navigation data ← :6547video stream Python bridgesocket → serialPython bridgeserial → socketGStreamercamera pipeline ESP8266PWM → ESCsESP32MPU-9250 · serialCameralive video Commands Telemetry Video internal data
    Read the full project

    Why it was needed

    SeaBot was piloting its first underwater robot from a regular laptop running open-source software. That setup had no protection and couldn’t be used outdoors. As the team built bigger robots with more instruments, they needed a dedicated control station. I designed it from start to finish: the software, the electrical system and the enclosure.

    What I did

    The pilot interface is Qt/QML with a C++ backend. It shows gauges for yaw, pitch and roll, plus depth, pressure, water temperature, the robot’s battery status, leak alerts and the live camera feed, with separate pages for robot setup, motor configuration, thruster tests and joystick setup. Joystick input is read with the QML Gamepad type and turned into motion commands (forward/back, left/right, up/down, lights, navigation mode), and each thruster can be tested on its own with a PWM slider.

    On the hardware side I picked an onboard PC (Intel i5, NVMe SSD), a 17.3″ 4K main screen and a 7″ touchscreen for instrument data. I worked out the power budget, about 145 W, and designed a 4S12P pack of 18650 Li-ion cells (14.4 V, about 43 Ah) with a smart protection board.

    The enclosure was modelled entirely in SolidWorks: an IP67 ABS case, CNC-cut plexiglass mounts for the screen and keyboard, and 3D-printed brackets in UV-resistant ApolloX.

    To test it I built a stand-in for the robot’s internals. An ESP32 read the motion sensor and sent the data over serial, an ESP8266 drove the motor controllers, and an Ubuntu companion computer ran Python bridge programs. Thruster control, telemetry and live video all worked end to end.

    Software

    Qt/QML, C++, Python, TCP sockets, JSON, GStreamer, Ubuntu Server

    Electronics

    ESP32, ESP8266, MPU-9250, PWM / ESC, Fathom-X, Li-ion pack design and BMS

    Mechanical

    SolidWorks, 3D printing, CNC

    III

    InventaLogic

    Staff scheduling for Québec convenience stores, with its own check-in terminal

    Personal project · in development

    Staff scheduling software I’m building for Québec convenience stores. Its scheduling engine places shifts greedily, then refines them by hill-climbing; it handles weekend rotation and hours across several locations, is covered by Vitest tests, and was checked against real store data.

    1. 1The check-in terminalSolidWorks model, running the Qt/QML app with sample data
    1
    Loading model…

    The manager’s web app

    The week the scheduling engine filled for two stores, with coverage per store, hours per employee and a warning past 40 h. Managers can swap shifts by drag and drop, and the app checks the 11-hour rest rule before saving.

    Per-store rules the engine has to respect: minimum rest between shifts, no opening the morning after a close, a cap on consecutive days, and a minimum number of days off.

    Check-ins from the terminal, compared with each planned shift. A manager can correct a punch, but has to give a reason.

    Captured from the real React pages, with sample data.

    Inside the scheduling engine

    Opening shiftClosing shiftRule violation

    Simplified illustration of the engine’s two passes on one store, with sample names. The real engine handles several stores and more rules.

    Read the full project

    Why it was needed

    The idea came from my own job. Where I work, employees write their hours down on paper, and at pay time the boss collects the sheets and works out everyone’s hours by hand. I wanted to automate that. The project then grew to cover the other headache, planning the week itself: someone has to open and close every day, nobody should close at night and open the next morning, weekends have to rotate fairly, and some employees work in more than one store.

    InventaLogic handles both halves: it generates the weekly schedule from each store’s own rules, and a check-in terminal at the store records real arrivals and departures, so the hours worked are counted automatically instead of collected on paper, and can be compared with the plan.

    What I built

    The scheduling engine works in two passes. A greedy pass first fills every shift, then a local search (hill climbing) keeps swapping shifts as long as the result gets better. It handles weekend rotation and adds up each employee’s hours across several stores. It is covered by Vitest tests and was checked against real convenience-store data.

    The manager’s web app shows the week for every store, with coverage and hours per employee, a warning past 40 h, drag-and-drop shift swaps that are checked against the 11-hour rest rule, per-store rule settings, and an attendance page where any correction needs a reason. The backend moved from Flask (Python) to Express and Prisma on PostgreSQL, and the dashboard was rebuilt in React.

    The check-in terminal is a Raspberry Pi 4 with a 7″ touchscreen running a Qt/QML app, in a case I designed in SolidWorks. Employees check in with a fingerprint or an NFC card: the GROW R558-S fingerprint sensor talks to the Pi over UART, which only worked once the port was set to two stop bits, and the PN532 NFC reader runs over I²C.

    Hosting: the app is being deployed on my own Linux server at DigitalOcean.

    My role: the system design, the scheduling rules and the engine logic, the terminal hardware, validating results with real store data, and deployment. Much of the web code was written with AI assistance (Claude Code).

    Software

    Scheduling engine (greedy + hill climbing), Vitest, React, Node.js / Express, Prisma, PostgreSQL, Qt/QML

    Hardware

    Raspberry Pi 4, 7″ touchscreen, GROW R558-S (UART), PN532 NFC (I²C), case designed in SolidWorks

    Deployment

    Linux server on DigitalOcean, AI-assisted development (Claude Code)

    Experience

    1. Jul 2024 – now

      Cashier

      JNSS INC. · Québec (QC)

      Customer service, cash and card transactions, end-of-day closing.

    2. May – Nov 2022

      Engineering intern, final project

      SeaBot · Nabeul, Tunisia

      Designed the ROV control box, from the IP67 enclosure and battery pack to the onboard hardware, and developed its Qt/QML pilot interface, tested on a stand-in for the robot. See the project

    3. Jul – Aug 2021

      Embedded systems developer intern

      SeaBot · Remote

      Worked on the embedded system of a buoy that measures wave height.

    4. Jan – Jun 2019

      Licence final project intern

      CTN / MarConEx · Tunisia

      Designed and built a hull-inspection ROV in a two-person team. See the project

    Home lab

    Home server from a salvaged desktop

    Personal project

    I turned a salvaged desktop PC into a Linux server that works as my own small data center: I use it to try out new tools, host game servers and run databases for my projects. I can reach it from anywhere through a reverse SSH tunnel: a cloud server with a fixed public IP acts as the relay, so nothing has to be opened on the home network.

    Linux · SSH · DigitalOcean

    Electronics workbench

    Tools I use

    I prototype and test my hardware on my own bench, from printed parts to soldered circuits.

    • 3D printingFDM and resin printers, for enclosures, brackets and prototype parts
    • SolderingSoldering station, assembling circuits on prototyping boards with components and wiring
    • Testing and powerMultimeter and bench DC power supply, to power, measure and debug my circuits
    • MeasuringCalipers and other measuring tools, to take exact dimensions of parts for CAD modelling and fitting

    Education

    1. 2019 – 2023

      National engineering degree, computer science

      ESPRIT, Tunisia · degree awarded May 2024

    2. 2016 – 2019

      Applied bachelor’s degree, naval electromechanics

      ISET Kélibia, Tunisia

    3. 2017

      CSWA, Certified SolidWorks Associate

      Dassault Systèmes

    Skills

    Embedded & electronics
    ESP32, ESP8266, Arduino, Raspberry Pi, Pixhawk / ArduSub, UART, I²C, serial, PWM and ESCs, Li-ion pack design with BMS
    Software
    C++, Qt/QML, Python, GStreamer, TCP sockets and JSON, Linux
    Also used in projects
    React, Node.js / Express, Prisma, PostgreSQL, through AI-assisted development (Claude Code)
    Mechanical & CAD
    SolidWorks (CAD and flow simulation), 3D printing (FDM and resin), CNC cutting, lathe machining
    Languages
    French (TEFAQ 2026: speaking C1, listening B2), English (working proficiency), Arabic (native)

    Contact

    Open to embedded systems, hardware and software roles anywhere in Canada. The quickest way to reach me is by email.