Writing a basic SF script

In previous tutorials we used the command line to understand how the hand works. Here we'll go through examples of controlling the hand with python. The easiest way to see all the functions available to you is to check reflex_hand.py, and reflex_sf_hand.py, where the functions are written.

Example code has been written for you. Inside of the reflex package you will find sf_example_code.py. You're encouraged to run the code and go through it yourself, commenting out lines or changing lines to see what affect it has on the hand behavior. In this tutorial we will talk about a few of the important moments, but for full understanding you should explore the example script.

Useful imports

To command the hand a number of ROS messages are used. Note that most of the imports come from reflex_msgs.msg, which are the messages defined in the reflex_msgs package.


from std_srvs.srv import Empty


from reflex_msgs.msg import Command

from reflex_msgs.msg import PoseCommand

from reflex_msgs.msg import VelocityCommand

from reflex_msgs.msg import Hand

Setting up publishers, services, and subscribers

To command your hand you'll likely want some combination of the calls below. In order to automatically calibrate the fingers, you'll need to call the ServiceProxy function.

In order to send position/velocity commands to the hand, you'll want to make publishers that publish to the appropriate topic, as shown here.

Finally, if you want to monitor the state of the hand you'll want to make a subscriber to the /hand_state topic. That will let you keep track of the joint positions, motor load, etc.


# Services can automatically call hand calibration

calibrate_fingers = rospy.ServiceProxy('/reflex_sf/calibrate_fingers', Empty)


# This collection of publishers can be used to command the hand

command_pub = rospy.Publisher('/reflex_sf/command', Command, queue_size=1)

pos_pub = rospy.Publisher('/reflex_sf/command_position', PoseCommand, queue_size=1)

vel_pub = rospy.Publisher('/reflex_sf/command_velocity', VelocityCommand, queue_size=1)


# Constantly capture the current hand state

rospy.Subscriber('/reflex_sf/hand_state', Hand, hand_state_cb)

If you want more information about how to make publishers and subscribers, try checking out the introductory ROS tutorials on the subject.

Publishing commands

There are many examples of publishing in the example code, but here is a basic illustration. The first thing to do is create a message of the right type, which we do with the VelocityCommand() call. The VelocityCommand can be populated by setting each of its elements - f1, f2, f3, and preshape. If you leave out any elements they will be set to 0.0, which could be desired. Finally, the command is published with vel_pub.publish().

vel_pub.publish(VelocityCommand(f1=-5.0, f2=-5.0, f3=-5.0, preshape=0.0))

© 2020 by RightHand Robotics, Inc.