Skip to content

Commit e184017

Browse files
committed
update demo
1 parent 4e1e8d1 commit e184017

File tree

3 files changed

+267
-155
lines changed

3 files changed

+267
-155
lines changed

demo/drag_trial_teaching.py

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
import time
2+
import os
3+
import sys
4+
import termios
5+
import tty
6+
import threading
7+
import json
8+
import serial
9+
import serial.tools.list_ports
10+
11+
from pymycobot.mycobot import MyCobot
12+
13+
14+
port: str
15+
mc: MyCobot
16+
sp: int = 80
17+
18+
19+
def setup():
20+
print("")
21+
global port, mc
22+
plist = list(serial.tools.list_ports.comports())
23+
idx = 1
24+
for port in plist:
25+
print("{} : {}".format(idx, port))
26+
idx += 1
27+
28+
_in = input("\nPlease input 1 - {} to choice:".format(idx - 1))
29+
port = str(plist[int(_in) - 1]).split(" - ")[0].strip()
30+
print(port)
31+
print("")
32+
33+
baud = 115200
34+
_baud = input("Please input baud(default:115200):")
35+
try:
36+
baud = int(_baud)
37+
except Exception:
38+
pass
39+
print(baud)
40+
print("")
41+
42+
DEBUG = False
43+
f = input("Wether DEBUG mode[Y/n]:")
44+
if f in ["y", "Y", "yes", "Yes"]:
45+
DEBUG = True
46+
# mc = MyCobot(port, debug=True)
47+
mc = MyCobot(port, baud, debug=DEBUG)
48+
49+
50+
class Raw(object):
51+
"""Set raw input mode for device"""
52+
53+
def __init__(self, stream):
54+
self.stream = stream
55+
self.fd = self.stream.fileno()
56+
57+
def __enter__(self):
58+
self.original_stty = termios.tcgetattr(self.stream)
59+
tty.setcbreak(self.stream)
60+
61+
def __exit__(self, type, value, traceback):
62+
termios.tcsetattr(self.stream, termios.TCSANOW, self.original_stty)
63+
64+
65+
class Helper(object):
66+
def __init__(self) -> None:
67+
self.w, self.h = os.get_terminal_size()
68+
69+
def echo(self, msg):
70+
print("\r{}".format(" " * self.w), end="")
71+
print("\r{}".format(msg), end="")
72+
73+
74+
class TeachingTest(Helper):
75+
def __init__(self, mycobot) -> None:
76+
super().__init__()
77+
self.mc = mycobot
78+
self.recording = False
79+
self.playing = False
80+
self.record_list = []
81+
self.record_t = None
82+
self.play_t = None
83+
84+
def record(self):
85+
self.record_list = []
86+
self.recording = True
87+
88+
def _record():
89+
start_t = time.time()
90+
91+
while self.recording:
92+
angles = self.mc.get_angles()
93+
if angles:
94+
self.record_list.append(angles)
95+
time.sleep(0.1)
96+
print("\r {}".format(time.time() - start_t), end="")
97+
98+
self.echo("Start recording.")
99+
self.record_t = threading.Thread(target=_record, daemon=True)
100+
self.record_t.start()
101+
102+
def stop_record(self):
103+
if self.recording:
104+
self.recording = False
105+
self.record_t.join()
106+
self.echo("Stop record")
107+
108+
def play(self):
109+
self.echo("Start play")
110+
for angles in self.record_list:
111+
# print(angles)
112+
self.mc.send_angles(angles, 80)
113+
time.sleep(0.1)
114+
self.echo("Finish play")
115+
116+
def loop_play(self):
117+
self.playing = True
118+
119+
def _loop():
120+
len_ = len(self.record_list)
121+
i = 0
122+
while self.playing:
123+
idx_ = i % len_
124+
i += 1
125+
self.mc.send_angles(self.record_list[idx_], 80)
126+
time.sleep(0.1)
127+
128+
self.echo("Start loop play.")
129+
self.play_t = threading.Thread(target=_loop, daemon=True)
130+
self.play_t.start()
131+
132+
def stop_loop_play(self):
133+
if self.playing:
134+
self.playing = False
135+
self.play_t.join()
136+
self.echo("Stop loop play.")
137+
138+
def save_to_local(self):
139+
if not self.record_list:
140+
self.echo("No data should save.")
141+
return
142+
143+
with open(os.path.dirname(__file__) + "/record.txt", "w") as f:
144+
json.dump(self.record_list, f, indent=2)
145+
self.echo("save dir: {}".format(os.path.dirname(__file__)))
146+
147+
def load_from_local(self):
148+
149+
with open(os.path.dirname(__file__) + "/record.txt", "r") as f:
150+
try:
151+
data = json.load(f)
152+
self.record_list = data
153+
self.echo("Load data success.")
154+
except Exception:
155+
self.echo("Error: invalid data.")
156+
157+
def print_menu(self):
158+
print(
159+
"""\
160+
\r q: quit
161+
\r r: start record
162+
\r c: stop record
163+
\r p: play once
164+
\r P: loop play / stop loop play
165+
\r s: save to local
166+
\r l: load from local
167+
\r f: release mycobot
168+
\r----------------------------------
169+
"""
170+
)
171+
172+
def start(self):
173+
self.print_menu()
174+
175+
while not False:
176+
with Raw(sys.stdin):
177+
key = sys.stdin.read(1)
178+
if key == "q":
179+
break
180+
elif key == "r": # recorder
181+
self.record()
182+
elif key == "c": # stop recorder
183+
self.stop_record()
184+
elif key == "p": # play
185+
self.play()
186+
elif key == "P": # loop play
187+
if not self.playing:
188+
self.loop_play()
189+
else:
190+
self.stop_loop_play()
191+
elif key == "s": # save to local
192+
self.save_to_local()
193+
elif key == "l": # load from local
194+
self.load_from_local()
195+
elif key == "f": # free move
196+
self.mc.release_all_servos()
197+
self.echo("Released")
198+
else:
199+
print(key)
200+
continue
201+
202+
203+
if __name__ == "__main__":
204+
setup()
205+
recorder = TeachingTest(mc)
206+
recorder.start()

