Advertisement
ZdenekM

follow joint trajectory action script

Mar 27th, 2013
871
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.94 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. # freely inspired by http://www.ros.org/wiki/arbotix_python/follow_controller
  4.  
  5. import roslib
  6. roslib.load_manifest('btb_manipulator')
  7.  
  8. import rospy, actionlib
  9.  
  10. from control_msgs.msg import FollowJointTrajectoryAction
  11. from dynamixel_msgs.msg import JointState as JointStateDynamixel
  12. from std_msgs.msg import Float64
  13.  
  14.  
  15. class JointSubscriber():
  16.    
  17.     def __init__(self,joint):
  18.        
  19.        
  20.         rospy.Subscriber(joint + '/state', JointStateDynamixel, self.joint_state_cb)
  21.        
  22.         rospy.loginfo('Subscribing for %s joint state.',joint)
  23.        
  24.         self.joint_name = joint
  25.         self.state = JointStateDynamixel()
  26.         self.received = False
  27.        
  28.        
  29.     def joint_state_cb(self,msg):
  30.        
  31.         if self.received is False:
  32.            
  33.             self.received = True
  34.        
  35.         self.state = msg
  36.        
  37.     def get_position(self):
  38.        
  39.         return self.state.current_pos
  40.        
  41.        
  42. class JointCommander():
  43.    
  44.     def __init__(self,joint):
  45.        
  46.         self.joint_name = joint
  47.         self.pub = rospy.Publisher(joint + '/command',Float64)
  48.        
  49.     def command(self,pos):
  50.        
  51.         #rospy.loginfo('publishing, joint ' + self.joint_name + ', value ' + pos)
  52.         self.pub.publish(pos)
  53.  
  54. class FollowController():
  55.  
  56.     def __init__(self):
  57.        
  58.         self.ns = 'arm_controller'
  59.        
  60.         #self.rate = 50.0 #rospy.get_param('~controllers/'+name+'/rate',50.0)
  61.         #self.joints = rospy.get_param('~' + self.ns + '/arm_joints')
  62.         self.joints = rospy.get_param('/dynamixel/arm_controller/arm_joints')
  63.        
  64.         rospy.loginfo('Configured for ' + str(len(self.joints)) + 'joints')
  65.        
  66.         self.joint_subs = [JointSubscriber(name + '_controller') for name in self.joints]
  67.         self.joint_pubs = [JointCommander(name + '_controller') for name in self.joints]
  68.        
  69.         self.joints_names = []
  70.        
  71.         for idx in range(0,len(self.joints)):
  72.        
  73.             self.joints_names.append(self.joints[idx] + '_joint')
  74.  
  75.         # action server
  76.         #name = rospy.get_param('~controllers/'+name+'/action_name','follow_joint_trajectory')
  77.         self.name = self.ns + '/follow_joint_trajectory'
  78.         self.server = actionlib.SimpleActionServer(self.name, FollowJointTrajectoryAction, execute_cb=self.actionCb, auto_start=False)
  79.  
  80.         rospy.loginfo("Started FollowController ("+self.name+"). Joints: " + str(self.joints))
  81.  
  82.     def startup(self):
  83.         self.server.start()
  84.  
  85.     def actionCb(self, goal):
  86.        
  87.         rospy.loginfo(self.name + ": Action goal recieved.")
  88.         traj = goal.trajectory
  89.  
  90.         if set(self.joints_names) != set(traj.joint_names):
  91.             msg = "Trajectory joint names does not match action controlled joints." + str(traj.joint_names)
  92.             rospy.logerr(msg)
  93.             self.server.set_aborted(text=msg)
  94.             return
  95.  
  96.         if not traj.points:
  97.             msg = "Trajectory empty."
  98.             rospy.logerr(msg)
  99.             self.server.set_aborted(text=msg)
  100.             return
  101.  
  102.         try:
  103.             indexes = [traj.joint_names.index(joint) for joint in self.joints_names]
  104.         except ValueError as val:
  105.             msg = "Trajectory invalid."
  106.             rospy.logerr(msg)
  107.             self.server.set_aborted(text=msg)
  108.             return
  109.  
  110.         if self.executeTrajectory(traj):  
  111.             self.server.set_succeeded()
  112.             rospy.loginfo('Executed.')
  113.         else:
  114.             rospy.logerr('Execution failed.')
  115.             self.server.set_aborted(text="Execution failed.")
  116.  
  117.      
  118.  
  119.     def executeTrajectory(self, traj):
  120.        
  121.         rospy.loginfo("Executing trajectory with " + str(len(traj.points)) + ' point(s)')
  122.        
  123.         try:
  124.             indexes = [traj.joint_names.index(joint) for joint in self.joints_names]
  125.         except ValueError as val:
  126.             return False
  127.        
  128.         time = rospy.Time.now()
  129.         start = traj.header.stamp
  130.        
  131.         #success = True
  132.        
  133.         for point in traj.points:
  134.            
  135.             if self.server.is_preempt_requested():
  136.                
  137.                 rospy.loginfo('Stopping arm movement')
  138.                
  139.                 self.server.set_preempted()
  140.                 #success = False
  141.                 break
  142.            
  143.             while rospy.Time.now() + rospy.Duration(0.01) < start:
  144.                 rospy.sleep(0.01)
  145.                
  146.             desired = [ point.positions[k] for k in indexes ]
  147.             endtime = start + point.time_from_start
  148.                            
  149.             for i in range(0,len(self.joints)):
  150.                
  151.                 self.joint_pubs[i].command(desired[i])
  152.  
  153.  
  154.             while rospy.Time.now() + rospy.Duration(0.01) < endtime:
  155.                
  156.                 rospy.sleep(0.01)
  157.  
  158.                
  159.         return True
  160.  
  161. #===============================================================================
  162. #    def active(self):
  163. #        """ Is controller overriding servo internal control? """
  164. #        return self.server.is_active() or self.executing
  165. #
  166. #    def getDiagnostics(self):
  167. #        """ Get a diagnostics status. """
  168. #        msg = DiagnosticStatus()
  169. #        msg.name = self.name
  170. #        msg.level = DiagnosticStatus.OK
  171. #        msg.message = "OK"
  172. #        if self.active():
  173. #            msg.values.append(KeyValue("State", "Active"))
  174. #        else:
  175. #            msg.values.append(KeyValue("State", "Not Active"))
  176. #        return msg
  177. #===============================================================================
  178.    
  179.    
  180. if __name__ == '__main__':
  181.    
  182.     rospy.init_node('follow_joint_controller', anonymous=True)
  183.    
  184.     rospy.loginfo('Follow joint action node.')
  185.    
  186.     c = FollowController()
  187.    
  188.     rospy.loginfo('Starting action server')
  189.    
  190.     c.startup()
  191.    
  192.     rospy.loginfo('Spinning')
  193.    
  194.     rospy.spin()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement