load.py
Go to the documentation of this file.
00001 #! /usr/bin/env python
00002 # Copyright (c) 2008, Willow Garage, Inc.
00003 # All rights reserved.
00004 #
00005 # Redistribution and use in source and binary forms, with or without
00006 # modification, are permitted provided that the following conditions are met:
00007 #
00008 #         * Redistributions of source code must retain the above copyright
00009 #             notice, this list of conditions and the following disclaimer.
00010 #         * Redistributions in binary form must reproduce the above copyright
00011 #             notice, this list of conditions and the following disclaimer in the
00012 #             documentation and/or other materials provided with the distribution.
00013 #         * Neither the name of the Willow Garage, Inc. nor the names of its
00014 #             contributors may be used to endorse or promote products derived from
00015 #             this software without specific prior written permission.
00016 #
00017 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027 # POSSIBILITY OF SUCH DAMAGE.
00028 
00029 # Author: Jon Scholz
00030 
00031 PKG="pr2_pose_saver"
00032 import roslib; roslib.load_manifest(PKG)
00033 import rospy
00034 import time
00035 import sys
00036 import os.path
00037 
00038 from geometry_msgs.msg import Twist, Pose, PoseStamped, TwistStamped
00039 from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint
00040 from pr2_controllers_msgs.msg import *
00041 
00042 verbose = False
00043 duration = 3.0
00044 
00045 class pr2_pose_loader:
00046     def __init__(self, verbose = False):
00047         """ @package pr2_pose_saver : load
00048         init: defines goal state variables and opens publishers and clients
00049         """
00050         self.verbose = verbose
00051 
00052         ############### PRIVATE PUBLISHERS/CLIENTS ###############
00053         ## publisher for base commands
00054         self._base_pub = rospy.Publisher('base_controller/command', Twist)
00055 
00056         ## action client for grippers
00057         self._l_gripper_pub = rospy.Publisher('l_gripper_controller/command', Pr2GripperCommand)
00058         self._r_gripper_pub = rospy.Publisher('r_gripper_controller/command', Pr2GripperCommand)
00059 
00060         ## action client for torso
00061         self._torso_pub = rospy.Publisher('/torso_controller/command', JointTrajectory)
00062 
00063         ## action client for head
00064         self._head_pub = rospy.Publisher('/head_traj_controller/command', JointTrajectory)
00065 
00066         ## publisher for arms
00067         self._r_arm_pub = rospy.Publisher("r_arm_controller/command", JointTrajectory, latch=True)
00068         self._l_arm_pub = rospy.Publisher("l_arm_controller/command", JointTrajectory, latch=True)
00069 
00070         ## publishers dictionary
00071         self.publishers = {'base':self._base_pub,
00072                            'l_gripper':self._l_gripper_pub,
00073                            'r_gripper':self._r_gripper_pub,
00074                            'torso':self._torso_pub,
00075                            'head':self._head_pub, 
00076                            'r_arm':self._r_arm_pub,
00077                            'l_arm':self._l_arm_pub,
00078                            'r_gripper':self._r_gripper_pub,
00079                            'l_gripper':self._l_gripper_pub
00080                            }
00081         rospy.sleep(0.5)
00082 
00083     def set_arm_state(self, jvals, arm):
00084         """ Sets goal for indicated arm (r_arm/l_arm) using provided joint values"""
00085         # Build trajectory message
00086         command = JointTrajectory()
00087         command.joint_names = ['%s_shoulder_pan_joint' % arm[0], 
00088                                '%s_shoulder_lift_joint' % arm[0],
00089                                '%s_upper_arm_roll_joint' % arm[0],
00090                                '%s_elbow_flex_joint' % arm[0],
00091                                '%s_forearm_roll_joint' % arm[0],
00092                                '%s_wrist_flex_joint' % arm[0],
00093                                '%s_wrist_roll_joint' % arm[0]]
00094         command.points.append(JointTrajectoryPoint(
00095             positions=jvals,
00096             velocities = [0.0] * (len(command.joint_names)),
00097             accelerations = [],
00098             time_from_start =  rospy.Duration(duration)))
00099         command.header.stamp = rospy.get_rostime() + rospy.Duration(0.01)
00100         # Send
00101         try:
00102             self.publishers[arm].publish(command)
00103             if self.verbose:
00104                 print "published [%s] to %s_controller/command topic" % (jvals, arm)
00105         except:
00106             print "failed to publish arm positions!"
00107 
00108     def set_gripper_state(self, jval, gripper):
00109         """ Sets goal for indicated gripper (r_gripper/l_gripper) using provided joint angle"""
00110         # Build trajectory message
00111         goal = Pr2GripperCommand()
00112         goal.max_effort = -1
00113         goal.position = jval
00114         try:
00115             self.publishers[gripper].publish(goal)
00116             if self.verbose:
00117                 print "published [%s] to %s_controller/command topic" % (jval, gripper)
00118         except:
00119             print "failed to publish gripper positions!"
00120 
00121     def set_head_state(self, jvals):
00122         """ Sets goal for head using provided joint values"""
00123         # Build trajectory message
00124         head_goal = JointTrajectory()
00125         head_goal.joint_names.append('head_pan_joint')
00126         head_goal.joint_names.append('head_tilt_joint')
00127         head_goal.points.append(JointTrajectoryPoint())
00128         head_goal.points[0].time_from_start = rospy.Duration(0.25)
00129         #self.head_goal.header.frame_id = 'base_link'
00130         for i in range(len(head_goal.joint_names)):
00131             head_goal.points[0].positions.append(jvals[i])
00132             head_goal.points[0].velocities.append(1)
00133         head_goal.header.stamp = rospy.get_rostime() + rospy.Duration(0.01)
00134         try:
00135             #print head_goal
00136             self.publishers["head"].publish(head_goal)
00137             if self.verbose:
00138                 print "published [%s] to head_traj_controller/command topic" % jvals
00139         except:
00140             print "failed to publish head position!"
00141 
00142     def set_torso_state(self, jval):
00143         """ Sets goal for torso using provided value"""
00144         # Build trajectory message
00145         torso_goal = JointTrajectory()
00146         torso_goal.joint_names.append('torso_lift_joint')
00147         torso_goal.points.append(JointTrajectoryPoint())
00148         torso_goal.points[0].time_from_start = rospy.Duration(0.25)
00149         torso_goal.points[0].velocities.append(0)
00150         torso_goal.points[0].positions.append(jval)
00151         torso_goal.header.stamp = rospy.get_rostime() + rospy.Duration(0.01)
00152         try:
00153             #print head_goal
00154             self.publishers["torso"].publish(torso_goal)
00155             if self.verbose:
00156                 print "published [%s] to torso_controller/command topic" % jval
00157         except:
00158             print "failed to publish torso position!"
00159 
00160     def parse_bookmark_file(self, bfile):
00161         f=open(bfile,'r')
00162 
00163         for l in f.readlines():
00164             if l.find("arm") != -1:
00165                 jvals_str = l.split(":")[1]
00166                 jvals = map(lambda x: float(x),jvals_str.strip("\n").split(","))
00167                 arm = l.split(":")[0]
00168                 self.set_arm_state(jvals, arm)
00169             if l.find("gripper") != -1:
00170                 jval_str = l.split(":")[1]
00171                 jval = map(lambda x: float(x),jval_str.strip("\n").split(","))[0]
00172                 gripper = l.split(":")[0]
00173                 self.set_gripper_state(jval, gripper)
00174             if l.find("head") != -1:
00175                 jvals_str = l.split(":")[1]
00176                 jvals = map(lambda x: float(x),jvals_str.strip("\n").split(","))
00177                 self.set_head_state(jvals)
00178             if l.find("torso") != -1:
00179                 jvals_str = l.split(":")[1]
00180                 jval = map(lambda x: float(x),jvals_str.strip("\n").split(","))[0]
00181                 self.set_torso_state(jval)
00182 
00183         f.close()
00184 
00185 if __name__ == "__main__":
00186     from optparse import OptionParser
00187     parser = OptionParser()
00188     parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False,
00189                       help="verbose mode")
00190     parser.add_option("-a", "--all", action="store_true", dest="load_all", 
00191                       help="load all", default=True)
00192     parser.add_option("-r", "--right_arm", action = "store_true", dest="load_right_arm",
00193                       help="Load pose of right arm", default=True)
00194     parser.add_option("-l", "--left_arm", action = "store_true", dest="load_left_arm",
00195                       help="Load pose of left arm", default=True)
00196     parser.add_option("-R", "--right-gripper", action = "store_true", dest="load_right_gripper",
00197                       help="Save pose of right gripper", default=True)
00198     parser.add_option("-L", "--left-gripper", action = "store_true", dest="load_left_gripper",
00199                       help="Save pose of right gripper", default=True)
00200     parser.add_option("-H", "--head", action = "store_true", dest="load_head",
00201                       help="Load pose of head", default=True)
00202     parser.add_option("-t", "--torso", action = "store_true", dest="load_torso",
00203                       help="Load pose of torso", default=True)
00204     parser.add_option("-T", "--tilting-aser", action = "store_true", dest="load_laser",
00205                       help="Load pose of tilting laser", default=True)
00206     # J.Romano added time option (8.2.10)
00207     parser.add_option("-s", "--seconds", action="store", type="float", dest="duration",
00208                       help="Input number of seconds to take to achieve goal")
00209     parser.add_option("-b", "--completion-topic", action="store", type="string", dest="completion_topic",
00210                       help="Topic on which to broadcast message upon completion (not necessarily success)")
00211     parser.add_option("-w", "--wait", action="store", type="float", dest="wait",
00212                       help="Time in seconds to wait before broadcasting completion message")
00213 
00214     (options, args) = parser.parse_args()
00215     verbose = options.verbose
00216     if options.duration:
00217         duration = options.duration
00218 
00219     if len(args) == 0:
00220         print "Error: no bookmark file provided"
00221         print "See load.py --help for instructions"
00222         sys.exit()
00223     else:
00224         bookmark_file = args[0]
00225 
00226     if not os.path.exists(bookmark_file):
00227         print "Error: could not locate provided bookmark file"
00228         sys.exit()
00229 
00230     rospy.init_node('bookmarker_publisher', anonymous=True)
00231 
00232     loader = pr2_pose_loader(options.verbose)
00233     loader.parse_bookmark_file(bookmark_file)
00234 
00235     if options.completion_topic:
00236         if options.wait:
00237             rospy.loginfo('Messages sent.  Waiting %s seconds', options.wait)
00238             rospy.sleep(options.wait)
00239         msg = rospy.Header()
00240         msg.stamp = rospy.Time.now()
00241         pub = rospy.Publisher(options.completion_topic, rospy.Header)
00242         rospy.loginfo('Done; broadcasting success on %s', options.completion_topic)
00243         while not rospy.is_shutdown():
00244             pub.publish(msg)
00245             rospy.sleep(1)
00246     
00247     
00248     


pr2_pose_saver
Author(s): Jonathan Scholz
autogenerated on Tue Jan 7 2014 11:12:13