So, um, robot!
It seems we have neglected this build thread, and all of a sudden the competition is over for us. Yes! Unfortunately, somewhere in that story, we are not going to worlds.
We have been doing a lot of documentation on the Open Alliance discord (great place), so I wouldn’t say we’ve been completely negligent. However, we can’t forget about everyone who isn’t there, so without further ado, here is a summary of everything that has happened since January.
Drive train & Frame
Starting from the bottom, we’re using a Max Swerve drive train, 25 by 25 inches. Per our programmers’ request, the swerve drivetrain had to be square. Since this is basically our first time with swerve drive, our programmers wanted to keep it as simple as possible. None of that rectangular swerve stuff.
Adding frame perimeter rules, the biggest we could make it was 30x30, but we decided to go a bit smaller. The idea was that a smaller robot could fit on the charge station more easily, and that did seem to be true once we arrived at the competition. However, once we put the robot together, the small wheelbase was likely a big reason why we had trouble with falling over so much.
We tried to fix this by adding weight in the form of steel bars to the front of the robot, but we mostly just had to get used to driving more carefully, and the problem really never fully went away.
Looking at the wheels, we originally used the rubber/plastic ones suggested and provided by REV. That seemed to be a bad idea.
These wheels wore down quickly, and the tread tended to just fall off after a while. While we brought a plethora of extra wheels, the time needed to replace them was annoying. Even after reinforcing the wheels with some rivets, they tended to fall apart pretty quickly.
Instead, these treaded aluminum wheels from the thrifty bot were much nicer. They are so close to being too big to fit, and they did wear down, but they lasted an entire competition without delaminating! In the future, I would definitely recommend using these wheels.
Bumpers
Moving up, bumpers! Or really, I should say bumper. This year we tried 2 things that our team had never done before, one-piece bumpers and reversible bumpers. Putting both of those together, we only need one bumper assembly to display both red and blue!
This was super convenient. After weighing the robot without the bumper during inspection, we could bolt the bumper on and forget about it. With the reversible bumper, switching alliances are a quick flip away, and the one-piece bumper was super strong and never fell off.
The only problem with the bumpers this year is they tended to get ripped and needed to be repaired. I assume this was always a problem, I just find it weird that I never noticed it before. Maybe it was the way I made it, maybe I noticed more because I was the one repairing the bumpers, or maybe we just ran into peculiarly sharp field elements more often this year. One thing is for sure: I got noticeably better at sewing this year.
Electronics
Didn’t do anything crazy with custom electronics or something, but we’ve got some neat organization.
We put most stuff onto a piece of Lexan attached to the frame. All of our Spark Maxes were attached to rails above that, which let us access the power, CAN, and encoder lines more easily. Shout out to Team 5406 Celt-X, who designed the 3D-printed mounts we copied and adapted for securing the Spark Maxes and various Wago terminals to Din rail: Celt-X FRC Din Rail Mount Collection by CeltXRobotics - Thingiverse.
Most interesting, we used a sort of branching CAN setup (not exactly like the image below, but close). All of the Spark Maxes were on separate branches, with the idea being if any of those CAN lines went bad, the rest of the system would be okay. However, the CAN branches have a maximum effective length, so the Falcon at the top of our robot had to be on the main line between the RoboRIO and PDH.
Elevator
The first part of our intake system is this elevator. It moves up and down, powered by one motor and some chains. For the motor, I think we started with a NEO, but that didn’t have enough power, so we tried a Falcon, and that must have also not worked because we got a 100:1 gearbox for it. We stuck with the Falcon until one of the two we were using broke (more on that in the Competitions section). Since we only had two Falcons, we had to switch back to a NEO, which with the bigger gearbox seemed fine.
The elevator is primarily mounted to the frame via two bolts going up into tapped 80-20 extrusion, with additional cross bars to keep it vertically level. The elevator is kinda up on a platform to give it some extra height.
The initial reason for the elevator was to help us reach different places better. However, when that Falcon broke, we had to play for a bit with the elevator locked in place. We discovered that was fine. However, at that point, it was too late to make big changes, so we just fixed it and continued the same. We did use the elevator to help us start autonomous, but after that, we would just keep the elevator at its lowest position to help not fall over so much.
Arm
Moving up, the arm. It is a combination of the Andymark Climber-in-a-Box we used last year for climbing, a new ThriftyBot Telescoping Tube Kit we bought, and an old Swerve and Steer module thrown in as a pivot mount. There is a NEO with an 80:1 gearbox driving the pivoting and a Falcon with a 16:1 gearbox controlling the telescoping.
The arm is mounted onto the top MAXTube of the elevator with just an intermediate plate and a few bolts. At one point there was concern that the MAXTube wouldn’t hold up to all the weight and stress, but it performed very well. On the bottom tube of the elevator, there is also a ‘cradle’ assembly to stop the arm from falling into the electronics while the robot is powered off.
There was some trouble adapting these climber systems usually meant for vertical movement to a horizontal system. When the tubes are pulled sideways to the direction they’re moving, there is a lot of friction, which the constant force springs couldn’t overcome, so the arm doesn’t move out. A couple of modifications to the usual system though, and we made it work. There was also a lot of silliness with adding the pivot to the arm, but it worked out in the end.
There were another two problems faced with the arm. First, when falling over, the telescoping Falcon is the first thing to hit the ground. After a couple of falls, it seemed fine, but eventually, it broke. Since we only had two Falcons, we couldn’t easily replace it and had to steal the motor from the elevator. The broken motor also seemed to cause the CAN bus to freak out, causing us to miss a match while we were very confused. Second, the rope that pulled the arm in snapped once. It was the same rope that we used last year for climbing, so it was just surprising that it lasted so long. Luckily it did not snap at a competition, it just took a while to put the new rope in.
Claw
Last, but certainly not least: the claw. We ended with a pneumatics-based design, with two 5-inch pistons. Each piston is connected to its own solenoid; there is not one solenoid with both pistons attached via a junction. We did this so that each side would move at the same time, instead of the side with less resistance moving first. The claw is made of two hinged thin sheets of metal covered with cut-up compliant wheels. The flexible metal and rubber formed around cones and cubes, allowing us to pick them up with a strong grip.
The claw is simply bolted to the end of the arm. There is a large cable drag train to keep the pneumatic tubes contained as the arm changes length.
The only problem we had with the claw was that it occasionally got bent a bit too much, which made it harder to pick up game pieces. However, after the matches, we were always able to bend it back into shape, with only a little bit of leftover bend.
Programming
Not having programmed the robot, I can’t really say how the programming happened, but I can point out what it ended up doing. I think our code is somewhere in this GitHub repository, or maybe one of the forks, or maybe a branch. Anyway, here are some things the code did:
The driving was controlled by two joysticks, one for strafing and the other for rotating. Swerve drive, being holonomic, can move in any direction and rotate in any direction at the same time, and the two joysticks work well for choosing those two directions. The buttons on the joysticks control automated movements that align the robot at the double substation and grid for easy pickup and delivery. Another button enables our autonomous balancing system, which moves the robot in whatever direction it needs to level out the charging station.
The intake system was controlled by another controller. There are buttons for all the controls: moving the elevator up and down; moving the pivot up and down; moving the arm in and out; and opening and closing the claw.
We used a limelight 2.0 to see and align to the April Tags. Unfortunately, the image was a bit jumpy, so we had trouble making precise repeatable movements and occasionally had to fall back to manual control. We considered switching to the Photon Vision software but didn’t put enough effort in to make that work.
We used Path Planner to plan our autonomous paths. Unfortunately, we had a strange and persistent issue where the robot would not exactly follow the given path. It followed roughly the same path every time, but definitely not the path we told it to follow. Since the end result was consistent though, we didn’t bother fixing the root issue and just pushed through the process with trial and error, eventually stumbling upon paths that mysteriously sent the robot to the right spot.
In the end, we created decent autonomous for each of the starting positions. Every autonomous would start by delivering a cone to the high position, which was very consistent.
On the human-player side, we would exit the community and attempt to pick up a staged cube, then return and place it in the high position. We managed to get this autonomous pretty consistent on our practice field, but at competitions, it only succeeded about one-quarter of the time.
On the other side, the cable protector powering the charge station got in the way, preventing us from doing anything consistently after going over the bump. As a result, we only attempted to leave the community on that side. A better vision system that could see game pieces on the ground might have allowed us to correct for errors from going over the bump, but we didn’t attempt that.
In the middle, after delivering the high cone, we would dock and engage with the charging station. This was luckily very consistent and ended up being our preferred starting position. Unfortunately, with our tipsy robot, we didn’t attempt to leave the community over the charge station and missed out on those 3 mobility points.
Pit
While we have a separate thread for our PIT, it also wasn’t updated, so I’m including it here!
Overall, I really like how the PIT PIT turned out! The road case carried everything nicely and allowed us to have consistent organization at every event. We could also move it out of our main classroom over to our practice field, making it easier to work wherever the robot was.
Just one problem: the pit didn’t quite fit in our van. While measuring the van for size constraints, we missed two latches in the middle of the doorway that hold the back doors shut. Luckily, we could just barely squeeze the pit in once we removed the top lid. When we arrived we would just rivet the lid back on, and before we left we would have to drill out those rivets. One of our off-season projects will be fixing this, probably by taking an inch or so off of the PIT.
Competitions
Okay, finally! How did we do?
Week 3 - Alexandria
Our first competition was the week 3 Alexandria event at Hayfield high school. It did not start well.
We lost the first 5 straight matches, mostly due to falling down early in the match, and so not contributing much past auto points.
After figuring out how to drive without tipping (keep the elevator down, basically meaning we aren’t using it), we did a bit better. Our middle autonomous’s balancing helped us get the activation bonus ranking point, but the overall alliance performance wasn’t yet quite enough to get the sustainability bonus.
We ended qualifications 5-7-0, ranked 30/40. Luckily, other teams recognized that we had gotten past the tipping problem, and we ended up being the second pick for the 5th seed alliance, alongside 620 Warbots as captain and 4541 CAVineers as the first pick. In the playoffs, our alliance won 1 match in the upper bracket and 1 match in the lower bracket before being eliminated. So, despite our poor performance in the qualifiers, we ended very well!
Week 4 - Timonium
Our second competition was the week 4 Timonium event at Dulaney High School.
Qualifications went much better at this one. This was the competition where our telescoping Falcon for the arm broke during match 7. We missed match 16 because a very weird CAN bus error knocked out our drive train, perhaps due to the broken Falcon. We had to improvise for a few matches without telescoping before stealing the Falcon from the elevator and playing with the elevator fixed in place instead.
Overall, we ended qualifications 7-5-0, ranked 18/36. During alliance selection, we were the first pick for the 7th seeded alliance with 8726 CryptoHawks as captain and 1895 Lambda Corps. Unfortunately, we had a weird lingering issue with our swerve drive (I’m not really sure what fixed it) that messed up our autonomus and slowed us down. Our alliance ended up double eliminated in the first 2 rounds.
Week 6 - Chesapeake District Championship
Despite our challenges, we ended the district events ranked #46 in the Chesapeake district! That was good enough to go to District Championships at Eagle Bank Arena. We were looking forward to qualifying for this event because it is conveniently only about a 15-minute drive away. Maybe we got better, or maybe we were carried by other teams, but this event was awesome!
Qualifications went very well. There were no major problems, so it was just up to our performance. We consistently balanced in auto and endgame for the activation bonus. With the general quality of teams increasing, we were also able to get the sustainability bonus often. We certainly won more often, but even when we didn’t we still got one or two ranking points.
We ended qualifications 8-4-0 and ranked 13 out of 60 teams. We were very close to moving up to be alliance captains. If Alliance 7 just chose the 8th captain, I think we could have made the 8th alliance. Regardless, we were the second pick for the 6th-seeded alliance, with 1123 AIM Robotics as our captain and 1599 CircuiTree as the first pick. I’ll tell you though, those other alliances were crazy! We played well — about 130 points in each match — but the other alliances just played better, and we were swiftly doubled eliminated in the first 2 rounds.
Awards
Pretty important to note: we won the Gracious Professionalism Award at all 3 of our events! I personally question why they gave us the same award 3 times instead of recognizing other teams, but I have to say good job to the team for being so gracious-professional (or something), and big thanks to all the teams who mentioned us to the judges! We probably wouldn’t have qualified for districts without the extra points from these awards.
(I’m responsible for dropping the first one on the ground and breaking it. Whoops)
Very professional:
In the end, we ranked #23 out of the 139 teams in the Chesapeake district. That was super close to the 20 teams going to worlds, but unfortunately, we did not qualify.
Final words
So, that’s the recap! In hindsight, our design was quite tipsy, which definitely hurt our performance. We pulled it together though and managed to play among some of the best teams in the district. While this is like the most words I’ve ever written for a long time, there are definitely details I’ve left out, so if anyone would like to know more, definitely ask!
And to end, an excerpt from the OA Discord: