Skip to content

Commit 04f498a

Browse files
authored
Merge pull request #9 from arduino/dev
0.2.0
2 parents a8ca070 + 8036b51 commit 04f498a

18 files changed

+579
-109
lines changed

arduino_alvik.py

+326-70
Large diffs are not rendered by default.

constants.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11

22
# COLOR SENSOR
33
COLOR_FULL_SCALE = 4097
4+
WHITE_CAL = [444, 342, 345]
5+
BLACK_CAL = [153, 135, 123]

conversions.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# MEASUREMENT UNITS CONVERSION #
2+
3+
from math import pi
4+
5+
6+
def conversion_method(func):
7+
def wrapper(*args, **kwargs):
8+
try:
9+
return func(*args, **kwargs)
10+
except KeyError:
11+
raise ConversionError(f'Cannot {func.__name__} from {args[1]} to {args[2]}')
12+
return wrapper
13+
14+
15+
@conversion_method
16+
def convert_rotational_speed(value: float, from_unit: str, to_unit: str) -> float:
17+
"""
18+
Converts a rotational speed value from one unit to another
19+
:param value:
20+
:param from_unit: unit of input value
21+
:param to_unit: unit of output value
22+
:return:
23+
"""
24+
speeds = {'rpm': 1.0, 'deg/s': 1/6, 'rad/s': 60/(2*pi), 'rev/s': 60}
25+
return value * speeds[from_unit.lower()] / speeds[to_unit.lower()]
26+
27+
28+
@conversion_method
29+
def convert_angle(value: float, from_unit: str, to_unit: str) -> float:
30+
"""
31+
Converts an angle value from one unit to another
32+
:param value:
33+
:param from_unit: unit of input value
34+
:param to_unit: unit of output value
35+
:return:
36+
"""
37+
angles = {'deg': 1.0, 'rad': 180/pi, 'rev': 360, 'revolution': 360, '%': 3.6, 'perc': 3.6}
38+
return value * angles[from_unit.lower()] / angles[to_unit.lower()]
39+
40+
41+
@conversion_method
42+
def convert_distance(value: float, from_unit: str, to_unit: str) -> float:
43+
"""
44+
Converts a distance value from one unit to another
45+
:param value:
46+
:param from_unit: unit of input value
47+
:param to_unit: unit of output value
48+
:return:
49+
"""
50+
distances = {'cm': 1.0, 'mm': 0.1, 'm': 100, 'inch': 2.54, 'in': 2.54}
51+
return value * distances[from_unit.lower()] / distances[to_unit.lower()]
52+
53+
54+
@conversion_method
55+
def convert_speed(value: float, from_unit: str, to_unit: str) -> float:
56+
"""
57+
Converts a distance value from one unit to another
58+
:param value:
59+
:param from_unit: unit of input value
60+
:param to_unit: unit of output value
61+
:return:
62+
"""
63+
distances = {'cm/s': 1.0, 'mm/s': 0.1, 'm/s': 100, 'inch/s': 2.54, 'in/s': 2.54}
64+
return value * distances[from_unit.lower()] / distances[to_unit.lower()]
65+
66+
67+
class ConversionError(Exception):
68+
pass

examples/set_pid.py examples/hand_follower.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
7-
speed = 0
7+
8+
reference = 10.0
89

910
while True:
1011
try:
11-
alvik.left_wheel.set_pid_gains(10.0, 1.3, 4.2)
12-
sleep_ms(100)
13-
alvik.right_wheel.set_pid_gains(4.0, 13, 1.9)
12+
L, CL, C, CR, R = alvik.get_distance()
13+
print(f'C: {C}')
14+
error = C - reference
15+
alvik.set_wheels_speed(error*10, error*10)
1416
sleep_ms(100)
1517
except KeyboardInterrupt as e:
1618
print('over')
1719
alvik.stop()
18-
sys.exit()
20+
sys.exit()

examples/message_reader.py

-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
if alvik.begin() < 0:
77
sys.exit()
88

9-
speed = 0
10-
119
while True:
1210
try:
1311
print(f'VER: {alvik.version}')

examples/pose_example.py

+12-20
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,48 @@
88
while True:
99
try:
1010

11-
alvik.move(100.0)
11+
alvik.move(100.0, 'mm')
1212
print("on target after move")
1313

14-
alvik.move(50.0)
14+
alvik.move(50.0, 'mm')
1515
print("on target after move")
1616

17-
alvik.rotate(90.0)
17+
alvik.rotate(90.0, 'deg')
1818
print("on target after rotation")
1919

20-
alvik.rotate(-45.00)
20+
alvik.rotate(-45.00, 'deg')
2121
print("on target after rotation")
2222

2323
x, y, theta = alvik.get_pose()
24-
print(f'Current pose is x={x}, y={y} ,theta={theta}')
24+
print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
2525

2626
alvik.reset_pose(0, 0, 0)
2727

2828
x, y, theta = alvik.get_pose()
29-
print(f'Updated pose is x={x}, y={y} ,theta={theta}')
29+
print(f'Updated pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
3030
sleep_ms(500)
3131

3232
print("___________NON-BLOCKING__________________")
3333

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}")
34+
alvik.move(50.0, 'mm', blocking=False)
3735
print("on target after move")
3836

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}")
37+
alvik.rotate(45.0, 'deg', blocking=False)
4238
print("on target after rotation")
4339

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}")
40+
alvik.move(100.0, 'mm', blocking=False)
4741
print("on target after move")
4842

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}")
43+
alvik.rotate(-90.00, 'deg', blocking=False)
5244
print("on target after rotation")
5345

5446
x, y, theta = alvik.get_pose()
55-
print(f'Current pose is x={x}, y={y} ,theta={theta}')
47+
print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
5648

5749
alvik.reset_pose(0, 0, 0)
5850

5951
x, y, theta = alvik.get_pose()
60-
print(f'Updated pose is x={x}, y={y} ,theta={theta}')
52+
print(f'Updated pose is x={x}, y={y}, theta(deg)={theta}')
6153
sleep_ms(500)
6254

6355
alvik.stop()

examples/read_color_sensor.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
7-
speed = 0
87

98
while True:
109
try:
11-
r, g, b = alvik.get_color_raw()
12-
print(f'RED: {r}, Green: {g}, Blue: {b}')
10+
r, g, b = alvik.get_color()
11+
h, s, v = alvik.get_color('hsv')
12+
print(f'RED: {r}, Green: {g}, Blue: {b}, HUE: {h}, SAT: {s}, VAL: {v}')
13+
print(f'COLOR LABEL: {alvik.get_color_label(h, s, v)}')
1314
sleep_ms(100)
1415
except KeyboardInterrupt as e:
1516
print('over')

examples/read_imu.py

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
7-
speed = 0
87

98
while True:
109
try:

examples/read_tof.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from arduino_alvik import ArduinoAlvik
2+
from time import sleep_ms
3+
import sys
4+
5+
alvik = ArduinoAlvik()
6+
alvik.begin()
7+
8+
while True:
9+
try:
10+
L, CL, C, CR, R = alvik.get_distance()
11+
T = alvik.get_distance_top()
12+
B = alvik.get_distance_bottom()
13+
print(f'T: {T} | B: {B} | L: {L} | CL: {CL} | C: {C} | CR: {CR} | R: {R}')
14+
sleep_ms(100)
15+
except KeyboardInterrupt as e:
16+
print('over')
17+
alvik.stop()
18+
sys.exit()

examples/read_touch.py

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
7-
speed = 0
87

98
while True:
109
try:

examples/test_meas_units.py

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
from arduino_alvik import ArduinoAlvik
2+
from time import sleep_ms
3+
import sys
4+
5+
alvik = ArduinoAlvik()
6+
alvik.begin()
7+
8+
while True:
9+
try:
10+
11+
# -- LINEAR MOVEMENTS --
12+
13+
print("Move fw 0.05 m")
14+
alvik.move(0.05, unit='m')
15+
sleep_ms(2000)
16+
17+
print("Move fw 10 cm")
18+
alvik.move(5, unit='cm')
19+
sleep_ms(2000)
20+
21+
print("Move bw 100 mm")
22+
alvik.move(-100, unit='mm')
23+
sleep_ms(2000)
24+
25+
print("Move fw 1 inch")
26+
alvik.move(1, unit='in')
27+
sleep_ms(2000)
28+
29+
print(f"Current position: {alvik.get_pose()}")
30+
alvik.reset_pose(0, 0, theta=3.1415, angle_unit='rad')
31+
sleep_ms(2000)
32+
33+
print(f"Current position: {alvik.get_pose()}")
34+
35+
# -- WHEEL ROTATIONS --
36+
alvik.right_wheel.reset()
37+
sleep_ms(2000)
38+
curr_pos = alvik.right_wheel.get_position()
39+
print(f'R wheel pos: {curr_pos}')
40+
sleep_ms(2000)
41+
42+
print("Rotate right wheel 25% fw")
43+
alvik.right_wheel.set_position(25, unit='%')
44+
sleep_ms(2000)
45+
curr_pos = alvik.right_wheel.get_position()
46+
print(f'R wheel pos: {curr_pos}')
47+
48+
print("Rotate right wheel 90 deg bw")
49+
alvik.right_wheel.set_position(-90, unit='deg')
50+
sleep_ms(2000)
51+
curr_pos = alvik.right_wheel.get_position()
52+
print(f'R wheel pos: {curr_pos}')
53+
54+
print("Rotate right wheel pi rad fw")
55+
alvik.right_wheel.set_position(3.14, unit='rad')
56+
sleep_ms(2000)
57+
curr_pos = alvik.right_wheel.get_position()
58+
print(f'R wheel pos: {curr_pos}')
59+
60+
print("Rotate right wheel a quarter revolution bw")
61+
alvik.right_wheel.set_position(-0.25, unit='rev')
62+
sleep_ms(2000)
63+
curr_pos = alvik.right_wheel.get_position()
64+
print(f'R wheel pos: {curr_pos}')
65+
66+
# -- WHEELS SPEED --
67+
print("Set speed 50% max_rpm (35.0 rpm)")
68+
alvik.set_wheels_speed(50, 50, '%')
69+
sleep_ms(1000)
70+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
71+
72+
print("Set speed 12 rpm (1 rev in 5 sec)")
73+
alvik.set_wheels_speed(12, 12, 'rpm')
74+
sleep_ms(1000)
75+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
76+
77+
print("Set speed -pi rad/s (1 back rev in 2 sec)")
78+
alvik.set_wheels_speed(-3.1415, -3.1415, 'rad/s')
79+
sleep_ms(1000)
80+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
81+
82+
print("Set speed 180 deg/s (1 back rev in 2 sec)")
83+
alvik.set_wheels_speed(180, 180, 'deg/s')
84+
sleep_ms(1000)
85+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
86+
87+
# -- DRIVE --
88+
print("Driving at 10 mm/s (expecting approx 5.6 rpm 64 deg/s)")
89+
alvik.drive(10, 20, linear_unit='mm/s', angular_unit='%')
90+
sleep_ms(2000)
91+
print(f"Current speed is {alvik.get_drive_speed()} (mm/s, deg/s))")
92+
93+
print("Driving at 10 mm/s (expecting approx 5.6 rpm)")
94+
alvik.drive(10, 0, linear_unit='mm/s')
95+
sleep_ms(2000)
96+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
97+
98+
print("Driving at 2 cm/s (expecting approx 11.2 rpm)")
99+
alvik.drive(2, 0, linear_unit='cm/s')
100+
sleep_ms(2000)
101+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
102+
103+
print("Driving at 1 in/s (expecting approx 14 rpm)")
104+
alvik.drive(1, 0, linear_unit='in/s')
105+
sleep_ms(2000)
106+
print(f"Current speed is {alvik.get_wheels_speed()} rpm")
107+
108+
print("Driving at 5 mm/s (expecting approx 5.6 rpm) pi/8 rad/s (22.5 deg/s)")
109+
alvik.drive(5, 3.1415/8, linear_unit='mm/s', angular_unit='rad/s')
110+
sleep_ms(2000)
111+
print(f"Current speed is {alvik.get_drive_speed()} (mm/s) (rpm)")
112+
113+
print("Driving at 5 mm/s (expecting approx 5.6 rpm) 1/8 rev/s (45 deg/s)")
114+
alvik.drive(5, 1/8, linear_unit='mm/s', angular_unit='rev/s')
115+
sleep_ms(2000)
116+
print(f"Current speed is {alvik.get_drive_speed()} (mm/s) (rpm)")
117+
118+
alvik.stop()
119+
sys.exit()
120+
121+
except KeyboardInterrupt as e:
122+
print('over')
123+
alvik.stop()
124+
sys.exit()

