|
5 | 5 | from ucPack import ucPack
|
6 | 6 |
|
7 | 7 | from pinout_definitions import *
|
| 8 | +from robot_definitions import * |
8 | 9 | from constants import *
|
9 | 10 |
|
10 | 11 |
|
11 | 12 | class ArduinoAlvik:
|
12 | 13 |
|
13 | 14 | def __init__(self):
|
14 | 15 | self.packeter = ucPack(200)
|
| 16 | + self.left_wheel = ArduinoAlvikWheel(self.packeter, ord('L')) |
| 17 | + self.right_wheel = ArduinoAlvikWheel(self.packeter, ord('R')) |
15 | 18 | self._update_thread_running = False
|
16 | 19 | self._update_thread_id = None
|
17 | 20 | self.l_speed = None
|
@@ -215,6 +218,8 @@ def _parse_message(self) -> int:
|
215 | 218 | if code == ord('j'):
|
216 | 219 | # joint speed
|
217 | 220 | _, self.l_speed, self.r_speed = self.packeter.unpacketC2F()
|
| 221 | + self.left_wheel._speed = self.l_speed |
| 222 | + self.right_wheel._speed = self.r_speed |
218 | 223 | elif code == ord('l'):
|
219 | 224 | # line sensor
|
220 | 225 | _, self.left_line, self.center_line, self.right_line = self.packeter.unpacketC3I()
|
@@ -300,3 +305,62 @@ def print_status(self):
|
300 | 305 | if str(a).startswith('_'):
|
301 | 306 | continue
|
302 | 307 | print(f'{str(a).upper()} = {getattr(self, str(a))}')
|
| 308 | + |
| 309 | + |
| 310 | +class ArduinoAlvikWheel: |
| 311 | + |
| 312 | + def __init__(self, packeter: ucPack, label: int, wheel_diameter_mm: float = WHEEL_DIAMETER_MM): |
| 313 | + self._packeter = packeter |
| 314 | + self._label = label |
| 315 | + self._wheel_diameter_mm = wheel_diameter_mm |
| 316 | + self._speed = None |
| 317 | + |
| 318 | + def reset(self, initial_position: float = 0.0): |
| 319 | + pass |
| 320 | + |
| 321 | + def set_pid_gains(self, kp: float = MOTOR_KP_DEFAULT, ki: float = MOTOR_KI_DEFAULT, kd: float = MOTOR_KD_DEFAULT): |
| 322 | + """ |
| 323 | + Set PID gains for Alvik wheels |
| 324 | + :param kp: proportional gain |
| 325 | + :param ki: integration gain |
| 326 | + :param kd: derivative gain |
| 327 | + :return: |
| 328 | + """ |
| 329 | + |
| 330 | + self._packeter.packetC1B3F(ord('P'), self._label, kp, ki, kd) |
| 331 | + uart.write(self._packeter.msg[0:self._packeter.msg_size]) |
| 332 | + |
| 333 | + def stop(self): |
| 334 | + """ |
| 335 | + Stop Alvik wheel |
| 336 | + :return: |
| 337 | + """ |
| 338 | + self.set_speed(0) |
| 339 | + |
| 340 | + def set_speed(self, velocity: float, unit: str = 'rpm'): |
| 341 | + """ |
| 342 | + Sets left/right motor speed |
| 343 | + :param velocity: the speed of the motor |
| 344 | + :param unit: the unit of measurement |
| 345 | + :return: |
| 346 | + """ |
| 347 | + |
| 348 | + self._packeter.packetC2B1F(ord('W'), self._label & 0xFF, ord('V'), velocity) |
| 349 | + uart.write(self._packeter.msg[0:self._packeter.msg_size]) |
| 350 | + |
| 351 | + def get_speed(self): |
| 352 | + """ |
| 353 | + Gets the current RPM speed of the wheel |
| 354 | + :return: |
| 355 | + """ |
| 356 | + return self._speed |
| 357 | + |
| 358 | + def set_position(self, position: float, unit: str = 'deg'): |
| 359 | + """ |
| 360 | + Sets left/right motor speed |
| 361 | + :param position: the speed of the motor |
| 362 | + :param unit: the unit of measurement |
| 363 | + :return: |
| 364 | + """ |
| 365 | + self._packeter.packetC2B1F(ord('W'), self._label & 0xFF, ord('P'), position) |
| 366 | + uart.write(self._packeter.msg[0:self._packeter.msg_size]) |
0 commit comments