Team 997 Open Alliance 2024

Team 997: Open Alliance Introduction for 2024

Team Intro

We are CHS Spartan Robotics, Team 997, based out of Corvallis High School in Corvallis Oregon. We have been around since 2002, but being connected to a public high school we have a regular turnover of students on the team. This is our first time doing OA, however we have always left our code in the open, just follow our code link and look around. This thread will primarily focus on our organization. We are also members of FIRST Force, a confederation of 7 teams in the Mid-Williamette valley here in Oregon. Having this group of teams means that we can more effectively handle building game elements and hold off-season events with multiple teams in attendance.

We have also been know to host a local Week 0 Scrimmage event. FIRST Force teams work together to put on the event and give teams from all over Oregon the chance to test their robot with other teams on a full field. We also have some Robot inspectors available to both train them as well as give teams feedback on their robot while still having enough time to make repairs before their first event.

Our team has about 35 members, including 6 leadership members, 6 mentors (maybe more coming for build season).

1 Like

I am the current design lead on team 997.

This is our current solution for a hypothetical non swerve-friendly game. It is a west coast drive with large diameter wheels in order to get over obstacles that swerve wheels would get stuck in.

We are rebounding from being shut down for a week by an ice storm. Fortunately our amazing field build team was able to build the field elements for our scrimmage in just over one day. So our area FRC team have practice elements ready for when the robots are ready.
-Spartan Robotics Business Team

This year we tried a completely new kickoff method. After significant time and research we believe we created a system with significantly improved efficiency, communication, and documentation. This is a summary of the first two days of kickoff.

For our game analysis section this year we decided not to read the rules as a whole team but in smaller groups. The advantage of this is that it is significantly more efficient to have individual groups to dive deeper on one subject, rather than the entire team gaining a surface level understanding.

We decided to make a list of every action the robot could do. “This ranged from holonomic movement” to “have LEDs”. Overall we found around 50 possible actions. From there we moved to estimating difficulty to complete for mechanical, design, controls, and software. We found that this was a highly difficult year for software and controls compared to mechanical and design.

We also calculated cycle times for all scoring methods.


We found that the most effective scoring method was speaker and amp with a ratio of two amp scores to every one speaker score. However the most optimal scoring method is highly varied depending on what your alliance is capable of doing. We determined that the majority of other teams would do the speaker however, the worst case scenario for amps was significantly lower scoring compared to the worst case scenario for speaker. Because of the cooperative nature of the game, versatility is HIGHLY valued.
scoring analysis

In the endgame we determined the difficulty of the trap outweighs the point benefit (assuming we would have to trade trap ability for either amp or speaker ability). We also determined that it would be impossible to score trap without a climb, and that a speaker shooter could double as an amp shooter.

After gathering this information we can now start designing our strategies. We found that there were 4 main strategies.

  • Amp, speaker, climb, ground intake
  • Speaker, climb, trap, ground intake
  • Speaker, climb, ground intake
  • Speaker, climb, trap

Our vote went heavily towards amp, speaker, climb.

From there we decided on our must, should, could, and won’ts for every robot action according to the voted on design. This is what will guide the rest of our build season.

Our significant musts were

  • Swerve
  • Ground Pickup
  • Shoot against subwoofer into speaker
  • Shoot into amp

Our significant Shoulds were

  • Climbing
  • Short enough to drive through the stage.’

Our significant Coulds were

  • Trap
  • Shooting from other places (besides subwoofer)

Our significant wont’s contained mostly unnecessary software features.

3 Likes

I apologize for the radio-silence, I forgot that we were doing open alliance.

Our robot was inspired by the initial prototyping of RI3D Cranberry Alarm.

We decided that we would use an under bumper style intake because of the simplicity benefits. We used a frame extension to keep a square swerve layout and because of the increased intake width. We dubbed our cantilevered design “West-Coast Intake.”

We also used cranberry alarm’s shooter squish information to get our shooter geometry correct. We are using polybelt for our transfer from the intake to the shooter. This year we purchased the AndyMark Climber in a Box so that we can get climb cooperative points.

To score in the amp we will deploy a panel to cover the top half of the opening and shoot up into it. We don’t have that in CAD yet so I will post that later.

2 Likes

Mechanical has finished manufacturing the frame rails for our swerve drive, along with 3-D printing the swerve module covers and have begun the assembly of our robot. We manufactured the superstructure of our shooter and indexer to be attached to our drive base. We made a large fixture plate for one of our CNC mills. We have also completed CNC gearbox plates for our indexer. We have also completed our intake gearbox plates and will soon begin the assembly of our intake, we have had some trouble making these because of their size, so we had to re-orient them.

