(long post warning)
I agree with the sentiments that FRC is a learning experience and my team doesn’t do any kind of tests or tryouts to join any of our subteams (software, electrical/controls, design, fabrication, and business). However, we do expect that students are (a) willing to learn and (b) willing to put in the time.
We’re a new team and just finishing our second year, so we’re still working out the pattern. In our first year we had a few students with FRC experience, some new students that wanted to learn, and no hardware - our first RoboRio and chassis wouldn’t come until we received our rookie kit. That wasn’t ideal, and we ended up in the classic scenario: the veteran FRC programmers did most of the code on the robot, the rookies didn’t have time during the 6 weeks to learn the architecture and contribute much (plus everyone was fighting over time on the robot). Luckily we had enough students interested in learning Android and Raspberry Pi that we built an Android scouting app and a Pi-based vision tracking system, both projects building on existing work brought by a mentor coming from a different team.
This year we had three tiers - the experienced FRC programmers, the experienced Android/Pi programmers, and the rookies who wanted to learn. In the fall offseason we let the rookies learn Python to get the basic concepts, and the other groups were given freedom to decide what they wanted to do. The robot students worked on cleaning up the previous year’s code, getting a base ready for this year. The Android students worked on the foundations for a new improved app. The Pi students were given a project to develop a standalone video kiosk for our pit. We had some students who wanted to play with Arduinos and we saw this as an opportunity to get students trained in the use of sensors.
One thing that was missing here was cross-training. We haven’t yet had, say, Android trained students saying “hey, I want to learn robot code”. We’ll cross that bridge when we get there.
After kickoff we decided our robot needed to have the following subsystems: the drivetrain, the OI, vision, gear handler, climber, and an LED strip light system we call Bling. Students were assigned to subsystems as follows:
-
the rookie students who went through the Python training were given the gear handler and climber subsystems. Their job was to write the Java Subsystem class that would encapsulate the mechanism hardware (motors, pneumatics), the sensor data (limit switches, IR, ultrasonics, encoders, CAN bus query) and build a library of method calls and corresponding Commands. (If you think about it, these subsystems are each pretty simple, well-defined, and WPILib provides a lot of hand-holding.) They also had to ask the drive team what buttons should do what, and bind those buttons in the OI to their newly created commands. This was also how they unit-tested their Subsystems.
-
the new student with some previous experience was given the Bling subsystem to write. He had to deal with interfacing to a RioDuino via RS232, and was given free reign to come up with commands and signalling patterns he thought might be useful, but his job was to get buy-in from the drive team and implement whatever signalling/showoff lighting they wanted. He also did some work in the drivetrain code.
-
the students with previous FRC experience were tasked with keeping the architecture clean and being the “gatekeeper” of our code on GitHub. Their job was to monitor pull requests and provide peer review and guidance to the new students, teaching them to follow our coding guidelines, how to use GitHub, and warning them of pitfalls. They also combined the Commands and Subsystems defined by the other students to write autonomous mode commands. They were also given more advanced deliverables like “write a Rotate command that used the gyro to turn the robot, use PID, tune the parameters so it works quickly and accurately”, and given freedom to try their own ideas (“I want to develop a more detailed logging system so we know what went wrong during auto”, “I want to try a new method of driving along a curve using equation-based path planning”).
-
the Camera vision subsystem was given to a group of students who had mixed FRC/Pi experience. There was code on both the RoboRio and the Pi to adjust as well as physical devices (camera, ringlight) to calibrate.
-
the Android team continued independently working on a scouting app for Steamworks.
-
the Arduino team continued learning and building a training curriculum for a workshop to teach other students. This was more of an outreach project that was ongoing in parallel with the build season.
Some of these jobs continued into competitions - the Android team was on standby to fix any problems with their app while they were scouting in the stands, the robot software students tweaked our auto and fixed any code problems, the vision team’s job was to make sure they made it on the field during calibration windows and get the vision system working to their satisfaction.
We were definitely juggling a lot of people and a lot of tasks trying to keep everyone busy. The key point we made clear was that you’ll be given ownership of a chunk of work, directly proportional to your willingness to take it on. If you’re only casually interested (or available) to come out then we’ll give you casual work - and there’s nothing wrong with that. But if you spend your time goofing off, or choosing not to be helpful, then someone else looking for things to do will eventually start crossing things off your to-do list for you.
The result was that some students have become subteam/project leaders, other students are working on projects and taking direction and training from their subteam leaders, some students who can only come in occasionally will help out wherever they can, and a few students just enjoy hanging out with us.
We had an unheard-of 20 software students on our 40-person team, and we managed to keep everyone busy - no small feat. I hope this model works for us again next year!