examples/wheels_speed.py

+3
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
while True:
99
try:
1010
alvik.set_wheels_speed(10, 10)
11+
print(f'Wheels speed: {alvik.get_wheels_speed()}')
1112
sleep_ms(1000)
1213

1314
alvik.set_wheels_speed(30, 60)
15+
print(f'Wheels speed: {alvik.get_wheels_speed()}')
1416
sleep_ms(1000)
1517

1618
alvik.set_wheels_speed(60, 30)
19+
print(f'Wheels speed: {alvik.get_wheels_speed()}')
1720
sleep_ms(1000)
1821
except KeyboardInterrupt as e:
1922
print('over')

install.bat

+2
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ if /i "%1"=="-h" (
1818
:install
1919
python -m mpremote %port_string% fs rm :arduino_alvik.py
2020
python -m mpremote %port_string% fs rm :constants.py
21+
python -m mpremote %port_string% fs rm :conversions.py
2122
python -m mpremote %port_string% fs rm :pinout_definitions.py
2223
python -m mpremote %port_string% fs rm :robot_definitions.py
2324
python -m mpremote %port_string% fs rm :uart.py
2425

2526
python -m mpremote %port_string% fs cp arduino_alvik.py :arduino_alvik.py
2627
python -m mpremote %port_string% fs cp constants.py :constants.py
28+
python -m mpremote %port_string% fs cp conversions.py :conversions.py
2729
python -m mpremote %port_string% fs cp pinout_definitions.py :pinout_definitions.py
2830
python -m mpremote %port_string% fs cp robot_definitions.py :robot_definitions.py
2931
python -m mpremote %port_string% fs cp uart.py :uart.py

install.sh

+2
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ fi
4444

4545
$python_command -m mpremote $connect_string fs rm :arduino_alvik.py
4646
$python_command -m mpremote $connect_string fs rm :constants.py
47+
$python_command -m mpremote $connect_string fs rm :conversions.py
4748
$python_command -m mpremote $connect_string fs rm :pinout_definitions.py
4849
$python_command -m mpremote $connect_string fs rm :robot_definitions.py
4950
$python_command -m mpremote $connect_string fs rm :uart.py
5051

5152
$python_command -m mpremote $connect_string fs cp arduino_alvik.py :arduino_alvik.py
5253
$python_command -m mpremote $connect_string fs cp constants.py :constants.py
54+
$python_command -m mpremote $connect_string fs cp conversions.py :conversions.py
5355
$python_command -m mpremote $connect_string fs cp pinout_definitions.py :pinout_definitions.py
5456
$python_command -m mpremote $connect_string fs cp robot_definitions.py :robot_definitions.py
5557
$python_command -m mpremote $connect_string fs cp uart.py :uart.py

0 commit comments

Comments
 (0)