navigate_tool.py
Go to the documentation of this file.
00001 import tool_utils as tu
00002 #import smach_ros
00003 from PyQt4.QtGui import *
00004 from PyQt4.QtCore import *
00005 import rospy
00006 import tf_utils as tfu
00007 import tf.transformations as tr
00008 import move_base_msgs.msg as mm
00009 import math
00010 
00011 
00012 #
00013 # controller and view
00014 # create and edits smach states
00015 class NavigateTool(tu.ToolBase):
00016 
00017     def __init__(self, rcommander):
00018         tu.ToolBase.__init__(self, rcommander, 'navigate', 'Navigate')
00019         self.tf_listener = rcommander.tf_listener
00020         self.default_frame = 'map'
00021         self.robot_frame_name = 'base_link'
00022 
00023     def fill_property_box(self, pbox):
00024         formlayout = pbox.layout()
00025         self.xline = QLineEdit(pbox)
00026         self.yline = QLineEdit(pbox)
00027         self.tline = QLineEdit(pbox)
00028         self.frameline = QLineEdit(pbox)
00029         self.frameline.setText(self.default_frame)
00030         self.pose_button = QPushButton(pbox)
00031         self.pose_button.setText('Current Pose')
00032         self.pose_tool = QPushButton(pbox)
00033         self.pose_tool.setText('Specify Pose')
00034         self.reset()
00035 
00036         formlayout.addRow("&x", self.xline)
00037         formlayout.addRow("&y", self.yline)
00038         formlayout.addRow("&theta", self.tline)
00039         formlayout.addRow("&frame", self.frameline)
00040         formlayout.addRow(self.pose_button)
00041         self.rcommander.connect(self.pose_button, SIGNAL('clicked()'), self.get_current_pose)
00042         formlayout.addRow(self.pose_tool)
00043         self.pose_tool.setEnabled(False)
00044         #self.rcommander.connect(self.pose_tool, SIGNAL('clicked()'), self.
00045         pbox.update()
00046         #print 'outcomes!', self.create_node()._outcomes
00047 
00048     def get_current_pose(self):
00049         frame = str(self.frameline.text())
00050         self.tf_listener.waitForTransform(frame, self.robot_frame_name, rospy.Time(), rospy.Duration(2.))
00051         p_base = tfu.transform(frame, self.robot_frame_name, self.tf_listener) \
00052                     * tfu.tf_as_matrix(([0., 0., 0., 1.], tr.quaternion_from_euler(0,0,0)))
00053         t, r = tfu.matrix_as_tf(p_base)
00054         x = t[0]
00055         y = t[1]
00056         theta = tr.euler_from_quaternion(r)[2]
00057         print x,y,theta
00058         
00059         self.xline.setText(str(x))
00060         self.yline.setText(str(y))
00061         self.tline.setText(str(math.degrees(theta)))
00062 
00063     def _create_node(self, name=None):
00064         xy = [float(self.xline.text()), float(self.yline.text())]
00065         theta = math.radians(float(self.tline.text()))
00066         frame = str(self.frameline.text())
00067         if name == None:
00068             nname = self.name + str(self.counter)
00069         else:
00070             nname = name
00071         state = NavigateState(nname, xy, theta, frame)
00072         return state
00073 
00074     def _node_selected(self, node):
00075         xy = node.xy
00076         self.xline.setText(str(xy[0]))
00077         self.yline.setText(str(xy[1]))
00078         self.tline.setText(str(math.degrees(node.theta)))
00079         self.frameline.setText(node.frame)
00080         #print 'node_selected called', xy
00081 
00082     def reset(self):
00083         self.xline.setText('0.')
00084         self.yline.setText('0.')
00085         self.tline.setText('0.')
00086         self.frameline.setText(self.default_frame)
00087 
00088     def get_smach_class(self):
00089         return NavigateState
00090 #
00091 # name maps to tool used to create it
00092 # model
00093 # is a state that can be stuffed into a state machine
00094 class NavigateState(tu.SimpleStateBase): # smach_ros.SimpleActionState):
00095 
00096     def __init__(self, name, xy, theta, frame):
00097         tu.SimpleStateBase.__init__(self, name, \
00098                 'move_base', mm.MoveBaseAction, 
00099                 goal_cb_str = 'ros_goal') 
00100 
00101         self.xy = xy
00102         self.theta = theta #stored as r internally
00103         self.frame = frame
00104 
00105     def ros_goal(self, userdata, default_goal):
00106         g = mm.MoveBaseGoal()
00107         p = g.target_pose
00108         
00109         p.header.frame_id = 'map'
00110         p.header.stamp = rospy.get_rostime()
00111         p.pose.position.x = self.xy[0]
00112         p.pose.position.y = self.xy[1]
00113         p.pose.position.z = 0
00114         
00115         p.pose.orientation.x = self.r[0]
00116         p.pose.orientation.y = self.r[1]
00117         p.pose.orientation.z = self.r[2]
00118         p.pose.orientation.w = self.r[3]
00119         return g
00120 
00121     def _get_theta(self):
00122         return tr.euler_from_quaternion(self.r)[2]
00123 
00124     def _set_theta(self, theta):
00125         self.r = tr.quaternion_from_euler(0, 0, theta)
00126 
00127     #    def _get_xy(self):
00128     #        return [self.xy[0], self.xy[1]]
00129     #
00130     #    def _set_xy(self, xy):
00131     #        self.xy = xy
00132     #        #self.t = [xy[0], xy[1], 0]
00133     #
00134     theta = property(_get_theta, _set_theta)
00135 
00136     #xy = property(_get_xy, _set_xy)
00137 
00138     def __getstate__(self):
00139         state = tu.SimpleStateBase.__getstate__(self)
00140         my_state = [self.xy, self.r, self.frame]
00141         return {'simple_state': state, 'self': my_state}
00142 
00143     def __setstate__(self, state):
00144         #print 'NavigateState setting state', state
00145         tu.SimpleStateBase.__setstate__(self, state['simple_state'])
00146         xy, r, fr = state['self']
00147         self.xy = xy
00148         self.r = r
00149         self.frame = fr
00150         #NavigateState.__init__(self, name, xy, t, fr)
00151 
00152 
00153 


rcommander
Author(s): Hai Nguyen (haidai@gmail.com)
autogenerated on Thu Nov 28 2013 11:46:34