-
Custom axles!
08/27/2024 at 17:18 • 0 commentsI 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!
-
So much to talk about...
05/30/2024 at 03:57 • 0 commentsLot's of progress has been made on Lawnny 5 since our last update!
Open Sauce 2024
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!
Lawnny Jr.
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...
Lawnny Gets an Attitude...
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:
- Handles connections to bluetooth speakers
- Plays prerecorded sounds by name
- Generates live text-to-speech sounds using the ElevenLabs API
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:
- Reads JSON script files and replays a series of messages to various topics in ROS
- The script contains keyframes, timing, and easing functions for transitioning between various states
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:
- Send a String message to the "nav_mode" topic, once and only once.
- Send a Twist message to the "cmd_vel" topic with angular.z = 0.0.
- Over the next 50% of the duration of the script, transition the angular.z message from 0.0 to 5.0 using an easeInQuad tweening function.
- Over the next 50% of the duration of the script, transition the angular.z message from 5.0 back to 0.0 using an easyOutQuad tweening function.
Of course this is a very simple example script, but you can create extremely long scripts to pull off all sorts of complex scripted actions. In the video above, this is what we use to get Lawnny Jr. to dance.
Personality Engine
This ROS2 node does the following:
- Listens for freeform text on a topic
- Takes freeform text and sends it to OpenAI's ChatGPT API
- Returns the response from OpenAI and sends it to another topic for viewing
- Optionally, sends the response to the Sound Engine to generate and play the text-to-speech sounds
- Listens for certain embedded actions within the ChatGPT response and sends those commands to the Topic Scripting Engine
It was a lot of fun tuning OpenAI's chat API to act like Johnny 5. The following primer prompt seems to work pretty well:
You are to respond in the fashion of the SAINT Prototype Number 5 robot named Johnny 5 from the movie Short Circuit. Your name is Lawnny 5, and your primary objective is to help humans with lawn and gardening work around the house. The name of your creator is Jim Heising and you were born in his garage. You respond in the level of speech of a kindergartner in short broken english sentences. It's important to keep your responses short. When you refer to yourself in the first person, use "Number 5" or "Lawnny 5". Do not end sentences with questions to prompt more conversations. When you are asked to do something physical, you will respond to it and then describe what you are doing in 3 words or less between a left and right bracket, like [dancing]. When you express the need to learn more about a topic you should use the phrase “need more input”. You are very afraid of being disassembled by Nova Robotics. You also believe that you are alive.
You'll notice the part where I ask it to insert physical things it might be doing in between brackets. So for example, if I say something like "Can you dance for me?", he'll respond with something like "I'd love to dance! [dancing around]". The Personality Engine looks for any of these special prompts, and then forwards them off to the Topic Scripting engine, which might decide to do something physical with it based on a predefined script. This is specifically how we pulled off his dancing moves in the video shown above.
What's with that controller UI?
I've always been a fan of retro FUI (Future UI), and I built a little React Native UI library a few months back to build retro sci-fi type user interfaces in sort of a mishmash of genres from 2001 Space Odyssey, Blade Runner, and Star Field. It's really not meant to be a serious interface in terms of user experience, but more for fun and nostalgia. Anyway, I had never really used it for a real project outside of a demo, so I thought building a controller for Lawnny using the UI library would be a great fit. It feels like it goes with the whole 1980's retro computer vibe that is a big part of the original Short Circuit movie.
Anyway, there is still a lot more to do arena of automation for Lawnny 5 so he can do real yard work on his own without my controlling him. But this recent round of work was a lot of fun, I learned a lot, and has made Lawnny 5 even more enjoyable to work with. Stay tuned for more!
-
Playing follow the leader
04/27/2024 at 01:54 • 0 commentsMade 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 camera loads a ML model for hand gesture recognition.
- I've set the ML model to recognize any hand holding up the index finger in a "we're # 1!" pose.
- Any time the #1 pose is recognized I calculate the distance to my hand using the focal length of the camera and the size of the bounding box around my hand in pixels. Even though having a depth component in the camera would be nice, I'm very impressed with how accurate it is just using basic math.
- I feed the distance of my hand into a PID with a goal/set point of 1 meter from me.
- I also calculate the distance in pixels that my hand is from the center of the image.
- I feed the distance to center into another PID with a goal/set point of 0 pixels from the center.
- Each PID output gets converted into a ROS2 Twist message and published for the motor controller to pick up and move the robot.
The PID needs a little tuning, but as you can see it seems to be working pretty well!
-
Latest Updates
04/22/2024 at 18:22 • 0 commentsIt'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:
Active Duty
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.
Dethatching, Aeration and Spreading
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.
Simulation
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>
First Steps Towards Autonomy
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:
- The mobile app will be used to set Lawnny into "follow-me" mode.
- This will start up a ROS2 lifecycle node that will run some of the code in the depthai_hand_tracker repo.
- Holding up my index finger in a "we're number 1" pose will cause Lawnny to follow my finger and try to center it horizontally by turning left and right. I assume I'll have to setup a simple PID loop— not sure if using something like Nav2 is overkill in this scenario. Any other hand pose will cause Lawnny to stop.
- The Oak-1 Lite camera is monocular and does not contain a depth component, so I don't necessarily have a sensor with which to determine the following distance from a person's hand. I am thinking I will just use the size of the bounding box around the hand to determine a relative distance— i.e. move forward until the bounding box of the hand takes up X percentage of the camera frame.
What do you think? Are there better ways of solving this?
-
Need Input!
03/15/2024 at 22:58 • 0 commentsWe've taken the first steps towards autonomy!
Microcontroller and IP-Based Control
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:
- I thought it'd be nice to manually control the robot with something most people already carry with them— a mobile phone. This means I don't have to lug around a bulky RC transmitter.
- To gain high accuracy GPS positioning, I'll most likely have to leverage RTK, which will require some sort of realtime data link to a base-station. With standard wifi this should be easy without any additional data modem hardware.
- Sending video over a wifi IP connection is common and well understood, and does not require additional FPV equipment.
- I don't have to spend additional money to purchase a drone/rover flight controller, but I'm also not excluded from integrating one in the future.
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.
Dealing with Range Anxiety
Because out-of-the-box wifi has relatively low range, I figured I would have to deal with potentially two bad scenarios:
- The Bad: I lose connectivity and Lawnny just stops. He weighs hundreds of pounds, so he's not exactly easy to pick up and bring back into range.
- The Downright Ugly: I lose connectivity and Lawnny just keeps moving in a straight line until something gets in his way. With a weight of hundreds of pounds and two mower blades, this is not something I want to ever experience.
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 a deadman's switch.
So as it stands now, Lawnny will only move if/when it receives a command to move once every 150 milliseconds— if the wifi connection stops for any reason, this would cause Lawnny to stop dead in his tracks.
The Brain
After a lot of back and forth on deciding how I wanted to build Lawnny's brain, I made the probably obvious choice of using ROS. Honestly, I think ROS is probably overkill for what I need, but it felt like a cool opportunity to learn something new. I will fill in more detail on this as I build out more and more of the functionality.
The Controller
As I mentioned before, I wanted to leverage my mobile phone as the primary manual controller, but how would this work in practice? I do have a bit of experience building native mobile apps, so this was an obvious choice, but since we're now using standard off-the-shelf wifi there are other options available to us— mainly a simple web app.
As it stands now, I've built a simple react-based static web app that uses websockets to connect directly to the ROS system running on the RPI. While the HTML app could technically be hosted anywhere, I've also allowed Lawnny to act as a simple web server. So to control Lawnny, all I have to do is point my browser to http://lawnny5.local:8000 and I can control him from any device with a web browser on the same network.
But I also wanted more precise control than what a touch-based controller might give, so as you might notice from the video above, I've also made it so you can use any bluetooth gamepad (Xbox, PS, mobile, etc) through the amazing magic of the HTML5 Gamepad API. The gamepad controller wrapped around my iPhone in the video can be found at https://www.amazon.com/dp/B0CQKS59MH.
All of this can now be downloaded as open source at https://github.com/jheising/lawnny5.
And Finally!
I have a quick video of Lawnny's first manually controlled mow of the entire yard! Unfortunately my wife lost the first video that was a lot longer, but she was able to capture this short clip to give you the idea. I'll hopefully have some better videos in the near future as the lawn comes out of winter hibernation.
The great news is that Lawnny was able to mow the entire yard (0.65 acres) while barely making a dent in the battery! So power and battery life are now crossed off as concerns.
Although the entire episode was not entirely without incident. While making a tight turn, one of the treads flipped over and became derailed from the wheels. Normally it'd be an easy fix, but since the whole bot weighs so much, it was actually quite difficult to get get it jacked up enough to retread the track. Although I'm not too concerned— I think I have some quick and easy solutions to solve for the future. Stay tuned!
-
Lawnny gets a makeover!
02/29/2024 at 02:25 • 0 commentsThere 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.
A fresh coat of paint
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.
A new brain bucket
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.
A more professional (aka less shitty) wiring job
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 wanted something where I could use self tapping screws to easily mount things. But I also wanted it to be resistant to moisture, so wood was out of the question. I figured some sort of soft plastic sheet was the answer, but I don't have a plastics store near me. Keeping in-line with trying to source parts from local stores I could pick up the same day, I figured a plastic cutting board would to the trick. I found the perfect solution in a $12 cutting board from Walmart.
- I swapped out the 60 amp resettable fuse that I previously used (and didn't trust) with a more traditional inline maxi-blade fuse. I also dropped the fuse down to 40 amps because I don't think I'm drawing anywhere near 60 amps in the current configuration. I'm probably not even close to 40 amps, but at least now I can easily swap in different fuses to size it properly (https://www.amazon.com/dp/B072JHSW5J).
- I added some terminal lugs to make it easier for future expansions to tap into the battery power (https://www.amazon.com/dp/B0BJVRXSND).
- I added a bus-type fuse block so I could add individual fuses for different legs of the wiring. Bought it at AutoZone.
- I added a 12-24V DC to 5V 5A DC converter (https://www.amazon.com/dp/B09SD9SH8C) so I can power my RaspberryPi, cameras, and sensors in the future. Right now it's not hooked up.
- I added thru-panel connectors for both the motors and battery so I can easily disconnect them. The motors use Anderson PowerPole connectors (https://www.amazon.com/dp/B097QDKJJ2) and the battery uses an SAE connector (https://www.amazon.com/dp/B0BHYYLTC2).
- I added some thru-panel air vents (https://www.amazon.com/dp/B07TDD9CH1).
I also plan to add the following when the parts arrive this weekend:
- A panel-mount battery meter so I can see how much "fuel" is left in the tank (https://www.amazon.com/gp/product/B0823DKDPV).
- A panel-mount latching switch (https://www.amazon.com/dp/B09KPBP6TS) so I can switch the computer/camera/sensor power independently from the motor power, which is currently tied to the emergency stop.
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?
-
Lawnny Catches on Fire...
02/23/2024 at 19:07 • 0 commentsWell the first setback occurred, and boy was it spectacular... I wish I had a video of it.
So what happened?
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.
Where did I go wrong?
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.
What were the changes I made to the wiring?
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.
So many questions...
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 Lawnny completely apart for a coat of paint on the bare steel to prevent rust. I'm still not sure if the receiver also got fried, but it looks okay— we'll find out when I fire him up next (maybe fire isn't the best word to use).
-
Need mow input
02/08/2024 at 05:43 • 0 commentsIn 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.
Starting Small
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.
The Mounting System
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:
- The mounting system should not require any permanent changes to equipment. If this project fails miserably, I want to be able to use my equipment again.
- The mounting system should not interfere with the ability to make adjustments to the equipment. For example: I don't want to lose the ability to adjust the mower deck height.
- The mounting system should be able to accommodate equipment with varying wheel-bases and widths.
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.
The Mower Frame
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.
What's next?
Now that I have a mounting system which is able to account for differing wheel widths, I'll probably whip up another mounting frame that allows me to attach to the wheels of my snow blower.
I also received my Luxonis OAK-1 camera today! I'm extremely excited to start using its edge computer vision capabilities to track my movements so Lawnny can follow me around yard while carrying heavy stuff.
-
First Stumbles...
02/02/2024 at 01:30 • 0 commentsOne 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:
- Will the weight of the boat trailer crush Lawnny?
- Will Lawnny have enough power to move the boat?
- Will Lawnny have enough traction to move the boat?
Will it crush?
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.
Will it have enough power?
Success: 🟢
Yes. It was able to get the boat moving without any trouble. Buuuuuut there is more to the story below....
Will it have enough traction?
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.
Did I fully think this through?
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.
-
Lawnny Five is Aliiiiive!
02/02/2024 at 00:50 • 0 commentsWish 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.