demo/reader.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import serial
2+
import serial.tools.list_ports
3+
from pymycobot.mycobot import MyCobot
4+
5+
port: str
6+
mc: MyCobot
7+
sp: int = 80
8+
9+
10+
def setup():
11+
print("")
12+
global port, mc
13+
plist = list(serial.tools.list_ports.comports())
14+
idx = 1
15+
for port in plist:
16+
print("{} : {}".format(idx, port))
17+
idx += 1
18+
19+
_in = input("\nPlease input 1 - {} to choice:".format(idx - 1))
20+
port = str(plist[int(_in) - 1]).split(" - ")[0].strip()
21+
print(port)
22+
print("")
23+
24+
DEBUG = False
25+
f = input("Wether DEBUG mode[Y/n]:")
26+
if f in ["y", "Y", "yes", "Yes"]:
27+
DEBUG = True
28+
# mc = MyCobot(port, debug=True)
29+
mc = MyCobot(port, debug=DEBUG)
30+
31+
32+
def focus():
33+
for i in range(6):
34+
mc.focus_servo(i + 1)
35+
36+
37+
def release():
38+
for i in range(6):
39+
mc.release_servo(i + 1)
40+
41+
42+
def angles():
43+
print(mc.get_angles())
44+
45+
46+
def coords():
47+
print(mc.get_coords())
48+
49+
50+
if __name__ == "__main__":
51+
setup()
52+
while not False:
53+
in_ = int(input("number"))
54+
if in_ == 1:
55+
focus()
56+
elif in_ == 2:
57+
release()
58+
elif in_ == 3:
59+
angles()
60+
elif in_ == 4:
61+
coords()

0 commit comments

Comments
 (0)