The reason why it seems so difficult to automate many things on the robot is because we are thinking about the big picture. After you decompose the robot behavior down into small pieces, you get things that don't actually seem too difficult to implement! When you have tools such as Octave and MatLab, things like AI and ML become like, "How in the world did I implement this uber-complicated thing in just 3 lines of code?!". It is quite simple to use OpenCV and acquire data, such as target, robot position, etc.
Just think of this. For the 2014 game, if you just acquired the ball and shot it into the goal -- no passing, etc., you could break up the game into the following parts:
-shooting -- optimal position, shooting power, robot velocity, robot acceleration
-driving -- optimal speed, obstacle avoidance, static field, dynamic field, etc.
-picking up -- map of the gamepieces
This all can be accomplished by quite simple OpenCV + MatLab code!
Now, let's try a practice implementation (idea, not code):
Code:
OPENCV: generate field view, find all obstacles, find all the gamepieces, triangulate robot position, gather facing direction <-- this can be done in the matter of 600 lines of OpenCV code.
INPUT: wait for user input -- what to do next? drive to a location, shoot, or intake?
PERFORM:
DRIVE: field data would be sent to the MatLab generated code.
SHOOT: find the optimal shooting location, use DRIVE to prepare the shot and go for it
INTAKE: read the list of gamepieces. Use DRIVE to get to the gamepiece. Use native code to pick up
These are all things that teams are already doing. However, I don't know of any team that has tried to perform it all.
Now, the program is capable of playing the game almost by itself -- little but some human intervention.
Now say that the driver wants to relax and doesn't want to drive by themselves -- sure, get new drivers

, but even better would be if you program a bit of AI so the robot can play by itself.
Forget about the DRIVE feature, above. Now, the list is -- INTAKE, SHOOT, and maybe a WAIT command.
This is what I would do:
Check if the robot is loaded. If it is ready, go directly into SHOOT. Otherwise, WAIT (do nothing, but watch and wait for an event) for a gamepiece to be available. INTAKE the gamepiece. Use SHOOT to score. Repeat this over and over again until the game timer is up.
^^ You have a fully autonomous robot. Sure, it won't be as competitive as a human -- it couldn't defend or pass, or anything, but a computer can think very fast to a very high accuracy. This means that a computer can perform all of this with a higher accuracy than a human could!
The code would of course be much more difficult if you wanted to implement features like passing or catching. And even better is that there can be human control overrides, so if the human wants the robot to do something his way, it can do it his way.