To 5499.

A Case for Breaching

Arani (Ron) Bhattacharyay

Introduction

This year presents a really interesting situation where for the first time in more than a decade, the record of field play only makes up HALF of the available ranking points! This means emperically that just by weight there's as much of an incentive to make an aggressive effort to win your match than to complete given tasks (the tower and the outer works). Even though those two seem the same, it might beckon a look at if that's really the case for us!

Our Regionals and Offense

A very interesting an seemingly consistent trend in FRC is that the West Coast doesn't play offense like the rest of the regions. It's not that we don't produce great offensive machine year in and out, it's just that in terms of offensive depth, the style of gameplay and defensive mindset usually mean that team are out to win rather than just outscore their opponents. To take a look at that trend, let's compare the top OPRs (I know OPR is flawed, it's just easy) of Madera and Silicon Valley from 2014, 2013, and 2011 (years scoring was not interdependant and there was defense) against some other offensive (Canadian) regionals. I picked a Canadian regional that was in between the two so it was relatively fair. I take the top 15 because I'm assuming that's the crowd y'all want to compete with!

In [22]:
%matplotlib inline
import numpy as np
import scipy.io
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def mean(data):
    """Return the sample arithmetic mean of data."""
    n = len(data)
    if n < 1:
        raise ValueError('mean requires at least one data point')
    return sum(data)/n # in Python 2 use sum(data)/float(n)

def _ss(data):
    """Return sum of square deviations of sequence data."""
    c = mean(data)
    ss = sum((x-c)**2 for x in data)
    return ss

def pstdev(data):
    """Calculates the population standard deviation."""
    n = len(data)
    if n < 2:
        raise ValueError('variance requires at least two data points')
    ss = _ss(data)
    pvar = ss/n # the population variance
    return pvar**0.5



# 2014 (Green - Canadian, Blue - SVR, Red - Madera)
rank = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
madera2014 = [91.31, 74.55, 56.03, 53.91, 53.54, 48.71, 44.33, 43.47, 39.90, 38.56, 38.18, 37.45, 36.86, 35.87, 34.82]
svr2014 = [107.89, 95.11, 90.97, 89.99, 83.49, 78.47, 76.38, 69.80, 62.90, 59.64, 58.82, 55.23, 54.61, 48.15, 47.80]
waterloo2014 = [126.39, 112.74, 91.76, 90.09, 89.76, 84.80, 81.87, 65.19, 65.18, 49.71, 46.77, 43.83, 42.21, 41.77, 39.19]

# red dashes, blue squares and green triangles
plt.plot(rank, madera2014, 'r--', rank, svr2014, 'bs', rank, waterloo2014, 'g^')
plt.ylabel('2014')
plt.show()

print("Madera Average:", mean(madera2014))
print("Madera SD:", pstdev(madera2014))
print("SVR Average:", mean(svr2014))
print("SVR SD:", pstdev(svr2014))
print("Waterloo Average:", mean(waterloo2014))
print("Waterloo SD:", pstdev(waterloo2014))
#Fun Fact, 254 scored 20% more in a regional before SVR! All hail California Defense!
Madera Average: 48.49933333333333
Madera SD: 15.38163513920271
SVR Average: 71.95
SVR SD: 17.983200679152382
Waterloo Average: 71.41733333333335
Waterloo SD: 26.838945450387744
In [23]:
# 2013 (Green - Canadian, Blue - SVR, Red - Madera)
rank = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
madera2013 = [40.71,34.06,33.91,33.40,32.06,27.84,27.05,26.61,24.86,23.18,19.47,18.41,18.15,17.52,17.16]
svr2013 = [80.21, 74.49, 54.90, 53.53, 53.44, 52.06, 43.38, 40.09, 39.07, 38.34, 38.32, 37.55, 37.08, 35.58, 34.12]
waterloo2013 = [98.70, 96.93, 63.00, 59.09, 55.30, 42.81, 41.32, 40.51, 39.48, 37.51, 33.22, 26.95, 24.92, 23.33, 23.09]

# red dashes, blue squares and green triangles
plt.plot(rank, madera2013, 'r--', rank, svr2013, 'bs', rank, waterloo2013, 'g^')
plt.ylabel('2013')
plt.show()

print("Madera Average:", mean(madera2013))
print("Madera SD:", pstdev(madera2013))
print("SVR Average:", mean(svr2013))
print("SVR SD:", pstdev(svr2013))
print("Waterloo Average:", mean(waterloo2013))
print("Waterloo SD:", pstdev(waterloo2013))
Madera Average: 26.292666666666673
Madera SD: 7.118774676086391
SVR Average: 47.47733333333334
SVR SD: 13.626957824678094
Waterloo Average: 47.077333333333335
Waterloo SD: 23.218938668442384
In [27]:
# 2011 (Green - Canadian, Blue - SVR, Red - Madera)
#This year we had to use Los Angeles which had the largest elite team overlap into the next year for Madera (notably winners 330 and 1717)
rank = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
la2011 = [60.02, 53.45, 52.70, 46.68, 45.80, 43.66, 29.43, 27.83, 23.23, 21.59, 21.23, 20.41, 19.54, 14.76, 14.12]
svr2011 = [71.59, 55.88, 42.76, 37.73, 30.25, 28.86, 28.29, 27.64, 27.37, 22.78, 22.60, 20.87, 19.82, 19.14, 17.42]
waterloo2011 = [71.88, 51.65, 38.14, 32.91, 31.49, 30.65, 27.05, 25.38, 14.45, 14.28, 11.65, 8.65, 8.59, 8.24, 7.80]

