Hi Patrick,

I am trying out the UA Smart Arm Controller package with my robot which
has a pair of AX-12+ arms, pan and tilt head servos, and a torso joint,
all controlled on a single Dynamixel bus via a USB2Dynamixel controller.
 I'm not sure the smart arm controller was meant to be used this way
(as a general joint controller for the whole robot) but so far it seems
to be working, meaning, I can move each joint by publishing to the
appropriate topic and I can read the states of each servo on the
appropriate topics.

It was really meant to be a general Dynamixel controller, be it the SmartArm or just pan/tilt joints anywhere on the robot. You just define a controller for each joint (e.g. a pan joint on the robot head or shoulder pitch joint in SmartArm), specify which motors drive this joint, what their min/max/home encoder position are, etc. There's really nothing specific to SmartArm.
 

The one discrepancy I have run into between the documentation and what I
am seeing on my machine is trying to get the joint state for all joints
as referred to in the tutorial at:

http://www.ros.org/wiki/smart_arm_controller/Tutorials/Getting%20Started%20with%20a%20Smart%20Arm

Near the bottom of the tutorial it is claimed that I can get the
joint_states with the following command:

rostopic echo /smart_arm_controller/state

but this topic does not exist.  I can get a list of motor states with
the command:

rostopic echo /motor_states/ttyUSB0

but this topic does not include the joint names which I will need if I
want to see the state changes in RViz via the robot_state_publisher and
my URDF model.


I changed how the driver operates quite a bit in the last few weeks, I still need to update the documentation to reflect all these changes. The addition of port name to topic names was to allow for multiple serial buses controlling the servos. I have 3 serial buses with a bunch of Dynamixels attached to each and I have 3 motor_states topics (e.g. /motor_states/upper_arm, /motor_states/lower_arm, /motor_states/head).

The /motor_states/* topics is the lowest level information that comes from the motors, it includes things like voltage, temperature and everything is still servo encoder units. This topic is published by the lowest level motor driver which doesn't know how servos are assembled into joints (some joints can be driven by multiple servos, SmartArm has two joints like that). For that we define a controller which will translates encoder units into actual angle in radians based on the home encoder position, etc. It also publishes joint state information on /controller_namespace/state, which includes joint_name and everything is translated to ROS units (radians for angles, rad/s for velocities, etc.) and  advertises a /controller_namespace/command topic through which you can control the joint.

 
So my question is: how can I get a list of joint states including joint
names?


So what you have is a bunch of /*/state topics, one for each controller. What I usually do next is write a node that subscribes to all of them and publishes a single joint_states message that robot_state_publisher subscribes to. Look here for an example:

http://code.google.com/p/ua-ros-pkg/source/browse/trunk/arrg/ua_apps/wubble2_robot/nodes/joint_states_publisher.py?r=1032

I probably should write a generic node that will subscribe to specified controllers and publish a joint_states topic.
 
Here is my full setup in case it helps:
<snip>

Your config files look fine to me.

Let me know if that helps,
Anton