00001 import tool_utils as tu
00002
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
00014
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
00045 pbox.update()
00046
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
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
00092
00093
00094 class NavigateState(tu.SimpleStateBase):
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
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
00128
00129
00130
00131
00132
00133
00134 theta = property(_get_theta, _set_theta)
00135
00136
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
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
00151
00152
00153