Skip to content

Commit 8208fe6

Browse files
committed
create test_servos2.py - test and calibrate servos with WASD control mode
1 parent b4fae9a commit 8208fe6

File tree

2 files changed

+207
-8
lines changed

2 files changed

+207
-8
lines changed

test_servos.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,20 @@ def menu():
2929
print('3. head set vertical angle')
3030
print('4. head move horizontal angle')
3131
print('5. head move vertical angle')
32-
print('6. dispenser rotate angle')
33-
print('7. dispenser totate until give candy')
34-
print('8. exit')
32+
print('6. dispenser totate until give candy')
33+
print('7. exit')
34+
35+
cap = cv2.VideoCapture(0)
3536

3637
def im_cap_and_save(name):
38+
global cap
3739
time.sleep(1)
3840
ret, frame = cap.read()
3941
if ret is True:
4042
cv2.imwrite(TEST_HEAD_FOLDER + '/' + name, frame)
4143

4244
if __name__ == '__main__':
4345
rospy.init_node('test_head')
44-
cap = cv2.VideoCapture(0)
4546

4647
hp = HeadPublisher()
4748
dispenser = Dispenser(SERVO_CHANNEL=4)
@@ -51,13 +52,13 @@ def im_cap_and_save(name):
5152
menu()
5253
ans = input('>')
5354
point = int(ans)
54-
if point == 8:
55+
if point == 7:
5556
break
5657
elif point == 1:
5758
hp.set_h_angle(90)
5859
hp.set_v_angle(90)
5960
im_cap_and_save('9090.png')
60-
elif point == 7: #rotate dispenser servo until give candy
61+
elif point == 6: #rotate dispenser servo until give candy
6162
start = time.time()
6263
dispenser.run()
6364
while time.time() - start < TIMEOUT:
@@ -80,7 +81,5 @@ def im_cap_and_save(name):
8081
elif point == 5:
8182
hp.move_v_angle(angle)
8283
im_cap_and_save('shift_v_' + str(angle) + '.png')
83-
elif point == 6:
84-
dispenser.set_angle(angle)
8584
else:
8685
print('invalid input')