We chose to use the climber in a box because it’s simple, reliable and fast to design around, assemble, test, and refine. We were worried that when fully assembled it would extend past the height limit, however, it ended up being below it. Our hook has a slot that engages with vertical chain links to prevent slipping on the chain. For our shooter, we used the geometry from RI3D prototyping to speed up the design process. Double flywheel spin is variable and we have more power. Concerns have been raised that the polycarb plates could interfere with radio signals, which we have yet to test. we had to shorten the length of our neo shaft because it was too long to engage properly with the VersaPlanetary gearbox sun gears. We tried to get around this by printing a spacer but the keyway was too short for the VersaPlanetary Input Coupler.

We have finished the core part of the cardboard mockup, with all major components wired but no CAN. We have continued work on a battery-less test platform that supports the RoboRIO and Raspberry Pi, as well as adding support for Raspberry Pi (for vision) to our test Swerve robot. We have experienced some issues with encoder noise on Swerve modules, which appear to have been solved by updating SparkMAX firmware to 24.0.1 and replacing encoder magnets with independently purchased Rev magnets. We have dealt with issues with SparkMAX controllers not running motors from the Rev Hardware Client, which are best solved by powering off the robot, disconnecting power from the RoboRIO, and turning on power again. This means that CAN is still functional but does not receive instructions from the RIO.

Climber

We tried several different codebases and libraries, at the start we used YAGSL but had many problems such as jitter and non-stop spinning, then we switched to using a WPILib codebase developed by another local team, but we continued to experience similar problems. We were making little progress, so we decided to go back to first principles. To do this, we started a new codebase using RobotPy to make sure that we were able to perform basic actions on the modules and to isolate individual problems using unit tests in python. Unit tests and WPILib’s tests allowed us to isolate and eliminate problems with the swerve drive. Unit tests let us prove functions were working, so we could test our theories on the problem. At first, we were using what we learned from the python tests to try and debug YAGSL, but the python development soon outpaced the changes in YAGSL so we decided to consider switching our code to python long-term.
Swerve Jitter Swerve Swerve2
Software has also been working on code for the indexer and shooter, however they had some problems with trying to get the correct motors spinning when the sensor is triggered. They have also got code working for the climber, but had some problems with directories being mixed up and figuring out whether or not the motor was inverted.

4 Likes

I love this!!! I am happy you guys were able to debug it to this point! Good luck this season! I would HIGHLY recommend you carefully read through YAGSL if you’re going to reimplement your own stuff and just be very aware that stuff is there for a reason. Btw you should be able to do any Unit tests you made in Python in Java if you were wondering (i never bothered to make or test this though).

I wanted to thank you for all the help you gave us while we were looking for a solution to our swerve drive issues. It came down to another mentor having a significant amount of time to take the robot base home and just pound away at the issue. Since he is extremely familiar with Python, that is where he worked.

I do fully intend on coming back to the YAGSL when we have more time.

Thanks again for all the help.

1 Like

That’s the way to get it done! I am very happy for you guys!

Work with what you know if you can, your mentor sounds great for taking it on and will serve you well by the sounds of it!

Good luck this year!

This week the design team fully finished the robot design, adding our amp mechanism. Our Amp mechanism deploys and covers the top half of the amp to turn the amp into a pocket that we shoot into. This keeps our shooter very simple and allows us to develop things separately. The amp bar consists of an aluminum arm which is driven by a geared NEO, a second arm which is passive, and an aluminum plate. The amp bar sits on top of the shooter and indexer while not deployed, and swings clear of the rest of the robot. The only thing we need to finish designing are the bumpers which require a unique mounting scheme. We have to design our bumpers differently this year, since we’re making an under-the-bumper intake instead of a standard intake. Our full-range vectoring intake sits in front of the wheel base, but behind the front rail of the frame. In order to let notes under the front, our front bumper segment is raised up to the maximum height. This requires mounting brackets on different levels to achieve split bumpers. We were able to finish all our polycarbonate plates and put many of them on the robot, despite our router biting the dust. We worked a lot on the climber this week, since we came across some unexpected issues related to keeping the climber sturdy and in place to hold the robot, after being deactivated. Currently, the NEO motor coasts once the power is cut, and the climber extends. We also designed a stand and holder for our raspberry pi that we nicknamed “The Lighthouse”

