Skip to content

Commit e858d83

Browse files
authored
Merge pull request #16 from arduino/single_ack_after_mov
Single ack after mov
2 parents d97e755 + ad2ed2f commit e858d83

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

arduino_alvik/arduino_alvik.py

+28-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import struct
44
from machine import I2C
55
import _thread
6-
from time import sleep_ms
6+
from time import sleep_ms, ticks_ms, ticks_diff
77

88
from ucPack import ucPack
99

@@ -67,7 +67,8 @@ def __init__(self):
6767
self._bottom_tof = None
6868
self._linear_velocity = None
6969
self._angular_velocity = None
70-
self._last_ack = ''
70+
self._last_ack = None
71+
self._waiting_ack = None
7172
self._version = [None, None, None]
7273
self._touch_events = _ArduinoAlvikTouchEvents()
7374

@@ -199,6 +200,7 @@ def _wait_for_ack(self) -> None:
199200
Waits until receives 0x00 ack from robot
200201
:return:
201202
"""
203+
self._waiting_ack = 0x00
202204
while self._last_ack != 0x00:
203205
sleep_ms(20)
204206

@@ -229,24 +231,31 @@ def _stop_update_thread(cls):
229231
"""
230232
cls._update_thread_running = False
231233

232-
def _wait_for_target(self):
233-
while not self.is_target_reached():
234-
pass
234+
def _wait_for_target(self, idle_time):
235+
start = ticks_ms()
236+
while True:
237+
if ticks_diff(ticks_ms(), start) >= idle_time*1000 and self.is_target_reached():
238+
break
239+
else:
240+
# print(self._last_ack)
241+
sleep_ms(100)
235242

236243
def is_target_reached(self) -> bool:
237244
"""
238245
Returns True if robot has sent an M or R acknowledgment.
239246
It also responds with an ack received message
240247
:return:
241248
"""
242-
if self._last_ack != ord('M') and self._last_ack != ord('R'):
243-
sleep_ms(50)
244-
return False
245-
else:
249+
if self._waiting_ack is None:
250+
return True
251+
if self._last_ack == self._waiting_ack:
246252
self._packeter.packetC1B(ord('X'), ord('K'))
247253
uart.write(self._packeter.msg[0:self._packeter.msg_size])
248-
sleep_ms(200)
254+
sleep_ms(100)
255+
self._last_ack = 0x00
256+
self._waiting_ack = None
249257
return True
258+
return False
250259

251260
def set_behaviour(self, behaviour: int):
252261
"""
@@ -269,8 +278,9 @@ def rotate(self, angle: float, unit: str = 'deg', blocking: bool = True):
269278
sleep_ms(200)
270279
self._packeter.packetC1F(ord('R'), angle)
271280
uart.write(self._packeter.msg[0:self._packeter.msg_size])
281+
self._waiting_ack = ord('R')
272282
if blocking:
273-
self._wait_for_target()
283+
self._wait_for_target(idle_time=(angle/MOTOR_CONTROL_DEG_S))
274284

275285
def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
276286
"""
@@ -284,8 +294,9 @@ def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
284294
sleep_ms(200)
285295
self._packeter.packetC1F(ord('G'), distance)
286296
uart.write(self._packeter.msg[0:self._packeter.msg_size])
297+
self._waiting_ack = ord('M')
287298
if blocking:
288-
self._wait_for_target()
299+
self._wait_for_target(idle_time=(distance/MOTOR_CONTROL_MM_S))
289300

290301
def stop(self):
291302
"""
@@ -610,7 +621,11 @@ def _parse_message(self) -> int:
610621
_, self._linear_velocity, self._angular_velocity = self._packeter.unpacketC2F()
611622
elif code == ord('x'):
612623
# robot ack
613-
_, self._last_ack = self._packeter.unpacketC1B()
624+
if self._waiting_ack is not None:
625+
_, self._last_ack = self._packeter.unpacketC1B()
626+
else:
627+
self._packeter.unpacketC1B()
628+
self._last_ack = 0x00
614629
elif code == ord('z'):
615630
# robot ack
616631
_, self._x, self._y, self._theta = self._packeter.unpacketC3F()

arduino_alvik/robot_definitions.py

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
MOTOR_KI_DEFAULT = 450.0
44
MOTOR_KD_DEFAULT = 0.0
55
MOTOR_MAX_RPM = 70.0
6+
MOTOR_CONTROL_DEG_S = 100
7+
MOTOR_CONTROL_MM_S = 100
68
WHEEL_TRACK_MM = 89.0
79

810
# Wheels parameters

0 commit comments

Comments
 (0)