Are interrupts the right thing to use for my robot?

If your "loop" code is not cycling fast enough to catch events - such as the opto-interrupter - then there is something wrong with the code.

The problem here is the use of serial communications. The standard serial operations are very slow and because they are themselves interrupt-driven, cannot be used in an interrupt routine. In general, you should not be calling functions in an interrupt routine.

You then have the choice - you can either perform serial communications - listening for commands - or execute time and event-critical actions, but not both. Even using interrupts, it is difficult to perform counting functions whilst executing communications as it would be necessary to make decisions within the interrupt routine on the basis of the event and time counts.

If you can possibly arrange your program to either count something or communicate at any particular time, that is what you need to do and if you can do that, then it follows that you do not need interrupts in the first place.