Skip to content

Commit ccb3dd4

Browse files
committed
fix: begin clears uart and waits for robot comm
fix: move and rotate wait on target feat: rotate and move blocking / non-blocking feat: wait_for_target, is_target_reached ex: pose_example.py blocking/non-blocking
1 parent bd1ec4d commit ccb3dd4

File tree

2 files changed

+68
-12
lines changed

2 files changed

+68
-12
lines changed

arduino_alvik.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import math
22

3+
import gc
4+
35
from uart import uart
46
import _thread
57
from time import sleep_ms
@@ -74,7 +76,11 @@ def begin(self) -> int:
7476
self._begin_update_thread()
7577
sleep_ms(100)
7678
self._reset_hw()
79+
while uart.any():
80+
uart.read(1)
7781
sleep_ms(1000)
82+
while self.last_ack != 0x00:
83+
sleep_ms(20)
7884
self.set_illuminator(True)
7985
return 0
8086

@@ -96,25 +102,45 @@ def _stop_update_thread(cls):
96102
"""
97103
cls._update_thread_running = False
98104

99-
def rotate(self, angle: float):
105+
def _wait_for_target(self):
106+
while not self.is_target_reached():
107+
pass
108+
109+
def is_target_reached(self) -> bool:
110+
if self.last_ack != ord('M') and self.last_ack != ord('R'):
111+
sleep_ms(50)
112+
return False
113+
else:
114+
self.packeter.packetC1B(ord('X'), ord('K'))
115+
uart.write(self.packeter.msg[0:self.packeter.msg_size])
116+
sleep_ms(200)
117+
return True
118+
119+
def rotate(self, angle: float, blocking: bool = True):
100120
"""
101121
Rotates the robot by given angle
102122
:param angle:
123+
:param blocking:
103124
:return:
104125
"""
105126
sleep_ms(200)
106127
self.packeter.packetC1F(ord('R'), angle)
107128
uart.write(self.packeter.msg[0:self.packeter.msg_size])
129+
if blocking:
130+
self._wait_for_target()
108131

109-
def move(self, distance: float):
132+
def move(self, distance: float, blocking: bool = True):
110133
"""
111134
Moves the robot by given distance
112135
:param distance:
136+
:param blocking:
113137
:return:
114138
"""
115139
sleep_ms(200)
116140
self.packeter.packetC1F(ord('G'), distance)
117141
uart.write(self.packeter.msg[0:self.packeter.msg_size])
142+
if blocking:
143+
self._wait_for_target()
118144

119145
def stop(self):
120146
"""
@@ -130,6 +156,10 @@ def stop(self):
130156
# stop the update thrad
131157
self._stop_update_thread()
132158

159+
# delete instance
160+
del self.__class__.instance
161+
gc.collect()
162+
133163
@staticmethod
134164
def _reset_hw():
135165
"""

examples/pose_example.py

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,46 @@
99
try:
1010

1111
alvik.move(100.0)
12-
while (ack := alvik.get_ack()) != ord('M'):
13-
sleep_ms(200)
12+
print("on target after move")
13+
14+
alvik.move(50.0)
1415
print("on target after move")
1516

1617
alvik.rotate(90.0)
17-
while (ack := alvik.get_ack()) != ord('R'):
18-
sleep_ms(200)
1918
print("on target after rotation")
2019

21-
alvik.move(50.0)
22-
while (ack := alvik.get_ack()) != ord('M'):
23-
sleep_ms(200)
20+
alvik.rotate(-45.00)
21+
print("on target after rotation")
22+
23+
x, y, theta = alvik.get_pose()
24+
print(f'Current pose is x={x}, y={y} ,theta={theta}')
25+
26+
alvik.reset_pose(0, 0, 0)
27+
28+
x, y, theta = alvik.get_pose()
29+
print(f'Updated pose is x={x}, y={y} ,theta={theta}')
30+
sleep_ms(500)
31+
32+
print("___________NON-BLOCKING__________________")
33+
34+
alvik.move(50.0, blocking=False)
35+
while not alvik.is_target_reached():
36+
print(f"Not yet on target received:{alvik.last_ack}")
2437
print("on target after move")
2538

26-
alvik.rotate(-45.00)
27-
while (ack := alvik.get_ack()) != ord('R'):
28-
sleep_ms(200)
39+
alvik.rotate(45.0, blocking=False)
40+
while not alvik.is_target_reached():
41+
print(f"Not yet on target received:{alvik.last_ack}")
42+
print("on target after rotation")
43+
44+
alvik.move(100.0, blocking=False)
45+
while not alvik.is_target_reached():
46+
print(f"Not yet on target received:{alvik.last_ack}")
47+
print("on target after move")
48+
49+
alvik.rotate(-90.00, blocking=False)
50+
while not alvik.is_target_reached():
51+
print(f"Not yet on target received:{alvik.last_ack}")
2952
print("on target after rotation")
3053

3154
x, y, theta = alvik.get_pose()
@@ -37,6 +60,9 @@
3760
print(f'Updated pose is x={x}, y={y} ,theta={theta}')
3861
sleep_ms(500)
3962

63+
alvik.stop()
64+
sys.exit()
65+
4066
except KeyboardInterrupt as e:
4167
print('over')
4268
alvik.stop()

0 commit comments

Comments
 (0)