A heavy-duty robotic lawn tractor with interchangeable implements
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
I was able to contact a manufacturer in China via Alibaba to have some custom axle adapters made. They should be showing up in a few days! If everything goes well, I will let everyone know how they can order a set of their own. Stay tuned!
Lot's of progress has been made on Lawnny 5 since our last update!
First, I'd like announce that Lawwny 5 will be attending Open Sauce 2024 from June 14th - 16th! If you are going to be in the San Francisco area during those dates, drop on by and say hi to Lawnny and friends!
Speaking of friends... One of the difficulties in working with Lawnny 5 has been his size and weight— a 200+ pound robot careening through the house is anything but safe and friendly. So recently I decided I needed to create a smaller version of Lawnny so I could continue to develop software for him in the comfort and safety of my home office.
I found the perfect solution in the UGV-01 tracked robot from WaveShare— https://www.waveshare.com/product/robotics/mobile-robots/ugv01.htm. It did take a few days for it to arrive from China, but when it showed up I was pleasantly surprised. It was mostly fully assembled and the build and electronics quality were absolutely stellar. A huge bargain for $169 if I say so myself.
You will have to supply your own lithium batteries, but the ESP32 control board allows you to do a lot with it out of the box. If you want to utilize any complex custom software you'll need to supply your own Raspberry Pi and connect to the ESP32 control board either via wifi or directly via UART.
The beauty of this setup is that other than a slightly different motor controller driver, 99% of the code that runs on Lawnny Jr. will be the same that runs on his big brother Lawnny 5. Plus I don't need to worry about him punching a hole through a wall when he misbehaves...
I've always wanted Lawnny to have a personality of sorts, so I've had a lot of fun working on that over the past few weeks. To accomplish this, I've built a few separate ROS2 nodes to handle different parts of his personality.
Sound Engine
This ROS2 node does the following:
Because Lawnny is built in the spirit of Johnny 5 from the movie Short Circuit, it seemed only fitting lend him Johnny's lovable and iconic voice. ElevenLabs has an amazing voice cloning engine, and I was able to stitch together a minute or so of movie clip footage of Johnny's voice to train their TTS AI model. The results are pretty astounding for such a small amount of data— Lawnny will now say anything I want him to in the voice of Johnny 5.
Topic Scripting Engine
This ROS2 node does the following:
This ROS2 node is pretty cool and probably deserves to be released as a public ROS package. It essentially allows you to publish any series of ROS messages to any topic and to precisely control the timing and easing between messages. Here is an example of a script:
{
"topics": {
"cmd_vel": {
"topic": "cmd_vel",
"type": "geometry_msgs/msg/Twist"
},
"nav_mode": {
"topic": "nav_mode",
"type": "std_msgs/msg/String"
}
},
"duration": 3000,
"framerate": 100,
"keyframes": [
["0%",
["nav_mode", {"data": "DIRECT"}, "once"],
["cmd_vel", {"angular": {"z": 0.0}}]
],
["50%",
["cmd_vel", {"angular": {"z": 5.0}}, "easeInQuad"]
],
["100%",
["cmd_vel", {"angular": {"z": 0.0}}, "easeOutQuad"]
]
]
}
This simple script essentially does the following:
Of course this...
Read more »Made some create progress this week in adding more functionality to Lawwny 5 by starting to leverage machine learning and computer vision!
One of the goals I wanted to accomplish with Lawnny is to have him follow me around the yard without having to whip out a controller. I thought of the idea of using computer vision to recognize hand gestures and then to track my hand in realtime and that's pretty much what I've been able to accomplish this week.
I was able to accomplish this using a Luxonis Oak-1 Lite Camera (https://shop.luxonis.com/collections/oak-cameras-1/products/oak-1-lite?variant=42583148101855) and the excellent github project here https://github.com/geaxgx/depthai_hand_tracker.
Here is the basic way it works:
The PID needs a little tuning, but as you can see it seems to be working pretty well!
It's been a while since I've posted, but that doesn't mean that Lawnny 5 hasn't been a very busy robot. Here is an update of progress:
One of the reason's I haven't been posting as much is that the recent progress on Lawnny has been a bit boring, but also extremely encouraging as well. What I mean by that is that he has been doing boring, but very real and useful, work in the yard almost every weekend for a few weeks in a row now. Reliability has been stellar, and he's pretty much fulfilled all of my original goals for the project. Here are a couple of videos of him in action:
That being said, even though he's doing regular and useful work, I still have a lot more planned for him.
One of the jobs I do twice a year is to dethatch, aerate and fertilize, and as I was doing laps around the lawn a few weeks ago I had a sudden thought— why the heck am I doing this when Lawnny could be doing it? I have no idea why it didn't occur to me sooner. Anyway, because Lawnny is designed around trailer hitches and is meant to function identically to a ride-on mower/tractor it was an easy solve. Currently I'm looking at purchasing and hooking up one of these:
https://www.amazon.com/Brinly-AS2-40BH-P-Combination-Aerator-Spreader/dp/B09YCQFKQC
Should hopefully be an easy hookup, and will post some video soon.
This has been a lot slower going than I would have ever thought. The main reason behind this is the sorry state of affairs for robotics simulation for people on Mac machines. I decided very early on that I wanted to do a lot of autonomous software development using simulations before I got anywhere near doing it in the real world, so I knew getting a reliable simulation environment up and running was going to be super important. What I did not realize was how ridiculously bad support is for doing this on an Apple Silicon. It's a long story which I may write about in the future, but at this point I have to run a virtual machine within a virtual machine (Docker running in UTM) in order to get anything to work, and it's still very flaky. And worse, it took me nearly a month to get to the point of even being able to run a simulation. As for simulation environments I've chosen to use Webots— Gazebo just seems overly janky to me.
<small_rant>I have to say that my experience in open-source robotics software over the past few months has been anything but pleasant, and it shows how ripe this area is for disruption. Obviously I can't complain— I'm using free software that people are spending their free time building— but it's just surprising. When you compare the open-source robotics ecosystem to something like open-source web application frameworks (the stuff I'm used to) it's striking how far behind robotics is. Granted, robotics is a much more complex problem than building web apps, but even the newest of web frameworks seems lightyears more refined than some of the most mature robotics projects. After learning more and more about the robotics industry during this project I suspect it really just has to do with economics— very few robotics companies actually make money and VC investments are becoming harder and harder to get. But I am convinced this will change eventually when we hit an inflection point, but who knows how long that will take.</small_rant>
I've decided that my first step towards autonomy will be to use my Luxonis Oak-1 Lite camera, and the amazing work of this repo https://github.com/geaxgx/depthai_hand_tracker to be able to get Lawnny to follow me around the lawn using hand signals. Here is a basic idea of what I'm thinking:
We've taken the first steps towards autonomy!
As most of you know by now, the ultimate goal for Lawnny is to provide some amount of autonomous functionality. But even though I want to automate as much as possible I don't want to lose the ability to control him manually, so a hybrid control system would have to be implemented.
The easiest way to accomplish this would probably be to leverage an off-the-shelf flight/rover controller— something like an Ardupilot. With this, I could control Lawnny autonomously with the flight controller, but then maintain the RC transmitter/receiver combo to override the FC when I wanted to control it manually. I did a lot of research into flight controllers, and long-range data links, but ultimately decided to start simple— control the robot directly from the Raspberry Pi through standard wifi.
Here are a few of the reasons I chose this route:
So with all of this in mind, I figured that a standard wifi connection would be the cheapest and easiest solution. But it does have some drawbacks— mainly relatively low range.
Because out-of-the-box wifi has relatively low range, I figured I would have to deal with potentially two bad scenarios:
Addressing the Bad
The way I'm addressing this is to implement two wifi radios. I've added a wifi dongle to the Raspberry Pi with a removable antenna. This antenna will be extended to run outside of the metal enclosure box and should provide a relatively stable connection to the wifi in my house. Obviously this wouldn't work if you had many acres of land, but my home wifi reaches most parts of my yard without any problem.
That being said, there is the chance that the wifi connection for this main USB-based radio could become weak or non-existent in certain parts of the yard, so that is where the second wifi radio comes in. The onboard wifi radio on the RPI is set to be a wifi hotspot. So if for some reason I lose connectivity on the shared wifi, I can just walk up near Lawnny with my phone and connect to its built-in access point and control it directly from there. This should work in theory, but only time and testing will tell.
Addressing the Downright Ugly
Out of the two problems this is by far the worse, so I had to go deep into "brain stem" of Lawnny to address this. The way I solved this was to employ the timeout functionality in the Sabertooth motor controller.
By default, the Sabertooth motor controller will continue to run the motors at the speed of the last command it was sent. For obvious reasons this would not be optimal if the controller became disconnected from manual control via wifi. So to address this, the controller has what is called a timeout mode. The timeout mode will continue to run the motors for only a short amount of time and will automatically stop unless it receives another command. So it acts a bit like...
Read more »There was one benefit to the unfortunate RUD (rapid unscheduled disassembly) of my motor controller in my last build log— it gave me an opportunity to spend some time on quality of life improvements.
Lawnny is an outdoor bot, so at some point I was going to have to deal with the potential of rust on his steel frame. While he was disassembled it felt like a good time to lay on a coat of paint. For this I chose spray-on truck bed liner, but if he lives past a single season I will probably upgrade him to powder coating.
Lawnny's original control box was just an outdoor electrical junction box that I picked up from HomeDepot. It was big enough to hold the initial "dumb" (aka RC) electronics. However the end goal is to make him partially autonomous, so I knew I was eventually going to need more room.
I looked around quite to find an off-the-shelf box, but really never found the right solution. So I decided to just weld one up myself. I'm still relatively new(ish) to welding so it was a bit of a pain, but ultimately I ended up with something I could almost stand to look at.
I'm a software engineer by trade, but a hardware enthusiast at heart. So I really do appreciate the artistry of a beautiful wiring job and also enjoy putting in the time to make things look neat and tidy. Unfortunately the time I invest never seems to end up looking how I imagine it— but at least I try.
Anyway, here is my best attempt...
A few of the most notable changes:
I also plan to add the following when the parts arrive this weekend:
Anyway, that about sums up the major quality of life changes, and Lawnny is once again up and running after our last mishap!
I think he looks slightly more svelte than last time, would you agree?
Well the first setback occurred, and boy was it spectacular... I wish I had a video of it.
My very expensive Sabertooth 2x60 shorted out and caught fire. And not just like a bunch of sparks, but literally caught fire to where I started to run and grab my fire extinguisher. But luckily at the last second the fuse tripped and stopped it from getting out of control.
Well I'm still not 100% sure, but maybe some folks here have an idea. First of all, I don't think it was an issue with the Sabertooth controller, because it happened after I made some changes to wiring, so it's more than likely 100% my fault.
One of the things I've been wanting to do is to be able to monitor my voltage remotely from my radio transmitter so I can start to calculate how much battery life I'm going to get out of Lawnny in real working conditions. My Spektrum receiver has a voltage sensor port which it uses to send telemetry to the transmitter, so this seemed like a perfect solution.
Spektrum sells a battery sensor cable for $12, but after looking online I found that it's just a standard JST ZH connector and I could buy 12 of them for $8. Seemed like a no-brainer.
From everything I could read online, this voltage sensor port is capable of handling up to 24v, so it seemed like I should just be able to hook it up in parallel to the battery and be done with it. The closest and easiest place I could hook it up was at the battery positive and negative terminals on the motor controller.
Now I wasn't fully sure if the JST ZH connectors I ordered were properly colored for the positive and negative inputs on the receiver, but I figured in a worst case scenario that I would just get a negative voltage reading instead of a positive one and would have to swap the wires around. So rather than clamping the wires into the terminals I figured I would just hold them against the terminals by hand like I would my multimeter. This may have been the fatal flaw...
When I switched on the power I immediately saw huge sparks and a fireball surrounding the motor controller, followed by a scream of "Noooooooooooo!!!" (I think that was me). I immediately removed the wires, but it kept sparking and shooting flames. After what seemed like a long time (even though it was probably only 5-10 seconds), I started to run for the fire extinguisher, and a moment later it stopped. I suspect that's when the 60 amp fuse finally popped.
Did I hook up the voltage sensor backwards? This is my working theory, but I'm still not sure why that would have caused the motor controller to go up in a blaze— if I hook up my multimeter backwards, it doesn't cause things to blow up. If anything would have gone up in smoke my guess is that it should have been the receiver.
The only thing I can think of is that maybe the BEC circuitry in the motor controller (which powers the receiver) shares a common ground with the high power motor ground. By hooking it up backwards I suppose I created a short across the motor controller, and the reason this is different than hooking up my handheld multimeter backwards is that my handheld doesn't share a common ground with the battery and controller. What do you all think?
The second question: what took the fuse so damn long to blow? The fuse for the motor controller is this: https://www.amazon.com/dp/B08LYG7ZYF.
Did this short draw less than 60 amps? I doubt it— the fireball I witnessed seems to beg to differ.
Maybe the fuse is more of a slow-blow type? Maybe it's just a cheaply made Chinese part and doesn't work well? Who knows, but I don't think I can trust it and will need to find a better replacement.
Anyway, it was a setback, but not worth crying over too much. Within 10 minutes of the accident I painfully shelled over another $200 for a new motor controller, and figured it'd be a good time to take...
Read more »
In order for Lawnny 5 to live up to his name, he really needs to learn how to mow the lawn. So for the past few days I've been working on connecting him up to my 30" Toro TimeMaster lawnmower.
Here are the early results of this work:
As you can probably tell, Lawnny appears to have no trouble slinging this beast of a mower around, and it's starting to take the shape of capable lawn tractor.
A portion of my lawn has a roughly 20° slope, so my first concern before investing a ton more time into the project was to find out if Lawnny was capable of pushing this chonky mower (150+ lbs) up that slope. This 30" mower is about as big and heavy as it gets for a residential walk-behind mower, so I figured if it could handle this beast it would be capable of handling just about any other mower you could throw at it.
To run this test I started as simple as possible— I put the mower at the bottom of the hill, pulled up Lawnny behind it and simply nudged it up the hill. It pushed the mower up the hill without even a hint of a struggle— absolutely no change in motor RPM. Even better, it appeared to have plenty of traction on the wet lawn and didn't leave any marks. This resounding success meant I could now invest the time into making a more permanent mount.
By now you probably know that Lawnny is based on an attachment system built around 2" hitch receivers. But how to you connect a 2" receiver to a piece of equipment with wheels?
Like everything else with Lawnny, I wanted the mounting system to be as versatile as possible, so I defined the following requirements for it:
Addressing requirements 1 and 2 were simple— attach the frame to the wheel axles. The entire weight of the machine is already supported by the wheels, so I know those mounting points are going to be strong enough. And the deck height of the mower is adjusted by changing the height of the wheel axles. It was a no-brainer decision.
Requirement 3 was a bit more complicated. I contemplated all sorts of ideas and one of the first that came to mind was to use something like Unistrut. But my rudimentary and error-prone organic physics simulator (my brain) ran some virtual simulations and determined that the Unistrut probably wouldn't be stiff enough (specifically in the torsion axis).
I started to imagine other things that were easy to adjust yet capable of handling extremely heavy loads, when it hit me— a forklift. With this in mind I set out to create a mount that could be adjusted like a forklift, and this is what I came up with:
The "forks" (the supports in this case) can slide from side-to-side to accommodate equipment of differing widths, and are held in place with some simple set screws. The supports can then be attached to the equipment frame via any means necessary— in this case (at least at the moment) they are attached with some u-bolts.
You'll also notice from the picture above how the frame of the mower attaches to the wheel axles and is easily removable with a few nuts and bolts to return the mower back to original.
Also notice how the adjustment levers for the mower deck are easily accessible. To keep those levers free of interference with the frame was a bit of a challenge, and frankly the right-angles aren't exactly structurally optimal. But the frame is surprisingly stiff already, and a few more added supports should shore it up to be pretty bulletproof.
Now that I have a mounting system which is able to...
Read more »One of the goals I have for Lawnny is for it to be able to move my boat into its parking spot behind my house. While it is possible for me to back it in directly with my vehicle, it's an extremely tight fit and the margin for error is just an inch or two on each side. Because of this, I generally park it by pushing it in by hand. Because I have a relatively flat driveway, amazingly it is possible to push the 2,500+lb boat trailer by hand, but it's not exactly fun.
I'd like to mimic a trailer dolly, similar to this:
But instead of pushing it, I want Lawnny to do the work for me.
Now there are a few major concerns here:
Success: 🟢
After my experiments today, I can say..... it will not! I wasn't really worried about the frame— the 2" receivers are made from 1/4" steel and would probably support a 747. I was mostly worried about the motor axles. The treads are connected directly to the motor axles with no support from a pillow-block on the frame, so the motor axle itself is pretty much taking all the load. The other issue is that the treads are offset quite a bit away from the motor, and this creates a lever-arm which increases the force load on the axles. I was extremely worried they would just snap or strip a gear.
Apparently they've taken this into account when building these mobility scooter motors (probably thanks to the obesity epidemic in America), because there was absolutely no issue taking the weight. I think the tongue weight on my boat trailer is around 350 lbs, and it seemed to barely register when I lowered it on the ball hitch.
Success: 🟢
Yes. It was able to get the boat moving without any trouble. Buuuuuut there is more to the story below....
Partial Fail: 🟠
As you can see here, it did not.
But I'm going to say it wasn't a completely fair test. This part of the driveway is slightly uphill, and I was starting from a complete stop (no momentum) and the ground was wet from rain.
Fail: 🔴
As you can see from the following video, I did not...
Remember above when I told you I got the boat moving? Well I didn't really think about stopping it...
So I'll start out by saying that I was very aware up front that Lawnny would have trouble towing from this position if he moved in reverse— there is nothing to stop him from tipping over the front. My solution to this problem was always going to be "When towing: don't drive in reverse. if you need to go backwards just turn Lawnny 180° in the opposite direction and move forward". You can see this working in the first video.
But what I didn't account for was the cruel mistresses of inertia and gravity. Lawnny can get the boat moving without any trouble, but when Lawnny wants to stop the boat, the weight of the boat and the slight slant of the driveway say otherwise. It's pretty much the same as if Lawnny started to back up, which rendered my so-called solution useless.
Anyway, I'm starting to think that towing such a large trailer may not be the best idea. I think I could solve the tipping issue by putting another set of wheels in front— which is super easy to do because of the modular nature of the hitch receiver frame— but it won't solve the braking problem. Luckily my driveway is relatively flat so I'm less worried about gravity running away with it, but the inertia problem still exists.
At the end of the day I'm still interested in getting this to work, but I'm going to tread lightly— I don't want a 2,000 lb boat careening down the neighborhood street dragging a helpless robot along for the ride.
Wish I could say it was an eventful experience, but it worked almost perfectly the moment I put power to it. I was pretty nervous powering it on because of the weight of the bot and power of the motors— it could do some serious damage.
Only thing I had to do extra was remap the forward/reverse channel to the elevator channel on my transmitter so that it controlled more like a joystick. I also had to set the failsafes in the receiver so it would default to stopping instead of going in reverse if/when the transmitter became disconnected.
Anyway, I kind of expected it to take a while to get the system debugged, but it works so well that I’ll probably be ordering my cameras and sensors and get to writing some software to make it autonomous.
Create an account to leave a comment. Already have an account? Log In.
Nice timing -- I too have need for a powered trailer dolly. Those scooter motors are spendy, though, at least new. Did you ever look at cheap Harbor Freight winches? They're basically DC motors with planetary gears; they don't have the 90-degree setup that your scooter motors have, but they should be self-braking.
And I agree -- the treads are cool! In my case, they might actually be necessary too -- I've got to move a trailer over loose gravel.
That's a great idea on the winches— will definitely look into it as an option.
Become a member to follow this project and never miss any updates
+1 for the Harbor Freight winches, they come apart pretty easy (just a lot of large Torx screws), and are easy to interface with a 12v supply. I've used a wireless controlled 2000 Lb rated one in a project. The self-braking feature on the motors has been great.