With the launch of the Mars Perseverance rover I became curious about the various systems on the rovers. Particularly interesting is the remarkably complex “SuperCam” included on the camera mast. I came across a paper published by the team at JPL and the California Institute of Technology titled “Stereo Vision and Rover Navigation Software for Planetary Exploration”. This paper describes the complex vision and navigation problems faced by the rover and serves as the inspiration for this project. In this project I designed and developed a semi-autonomous rover based on a commercial-off-the-shelf rover chassis, a Raspberry Pi and consumer webcam. Using readily available hardware allowed me to focus development on the control software allowing for real-time remote control with a laptop and joystick.

Chassis and Electronics

The focus of this project is development of control software and semi-autonomous operation so the decision was made to use a mostly complete, off-the-shelf, chassis option. I found a suitable tracked chassis kit on Amazon that includes a working suspension, 2 drive motors, as well as integrated encoders.

Power for the motors is provided by a 3 cell RC LiPo battery. The battery is connected directly to the motor driver board. Power for the Raspberry Pi is provided by a USB battery pack via the Pi’s USB power port. In the future I plan to develop a unified power supply that includes a larger battery, voltage regulation, and onboard charging.

Overview of the motor driver board and power distribution module
The Raspberry Pi acts as the central processor for the whole rover

The Raspberry Pi controls the motor driver via 4 GPIO pins providing direction and PWM speed control.

Control Station and Software

I originally looked into existing protocols that would allow control of the rover via a local Wifi network. I came across the Real Time Streaming Protocol (RTSP) used for streaming real-time media (like video calls). Extending the protocol to allow for real-time control of hardware ultimately proved too complicated for the purposes of this project, though I might revisit this in the future.

I finally settled on a home grown solution using a custom protocol via UDP. The rover and control station are written in Python. The rover software listens for incoming commands on a UDP port and interfaces with the GPIO pins of the Raspberry Pi to control the rover functions. The control station reads inputs from a USB joystick or gamepad and sends commands to the rover via the local network.

Project Gallery