This chapter does not appear in the book.
In chapter VBI-4.5, I developed a controller for a toy missile launcher, utilizing libusb-win32 and LibusbJava. I'll be using the same libraries again here, to control the OWI-535 robotic arm shown in the picture at the top of the page.
To be precise, I'm using the UK version of the arm, available from Maplin Electronics. It's the same product but the box includes a OWI USB interface, which is NOT part of the basic OWI-535 package.
One downside of the arm is its under-powered control software which only offers time-based movement of the arm's joints (e.g. rotate the wrist for 0.5 second). It would be much more useful to define joint rotations using absolute and relative angles, or to specify (x, y, z) locations (e.g. move the arm's grippers to (10, 15, 7)).
I'll be implementing control software that offers all these features. The code forms a loose hierarchy – the lowest level moves the arm using USB control transfers while the top-tier utilizes coordinates. Each level is implemented using capabilities supplied by the next level down, as illustrated by the figure on the right.
The USB control transfer software at the lowest level is quite similar to the missile launcher code from chapter VBI-4.5 (so I won't be explaining all the details again). However, for the protocol detection work, I turned to the popular freeware, SnoopyPro, instead of the commercial USBTrace tool from chapter VBI-4.5; the main reason for changing was to illustrate an alternative form of sniffing.
At the second level, sequences of control transfers are employed to implement timed rotation requests for the arm's joints. This is sufficient for programming simple user interactions with the arm, via my ArmCommunicator class.
My Joint class utilizes ArmCommunicator to define joint rotations using absolute angles, and as offsets from the current position. This requires the utilization of rotational timing information, and the storage of joint orientations.
Forward kinematics employs joint orientations and link dimensions (e.g. the length of the upper arm) to calculate the location of the robot arm's gripper. Far more useful is inverse kinematics (IK), which calculates the joint rotations necessary to move the gripper to a specified position (e.g. move to (-9, 7, 5)). IK is a formidable problem for most robot arm designs, but quite simple for the OWI.
With the availability of kinematics information, the arm's command language can specify movements in terms of where to pick up and deposit an object.