CMU projects
Space Robotics · CMU

MoonRanger: lunar micro-rover perception.

Software perception for one of the first truly autonomous micro-rovers targeted for the lunar surface. I worked on the stereo reconstruction pipeline, getting disparity data saved and inspectable so the team could debug failures offline.

Role Software Perception
Timeline Feb 2022 to May 2022
Team CMU MoonRanger
Stack C++ · ROS · Stereo Vision · NASA cFS
The MoonRanger lunar micro-rover
The MoonRanger rover. Image: CMU Robotics Institute.

Context

MoonRanger is a small, fast lunar rover being built at Carnegie Mellon to demonstrate autonomous navigation on the moon, without continuous earth-based teleoperation. The mission targets prospecting for water ice near the lunar south pole, which means the rover has to see and understand the terrain in front of it entirely on its own.

My contribution

I worked on the perception team, on the data side of the stereo reconstruction pipeline: getting disparity and image data flowing, saved, and inspectable so the rest of the team could debug the pipeline.

Concretely, I added the ability to write disparity-map data to disk, storing it as a grayscale image instead of the CSV format that had been used before, and wired up ROS image_transport to save image data during a run. Along the way I cleaned up the codebase, removing dead code and tightening how image data (cv::Mat) was handled, and added unit tests around the disk-writing functionality.

The motivation is that stereo failures are hard to debug live. A disparity map can look plausible on a screen and still be quietly wrong: bad matches in low-texture regions, edge fattening, or holes where the surface has too little contrast. Being able to dump the raw disparity to disk meant the team could replay a run frame by frame and actually see where the pipeline broke, instead of guessing from a downstream navigation failure.

The stereo pipeline

The rover's depth perception is classical stereo. Two calibrated cameras view the same scene, and the disparity between a point's position in the two images gives its depth by triangulation. MoonRanger's pipeline builds on ROS stereo_image_proc, using block matching to compute the disparity map after a careful stereo camera calibration, since stereo depth is only ever as good as the calibration behind it. The perception software runs on NASA's core Flight System (cFS), the flight-software framework the rover is built on.

Challenges

The moon is a hostile place for stereo vision. The sun sits at a very low angle near the horizon throughout the lunar day, which casts long shadows and produces extremely high-contrast scenes. High contrast actually helps stereo matching, since it gives texture to lock onto, but the long shadows and glare are punishing. We tested in a sandbox rig on the ground; the closest earthly analogy is driving across terrain blanketed after a snowstorm, where the surface is bright, low on texture, and hard to read.

What I learned

This was my first time inside a research codebase actually headed for flight hardware. The bar for testing and reproducibility is different when the system has to run autonomously on the moon with no one able to patch it: every capability needs a way to be inspected and verified offline, and "it works on my machine" isn't a finish line.

Stack & links

C++ ROS Stereo Vision stereo_image_proc image_transport NASA cFS Disparity Maps Autonomy