Thanks for mentioning the movement of the PID algorithm out of the Java VM and into the kernel. That assuages some of my concerns about real-time performance. Previous experience with programming Java to work in real time has taught me to write tight thread loops that just:
1. Do all essential work, then, as soon as possible,
I'm already using System.currentTimeMillis() quite a bit to tell me how these threads are doing. Except for the first iterations of threads, jit compiling does not seem to be a problem - "the math" runs fast, it's the reading of sensors that takes up the time! I make the threads operate on instance variables and method-local variables, so that the same arrays and Stringbuffers get used over and over. So, I'm trying to keep "new"s and gc to a minimum. I also keep the execution of any "synchronized" methods or critical sections "short and sweet".
As to GPS, I use a consumer Bluetooth GPS called the Dual XGPS150. It's made with a SkyTraq GPS chipset, one of the three top-performing consumer chipsets, along with MTK and SiRF. All such devices are capable of acquiring and tracking satellites indoors routinely, although the accuracy of indoor fixes will generally be lower than the accuracy of outdoor fixes. One can characterize indoor fixes as "accurate to + or - 1 room or office", whereas outdoor fixes from these chipsets are "accurate to + or - 1 square of concrete on a paved sidewalk" (about 1 square meter). Also, either an indoor or an outdoor fix can correct a robot's internal timekeepers to atomic clock accuracy.
I have 6 short text files that I can zip and send you, so that you will have updates that I have made to your GPS NMEA classes. How do I transmit those to you?