Skip to content

Commit 174658c

Browse files
committed
merge main
2 parents 15bca9a + 8f58e0c commit 174658c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2795
-75
lines changed

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
# ChangeLog for pymycobot
22

3+
## v2.9.6 (2022-9-13)
4+
5+
- release v2.9.6
6+
- Fix MyBuddySocket get_radians()、send_radians() BUG
7+
8+
## v2.9.5 (2022-9-13)
9+
10+
- release v2.9.5
11+
- Add MyBuddy serial open(),is_open() function
12+
- Add MyBuddy example
13+
14+
## v2.9.4 (2022-9-8)
15+
16+
- release v2.9.4
17+
- fix read_next_error() bug
18+
- fix set_ssid_pwd() bug
19+
20+
## v2.9.3 (2022-8-31)
21+
22+
- release v2.9.3
23+
- fix jog_increment() bug
24+
- Fixed an incorrect description of the set_fresh_mode interface
25+
326
## v2.9.2 (2022-8-8)
427

528
- release v2.9.2

demo/drag_trial_teaching350.py renamed to demo/myCobot_320_demo/drag_trial_teaching_myCobot_320.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import json
88
import serial
99
import serial.tools.list_ports
10+
sys.path.append(os.getcwd())
1011

1112
from pymycobot.mycobot import MyCobot
1213

demo/350servo_info.py renamed to demo/myCobot_320_demo/myCobot_320_servo_info.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# encoding=utf-8
2+
import os
3+
import sys
4+
sys.path.append(os.getcwd())
5+
26
import matplotlib.pyplot as plt
37
import matplotlib.font_manager as font_manager
8+
49
from pymycobot import MyCobot
510

611
mc = MyCobot("COM12", 115200)

demo/myCobot_320_testtool_M5version_v1.0_20220623.py renamed to demo/myCobot_320_demo/myCobot_320_testtool_M5version_v1.0_20220623.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#!/usr/bin/env python3
2+
import os
3+
import sys
4+
sys.path.append(os.getcwd())
25
import tkinter
36
from tkinter import ttk
47
import time

demo/myCobot_320_testtool_PIversion_v1.0_20220623.py renamed to demo/myCobot_320_demo/myCobot_320_testtool_PIversion_v1.0_20220623.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
#!/usr/bin/env python3
1+
import os
2+
import sys
3+
sys.path.append(os.getcwd())
4+
25
import socket
36
import tkinter
47
from tkinter import ttk

demo/drag_trial_teaching_mubuddy.py renamed to demo/mybuddy_demo/drag_trial_teaching_mubuddy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import json
1111
import serial
1212
import serial.tools.list_ports
13-
13+
sys.path.append(os.getcwd())
1414
from pymycobot import MyBuddy
1515

