35 from cursesmenu
import *
42 import yamlordereddictloader
47 from std_msgs.msg
import Bool, Int32
50 from trajectory_msgs.msg
import JointTrajectoryPoint
51 from control_msgs.msg
import JointTrajectoryAction, JointTrajectoryGoal, FollowJointTrajectoryAction, FollowJointTrajectoryGoal
52 from sensor_msgs.msg
import JointState
54 from os
import listdir
55 from os.path
import isfile, join
59 This class creates a kinesthetic interface for Revel series robotic arms. 60 Run as a file, this class is used and wrapped around an n-curses style terminal gui. 62 The KinestheticTeaching class could be imported and used as a base for a drag-and-click GUI, 63 or voice activated interactive system. 73 joint_states_sub = rospy.Subscriber(
'/joint_states', JointState, self.
js_cb, queue_size=1)
76 self.fkine.wait_for_server()
80 self.gripper_client.wait_for_server()
85 rospack = rospkg.RosPack()
86 self.
path = rospack.get_path(
'svenzva_utils')
102 self.gripper_goal.target_action = self.gripper_goal.OPEN
108 self.gripper_goal.target_action = self.gripper_goal.CLOSE
109 self.gripper_goal.target_current = 200
118 * To be called each time the user wishes to save a pose 122 raw_input(
"You must set the interaction before saving poses. Press Enter to continue.")
128 name = raw_input(
"Name this pose: ")
130 ar.append(self.joint_states.position[0])
131 ar.append(self.joint_states.position[1])
132 ar.append(self.joint_states.position[2])
133 ar.append(self.joint_states.position[3])
134 ar.append(self.joint_states.position[4])
135 ar.append(self.joint_states.position[5])
136 f.write(name +
": " + str(ar) +
"\n")
144 raw_input(
"You must set the interaction before saving poses. Press Enter to continue.")
151 ran = random.randint(1,10000)
158 ar.append(
"open_gripper")
161 ar.append(
"close_gripper")
163 f.write(
"gripper" + str(ran) +
": " +str(ar) +
"\n")
176 self.
interaction_name = raw_input(
"Name contained invalid characters.\n Set interaction (file)name: ")
186 Sends a j6 or gripper command given a yaml file. 187 Stand-alone method for playing a state. 191 f = open(self.
path+
"/config/" + filename +
".yaml")
192 qmap = yaml.load(f,Loader=yamlordereddictloader.Loader)
198 req = SvenzvaJointGoal()
199 if qmap[state_name][0] ==
"open_gripper":
202 elif qmap[state_name][0] ==
"close_gripper":
206 if len(qmap[state_name]) < 6:
209 req.positions = qmap[state_name]
212 self.fkine.send_goal_and_wait(req)
215 Plays back a specific state name. Helper fuction 219 req = SvenzvaJointGoal()
222 if qmap[state_name][0] ==
"open_gripper":
225 elif qmap[state_name][0] ==
"close_gripper":
229 if len(qmap[state_name]) < 6:
232 req.positions = qmap[state_name]
235 self.fkine.send_goal_and_wait(req)
239 Plays back an entire interaction- all poses specified in an interaction file 243 raw_input(
"You must set the interaction before saving poses. Press Enter to continue.")
248 qmap = yaml.load(f, Loader=yamlordereddictloader.Loader)
252 raw_input(
"Could not find specified state file.")
267 time = rospy.get_rostime()
268 max_time = rospy.Duration(10.0)
270 while rospy.get_rostime() < time + max_time:
273 if abs(self.joint_states.position[i] - q_ar[i]) > self.
delta:
284 mypath = self.
path +
"/config/" 285 return [f
for f
in listdir(mypath)
if isfile(join(mypath, f))]
291 str_build += str(item) +
"\n" 298 self.
menu = CursesMenu(
"Main",
"Teach or playback a guided interaction")
300 gripper_menu = CursesMenu(
"Gripper Interaction",
"Teaching a new guided interaction")
301 record_menu = CursesMenu(
"Record Interaction",
"Teaching a new guided interaction")
302 playback_menu = CursesMenu(
"Playback Interaction",
"Playing back an existing interaction")
304 record_submenu_item = SubmenuItem(
"Record a new interaction", record_menu, self.
menu)
305 gripper_submenu_item = SubmenuItem(
"Set gripper action", gripper_menu, record_menu)
306 playback_submenu_item = SubmenuItem(
"Playback an existing interaction", playback_menu, self.
menu)
316 gripper_menu.append_item(save_gripper_open_item)
317 gripper_menu.append_item(save_gripper_close_item)
319 record_menu.append_item(save_pose_item)
320 record_menu.append_item(gripper_submenu_item)
322 self.menu.append_item(set_int_name_item)
323 self.menu.append_item(list_existing_interactions_item)
324 self.menu.append_item(record_submenu_item)
325 self.menu.append_item(playback_item)
330 if __name__ ==
'__main__':
332 rospy.init_node(
'svenzva_kinesthic_teaching_console', anonymous=
False)
335 kt.start_console_menu()
336 except rospy.ROSInterruptException:
def record_state_interaction(self)
def js_playback(self, filename, state_name)
def set_new_interaction_name(self)
def list_existing_interactions(self)
def playback_interaction(self)
def start_console_menu(self)
def wait_for_stall(self, q_ar)
def record_gripper_interaction(self, open_gripper)