test_servos2.py

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
#!/usr/bin/env python3
2+
3+
TEST_HEAD_FOLDER='test_servo_folder'
4+
5+
import rospy
6+
import os
7+
8+
if os.path.exists(TEST_HEAD_FOLDER) is False:
9+
os.mkdir(TEST_HEAD_FOLDER)
10+
11+
try:
12+
import cv2
13+
except:
14+
os.insert(1, '/usr/local/lib/python3.5/dist-packages')
15+
import cv2
16+
17+
18+
import getch
19+
20+
from motion.head.head_publisher import HeadPublisher
21+
from motion.eyes.eyes_publisher import EyesPublisher
22+
from motion.eyebrows.eyebrows_publisher import EyebrowsPublisher
23+
24+
from motion.candy_dispenser.candy_dispenser_controller import Dispenser
25+
26+
import serial
27+
TIMEOUT = 10
28+
import time
29+
30+
import ros_numpy
31+
from sensor_msgs.msg import Image
32+
33+
hp = HeadPublisher()
34+
ep = EyesPublisher()
35+
ebp = EyebrowsPublisher()
36+
37+
if not ['/vision_camera_capture/image', 'sensor_msgs/Image'] in rospy.get_published_topics():
38+
cap = cv2.VideoCapture(0)
39+
40+
def im_cap_and_save(name):
41+
if 'cap' in globals():
42+
global cap
43+
44+
time.sleep(1)
45+
ret, frame = cap.read()
46+
if ret is True:
47+
cv2.imwrite(TEST_HEAD_FOLDER + '/' + name, frame)
48+
49+
else:
50+
51+
def callback_photo(data: Image):
52+
try:
53+
cv2.imwrite(TEST_HEAD_FOLDER + '/' + name, ros_numpy.numpify(data))
54+
except Exception as e:
55+
print('image saving error: ', str(e))
56+
57+
58+
get_im_sub = rospy.Subscriber('/vision_face_tracking/face_image', Image, lock_recognize.callback)
59+
time.sleep(1)
60+
get_im_sub.unregister()
61+
62+
63+
64+
def control_head():
65+
global hp
66+
67+
clear = os.system('clear')
68+
69+
step = 5
70+
h_angle = 90
71+
v_angle = 90
72+
73+
if rospy.has_param('/head/h_angle') and rospy.has_param('/head/v_angle'):
74+
h_angle = rospy.get_param('/head/h_angle')
75+
v_angle = rospy.get_param('/head/v_angle')
76+
77+
ans = ''
78+
while ans != 'q':
79+
print('h_angle: {0}, v_angle: {1}'.format(h_angle, v_angle))
80+
print('WASD - control head, q - exit')
81+
ans = getch.getch()
82+
83+
if ans == 'w':
84+
hp.move_v_angle(-step)
85+
elif ans == 's':
86+
hp.move_v_angle(step)
87+
elif ans == 'l':
88+
hp.move_h_angle(step)
89+
elif ans == 'r':
90+
hp.move_h_angle(-step)
91+
else:
92+
pass
93+
94+
im_cap_and_save('head({0} {1})'.format(str(h_angle), str(v_angle))
95+
clear = os.system('clear')
96+
97+
98+
99+
def control_eyes():
100+
global ep
101+
102+
clear = os.system('clear')
103+
104+
x = 0
105+
y = 0
106+
107+
if rospy.has_param('/eyes/x') and rospy.has_param('/eyes/y'):
108+
x = rospy.get_param('/eyes/x')
109+
y = rospy.get_param('/eyes/y')
110+
111+
ans = ''
112+
while ans != 'q':
113+
print('x: {0}, y: {1}'.format(x, y))
114+
print('WASD - control eyes, c - center eyes, q - exit')
115+
ans = getch.getch()
116+
117+
if ans == 'w':
118+
ep.move_up()
119+
elif ans == 's':
120+
ep.move_down()
121+
elif ans == 'l':
122+
ep.move_left()
123+
elif ans == 'r':
124+
ep.move_right()
125+
elif ans == 'c':
126+
ep.move_center()
127+
else:
128+
pass
129+
130+
clear = os.system('clear')
131+
132+
133+
134+
def control_eyebrows():
135+
global ebp
136+
137+
clear = os.system('clear')
138+
139+
step = 5
140+
l_angle = 98
141+
r_angle = 75
142+
143+
if rospy.has_param('/eyebrows/l_angle') and rospy.has_param('/eyebrows/r_angle'):
144+
l_angle = rospy.get_param('/eyebrows/l_angle')
145+
r_angle = rospy.get_param('/eyebrows/r_angle')
146+
147+
ans = ''
148+
while ans != 'q':
149+
print('l_angle: {0}, r_angle: {1}'.format(l_angle, r_angle))
150+
print('WS - control eyebrows, c - center eyebrows, q - exit')
151+
ans = getch.getch()
152+
153+
if ans == 'w':
154+
ebp.move_up()
155+
elif ans == 's':
156+
ebp.move_down()
157+
else:
158+
pass
159+
160+
clear = os.system('clear')
161+
162+
163+
def menu():
164+
print('1. head')
165+
print('2. eyes')
166+
print('3. eyebrows')
167+
print('4. take candy')
168+
print('5. exit')
169+
170+
171+
if __name__ == '__main__':
172+
rospy.init_node('test_head')
173+
174+
175+
dispenser = Dispenser(SERVO_CHANNEL=4)
176+
ser = serial.Serial('/dev/ttyACM0', 9600)
177+
178+
while True:
179+
menu()
180+
ans = input('>')
181+
point = int(ans)
182+
if point == 5:
183+
break
184+
elif point == 1:
185+
control_head()
186+
elif point == 2:
187+
control_eyes()
188+
elif point == 3:
189+
control_eyebrows()
190+
elif point == 4: #rotate dispenser servo until give candy
191+
start = time.time()
192+
dispenser.run()
193+
while time.time() - start < TIMEOUT:
194+
if ser.read(4) == b'true': #if candy dispensing sensor sent true
195+
print('candy!')
196+
break
197+
dispenser.stop()
198+
print('candy timeout!')
199+
else:
200+
print('invalid input')

0 commit comments

Comments
 (0)