← back

Team Odyssey

I was the automation engineer in the CS Team at Team Odyssey, Amrita’s rover team. My work involved creating an end-to-end system for the rover.

Rover Control Plane

The most interesting challenge was in converting a standard issue Dell Optiplex into a robotics computer, we opted for this computer due to budget constraints but what we discovered is that it’s a surprisingly robust machine for the tasks we needed to use it for.

I wrote a server and accompanying UI to control the rover, designed so I could spin up task-specific interfaces and keep everything in one place. This control server uses FastAPI, mainly for its async support (good for WebSockets), while the dashboard itself was written in SvelteKit.

The server was the primary interface with ROS, communicating through ROSBridge; which converts JSON messages into native ROS messages. This let us isolate the ROS dependency entirely to the rover computer; any machine that could connect to the comms network was capable of controlling the rover.

The server also handled camera feeds over WebSocket, with MJPEG as a fallback, and configurable resolution to gracefully handle bandwidth drops.

System Initialization with systemd

I set up systemd services to automatically initialize everything the rover needed on boot, all ROS nodes, the control server, camera-specific software, and a program to query sensor data from a smartphone mounted on the chassis. (Smartphones, it turns out, are a surprisingly cheap way to get a lot of sensor data.)

Device Management with udev Rules

A persistent problem from the previous year was that the team had no reliable way to identify what device was being plugged in. I wrote udev rules to query serial numbers, vendor IDs, and product IDs directly, mapping them to static names so we were always talking to the right device. This unlocked some nice things downstream like a dedicated Microscope panel in the UI, and automatically rebooting an ADB process whenever a smartphone was connected.

Smartphone

One of the more interesting pieces here was the smartphone mounted on the chassis. We wrote an Android app that communicates over ROS, and used a systemd service with ADB to automatically launch it whenever the phone was connected. Smartphones pack a surprising amount of sensor data for very little cost, and this let us tap into all of it without any manual setup.

Report Generation Pipeline

I built a custom pipeline using Typst and the control server to programmatically generate well-formatted reports with minimal manual input from the base team during what was already a pretty high-pressure situation.

What It Was Like

There were a lot of sleepless nights. There were disasters, roadblocks, and moments where things broke in ways I hadn’t anticipated. This competition pushed me to think on my feet, break my head over inscrutable errors and learn a lot about what it takes to make something perform.

  1. LinkedIn post
  2. Team Odyssey’s Website - also maintained by me.
  3. IRC Rover Challenge