# red dashes, blue squares and green triangles
plt.plot(rank, la2011, 'r--', rank, svr2011, 'bs', rank, waterloo2011, 'g^')
plt.ylabel('2011')
plt.show()

print("Madera Average:", mean(la2011))
print("Madera SD:", pstdev(la2011))
print("SVR Average:", mean(svr2011))
print("SVR SD:", pstdev(svr2011))
print("Waterloo Average:", mean(waterloo2011))
print("Waterloo SD:", pstdev(waterloo2011))
Madera Average: 32.96333333333334
Madera SD: 15.1293316295055
SVR Average: 31.533333333333335
SVR SD: 14.545681451512985
Waterloo Average: 25.520666666666664
Waterloo SD: 17.767572134525178

Anyone see what I'm seeing! It's far harder to stand out as an offensive robot in California, even if you were to remove the extreme elite. It's easy to see that from how even teams are in offense at the top around here and how we have less of a standard deviation amongst our elite, but the averages are in the same ballpark for the more competitive regionals! This means that regionals we wil compete at are won much more strategically than what is traditional in other regions. Given that, we don't want to be in a position where we can score fairly well, but not enough to stand out and fall in a position where we don't control our own fate! So what to do?

The Power of the Ranking Point

Turns out this year has the twist of the manipulated ranking point! It's a new oppurtunity to get ranking points without being too concerned with your opponent's performance as well as an easy way to control how well you rank. What's the last time an extraneous ranking point was added? 2012! Let's take a look at a regional that was early on and teams failed to realize the importance of Coopertition points as well as being relevant to the manner in which our regionals will play out. San Diego 2012. Let's take a look at the rankings from that year.

Team QR CP Record Rank
4161 24 6 9-1-0 1
1661 24 8 8-2-0 2
599 22 8 7-3-0 3
2984 21 6 7-2-1 4
1726 20 4 8-2-0 5
2496 20 6 7-3-0 6
1138 20 6 7-3-0 7
1266 18 6 6-4-0 8
2827 17 2 7-2-1 9
399 17 6 5-4-1 10
3476 17 2 7-2-1 11
4276 16 2 7-3-0 12
2485 16 6 5-5-0 13
2102 16 4 5-3-2 14
1538 15 4 5-4-1 15
4056 15 0 7-2-1 16
3965 15 4 5-4-1 17
3341 15 4 5-4-1 18
3255 15 2 6-3-1 19
2543 15 2 6-4-0 20

This new ranking system gave not so elite teams like 4161 and 2984 a fighting chance. Not to mention like balancing, finishing the breaches is a fair amount of points even come to eliminations. You score extra ranking points while still putting up solid numbers in eliminations. Now let's double the CP, since we have twice as many extra ranking points available! By the way, the doubling of the CP is a fair assumption due to the consistency of random variables across the indepedendent stochastic processes.

Team QR CP Record Old Rank New Rank
4161 30 12 9-1-0 1 2
1661 32 16 8-2-0 2 1
599 30 16 7-3-0 3 3
2984 27 12 7-2-1 4 4
1726 24 8 8-2-0 5 7
2496 26 12 7-3-0 6 5
1138 26 12 7-3-0 7 6
1266 24 12 6-4-0 8 8
2827 19 4 7-2-1 9 12
399 23 12 5-4-1 10 9
3476 19 4 7-2-1 11 13
4276 18 4 7-3-0 12 17
2485 22 12 5-5-0 13 10
2102 20 8 5-3-2 14 11
1538 19 8 5-4-1 15 14
4056 15 0 7-2-1 16 20
3965 19 8 5-4-1 17 15
3341 19 8 5-4-1 18 16
3255 17 4 6-3-1 19 18
2543 16 4 6-4-0 20 19

Holy Shit! Teams with very mediocre record start to find themselves extremely well ranked compared to teams that won a ton of matches but failed to get the Coopertition bridge. It really made a difference at moving tail end teams to the top. But more key is that teams switched places at the top. Huge alliance shifts! If you do more research, you'll see the higher CP teams ended up doing better throughout the year! More room for improvement and a sign of overall smarter play. Now teams that had weaker performances in shooting basketballs have either to torch the field or build their own alliances and the field becomes suddenly much more flat. This should be key with big players like 254, 1323, 973, and 3970 at our first event. Outranking even one changes the entire dynamic! This means that since we play in a weak offensive area, we can start looking to find ourselves highly ranked to pick up potentially a better scorer ranked lower, or maybe even draw the attention of an higher seed. It might not be a bad idea to really key in on the breach points and make sure the tower goes down low even if it loses high points. (FYI) 294 could not shoot a single basket in LA in 2012. We got all the coopertition and bridge points as well as had the highets DPR. We ranked 3rd and picked up the second best shooter in 973 and snuck our way into the finals!

