<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    Hi,<br>
    <br>
    At Shadow we had 2 different approaches: we built 2 different ROS
    interfaces, one for the ethercat hand we plugged to the pr2 and
    another one for our existing CAN hand. <br>
    <br>
    I'm more familiar with the CAN interface. In this interface, we
    built a ROS interface on top of our existing driver. There's one
    publisher and one subscriber for the hand. The ROS interface reads
    data and publishes them periodically to the joint_states topic. It
    also publishes hardware information on the diagnostics topic. I also
    defined a couple of specific messages because it was easier in
    certain cases than to use the existing ROS messages. The subscriber
    is used to send command to the hand. <br>
    <br>
    The ethercat interface is really different. It was build directly
    for ROS, using the pr2_controllers, etc... There's one publisher and
    one subscriber per joint. If I'm not mistaking, it only uses
    standard ROS/pr2 messages.<br>
    <br>
    In both cases, one of the important thing was to build the urdf
    model of the robot. The model is used throughout the code and also
    for visualization / simulation purposes.<br>
    <br>
    If you want to have a look at the ROS interface for our CAN hands,
    you can go to: <br>
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    <a href="https://launchpad.net/sr-ros-interface">https://launchpad.net/sr-ros-interface</a><br>
    <br>
    Hope this help, otherwise don't hesitate to recontact me if you
    wanted more info. <br>
    <br>
    Cheers,<br>
    <br>
    Ugo<br>
    <br>
    On 02/08/10 07:29, Adrian wrote:
    <blockquote
      cite="mid:AANLkTinZs9K6uX9YnYXPAJp9B5NWHoiK+zZ-hRraSN3+@mail.gmail.com"
      type="cite">
      <div> </div>
      <div> Morgan,</div>
      <div> </div>
      <div> Thanks, that is quite helpful.  The point of my question was
        that I want to do this in a way which would make the arm as easy
        as possible for existing ROS users like, for example, those
        familiar with the PR-2 software, to just "drop in" my hand/arm. 
        So I would not want to go create a buch of new messages and
        services and such if I could help it, I would like to figure out
        what level of abstraction is the correct place for my code to
        meet up with existing code.  Is the "joint space controler" the
        place to do this?  </div>
      <div>  If so, what exactly is the "joint space controler"?  From
        what I read in the wiki, it looks like controlers are not
        exactly nodes, but some kind of module which is loaded into some
        general real-time layer which handles all controlers on the
        robot.  Is that correct? (I am learning about ROS as I start
        this, so I appreciate your patience with what probably look like
        dumb questions.)</div>
      <div>  Really, what I am getting at is, if someone walked up to
        someone and said "hi, I made a cool hand, want to use it in your
        research?", what would be the best case for them, as ROS users,
        and possibly PR-2 owners, in terms of code I could have
        implemented to make the hand easy to use?</div>
      <div>  I gather that the Shadow Hand folks had this exact
        situation, what did they do?</div>
      <div> </div>
      <div>-=A</div>
      <div> </div>
      <div>ps. Nice to hear from you Morgan!<br>
        <br>
      </div>
      <div class="gmail_quote">On Sun, Aug 1, 2010 at 11:10 PM, Morgan
        Quigley <span dir="ltr"><<a moz-do-not-send="true"
            href="mailto:mquigley@cs.stanford.edu">mquigley@cs.stanford.edu</a>></span>
        wrote:<br>
        <blockquote style="border-left: 1px solid rgb(204, 204, 204);
          margin: 0px 0px 0px 0.8ex; padding-left: 1ex;"
          class="gmail_quote">Hi Adrian,<br>
          <br>
          I'm sure others will chime in here, but IMHO the greatest
          thing about<br>
          ROS is that you can do whatever you want :)   it's designed
          from the<br>
          ground up to be flexible and extensible, and to not favor one
          approach<br>
          over another equally-valid approach.<br>
          <br>
          That being said, when I've built my own sensors and arms, if
          the<br>
          bandwidth isn't prohibitive, I first wrap up the hardware
          details in a<br>
          ROS node that performs whatever bit-mashing is necessary to
          publish<br>
          and subscribe to abstracted versions of what the hardware
          deals with,<br>
          e.g., translating to/from some packet format that contains
          sensor<br>
          readings and actuator commands that goes over
          usb/ethernet/etc. to an<br>
          embedded microcontroller. This node doesn't do anything beyond
          munging<br>
          the embedded protocol into ROS messages, and maybe do graceful<br>
          startup/shutdown of the hardware. When using the real
          hardware, this<br>
          program is started once during a session and left up for a few
          hours<br>
          while hacking higher layers.<br>
          <br>
          Once the driver wrapper is done, you can write higher layers
          that<br>
          either implement your own stuff or interface to other ROS
          software<br>
          (e.g., rviz, robot state publisher, nav stack, etc. etc.).
          Since those<br>
          higher layers aren't tied to hardware, you can use rosbag to<br>
          record/play real data to the rest of the stack, and/or write a<br>
          simulation layer to swap with the "real" driver wrapper.<br>
          <br>
          we just did a master-slave "puppeteer" demo of our arm that
          had a<br>
          straightforward stack:<br>
          <br>
          * human motion capture<br>
          * inverse kinematics via OROCOS/KDL<br>
          * robot state publisher (forward kinematics)<br>
          * joint-space controller<br>
          * state estimation from encoders, accelerometers, etc.<br>
          * device driver wrappers<br>
          <br>
          It's all available in an unvarnished state here:<br>
          <a moz-do-not-send="true"
            href="https://stanford-ros-pkg.googlecode.com/svn/trunk/openarms/"
            target="_blank">https://stanford-ros-pkg.googlecode.com/svn/trunk/openarms/</a><br>
          <br>
          each layer is a separate node. All of them talk to rviz in one
          way or<br>
          another to ease debugging. The robot state publisher (from the
          WG<br>
          robot_model stack) converts joint angles and the robot's
          kinematic<br>
          description (URDF) into tf frames. When doing any of this
          stuff, rviz<br>
          is extremely helpful when converting a new robot's cad models
          into<br>
          URDF and in general for making sense of all the coordinate
          systems.<br>
          <br>
          HTH,<br>
          <font color="#888888">-mq<br>
          </font>
          <div>
            <div class="h5"><br>
              <br>
              On Sun, Aug 1, 2010 at 8:34 PM, Adrian <<a
                moz-do-not-send="true"
                href="mailto:adrian.kaehler@gmail.com">adrian.kaehler@gmail.com</a>>
              wrote:<br>
              ><br>
              >   I am interested to know how one goes about creating
              an interface for<br>
              > a device, such as an arm or hand.  In particular, the
              question is what is<br>
              > the lowest level component in the ROS architecture
              which one would implement<br>
              > first?  Presumably, once that low level element was
              in place, one could then<br>
              > go on to create services or actions that make use of
              that component.<br>
              >   Could someone point me to (or write?) a summary of
              what this stack looks<br>
              > like for something like the PR2 or Shadow arms?<br>
              ><br>
              ><br>
            </div>
          </div>
          <div>
            <div class="h5">>
              _______________________________________________<br>
              > ros-users mailing list<br>
              > <a moz-do-not-send="true"
                href="mailto:ros-users@code.ros.org">ros-users@code.ros.org</a><br>
              > <a moz-do-not-send="true"
                href="https://code.ros.org/mailman/listinfo/ros-users"
                target="_blank">https://code.ros.org/mailman/listinfo/ros-users</a><br>
              ><br>
              ><br>
              _______________________________________________<br>
              ros-users mailing list<br>
              <a moz-do-not-send="true"
                href="mailto:ros-users@code.ros.org">ros-users@code.ros.org</a><br>
              <a moz-do-not-send="true"
                href="https://code.ros.org/mailman/listinfo/ros-users"
                target="_blank">https://code.ros.org/mailman/listinfo/ros-users</a><br>
            </div>
          </div>
        </blockquote>
      </div>
      <br>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
ros-users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:ros-users@code.ros.org">ros-users@code.ros.org</a>
<a class="moz-txt-link-freetext" href="https://code.ros.org/mailman/listinfo/ros-users">https://code.ros.org/mailman/listinfo/ros-users</a>
</pre>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Ugo Cupcic         |  Shadow Robot Company | <a class="moz-txt-link-abbreviated" href="mailto:ugo@shadowrobot.com">ugo@shadowrobot.com</a>
Software Engineer  |    251 Liverpool Road |
need a Hand?       |    London  N1 1LX     | +44 20 7700 2487
<a class="moz-txt-link-freetext" href="http://www.shadowrobot.com/hand/">http://www.shadowrobot.com/hand/</a>              @shadowrobot</pre>
  </body>
</html>