Wind-up algorithm: the error*dt summation is set to zero after reaching a certain value. Wind-up has only been an issue if I push the bot really hard. The motor/wheel system is not responsive enough to handle large disturbances. The error*dt summation accumulates rapidly. This can be mitigated with larger diameter wheels. The Tamiya 72101 geared-motors (7.2V, 12A stall) can handle the additional torque. The motor driver (Pololu VNH2SP30) outputs current measurements, but I do not use those.
The program loops at approximately 100Hz. I could use the ZX-40n native device for 2,000Hz processing speed, but 100Hz is more than adequate for this bot. And actually, the IR range sensor is the weakest link. Its update rate is 25Hz; still adequate.
About the Martini... I'm happy to report that not a drop was spilled. As you can see in the video, the GBOT90 drifted away with the drink. So I intervened and grabbed the glass to avert a catastrophe. Then the bot drifted back as if it wanted the Martini back. I cut that scene out because it comprimised my identity. Sorry. I plan to add a forward looking sensor (either IR or ultra-sonic) to track an object and maintain position.
Overall, I was surprised that Integral control was so critical for graceful responses. Mostly PD control results in a jitter system, but very little drift.