This week the mechanical team worked on some of the last parts for our robot. We made a few gussets, brackets, panels for electrical components to mount on, and some large polycarbonate plates for our shooter and indexer. We also assembled the intake and indexer on our robot and finished our Climber in a Box assembly. We made some small adjustments to our indexer after testing, removing 2 of our green compliant wheels to prevent notes from jamming in the corners. We also began assembly of our shooter. We had some issues making the polycarbonate plates on our OMIO CNC router. The Y axis isn’t holding its calibration while making parts, so our bearing holes came out more like bearing ovals, and parts can be off by up to half an inch. We have not been able to find the cause of or solve this issue, so if any other teams have experience with this, please reach out. We were able to work around this issue with the help and equipment of one of our sponsors, CMTD. We were able to make the parts on their CNC mills instead of our router. During assembly, we had some issues in alignment between bolt holes, but we were able to fix this by drilling holes in certain parts wider so that bolts fit.

This week the controls team completed the CAN wiring and power supply to the SparkMAXs on the swerve drive, intake, and indexer of the competition robot. We used conduit and zipties on some of our wires to improve organization. We checked that all of our connections were secure and noticed we had some issues with Wago lever nuts and loose ferrules which were impairing the function of our CAN. We also used the Rev Hardware Client to run intake and feeder subsystems at once, allowing other subteams to test functionality. At this point, the robot is a complete swerve bot with functioning intake and indexer.

This week software has been converting code for our shooter, indexer, and climber into Python and making it command-based. We have been trying to implement extension limits onto our climber by using encoders, however it is not working and we are not yet sure why. We have also been helping team members develop Python skills since we have previously used Java. We have continued to tune our swerve drive code and have started working on trajectory following.

Ring Toss

For computer vision this week we are using Photonvision and a Pi 4 with a Pi camera 1. We have 2 micro SD cards which we are having to constantly update to the right version using the imaging software. So far we have been making some pretty good progress, we have 3D printed a camera mount and have ordered a Pi 5 along with a better camera for faster finding of the april tags. However, the cables which are used for each camera and Pi change so we have to order different ones which is a big setback as we have to work with the older Pi. This is along with the fact that we have a shortage of camera cables which have led us to order more due to the first time having ordered display cables instead of the actual ones that work. With the Pi 4 we have seen that the cameras are accurate and can measure all the distances and angles, however putting these values to use has shown more difficult than anticipated because our odometry and april tag readings seem to be conflicting on the field which has caused our robots estimated position to be in two places at once, so we still have some work to do.

Intake

6 Likes

This week, mechanical team assembled and attached our amp mechanism to the robot, and finished attaching the shooter to the robot. We have cracks forming in the indexer polycarb, which we think might be caused by forces from either the corner of the gearbox on the plate, or hammering on the hex shaft connected to the indexer plates. We drilled holes at the end of the major cracks to hopefully keep them from spreading.

Design has been working on and off on actual CAD and mostly helping with other parts of the process. One notable aspect of our design work recently has been our button box. This year, we have migrated to a custom 3D printed panel approach, using a special layout with regards to the robot function. Using 3 light-up buttons, 1 regular button, 3 LEDs, 3 dials, and 2 heavy switches, we have covered not only the nominal robot function but also a number of system overrides. By switching color partway through the print, we will have a high-contrast control panel that not only looks awesome but allows for quick, intuitive operation. It was primarily constructed out of electrical components scrounged out of derelict cabinets, and used a fantastic assortment of different potentiometers with 3D printed dials affixed to the spindle.

For vision, we are currently trying to get a second camera hooked up to our Pi 5. The front-facing camera is currently accurate, and we can get all kinds of information about field positioning from it but not from the back-facing camera, which would double how much of the field we can see and make it so we are basically never out of sight of the April tags and be able to know where we are at all times. We also are adding functionality to our code so we can turn to face any of the April tags which we know we will need and will make driving it substantially easier. This week, we finished wiring the robot, setting CAN IDs to all SparkMAXes, and updating firmware to all devices. We used Rev Hardware Client to make sure CAN was working, and there were no conflicting CAN IDs. We also used Rev Hardware Client to individually run our shooter motors and test shooting. We attached an infrared beam break between our indexer and our shooter to be able to tell when a note is ready. We have continued using 3/4” conduit on the wire and encoder cable bundles between the SparkMAXes and NEO motors. We have dealt with a few issues: our radio was disconnecting occasionally and briefly, so we decided to use the Rev Radio Power Module instead of our POE injector, and this appears to have solved the issue. Software is also dealing with not being able to reverse the encoder direction when using firmware PID in the SparkMAXes, so we have attempted to address this issue by replacing the encoders with those from a previous test robot, on which they were working. Our encoders were disconnecting occasionally, so we zip-tied our encoder ribbon cables to the SparkMAXes and swerve modules in such a way that it made the plug connections more secure. We connected our Raspberry Pi 5 for vision to power supply over a mangled USB-C cable powered from a 12V to 5V buck converter brick. We began running Ethernet connections through a network switch so that we could connect the Pi over Ethernet. We are using a NEO 550 to rotate into place and retract a redirect guard to allow our shooter to score in the amp. There was a CAN disconnect issue where a stretched CAN cable unplugged from a SparkMAX, disconnecting downstream motor controllers as well (the connection was not looped over). We created a small test circuit that intercedes between the beam break and the RoboRIO and lights up when the beam break is tripped; this allows us to eliminate hardware issues with the beam break.

