Autonomous Ground Vehicle
I’m building a rover that can navigate my neighborhood autonomously. GPS waypoints, curb climbing, the whole deal. The goal is to deliver homebrew to my neighbors without me having to walk it over myself. I make beer, they get beer, everybody wins. Except now I have to build a robot.
Here’s the thing about building robots: you don’t just learn one skill. You learn twelve. I started this project knowing how to write software. Now I’m doing CAD modeling, Ackerman steering geometry, aluminum fabrication, 3D printing in multiple materials, ArduPilot configuration, and spending way too much time thinking about gear ratios. Each problem solved reveals three more problems I didn’t know existed.
Here’s where things stand:
CAD render of the current design
Current state of the build
Current Status
The gearbox is working but integrating it into the rover has been a challenge. I haven’t found a way to make the gearbox output line up with the current wheel level. Making them level drastically reduces ground clearance, and I would also need to redesign the frame and steering mount components. So instead I’m using a dual cardan universal joint to connect the gearbox output to the wheels at an angle. I found 3D printable universal joint models for 5-10mm shafts, printed two of them, and connected them with an intermediate shaft. A single universal joint has a problem: even with a constant input speed, the output oscillates faster and slower through each rotation. But a dual cardan joint uses two universal joints so the oscillation from the first cancels out the second, giving you constant velocity output. Sounds like black magic to me. Anyway, I still need to cut some aluminum rods to get the shaft lengths right, but the prototype is looking promising.
Dual cardan universal joint prototype for solving the gearbox alignment problem
Design Decisions
When I look at a component and it’s $20 but I need four of them, maybe more if I break something during testing, it starts to make sense to design it myself and 3D print it. The money goes further buying tools that help me make parts than buying parts that might not fit right anyway. Half the parts on this rover are custom printed for exactly this reason.
Ackerman Steering Geometry
I went with Ackerman steering instead of skid-steer. The inside wheel turns sharper than the outside wheel during a turn, which is how actual cars work. Skid-steer would’ve been simpler mechanically, but it tears up the tires and fights ArduPilot’s steering logic. Ackerman plays nice with the GroundSteering servo function and doesn’t leave rubber all over my driveway.
Brushed vs Brushless Motors
Brushed motors. I know, I know. Brushless is more efficient. But at 3 mph, efficiency doesn’t matter. What matters is smooth low-speed control, and brushed motors do that without needing sensored feedback or fancy ESC tuning. They’re also cheaper, and I’ve already spent enough on this project.
Wheel Design
The wheels need to climb curbs. Standard curbs are about 15cm, so I designed 17cm diameter wheels to clear them with some margin. I went with 6000RS bearings instead of the cheaper 608 skateboard bearings because the deeper groove handles radial loads better. When you’re carrying 10 pounds of beer over rough terrain, you want bearings that won’t complain.
Build Progress
Frame and Body
The frame is 2020 T-slot aluminum extrusion, 24” x 18”. It’s basically adult LEGO. I can move things around, drill new holes, and adjust the layout without starting over. The joints use M6 tapped holes. I learned to tap threads into aluminum, which is more satisfying than it has any right to be.
Cut 2020 extrusion pieces before assembly
Tapping M6 threads by hand
First mockup with wheels placed for sizing
Frame with steering and motor mounts installed
Drivetrain
Two motors, two ESCs, one dream. The HOBBYWING QUICRUN 1080 G2 ESCs drive 540 40T brushed motors. Getting power from the motor shafts to the wheels required flexible couplers. Rigid connections would bind up with any misalignment, and there’s always misalignment. The bearings are 6000RS with a 10mm bore, and I spent way too long getting the shaft diameter right. 9.98mm fits a 10mm bore smoothly. 10.02mm does not.
Early motor mount prototype with flexible coupler
Testing the bearing housing and motor alignment
Complete drivetrain assembly with wheel attached
The initial test drive was humbling. The rover couldn’t drive over a small power cord in the garage. When I pushed throttle to the max, one of the motors started smoking. That’s when I knew I couldn’t get away from learning about gears and gear boxes.
*Test drive before the gearbox redesign*I designed a 2-stage gearbox that gives a 40:1 reduction. There are way cooler gear assemblies out there, but this one is mine.
2-stage gearbox with motor attached
Current gearbox with red spur gears
Gearbox and motor assembly with wheel attached
Dual cardan universal joint prototype for solving the gearbox alignment problem
Steering
The steering knuckles are 3D-printed and implement Ackerman geometry. A Zoskay DS3235 servo provides 35kg-cm of torque, which is enough to turn the wheels even when the rover is sitting still on pavement.
The servo mount took four tries to get right. First one didn’t fit the servo. Second one had screw holes that were too big. Third one didn’t account for the wire coming out of the servo. Fourth time I just removed one side of the mount entirely so the servo could slide in from the side. Sometimes the simple solution is the one you should’ve tried first.
Four iterations of servo mounts before getting it right
Steering knuckle mounted to the frame
Custom servo arm sleeve for the steering linkage
Servo installed with mount and custom arm
Steering linkage
Wheels and Tires
I printed my own wheels. 17cm diameter, 6.5cm wide, with a hex hub interface so they pop on and off easily. The wheels are PLA, rigid enough to hold their shape. The tires are TPU, which is flexible and grippy. Press-fitting 6000RS bearings into PLA hubs requires getting the hole diameter exactly right. Too tight and the bearing won’t go in. Too loose and it falls out. I got it right eventually.
PLA wheel hub fresh off the printer
Tire fit on wheel prototype
Final wheels and tires
The gearbox redesign needed a new drive wheel hub. I went with a 5-lug design, planning to use heat inserts in the wheel so the hub could bolt on cleanly. The problem was the lack of infill in the wheel. The heat inserts just fell right into the plastic. I don’t want to waste the wheels though, so super glue will work for now. If I need to reprint the wheels I’ll bump up the infill, though I didn’t keep track of what I used for these ones. Lesson learned on documenting print settings. But I probably won’t keep track of the next ones either.
New 5-lug wheel hub
Hub mounted in the wheel
Electronics
The brain is a SpeedyBee F405 WING running ArduPilot Rover firmware. It’s a flight controller, but ArduPilot doesn’t care that I’m on the ground. GPS comes from a Matek M10Q-5883 module with a built-in compass. RC control uses ExpressLRS protocol. Low latency, good range, and if I mess up the autonomous navigation I can take over manually.
Power is two 3S LiPo batteries, 15000mAh each. That’s 333Wh total, which should be enough to deliver a lot of beer before needing a recharge. Laying everything out on the garage floor helped me figure out what size enclosure I’d need.
Planning the electronics layout on the garage floor
Enclosure with heat inserts installed
Inside the enclosure, I designed caddies for the batteries, flight controller, and ESCs. Each component velcro-straps to a caddy, and the caddies screw into the enclosure where I added heat inserts. It keeps everything modular and easy to swap out when I inevitably fry something.
Enclosure with batteries and ESCs installed in caddies
ArduPilot configuration was its own adventure. I spent three days figuring out that “Roll” controls steering in rover mode, not “Yaw” like you’d expect. The motors use SERVO function 70 (throttle), and steering uses function 26 (GroundSteering). Now it makes sense. At the time, it did not.
Dry fit of major components without wheels
Specifications
| Requirement | Specification |
|---|---|
| Payload capacity | 10 lbs |
| Target speed | ~3 mph |
| Terrain | Paved surfaces, sidewalks, curbs, grass, mild grades |
| Navigation | GPS waypoint autonomy via ArduPilot |
| Operating range | Multi-kilometer |
| System | Component | Details |
|---|---|---|
| Frame | 2020 aluminum extrusion | 24” x 18” bolted frame |
| Drivetrain | Brushed DC motors | Dual HOBBYWING QUICRUN 1080 G2 ESCs, 540 40T motors |
| Steering | Ackerman geometry | Zoskay DS3235 servo (35kg-cm torque) |
| Flight controller | SpeedyBee F405 WING | STM32F405 @ 168MHz, ArduPilot Rover firmware |
| GPS | Matek M10Q-5883 | GPS + magnetometer module |
| Power | Dual 3S LiPo | 15000mAh each, 333Wh total capacity |
| Wheels | Custom 3D-printed | 17cm diameter, 6.5cm width, 6000RS bearings |
| RC | ExpressLRS | Radiomaster TX12 MKII transmitter, BetaFPV SuperD receiver |
See Also
- CAD Models - Onshape renders and design views
- Design Notes and Calculations - Hand-drawn sketches and calculations