mirror of
https://github.com/undera/pylgbst.git
synced 2020-11-18 19:37:26 -08:00
Two-color centering+snowflake
This commit is contained in:
parent
76875d56f7
commit
7da3b8e508
@ -2,7 +2,7 @@ import logging
|
|||||||
import math
|
import math
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from pylgbst import MoveHub, ColorDistanceSensor, COLORS, COLOR_RED, COLOR_CYAN
|
from pylgbst import MoveHub, ColorDistanceSensor, COLORS, COLOR_RED, COLOR_YELLOW
|
||||||
|
|
||||||
|
|
||||||
class Plotter(MoveHub):
|
class Plotter(MoveHub):
|
||||||
@ -35,23 +35,25 @@ class Plotter(MoveHub):
|
|||||||
self.caret.constant(-self.base_speed)
|
self.caret.constant(-self.base_speed)
|
||||||
count = 0
|
count = 0
|
||||||
max_tries = 50
|
max_tries = 50
|
||||||
while self._marker_color != COLOR_RED and count < max_tries:
|
while self._marker_color not in (COLOR_RED, COLOR_YELLOW) and count < max_tries:
|
||||||
time.sleep(30.0 / max_tries)
|
time.sleep(30.0 / max_tries)
|
||||||
count += 1
|
count += 1
|
||||||
logging.info("Centering tries: %s, color #%s", count,
|
self.color_distance_sensor.unsubscribe(self._on_distance)
|
||||||
COLORS[self._marker_color] if self._marker_color else None)
|
clr = COLORS[self._marker_color] if self._marker_color else None
|
||||||
|
logging.info("Centering tries: %s, color #%s", count, clr)
|
||||||
if count >= max_tries:
|
if count >= max_tries:
|
||||||
raise RuntimeError("Failed to center caret")
|
raise RuntimeError("Failed to center caret")
|
||||||
finally:
|
finally:
|
||||||
self.caret.stop()
|
self.caret.stop()
|
||||||
self.color_distance_sensor.unsubscribe(self._on_distance)
|
self.color_distance_sensor.unsubscribe(self._on_distance)
|
||||||
|
|
||||||
|
if self._marker_color != COLOR_YELLOW:
|
||||||
self.move(-self.field_width, 0)
|
self.move(-self.field_width, 0)
|
||||||
|
|
||||||
def _on_distance(self, color, distance):
|
def _on_distance(self, color, distance):
|
||||||
self._marker_color = None
|
self._marker_color = None
|
||||||
logging.debug("Color: %s, distance %s", COLORS[color], distance)
|
logging.debug("Color: %s, distance %s", COLORS[color], distance)
|
||||||
if color in (COLOR_RED, COLOR_CYAN):
|
if color in (COLOR_RED, COLOR_YELLOW):
|
||||||
if distance <= 3:
|
if distance <= 3:
|
||||||
self._marker_color = color
|
self._marker_color = color
|
||||||
|
|
||||||
@ -110,7 +112,7 @@ class Plotter(MoveHub):
|
|||||||
return
|
return
|
||||||
wheel_dir = movy / abs(movy)
|
wheel_dir = movy / abs(movy)
|
||||||
if wheel_dir == -self.__last_wheel_dir:
|
if wheel_dir == -self.__last_wheel_dir:
|
||||||
self.wheels.angled(270, -wheel_dir)
|
self.wheels.angled(230, -wheel_dir)
|
||||||
self.__last_wheel_dir = wheel_dir
|
self.__last_wheel_dir = wheel_dir
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -7,11 +7,13 @@ from pylgbst.comms import DebugServerConnection, BLEConnection
|
|||||||
|
|
||||||
|
|
||||||
def moves():
|
def moves():
|
||||||
|
plotter.move(-FIELD_WIDTH, 0)
|
||||||
|
plotter.move(FIELD_WIDTH * 2, 0)
|
||||||
|
plotter.move(-FIELD_WIDTH, 0)
|
||||||
|
|
||||||
plotter.move(FIELD_WIDTH, FIELD_WIDTH)
|
plotter.move(FIELD_WIDTH, FIELD_WIDTH)
|
||||||
plotter.move(-FIELD_WIDTH, -FIELD_WIDTH)
|
plotter.move(-FIELD_WIDTH, -FIELD_WIDTH)
|
||||||
|
|
||||||
plotter.move(FIELD_WIDTH, 0)
|
|
||||||
plotter.move(-FIELD_WIDTH, 0)
|
|
||||||
plotter.move(0, FIELD_WIDTH)
|
plotter.move(0, FIELD_WIDTH)
|
||||||
plotter.move(0, -FIELD_WIDTH)
|
plotter.move(0, -FIELD_WIDTH)
|
||||||
|
|
||||||
@ -47,7 +49,7 @@ def circles():
|
|||||||
plotter.move(FIELD_WIDTH / 4.0, 0)
|
plotter.move(FIELD_WIDTH / 4.0, 0)
|
||||||
plotter.circle(FIELD_WIDTH / 2.0)
|
plotter.circle(FIELD_WIDTH / 2.0)
|
||||||
|
|
||||||
plotter.move(FIELD_WIDTH / 4.0, 0)
|
plotter.move(FIELD_WIDTH / 2.0, 0)
|
||||||
plotter.circle(FIELD_WIDTH)
|
plotter.circle(FIELD_WIDTH)
|
||||||
|
|
||||||
|
|
||||||
@ -59,10 +61,12 @@ class LaserPlotter(Plotter):
|
|||||||
|
|
||||||
|
|
||||||
def lego():
|
def lego():
|
||||||
t = FIELD_WIDTH / 10.0
|
t = FIELD_WIDTH / 5.0
|
||||||
h = t * 5.0
|
h = t * 5.0
|
||||||
w = t * 3.0
|
w = t * 3.0
|
||||||
|
|
||||||
|
plotter.move(-t * 2.0, 0)
|
||||||
|
|
||||||
plotter.line(h, 0)
|
plotter.line(h, 0)
|
||||||
plotter.line(0, t)
|
plotter.line(0, t)
|
||||||
plotter.line(-(h - t), 0)
|
plotter.line(-(h - t), 0)
|
||||||
@ -164,6 +168,56 @@ def try_speeds():
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
def snowflake():
|
||||||
|
a = [300, 232,
|
||||||
|
351, 144,
|
||||||
|
307, 68,
|
||||||
|
350, 45,
|
||||||
|
379, 94,
|
||||||
|
413, 36,
|
||||||
|
456, 61,
|
||||||
|
422, 119,
|
||||||
|
482, 118,
|
||||||
|
481, 167,
|
||||||
|
394, 168,
|
||||||
|
343, 256,
|
||||||
|
444, 256,
|
||||||
|
488, 179,
|
||||||
|
530, 204,
|
||||||
|
500, 256,
|
||||||
|
569, 256,
|
||||||
|
582, 280]
|
||||||
|
prev = None
|
||||||
|
vals = []
|
||||||
|
maxval = 0
|
||||||
|
for i in range(0, len(a)):
|
||||||
|
if i % 2:
|
||||||
|
continue
|
||||||
|
|
||||||
|
maxval = max(maxval, abs(a[i]), abs(a[i + 1]))
|
||||||
|
if prev:
|
||||||
|
vals.append((a[i] - prev[0], a[i + 1] - prev[1]))
|
||||||
|
prev = a[i], a[i + 1]
|
||||||
|
|
||||||
|
assert len(vals) == len(a) / 2 - 1
|
||||||
|
|
||||||
|
vals = [(x[0] / float(maxval), x[1] / float(maxval)) for x in vals]
|
||||||
|
|
||||||
|
logging.info("Moves: %s", vals)
|
||||||
|
zoom = FIELD_WIDTH * 2.0
|
||||||
|
for item in vals:
|
||||||
|
plotter.line(item[0] * zoom, item[1] * zoom)
|
||||||
|
|
||||||
|
for item in reversed(vals):
|
||||||
|
plotter.line(-item[0] * zoom, item[1] * zoom)
|
||||||
|
|
||||||
|
for item in vals:
|
||||||
|
plotter.line(-item[0] * zoom, -item[1] * zoom)
|
||||||
|
|
||||||
|
for item in reversed(vals):
|
||||||
|
plotter.line(item[0] * zoom, -item[1] * zoom)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
@ -173,19 +227,18 @@ if __name__ == '__main__':
|
|||||||
logging.warning("Failed to use debug server: %s", traceback.format_exc())
|
logging.warning("Failed to use debug server: %s", traceback.format_exc())
|
||||||
conn = BLEConnection().connect()
|
conn = BLEConnection().connect()
|
||||||
|
|
||||||
plotter = LaserPlotter(conn, 0.5)
|
plotter = LaserPlotter(conn, 0.75)
|
||||||
FIELD_WIDTH = plotter.field_width
|
FIELD_WIDTH = plotter.field_width
|
||||||
|
|
||||||
try:
|
try:
|
||||||
#plotter.initialize()
|
plotter.initialize()
|
||||||
|
|
||||||
# plotter._tool_down()
|
# plotter._tool_down()
|
||||||
|
|
||||||
# try_speeds()
|
# try_speeds()
|
||||||
|
|
||||||
|
|
||||||
# moves()
|
# moves()
|
||||||
triangle()
|
# triangle()
|
||||||
# square()
|
# square()
|
||||||
# cross()
|
# cross()
|
||||||
# romb()
|
# romb()
|
||||||
@ -193,9 +246,10 @@ if __name__ == '__main__':
|
|||||||
# plotter.spiral(4, 0.02)
|
# plotter.spiral(4, 0.02)
|
||||||
# plotter.rectangle(FIELD_WIDTH / 5.0, FIELD_WIDTH / 5.0, solid=True)
|
# plotter.rectangle(FIELD_WIDTH / 5.0, FIELD_WIDTH / 5.0, solid=True)
|
||||||
|
|
||||||
# lego()
|
|
||||||
# square_spiral()
|
# square_spiral()
|
||||||
|
# lego()
|
||||||
# christmas_tree()
|
# christmas_tree()
|
||||||
|
snowflake()
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
plotter.finalize()
|
plotter.finalize()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user