Being Competitve at Every Event

The usual negative connotation is that if we choose to be a breach robot, we're reducing our potential to be competitive even though we rank high. Are we though? I'm going to take a bit of a historical perspective in this round rather than throw funny charts and graphs, so buckle up!

The aspect here is two fold. You want to be aggressive enough to find yourself at champs through stellar performance in the regional stage, but not sacrifice potential so that when you are playing against tougher competition you hold value. This means you have to find the optimal manner for your team to reach those goals, because the reality is trying to beat the best at their own game isn't always the fastest way to the top. The following are going to be stories of five Californian teams which have made noise at the world stage, but definately not from revered form of pounding dominance (but maybe they are now!)

1717

Probably the biggest name to be missed from the FRC world this year. Everyone knows them for an elegant swerve, sleek and efficient scoring, and absolutely gnarly driving. But they started by doing one thing REALLY well. In 2007, they chose to lift two robots up faster than anyone else and pretty much ignored tubes. Because of it, they were the second overall pick and won the regional. They had the fastest ball climb in 2008, the fastest dump in 2009, and the most accurate mid range scoring in 2010. Then they worked themselves to elite. Momentum!

1678

Definately the largest disruption in FIRST California in recent memory, and at the cream of the crop. But most didn't know they've been silently killing at the Davis Regional for the past few years. Why? They exceed ANYONE, and I mean ANYONE, right out of the gate at a week 1 regional. They are usually already at 75% of full capacity right out of the gate, and driving enhancements and minor improvements become more doable because they always aim to have a simple but elegant machine out by week 5 of build season!

2485

Another on and off team from Southern California who's features were definately flashier, but no less impressive. They've been consistent for ages, but their FCS in 2013 got them noticed and it was obvious that was their one focus. They went from focusing accross the board to doing one thing well, and their stock skyrocketed in the San Diego area. Since then, they've always chosen to do one offensive task extremeley well and CONSISTENTLY. Unless they break, their output is the same regardless who they play, and that is ridiculously valuable.

294

Yeah. I know this story the best, but it's a great example of what to do and what happens when you don't do it! In 2010, Beach Cities went from a second pick regional champ, to a second overall pick finalist, to the #1 seed in their divison and to go on and what was considered the impossible (beat a 469 that had NEVER lost that year for a Wold Championship). How'd they get that far? 294 has had the same drive train every year. Its been called outdated and archaic, but its purpose has never failed. If all hell breaks loose, DEFEND. It's imposible to move a 294 Drivetrain in when it's in low gear without more than 300lbs of force in a T-Bone, and it has never lost a head on battle in game. Also, even if our robot's behind, our drivers practice defending from week one. From that, we've developed the rest of the bot to get better and better over time, and design so there's always open oppurtunities to improve. Years we fail to do that, we fail (2013, 2015). Years we go back to basics, we succeed (2014).

973

The Greybots are actually quite and old institution, but didn't start to make noise until a couple of years into Adam Heard's tenure at Cal Poly SLO. So why did his appearance change the entire outlook for the team? Speed. He tried to get more of it in his time at 294 but couldn't. Since 2009, the Greybots have aimed to be the fastest and easiest to maneuver machine on the field, and it has given them the advantage of doing twice as much in one match than most roobts could ever do. They've built off that speed with simple mechanisms, and developed into a powerhouse over time. He still preaches those same concepts in the summer robots they build, and they still kill!

The unifying story to learn from all of them is momentum! Pick one thing to live and die by, be the best at it, and define your place in the open market. In it's second year, 5499 could make or break its existance by living by that mantra. If you asked me three years ago which rookies would look strongest now, I would have said 5012 and 5124. (Whaddya know, a world champ, two regionals, and a finalist amongst them). How did I know that? They both did one thing well!

What Now, Ron?

Now, we need to figure out every possible way of playing the game, evaluate the difficulty and value the importance of each task, and come up with what we know we can do best (I'd do it with a built matrix for a Singular Value Decomposition dumped into a PCA). Those who tell you the numbers lie just aren't hearing them clearly. The best way to move forward is to come up with a completely objective and double blind system of analysis, and trust the system. I like how a lot of the plans y'all came up with were safe and cautious, but the key here isn't to limit your abilites, but rather make sure every mechanism and piece has multiply safe uses (think 330, 1114). Draw inspiration from previous years (hint, this is basically 2010)! Transaltion: Not sure being short and shooting high are mutually exclusive. Get Stoked! Also, finalize robot plans by Sunday!