In order to support different kinds of hardware, Player makes a
distinction between device interfaces and device drivers.
A device interface, such as ptz, specifies the format of the data,
command, and configuration interactions that a device allows. A device
driver, such as sonyevid30, specifies how the low-level device
control will be carried out. In general, more than one driver may support
a given interface3.2, though not all drivers will support all configuration requests.
Thus we extend in Player the analogy of UNIX devices, where, for example,
a wide variety of joysticks all present the same ``joystick'' API to
the programmer.

As an example, consider the two drivers p2os_position and rwi_position, which control Pioneer mobile robots and RWI mobile robots,
respectively. They both support the position interface and thus
they both accept commands and generate data in the same format, allowing
a client program to treat them identically, ignoring the details of the
underlying hardware. They also accept configuration requests in the same
format, but not all configuration requests are supported by both drivers.
For example, motor power can be toggled from software with Pioneer robots
but not with RWI robots. Thus the p2os_position driver supports the
configuration request to toggle motor power, while the rwi_position
driver does not.

All client/server interaction is done by interface, with no reference
to the underlying driver3.3. So, for example, if
Player has been configured to control a single position device with
index 0 and driver p2os_position (see Chapter 4
for how specify this information), then the client opens and controls the
0thposition device. Player could also be configured to control
a second position device with index 1 and driver rwi_position;
to access it, the client would open the 1stposition device.

Details on Player's device interfaces and drivers are given in
Chapters 6 & 7, respectively.