1616

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
'''
2+
Drag and teach in windows version
3+
'''
4+
from pickle import FALSE
5+
import time
6+
import os
7+
import sys
8+
import threading
9+
import json
10+
import serial
11+
import serial.tools.list_ports
12+
import platform
13+
14+
15+
sys.path.append(os.getcwd())
16+
from pymycobot import MyBuddy
17+
18+
19+
mb: MyBuddy
20+
sp: int = 80
21+
os_version: str
22+
WIN = False
23+
LINUX = False
24+
25+
def setup():
26+
print("")
27+
global port, mb, baud, os_version, WIN, LINUX
28+
os_version = platform.system()
29+
if os_version == 'Windows':
30+
WIN = True
31+
LINUX = False
32+
elif os_version == 'Linux':
33+
WIN = False
34+
LINUX = True
35+
if WIN:
36+
port = 'COM21'
37+
baud = 115200
38+
elif LINUX:
39+
port = '/dev/ttyACM0'
40+
baud = 115200
41+
mb = MyBuddy(port, baud, debug=True)
42+
43+
44+
class Raw(object):
45+
"""Set raw input mode for device"""
46+
47+
48+
def __init__(self, stream):
49+
import termios
50+
import tty
51+
self.stream = stream
52+
self.fd = self.stream.fileno()
53+
54+
def __enter__(self):
55+
self.original_stty = termios.tcgetattr(self.stream)
56+
tty.setcbreak(self.stream)
57+
58+
def __exit__(self, type, value, traceback):
59+
termios.tcsetattr(self.stream, termios.TCSANOW, self.original_stty)
60+
61+
62+
class Helper(object):
63+
def __init__(self) -> None:
64+
self.w, self.h = os.get_terminal_size()
65+
66+
def echo(self, msg):
67+
print("\r{}".format(" " * self.w))
68+
print("\r{}".format(msg))
69+
70+
71+
class TeachingTest(Helper):
72+
def __init__(self, mycobot) -> None:
73+
super().__init__()
74+
self.mb = mb
75+
self.recording = False
76+
self.playing = False
77+
self.record_list = []
78+
self.record_t = None
79+
self.play_t = None
80+
81+
def record(self):
82+
self.record_list = []
83+
self.recording = True
84+
85+
def _record():
86+
start_t = time.time()
87+
_id = 0
88+
while self.recording:
89+
_encoders = self.mb.get_encoders(_id)
90+
if _encoders:
91+
if _encoders[-2:-1]:
92+
self.record_list.append(_encoders)
93+
time.sleep(0.05)
94+
# print("\r {}".format(time.time() - start_t), end="")
95+
self.echo("Start recording.")
96+
self.record_t = threading.Thread(target=_record, daemon=True)
97+
self.record_t.start()
98+
99+
def stop_record(self):
100+
if self.recording:
101+
self.recording = False
102+
self.record_t.join()
103+
self.echo("Stop record")
104+
105+
def play(self):
106+
self.echo("Start play")
107+
for _encoders_data in self.record_list:
108+
print(_encoders_data)
109+
_encoders = _encoders_data[0:7] + _encoders_data[14:21] + _encoders_data[-2:-1]
110+
_speeds = _encoders_data[7:14] + _encoders_data[21:28] + _encoders_data[-1:]
111+
self.mb.set_encoders(0, _encoders,_speeds)
112+
time.sleep(0.05)
113+
self.echo("Finish play")
114+
115+
def loop_play(self):
116+
self.playing = True
117+
118+
def _loop():
119+
len_ = len(self.record_list)
120+
i = 0
121+
while self.playing:
122+
idx_ = i % len_
123+
i += 1
124+
_encoders_data = self.record_list[idx_]
125+
print(_encoders_data)
126+
_encoders = _encoders_data[0:7] + _encoders_data[14:21] + _encoders_data[-2:-1]
127+
_speeds = _encoders_data[7:14] + _encoders_data[21:28] + _encoders_data[-1:]
128+
self.mb.set_encoders(0, _encoders,_speeds)
129+
time.sleep(0.05)
130+
131+
self.echo("Start loop play.")
132+
self.play_t = threading.Thread(target=_loop, daemon=True)
133+
self.play_t.start()
134+
135+
def stop_loop_play(self):
136+
if self.playing:
137+
self.playing = False
138+
self.play_t.join()
139+
self.echo("Stop loop play.")
140+
141+
def save_to_local(self):
142+
if not self.record_list:
143+
self.echo("No data should save.")
144+
return
145+
146+
with open(os.path.dirname(__file__) + "/record.txt", "w") as f:
147+
json.dump(self.record_list, f, indent=2)
148+
self.echo("save dir: {}".format(os.path.dirname(__file__)))
149+
150+
def load_from_local(self):
151+
152+
with open(os.path.dirname(__file__) + "/record.txt", "r") as f:
153+
try:
154+
data = json.load(f)
155+
self.record_list = data
156+
self.echo("Load data success.")
157+
except Exception:
158+
self.echo("Error: invalid data.")
159+
160+
def print_menu(self):
161+
print(
162+
"""\
163+
\r q + Enter: quit
164+
\r r + Enter: start record
165+
\r c + Enter: stop record
166+
\r p + Enter: play once
167+
\r P + Enter: loop play / stop loop play
168+
\r s + Enter: save to local
169+
\r l + Enter: load from local
170+
\r f + Enter: release mycobot
171+
\r----------------------------------
172+
"""
173+
)
174+
175+
def start(self):
176+
global WIN, LINUX
177+
self.print_menu()
178+
while not False:
179+
if WIN:
180+
key = input()
181+
elif LINUX:
182+
with Raw(sys.stdin):
183+
key = sys.stdin.read(1)
184+
if key == "q":
185+
break
186+
elif key == "r": # recorder
187+
self.record()
188+
elif key == "c": # stop recorder
189+
self.stop_record()
190+
elif key == "p": # play
191+
self.play()
192+
elif key == "P": # loop play
193+
if not self.playing:
194+
self.loop_play()
195+
else:
196+
self.stop_loop_play()
197+
elif key == "s": # save to local
198+
self.save_to_local()
199+
elif key == "l": # load from local
200+
self.load_from_local()
201+
elif key == "f": # free move
202+
self.mb.release_all_servos(0)
203+
time.sleep(0.05)
204+
self.mb.release_all_servos(2)
205+
self.echo("Released")
206+
else:
207+
print(key)
208+
continue
209+
210+
211+
if __name__ == "__main__":
212+
setup()
213+
recorder = TeachingTest(mb)
214+
recorder.start()
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# coding=utf8
2+
import os
3+
import time
4+
from pymycobot.mybuddy import MyBuddy
5+
import threading
6+
from threading import Lock, Thread
7+
import cv2 as cv
8+
# Establish serial connection
9+
mc = MyBuddy('/dev/ttyACM0', 115200)
10+
11+
12+
13+
# Release the arms and record the points passed
14+
def read():
15+
time.sleep(10)
16+
t = time.time()
17+
record_list = []
18+
print(1)
19+
while time.time() - t < 5:
20+
angles_1 = mc.get_encoders(1)
21+
angles_2 = mc.get_encoders(2)
22+
if angles_1 and angles_2:
23+
record_list.append([angles_1, angles_2])
24+
time.sleep(0.1)
25+
# Print the read location information, copy and save it as a txt file
26+
for i in record_list:
27+
print(i)
28+
29+
30+
# Take out and use the saved location
31+
def write():
32+
time.sleep(1.5)
33+
# The file here uses the saved txt file
34+
data = list(filter(None, open(os.path.join(os.getcwd(), 'ChewingGum.txt')).read().splitlines()))
35+
for angles in data:
36+
data = eval(angles)[0]
37+
data[4] -= 280
38+
mc.set_encoders(1, data, 100)
39+
time.sleep(0.03)
40+
mc.set_encoders(2, eval(angles)[1], 100)
41+
time.sleep(0.2)
42+
time.sleep(1.5)
43+
mc.set_gripper_state(2, 1)
44+
time.sleep(1.5)
45+
# The file here uses the saved txt file
46+
data = list(filter(None, open(os.path.join(os.getcwd(), 'ChewingGum_2.txt')).read().splitlines()))
47+
for angles in data:
48+
data = eval(angles)[0]
49+
data[4] -= 280
50+
mc.set_encoders(1, data, 100)
51+
time.sleep(0.03)
52+
mc.set_encoders(2, eval(angles)[1], 100)
53+
time.sleep(0.2)
54+
time.sleep(1.5)
55+
mc.set_gripper_state(2, 0)
56+
time.sleep(1.5)
57+
# The file here uses the saved txt file
58+
data = list(filter(None, open(os.path.join(os.getcwd(), 'ChewingGum_3.txt')).read().splitlines()))
59+
for angles in data:
60+
data = eval(angles)[0]
61+
data[4] -= 280
62+
mc.set_encoders(1, data, 100)
63+
time.sleep(0.03)
64+
mc.set_encoders(2, eval(angles)[1], 100)
65+
time.sleep(0.2)
66+
67+
68+
# show emoji
69+
def smile():
70+
# The location where the emoji file is stored
71+
cap = cv.VideoCapture("/home/ubuntu/emo/face_video_3_2.mp4")
72+
out_win = "l"
73+
cv.namedWindow(out_win, cv.WINDOW_NORMAL)
74+
cv.setWindowProperty(out_win, cv.WND_PROP_FULLSCREEN, cv.WINDOW_FULLSCREEN)
75+
# infinite loop
76+
while True:
77+
ret, frame = cap.read()
78+
if frame is not None:
79+
print(1)
80+
cv.imshow(out_win, frame)
81+
if cv.waitKey(1) & 0xFF == ord('q') or ret == False:
82+
cap = cv.VideoCapture("/home/ubuntu/emo/look_happy.mp4")
83+
84+
85+
if __name__ == '__main__':
86+
# run with multithreading
87+
t1 = threading.Thread(target=write)
88+
t2 = threading.Thread(target=smile)
89+
t1.start()
90+
t2.start()

0 commit comments

Comments
 (0)