There are a few reasons that we didn't use wpilib's command based system. The first one is that our tendency is to look at what we want to do, and decide and create the architecture based on that - if we choose to use wpilib's command based system, we don't have very much flexibility to change it.
Another reason is that programmers on our team tend to distrust wpilib. I've seen what I think it should do and what it's actually doing vary far too many times for me to trust it. We've gotten to the point of isolating all calls to wpilib to one wrapper thread, just so we don't have to deal with interfacing with it directly anymore.
I haven't looked into command based programming much, but it looks like it has the following problems:
- Poor/no (?) threading support
- only runs when it gets DS packets
We end up having a similar system to command based programming in some places (lemonscript, the drivetrain subsystem, etc), but this allows us to implement it in a way that fits into our codebase well, and also lets us only use it where it makes sense to use it - in other places different methods work just as well, or better.