mycobot_ros/scripts/teleop_keyboard.py
2021-05-13 15:40:51 +08:00

177 lines
5.3 KiB
Python
Executable file

#!/usr/bin/env python
from __future__ import print_function
from mycobot_ros.srv import (
GetCoords, SetCoords, GetAngles, SetAngles, GripperStatus)
import rospy
import sys
import select
import termios
import tty
import copy
import time
import roslib
roslib.load_manifest('mycobot_ros')
msg = """
Mycobot Teleop Keyboard Controller
---------------------------
Movimg options(control coordinations [x,y,z,rx,ry,rz]):
w(x+)
a(y-) s(x-) d(y+)
z(z-) x(z+)
u(rx+) i(ry+) o(rz+)
j(rx-) k(ry-) l(rz-)
Gripper control:
g - open
h - close
Other:
1 - Go to init pose
2 - Go to home pose
3 - Resave home pose
q - Quit
"""
def vels(speed, turn):
return "currently:\tspeed: %s\tchange percent: %s " % (speed, turn)
class Raw(object):
def __init__(self,stream):
self.stream = stream
self.fd = self.stream.fileno()
def __enter__(self):
self.original_stty = termios.tcgetattr(self.stream)
tty.setcbreak(self.stream)
def __exit__(self, type, value, traceback):
termios.tcsetattr(self.stream, termios.TCSANOW, self.original_stty)
def teleop_keyboard():
rospy.init_node('teleop_keyboard')
model = 0
speed = rospy.get_param("~speed", 50)
change_percent= rospy.get_param("~change_percent", 5)
change_angle = 180 * change_percent / 100
change_len = 250 * change_percent / 100
rospy.wait_for_service('get_joint_angles')
rospy.wait_for_service('set_joint_angles')
rospy.wait_for_service('get_joint_coords')
rospy.wait_for_service('set_joint_coords')
rospy.wait_for_service('switch_gripper_status')
try:
get_coords = rospy.ServiceProxy('get_joint_coords', GetCoords)
set_coords = rospy.ServiceProxy('set_joint_coords', SetCoords)
get_angles = rospy.ServiceProxy('get_joint_angles', GetAngles)
set_angles = rospy.ServiceProxy('set_joint_angles', SetAngles)
switch_gripper = rospy.ServiceProxy(
'switch_gripper_status', GripperStatus)
except:
print('start error ...')
exit(1)
init_pose = [0, 0, 0, 0, 0, 0, speed]
home_pose = [0, 0, 0, 0, 0, 0, speed]
# rsp = set_angles(*init_pose)
while True:
res = get_coords()
if res.x > 1:
break
time.sleep(.1)
record_coords = [
res.x, res.y, res.z, res.rx, res.ry, res.rz, speed, model
]
print(record_coords)
try:
print(msg)
print(vels(speed, change_percent))
while(1):
try:
# print("\r current coords: %s" % record_coords, end="")
with Raw(sys.stdin):
key = sys.stdin.read(1)
if key == 'q':
break
elif key in ['w', 'W']:
record_coords[0] += change_len
set_coords(*record_coords)
elif key in ['s', 'S']:
record_coords[0] -= change_len
set_coords(*record_coords)
elif key in ['a', 'A']:
record_coords[1] -= change_len
set_coords(*record_coords)
elif key in ['d', 'D']:
record_coords[1] += change_len
set_coords(*record_coords)
elif key in ['z', 'Z']:
record_coords[2] -= change_len
set_coords(*record_coords)
elif key in ['x', 'X']:
record_coords[2] += change_len
set_coords(*record_coords)
elif key in ['u', 'U']:
record_coords[3] += change_angle
set_coords(*record_coords)
elif key in ['j', 'J']:
record_coords[3] -= change_angle
set_coords(*record_coords)
elif key in ['i', 'I']:
record_coords[4] += change_angle
set_coords(*record_coords)
elif key in ['k', 'K']:
record_coords[4] -= change_angle
set_coords(*record_coords)
elif key in ['o', 'O']:
record_coords[5] += change_angle
set_coords(*record_coords)
elif key in ['l', 'L']:
record_coords[5] -= change_angle
set_coords(*record_coords)
elif key in ['g', 'G']:
switch_gripper(True)
elif key in ['h', 'H']:
switch_gripper(False)
elif key == '1':
rsp = set_angles(*init_pose)
elif key in '2':
rsp = set_angles(*home_pose)
elif key in '3':
rep = get_angles()
home_pose[0] = rep.joint_1
home_pose[1] = rep.joint_2
home_pose[2] = rep.joint_3
home_pose[3] = rep.joint_4
home_pose[5] = rep.joint_5
else:
continue
except Exception as e:
# print(e)
continue
except Exception as e:
print(e)
if __name__ == "__main__":
try:
teleop_keyboard()
except rospy.ROSInterruptException:
pass