The classical engineering fields have evolved standards and techniques for developing complex systems. For example, both mechanical and electrical engineers have a wide variety of standard components, with defined capabilities, that they can draw upon (e.g., gears, transistors) in the design of complex systems. On the other hand, software engineering has struggled with the basic idea of reusability. Software engineering approaches, such as the use of components that promote the concept of information hiding and the introduction of structured programming languages, offer a roadmap to an improved software reuse. Unfortunately, their adoption by robotics researchers has been slow, impeded by the tradition of individual research groups crafting independent and incompatible solutions to common problems.