@@ -21,53 +21,53 @@ class ArduinoAlvik:
21
21
_update_thread_id = None
22
22
23
23
def __new__ (cls ):
24
- if not hasattr (cls , 'instance ' ):
25
- cls .instance = super (ArduinoAlvik , cls ).__new__ (cls )
26
- return cls .instance
24
+ if not hasattr (cls , '_instance ' ):
25
+ cls ._instance = super (ArduinoAlvik , cls ).__new__ (cls )
26
+ return cls ._instance
27
27
28
28
def __init__ (self ):
29
- self .packeter = ucPack (200 )
30
- self .left_wheel = _ArduinoAlvikWheel (self .packeter , ord ('L' ))
31
- self .right_wheel = _ArduinoAlvikWheel (self .packeter , ord ('R' ))
32
- self .led_state = [None ]
33
- self .left_led = _ArduinoAlvikRgbLed (self .packeter , 'left' , self .led_state ,
29
+ self ._packeter = ucPack (200 )
30
+ self .left_wheel = _ArduinoAlvikWheel (self ._packeter , ord ('L' ))
31
+ self .right_wheel = _ArduinoAlvikWheel (self ._packeter , ord ('R' ))
32
+ self ._led_state = [None ]
33
+ self .left_led = _ArduinoAlvikRgbLed (self ._packeter , 'left' , self ._led_state ,
34
34
rgb_mask = [0b00000100 , 0b00001000 , 0b00010000 ])
35
- self .right_led = _ArduinoAlvikRgbLed (self .packeter , 'right' , self .led_state ,
35
+ self .right_led = _ArduinoAlvikRgbLed (self ._packeter , 'right' , self ._led_state ,
36
36
rgb_mask = [0b00100000 , 0b01000000 , 0b10000000 ])
37
- self .battery_perc = None
38
- self .touch_bits = None
39
- self .behaviour = None
40
- self .red = None
41
- self .green = None
42
- self .blue = None
37
+ self ._battery_perc = None
38
+ self ._touch_byte = None
39
+ self ._behaviour = None
40
+ self ._red = None
41
+ self ._green = None
42
+ self ._blue = None
43
43
self ._white_cal = None
44
44
self ._black_cal = None
45
- self .left_line = None
46
- self .center_line = None
47
- self .right_line = None
48
- self .roll = None
49
- self .pitch = None
50
- self .yaw = None
51
- self .x = None
52
- self .y = None
53
- self .theta = None
54
- self .ax = None
55
- self .ay = None
56
- self .az = None
57
- self .gx = None
58
- self .gy = None
59
- self .gz = None
60
- self .left_tof = None
61
- self .center_left_tof = None
62
- self .center_tof = None
63
- self .center_right_tof = None
64
- self .right_tof = None
65
- self .top_tof = None
66
- self .bottom_tof = None
67
- self .linear_velocity = None
68
- self .angular_velocity = None
69
- self .last_ack = ''
70
- self .version = [None , None , None ]
45
+ self ._left_line = None
46
+ self ._center_line = None
47
+ self ._right_line = None
48
+ self ._roll = None
49
+ self ._pitch = None
50
+ self ._yaw = None
51
+ self ._x = None
52
+ self ._y = None
53
+ self ._theta = None
54
+ self ._ax = None
55
+ self ._ay = None
56
+ self ._az = None
57
+ self ._gx = None
58
+ self ._gy = None
59
+ self ._gz = None
60
+ self ._left_tof = None
61
+ self ._center_left_tof = None
62
+ self ._center_tof = None
63
+ self ._center_right_tof = None
64
+ self ._right_tof = None
65
+ self ._top_tof = None
66
+ self ._bottom_tof = None
67
+ self ._linear_velocity = None
68
+ self ._angular_velocity = None
69
+ self ._angular_velocity = ''
70
+ self ._version = [None , None , None ]
71
71
72
72
@staticmethod
73
73
def is_on () -> bool :
@@ -191,7 +191,7 @@ def _wait_for_ack(self) -> None:
191
191
Waits until receives 0x00 ack from robot
192
192
:return:
193
193
"""
194
- while self .last_ack != 0x00 :
194
+ while self ._angular_velocity != 0x00 :
195
195
sleep_ms (20 )
196
196
197
197
@staticmethod
@@ -231,12 +231,12 @@ def is_target_reached(self) -> bool:
231
231
It also responds with an ack received message
232
232
:return:
233
233
"""
234
- if self .last_ack != ord ('M' ) and self .last_ack != ord ('R' ):
234
+ if self ._angular_velocity != ord ('M' ) and self ._angular_velocity != ord ('R' ):
235
235
sleep_ms (50 )
236
236
return False
237
237
else :
238
- self .packeter .packetC1B (ord ('X' ), ord ('K' ))
239
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
238
+ self ._packeter .packetC1B (ord ('X' ), ord ('K' ))
239
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
240
240
sleep_ms (200 )
241
241
return True
242
242
@@ -246,8 +246,8 @@ def set_behaviour(self, behaviour: int):
246
246
:param behaviour: behaviour code
247
247
:return:
248
248
"""
249
- self .packeter .packetC1B (ord ('B' ), behaviour & 0xFF )
250
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
249
+ self ._packeter .packetC1B (ord ('B' ), behaviour & 0xFF )
250
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
251
251
252
252
def rotate (self , angle : float , unit : str = 'deg' , blocking : bool = True ):
253
253
"""
@@ -259,8 +259,8 @@ def rotate(self, angle: float, unit: str = 'deg', blocking: bool = True):
259
259
"""
260
260
angle = convert_angle (angle , unit , 'deg' )
261
261
sleep_ms (200 )
262
- self .packeter .packetC1F (ord ('R' ), angle )
263
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
262
+ self ._packeter .packetC1F (ord ('R' ), angle )
263
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
264
264
if blocking :
265
265
self ._wait_for_target ()
266
266
@@ -274,8 +274,8 @@ def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
274
274
"""
275
275
distance = convert_distance (distance , unit , 'mm' )
276
276
sleep_ms (200 )
277
- self .packeter .packetC1F (ord ('G' ), distance )
278
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
277
+ self ._packeter .packetC1F (ord ('G' ), distance )
278
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
279
279
if blocking :
280
280
self ._wait_for_target ()
281
281
@@ -293,8 +293,8 @@ def stop(self):
293
293
# stop the update thrad
294
294
self ._stop_update_thread ()
295
295
296
- # delete instance
297
- del self .__class__ .instance
296
+ # delete _instance
297
+ del self .__class__ ._instance
298
298
gc .collect ()
299
299
300
300
@staticmethod
@@ -333,8 +333,8 @@ def set_wheels_speed(self, left_speed: float, right_speed: float, unit: str = 'r
333
333
left_speed = convert_rotational_speed (left_speed , unit , 'rpm' )
334
334
right_speed = convert_rotational_speed (right_speed , unit , 'rpm' )
335
335
336
- self .packeter .packetC2F (ord ('J' ), left_speed , right_speed )
337
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
336
+ self ._packeter .packetC2F (ord ('J' ), left_speed , right_speed )
337
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
338
338
339
339
def set_wheels_position (self , left_angle : float , right_angle : float , unit : str = 'deg' ):
340
340
"""
@@ -344,9 +344,9 @@ def set_wheels_position(self, left_angle: float, right_angle: float, unit: str =
344
344
:param unit: the speed unit of measurement (default: 'rpm')
345
345
:return:
346
346
"""
347
- self .packeter .packetC2F (ord ('A' ), convert_angle (left_angle , unit , 'deg' ),
347
+ self ._packeter .packetC2F (ord ('A' ), convert_angle (left_angle , unit , 'deg' ),
348
348
convert_angle (right_angle , unit , 'deg' ))
349
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
349
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
350
350
351
351
def get_wheels_position (self , unit : str = 'deg' ) -> (float , float ):
352
352
"""
@@ -363,36 +363,36 @@ def get_orientation(self) -> (float, float, float):
363
363
:return: roll, pitch, yaw
364
364
"""
365
365
366
- return self .roll , self .pitch , self .yaw
366
+ return self ._roll , self ._pitch , self ._yaw
367
367
368
368
def get_accelerations (self ) -> (float , float , float ):
369
369
"""
370
370
Returns the 3-axial acceleration of the IMU
371
371
:return: ax, ay, az
372
372
"""
373
- return self .ax , self .ay , self .az
373
+ return self ._ax , self ._ay , self ._az
374
374
375
375
def get_gyros (self ) -> (float , float , float ):
376
376
"""
377
377
Returns the 3-axial angular acceleration of the IMU
378
378
:return: gx, gy, gz
379
379
"""
380
- return self .gx , self .gy , self .gz
380
+ return self ._gx , self ._gy , self ._gz
381
381
382
382
def get_imu (self ) -> (float , float , float , float , float , float ):
383
383
"""
384
384
Returns all the IMUs readouts
385
385
:return: ax, ay, az, gx, gy, gz
386
386
"""
387
- return self .ax , self .ay , self .az , self .gx , self .gy , self .gz
387
+ return self ._ax , self ._ay , self ._az , self ._gx , self ._gy , self ._gz
388
388
389
389
def get_line_sensors (self ) -> (int , int , int ):
390
390
"""
391
391
Returns the line sensors readout
392
392
:return: left_line, center_line, right_line
393
393
"""
394
394
395
- return self .left_line , self .center_line , self .right_line
395
+ return self ._left_line , self ._center_line , self ._right_line
396
396
397
397
def drive (self , linear_velocity : float , angular_velocity : float , linear_unit : str = 'cm/s' ,
398
398
angular_unit : str = 'deg/s' ):
@@ -409,8 +409,8 @@ def drive(self, linear_velocity: float, angular_velocity: float, linear_unit: st
409
409
angular_velocity = (angular_velocity / 100 )* ROBOT_MAX_DEG_S
410
410
else :
411
411
angular_velocity = convert_rotational_speed (angular_velocity , angular_unit , 'deg/s' )
412
- self .packeter .packetC2F (ord ('V' ), linear_velocity , angular_velocity )
413
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
412
+ self ._packeter .packetC2F (ord ('V' ), linear_velocity , angular_velocity )
413
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
414
414
415
415
def brake (self ):
416
416
"""
@@ -427,11 +427,11 @@ def get_drive_speed(self, linear_unit: str = 'cm/s', angular_unit: str = 'deg/s'
427
427
:return: linear_velocity, angular_velocity
428
428
"""
429
429
if angular_unit == '%' :
430
- angular_velocity = (self .angular_velocity / ROBOT_MAX_DEG_S )* 100
430
+ angular_velocity = (self ._angular_velocity / ROBOT_MAX_DEG_S )* 100
431
431
else :
432
- angular_velocity = convert_rotational_speed (self .angular_velocity , 'deg/s' , angular_unit )
432
+ angular_velocity = convert_rotational_speed (self ._angular_velocity , 'deg/s' , angular_unit )
433
433
434
- return convert_speed (self .linear_velocity , 'mm/s' , linear_unit ), angular_velocity
434
+ return convert_speed (self ._linear_velocity , 'mm/s' , linear_unit ), angular_velocity
435
435
436
436
def reset_pose (self , x : float , y : float , theta : float , distance_unit : str = 'cm' , angle_unit : str = 'deg' ):
437
437
"""
@@ -446,8 +446,8 @@ def reset_pose(self, x: float, y: float, theta: float, distance_unit: str = 'cm'
446
446
x = convert_distance (x , distance_unit , 'mm' )
447
447
y = convert_distance (y , distance_unit , 'mm' )
448
448
theta = convert_angle (theta , angle_unit , 'deg' )
449
- self .packeter .packetC3F (ord ('Z' ), x , y , theta )
450
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
449
+ self ._packeter .packetC3F (ord ('Z' ), x , y , theta )
450
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
451
451
sleep_ms (1000 )
452
452
453
453
def get_pose (self , distance_unit : str = 'cm' , angle_unit : str = 'deg' ) -> (float , float , float ):
@@ -457,9 +457,9 @@ def get_pose(self, distance_unit: str = 'cm', angle_unit: str = 'deg') -> (float
457
457
:param angle_unit: unit of theta output
458
458
:return: x, y, theta
459
459
"""
460
- return (convert_distance (self .x , 'mm' , distance_unit ),
461
- convert_distance (self .y , 'mm' , distance_unit ),
462
- convert_angle (self .theta , 'deg' , angle_unit ))
460
+ return (convert_distance (self ._x , 'mm' , distance_unit ),
461
+ convert_distance (self ._y , 'mm' , distance_unit ),
462
+ convert_angle (self ._theta , 'deg' , angle_unit ))
463
463
464
464
def set_servo_positions (self , a_position : int , b_position : int ):
465
465
"""
@@ -468,19 +468,19 @@ def set_servo_positions(self, a_position: int, b_position: int):
468
468
:param b_position: position of B servomotor (0-180)
469
469
:return:
470
470
"""
471
- self .packeter .packetC2B (ord ('S' ), a_position & 0xFF , b_position & 0xFF )
472
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
471
+ self ._packeter .packetC2B (ord ('S' ), a_position & 0xFF , b_position & 0xFF )
472
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
473
473
474
474
def get_ack (self ):
475
475
"""
476
476
Returns last acknowledgement
477
477
:return:
478
478
"""
479
- return self .last_ack
479
+ return self ._angular_velocity
480
480
481
481
# def send_ack(self):
482
- # self.packeter .packetC1B(ord('X'), ACK_)
483
- # uart.write(self.packeter .msg[0:self.packeter .msg_size])
482
+ # self._packeter .packetC1B(ord('X'), ACK_)
483
+ # uart.write(self._packeter .msg[0:self._packeter .msg_size])
484
484
485
485
def _set_leds (self , led_state : int ):
486
486
"""
@@ -489,31 +489,31 @@ def _set_leds(self, led_state: int):
489
489
5->right_red 6->right_green 7->right_blue
490
490
:return:
491
491
"""
492
- self .led_state [0 ] = led_state & 0xFF
493
- self .packeter .packetC1B (ord ('L' ), self .led_state [0 ])
494
- uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
492
+ self ._led_state [0 ] = led_state & 0xFF
493
+ self ._packeter .packetC1B (ord ('L' ), self ._led_state [0 ])
494
+ uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
495
495
496
496
def set_builtin_led (self , value : bool ):
497
497
"""
498
498
Turns on/off the builtin led
499
499
:param value:
500
500
:return:
501
501
"""
502
- if self .led_state [0 ] is None :
502
+ if self ._led_state [0 ] is None :
503
503
self ._set_leds (0x00 )
504
- self .led_state [0 ] = self .led_state [0 ] | 0b00000001 if value else self .led_state [0 ] & 0b11111110
505
- self ._set_leds (self .led_state [0 ])
504
+ self ._led_state [0 ] = self ._led_state [0 ] | 0b00000001 if value else self ._led_state [0 ] & 0b11111110
505
+ self ._set_leds (self ._led_state [0 ])
506
506
507
507
def set_illuminator (self , value : bool ):
508
508
"""
509
509
Turns on/off the illuminator led
510
510
:param value:
511
511
:return:
512
512
"""
513
- if self .led_state [0 ] is None :
513
+ if self ._led_state [0 ] is None :
514
514
self ._set_leds (0x00 )
515
- self .led_state [0 ] = self .led_state [0 ] | 0b00000010 if value else self .led_state [0 ] & 0b11111101
516
- self ._set_leds (self .led_state [0 ])
515
+ self ._led_state [0 ] = self ._led_state [0 ] | 0b00000010 if value else self ._led_state [0 ] & 0b11111101
516
+ self ._set_leds (self ._led_state [0 ])
517
517
518
518
def _update (self , delay_ = 1 ):
519
519
"""
@@ -547,8 +547,8 @@ def _read_message(self) -> bool:
547
547
"""
548
548
while uart .any ():
549
549
b = uart .read (1 )[0 ]
550
- self .packeter .buffer .push (b )
551
- if b == self .packeter .end_index and self .packeter .checkPayload ():
550
+ self ._packeter .buffer .push (b )
551
+ if b == self ._packeter .end_index and self ._packeter .checkPayload ():
552
552
return True
553
553
return False
554
554
@@ -557,53 +557,53 @@ def _parse_message(self) -> int:
557
557
Parse a received message
558
558
:return: -1 if parse error 0 if ok
559
559
"""
560
- code = self .packeter .payloadTop ()
560
+ code = self ._packeter .payloadTop ()
561
561
if code == ord ('j' ):
562
562
# joint speed
563
- _ , self .left_wheel ._speed , self .right_wheel ._speed = self .packeter .unpacketC2F ()
563
+ _ , self .left_wheel ._speed , self .right_wheel ._speed = self ._packeter .unpacketC2F ()
564
564
elif code == ord ('l' ):
565
565
# line sensor
566
- _ , self .left_line , self .center_line , self .right_line = self .packeter .unpacketC3I ()
566
+ _ , self ._left_line , self ._center_line , self ._right_line = self ._packeter .unpacketC3I ()
567
567
elif code == ord ('c' ):
568
568
# color sensor
569
- _ , self .red , self .green , self .blue = self .packeter .unpacketC3I ()
569
+ _ , self ._red , self ._green , self ._blue = self ._packeter .unpacketC3I ()
570
570
elif code == ord ('i' ):
571
571
# imu
572
- _ , self .ax , self .ay , self .az , self .gx , self .gy , self .gz = self .packeter .unpacketC6F ()
572
+ _ , self ._ax , self ._ay , self ._az , self ._gx , self ._gy , self ._gz = self ._packeter .unpacketC6F ()
573
573
elif code == ord ('p' ):
574
574
# battery percentage
575
- _ , self .battery_perc = self .packeter .unpacketC1F ()
575
+ _ , self ._battery_perc = self ._packeter .unpacketC1F ()
576
576
elif code == ord ('d' ):
577
577
# distance sensor
578
- _ , self .left_tof , self .center_tof , self .right_tof = self .packeter .unpacketC3I ()
578
+ _ , self ._left_tof , self ._center_tof , self ._right_tof = self ._packeter .unpacketC3I ()
579
579
elif code == ord ('t' ):
580
580
# touch input
581
- _ , self .touch_bits = self .packeter .unpacketC1B ()
581
+ _ , self ._touch_byte = self ._packeter .unpacketC1B ()
582
582
elif code == ord ('b' ):
583
583
# behaviour
584
- _ , self .behaviour = self .packeter .unpacketC1B ()
584
+ _ , self ._behaviour = self ._packeter .unpacketC1B ()
585
585
elif code == ord ('f' ):
586
586
# tof matrix
587
- (_ , self .left_tof , self .center_left_tof , self .center_tof ,
588
- self .center_right_tof , self .right_tof , self .top_tof , self .bottom_tof ) = self .packeter .unpacketC7I ()
587
+ (_ , self ._left_tof , self ._center_left_tof , self ._center_tof ,
588
+ self ._center_right_tof , self ._right_tof , self ._top_tof , self ._bottom_tof ) = self ._packeter .unpacketC7I ()
589
589
elif code == ord ('q' ):
590
590
# imu position
591
- _ , self .roll , self .pitch , self .yaw = self .packeter .unpacketC3F ()
591
+ _ , self ._roll , self ._pitch , self ._yaw = self ._packeter .unpacketC3F ()
592
592
elif code == ord ('w' ):
593
593
# wheels position
594
- _ , self .left_wheel ._position , self .right_wheel ._position = self .packeter .unpacketC2F ()
594
+ _ , self .left_wheel ._position , self .right_wheel ._position = self ._packeter .unpacketC2F ()
595
595
elif code == ord ('v' ):
596
596
# robot velocity
597
- _ , self .linear_velocity , self .angular_velocity = self .packeter .unpacketC2F ()
597
+ _ , self ._linear_velocity , self ._angular_velocity = self ._packeter .unpacketC2F ()
598
598
elif code == ord ('x' ):
599
599
# robot ack
600
- _ , self .last_ack = self .packeter .unpacketC1B ()
600
+ _ , self ._angular_velocity = self ._packeter .unpacketC1B ()
601
601
elif code == ord ('z' ):
602
602
# robot ack
603
- _ , self .x , self .y , self .theta = self .packeter .unpacketC3F ()
603
+ _ , self ._x , self ._y , self ._theta = self ._packeter .unpacketC3F ()
604
604
elif code == 0x7E :
605
605
# firmware version
606
- _ , * self .version = self .packeter .unpacketC3B ()
606
+ _ , * self ._version = self ._packeter .unpacketC3B ()
607
607
else :
608
608
return - 1
609
609
@@ -614,72 +614,73 @@ def get_battery_charge(self) -> int:
614
614
Returns the battery SOC
615
615
:return:
616
616
"""
617
- if self .battery_perc > 100 :
617
+ if self ._battery_perc > 100 :
618
618
return 100
619
- return round (self .battery_perc )
619
+ return round (self ._battery_perc )
620
620
621
- def _get_touch (self ) -> int :
621
+ @property
622
+ def _touch_bits (self ) -> int :
622
623
"""
623
624
Returns the touch sensor's state
624
625
:return: touch_bits
625
626
"""
626
- return self .touch_bits
627
+ return ( self ._touch_byte & 0xFF ) if self . _touch_byte is not None else 0x00
627
628
628
629
def get_touch_any (self ) -> bool :
629
630
"""
630
631
Returns true if any button is pressed
631
632
:return:
632
633
"""
633
- return bool (self .touch_bits & 0b00000001 )
634
+ return bool (self ._touch_bits & 0b00000001 )
634
635
635
636
def get_touch_ok (self ) -> bool :
636
637
"""
637
638
Returns true if ok button is pressed
638
639
:return:
639
640
"""
640
- return bool (self .touch_bits & 0b00000010 )
641
+ return bool (self ._touch_bits & 0b00000010 )
641
642
642
643
def get_touch_cancel (self ) -> bool :
643
644
"""
644
645
Returns true if cancel button is pressed
645
646
:return:
646
647
"""
647
- return bool (self .touch_bits & 0b00000100 )
648
+ return bool (self ._touch_bits & 0b00000100 )
648
649
649
650
def get_touch_center (self ) -> bool :
650
651
"""
651
652
Returns true if center button is pressed
652
653
:return:
653
654
"""
654
- return bool (self .touch_bits & 0b00001000 )
655
+ return bool (self ._touch_bits & 0b00001000 )
655
656
656
657
def get_touch_up (self ) -> bool :
657
658
"""
658
659
Returns true if up button is pressed
659
660
:return:
660
661
"""
661
- return bool (self .touch_bits & 0b00010000 )
662
+ return bool (self ._touch_bits & 0b00010000 )
662
663
663
664
def get_touch_left (self ) -> bool :
664
665
"""
665
666
Returns true if left button is pressed
666
667
:return:
667
668
"""
668
- return bool (self .touch_bits & 0b00100000 )
669
+ return bool (self ._touch_bits & 0b00100000 )
669
670
670
671
def get_touch_down (self ) -> bool :
671
672
"""
672
673
Returns true if down button is pressed
673
674
:return:
674
675
"""
675
- return bool (self .touch_bits & 0b01000000 )
676
+ return bool (self ._touch_bits & 0b01000000 )
676
677
677
678
def get_touch_right (self ) -> bool :
678
679
"""
679
680
Returns true if right button is pressed
680
681
:return:
681
682
"""
682
- return bool (self .touch_bits & 0b10000000 )
683
+ return bool (self ._touch_bits & 0b10000000 )
683
684
684
685
@staticmethod
685
686
def _limit (value : float , lower : float , upper : float ) -> float :
@@ -768,7 +769,7 @@ def get_color_raw(self) -> (int, int, int):
768
769
:return: red, green, blue
769
770
"""
770
771
771
- return self .red , self .green , self .blue
772
+ return self ._red , self ._green , self ._blue
772
773
773
774
def _normalize_color (self , r : float , g : float , b : float ) -> (float , float , float ):
774
775
"""
@@ -836,6 +837,9 @@ def get_color(self, color_format: str = 'rgb') -> (float, float, float):
836
837
"""
837
838
assert color_format in ['rgb' , 'hsv' ]
838
839
840
+ if None in list (self .get_color_raw ()):
841
+ return None , None , None
842
+
839
843
if color_format == 'rgb' :
840
844
return self ._normalize_color (* self .get_color_raw ())
841
845
elif color_format == 'hsv' :
@@ -858,6 +862,9 @@ def hsv2label(h, s, v) -> str:
858
862
:return:
859
863
"""
860
864
865
+ if None in [h , s , v ]:
866
+ return 'UNDEFINED'
867
+
861
868
if s < 0.1 :
862
869
if v < 0.05 :
863
870
label = 'BLACK'
@@ -899,34 +906,38 @@ def get_distance(self, unit: str = 'cm') -> (float, float, float, float, float):
899
906
:param unit: distance output unit
900
907
:return: left_tof, center_left_tof, center_tof, center_right_tof, right_tof
901
908
"""
902
- return (convert_distance (self .left_tof , 'mm' , unit ),
903
- convert_distance (self .center_left_tof , 'mm' , unit ),
904
- convert_distance (self .center_tof , 'mm' , unit ),
905
- convert_distance (self .center_right_tof , 'mm' , unit ),
906
- convert_distance (self .right_tof , 'mm' , unit ))
909
+
910
+ if None in [self ._left_tof , self ._center_left_tof , self ._center_tof , self ._center_right_tof , self ._right_tof ]:
911
+ return None , None , None , None , None
912
+
913
+ return (convert_distance (self ._left_tof , 'mm' , unit ),
914
+ convert_distance (self ._center_left_tof , 'mm' , unit ),
915
+ convert_distance (self ._center_tof , 'mm' , unit ),
916
+ convert_distance (self ._center_right_tof , 'mm' , unit ),
917
+ convert_distance (self ._right_tof , 'mm' , unit ))
907
918
908
919
def get_distance_top (self , unit : str = 'cm' ) -> float :
909
920
"""
910
921
Returns the obstacle top distance readout
911
922
:param unit:
912
923
:return:
913
924
"""
914
- return convert_distance (self .top_tof , 'mm' , unit )
925
+ return convert_distance (self ._top_tof , 'mm' , unit )
915
926
916
927
def get_distance_bottom (self , unit : str = 'cm' ) -> float :
917
928
"""
918
929
Returns the obstacle bottom distance readout
919
930
:param unit:
920
931
:return:
921
932
"""
922
- return convert_distance (self .bottom_tof , 'mm' , unit )
933
+ return convert_distance (self ._bottom_tof , 'mm' , unit )
923
934
924
935
def get_version (self ) -> str :
925
936
"""
926
937
Returns the firmware version of the Alvik
927
938
:return:
928
939
"""
929
- return f'{ self .version [0 ]} .{ self .version [1 ]} .{ self .version [2 ]} '
940
+ return f'{ self ._version [0 ]} .{ self ._version [1 ]} .{ self ._version [2 ]} '
930
941
931
942
def print_status (self ):
932
943
"""
0 commit comments