Scrimmage put our robot through several (unintentional) stress tests, which revealed many interesting failing points of the robot. First and foremost, not all connections were secure. One of the ways this manifested itself was through the disconnect of one of the motor wires to the drive NEO in the front left swerve module. Interestingly enough, we now know based on this that NEOs can run with just 1 stage of the coil timing cycle, as the motor was still able to run if it was kickstarted, which made it hard to pinpoint the problem as the motor appeared to be in somewhat-working condition. Another known issue, even before scrimmage, is that our encoder connections to the SparkMAXes are unreliable. We have tried to remedy this by tying down the encoder ribbon cables. While working on the robot in the pit, an encoder ribbon cable got pinched, breaking the power connection. Unfortunately, this was one of the few things that we did not pack in our tool cart. We were able to fix this by peeling away the ribbon cable wire from the rest, stripping both ends, and connecting them with a Wago lever nut, which lasted the entire day without any problems. A continued issue we are running into is the radio momentarily disconnecting. As of now, we are not sure whether this is a product of signal interference or weak signal, brownouts in the power supply, or a poorly functioning radio. We will work on determining the problem, including trying a redundant power supply. An interesting thing that happened was when the robot (accidentally) ran full power into the wall at the edge of the field. Apparently, the stall current the motors drew was enough to cause global brownouts to the robot, actually restarting the robot. A very large and simple mistake we made was that we forgot to calibrate the NavX, which cost us our first match (we were essentially unable to move without spinning). We also learned a significant amount from our optional inspection. Simple issues include having exposed breaker terminals, the inspector not being able to verify the AWG of our power wires, zip ties needing to be trimmed, and exposed bolt heads around the battery need to be covered. Interestingly, the clip we used on our battery strap was designed to be break-away to prevent choking, but this means that it is not suitable for the robot.

We opted initially for a single AndyMark climber instead of two. Because the climber is mounted on the frame rail, the robot tilts significantly when we attempt to climb. The climber also does not retract low enough to climb on the lowest point of the chain. Because the climber was off center we could only climb while the bumpers were supported by the podium. This means we can only climb on the highest part of the chain on one side. We now plan to attach another AndyMark climber to the other side of the robot so that we can climb on both sides, however this does not solve the issue of climbing on the lowest point of the chain.

Climb Success Climb Failure

The robot drive base code, having been recently updated, now handles far smoother with much more accurate movement than it had done in the past. However, the drivers are still acclimating to the heading-position joystick control scheme. While most video games use control based on rotational velocity, this system utilizes the position of the steering-joystick to determine the heading of the robot. One issue that has arisen from this is that rotation is reversed based on the side of interest of the robot. For instance, when targeting a game piece, the “front” of the robot (side of interest) is the intake. But when launching said game piece, the rear-mounted launcher is the side of interest. Because our steering system considers the intake to be the front, steering feels “backwards” when shooting, which can lead to missed shots. The intake and shooter have mostly been functioning adequately. The intake currently has an issue when a game piece becomes jammed after intaking from the far sides of the intake. When we intook a note, it got caught on our amp mechanism and the mounts for our sponsor panel, which prevented it from touching the indexer and fully making its way into the robot. We are currently still deciding on how we plan to fix this. The shooter, while currently working, has required some troubleshooting before we were able to bring it to its full potential. The handoff between the indexer and the shooter has been faulty, and the indexer has been required to run at full speed in order to allow the shooter to fire unimpeded. While we were able to fix this issue with software, we have other plans to increase the moment of inertia in the flywheels, so that a smaller percentage of the kinetic energy is removed by the handoff. This would be achieved by filling the wheels with epoxy, or making them out of a heavier material.

Note Gets Stuck
Cycling1 Cycling2