puma /

Full commit
Trammell Hudson 0b610ec 

PUMA robot

There are three pieces to the shuffleboard robot software:

* ``: Listens to the USB serial controllers, exposes an
TCP port that prints the voltage and six raw count measurements.

* ``: Contacts the telnet server and uses `` to translate
the raw counts to joint angles and XYZ position / ASN angles.  Accepts
commands on stdin like `home`, `hold`, and XYZ positions like `300 130 0`.

* ``: Opens a TCP port to accept commands frmo the
game server.  Contacts the telnet server and translate commands
line `move 300 -5` into XYZ coordinates and ASN angles, Then uses
`` to generate raw joint commands to send the arm to the
desired position.

To startup the arm:

# Power up the the arm.
# Use the brake release switch to pose the arm into the home position.
# Power cycle the arm to reset the counters for the home position.
# Plug in the USB if it is not already.
# Run ``, wait for all six axes to report.
# Run `` to contact the server.
## Send `r` command to read raw joint counters,
## Send `a` command to read the joint angles.
## Send `p` command to print XYZ, ASN coordinates
## Send `hold` command to hold current position
# Run `` to start the shuffleboard server
# Run `telnet localhost 27189` to verify data

To unlock the arm:

# Send `hold` command.
# Twist the E-stop to unlock the brake.
# If anything looks weird -- *HIT THE E-STOP SWITCH*.
# If the sixth axis is spinning, hit the E-stop and wait a few seconds before releasing it.
# Sometimes it takes two or three times to settle back down.

To calibrate the arm positions at different distances:

# Values are in `` function `map_z`.
# Yes, it could be written in a much better fashion.
# To test, send a command from the `` program:
## `350 130 0`
## And then adjust the Z value downwards:
## `350 130 -20`
## `350 130 -30`
## `350 130 -35`, etc
# Write that value into the `map_z` function.