mirror of
https://github.com/undera/pylgbst.git
synced 2020-11-18 19:37:26 -08:00
* Cosmetics * Harmonograph demo * Cleanup * Original * Original * Cosmetics * Original file * Fixes * cosmetics * separate classes * Cosmetics * Cosmetics * fix tests * Remove plotter tests * Add bluegiga * Rename it * Progress * Fix tests * Cosmetics * Found a way for pygatt! * Playing with gatt * Fix hung subscribe * rename class * add test * skeleton for autodetect * safer order * Fix tests * Fix test * Add dbus install * another try * 2 * 3 * 34 * 6 * 7 * Isolate some tests * 8 * back to roots * Try more * 9 * Help * rep * site-packs * Fix? * Py3 come on * dbus * busss * dev null! * Fix test * Cleanup * Fix tests * Fix after review * add package * FIx package paths * Cosmetics * Update * More doc
266 lines
6.4 KiB
Python
266 lines
6.4 KiB
Python
# coding=utf-8
|
|
import logging
|
|
import time
|
|
import traceback
|
|
|
|
from examples.plotter import Plotter
|
|
from pylgbst import get_connection_auto
|
|
from pylgbst.comms import DebugServerConnection
|
|
from pylgbst.movehub import EncodedMotor, PORT_AB, PORT_C, PORT_A, PORT_B, MoveHub
|
|
from tests import HubMock
|
|
|
|
|
|
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(0, FIELD_WIDTH)
|
|
plotter.move(0, -FIELD_WIDTH)
|
|
|
|
|
|
def cross():
|
|
plotter.line(FIELD_WIDTH, FIELD_WIDTH)
|
|
plotter.move(-FIELD_WIDTH, 0)
|
|
plotter.line(FIELD_WIDTH, -FIELD_WIDTH)
|
|
|
|
|
|
def square():
|
|
plotter.line(FIELD_WIDTH, 0)
|
|
plotter.line(0, FIELD_WIDTH)
|
|
plotter.line(-FIELD_WIDTH, 0)
|
|
plotter.line(0, -FIELD_WIDTH)
|
|
|
|
|
|
def triangle():
|
|
plotter.line(FIELD_WIDTH, 0)
|
|
plotter.line(0, FIELD_WIDTH)
|
|
plotter.line(-FIELD_WIDTH, -FIELD_WIDTH)
|
|
|
|
|
|
def romb():
|
|
plotter.move(-FIELD_WIDTH, 0)
|
|
plotter.line(FIELD_WIDTH, FIELD_WIDTH * 2)
|
|
plotter.line(FIELD_WIDTH, -FIELD_WIDTH * 2)
|
|
plotter.line(-FIELD_WIDTH, -FIELD_WIDTH * 2)
|
|
plotter.line(-FIELD_WIDTH, FIELD_WIDTH * 2)
|
|
|
|
|
|
def circles():
|
|
plotter.move(FIELD_WIDTH / 4.0, 0)
|
|
plotter.circle(FIELD_WIDTH / 2.0)
|
|
|
|
plotter.move(FIELD_WIDTH / 2.0, 0)
|
|
plotter.circle(FIELD_WIDTH)
|
|
|
|
|
|
def square_spiral():
|
|
rounds = 5
|
|
step = plotter.base_speed / rounds / 5.0
|
|
for r in range(1, rounds):
|
|
plotter.line(step * r * 4, 0)
|
|
plotter.line(0, step * (r * 4 + 1))
|
|
plotter.line(-step * (r * 4 + 2), 0)
|
|
plotter.line(0, -step * (r * 4 + 3))
|
|
plotter.line(step * 2.0, step * 2.0) # cut
|
|
|
|
|
|
def christmas_tree():
|
|
t = FIELD_WIDTH / 3
|
|
plotter.line(t, t)
|
|
plotter.line(-t * 0.5, 0)
|
|
plotter.line(t, t)
|
|
plotter.line(-t * 0.5, 0)
|
|
plotter.line(t, t)
|
|
|
|
plotter.line(-t * 3.5, 0)
|
|
|
|
plotter.line(t, -t)
|
|
plotter.line(-t * 0.5, 0)
|
|
plotter.line(t, -t)
|
|
plotter.line(-t * 0.5, 0)
|
|
plotter.line(t, -t)
|
|
|
|
|
|
def try_speeds():
|
|
speeds = [x * 1.0 / 10.0 for x in range(1, 11)]
|
|
for s in speeds:
|
|
logging.info("%s", s)
|
|
plotter.both.constant(s, -s)
|
|
time.sleep(1)
|
|
for s in reversed(speeds):
|
|
logging.info("%s", s)
|
|
plotter.both.constant(-s, s)
|
|
time.sleep(1)
|
|
|
|
|
|
def snowflake(scale=1.0):
|
|
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 * scale
|
|
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)
|
|
|
|
plotter.line(0.05 * zoom, 0)
|
|
|
|
|
|
def angles_experiment():
|
|
parts = 2
|
|
for x in range(0, parts + 1):
|
|
movy = x * 1.0 / parts
|
|
plotter.line(1.0, movy)
|
|
plotter.move(-1.0, -movy)
|
|
logging.info("%s", movy)
|
|
|
|
for x in range(0, parts):
|
|
movx = x * 1.0 / parts
|
|
plotter.line(movx, 1.0)
|
|
plotter.move(-movx, -1.0)
|
|
logging.info("%s", movx)
|
|
|
|
"""
|
|
path = 1000
|
|
|
|
spd_b = x * plotter.base_speed / parts
|
|
spd_a = plotter.base_speed - spd_b
|
|
|
|
angle = path * (1.0 + spd_b / spd_a)
|
|
logging.info("%s, %s, %s", angle, spd_a, spd_b)
|
|
|
|
plotter.motor_AB.angled(angle, spd_a, -spd_b)
|
|
plotter._compensate_wheels_backlash(-1)
|
|
plotter.motor_AB.angled(-angle, spd_a, -spd_b)
|
|
plotter._compensate_wheels_backlash(1)
|
|
"""
|
|
|
|
|
|
class MotorMock(EncodedMotor):
|
|
def _wait_sync(self, async):
|
|
super(MotorMock, self)._wait_sync(True)
|
|
|
|
|
|
def get_hub_mock():
|
|
hub = HubMock()
|
|
hub.motor_A = MotorMock(hub, PORT_A)
|
|
hub.motor_B = MotorMock(hub, PORT_B)
|
|
hub.motor_AB = MotorMock(hub, PORT_AB)
|
|
hub.motor_external = MotorMock(hub, PORT_C)
|
|
return hub
|
|
|
|
|
|
def interpret_command(cmd, plotter):
|
|
scale = 0.075
|
|
for c in cmd.lower():
|
|
if c == u'л':
|
|
plotter._transfer_to(-scale, 0)
|
|
elif c == u'п':
|
|
plotter._transfer_to(scale, 0)
|
|
elif c == u'н':
|
|
plotter._transfer_to(0, -scale)
|
|
elif c == u'в':
|
|
plotter._transfer_to(0, scale)
|
|
elif c == u'1':
|
|
plotter._tool_down()
|
|
elif c == u'0':
|
|
plotter._tool_up()
|
|
elif c == u' ':
|
|
pass
|
|
else:
|
|
logging.warning(u"Неизвестная команда: %s", c)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logging.getLogger('').setLevel(logging.DEBUG)
|
|
|
|
try:
|
|
conn = DebugServerConnection()
|
|
except BaseException:
|
|
logging.warning("Failed to use debug server: %s", traceback.format_exc())
|
|
conn = get_connection_auto()
|
|
|
|
hub = MoveHub(conn) if 1 else get_hub_mock()
|
|
|
|
plotter = Plotter(hub, 0.75)
|
|
FIELD_WIDTH = 0.9
|
|
|
|
try:
|
|
"""
|
|
while True:
|
|
cmd = six.moves.input("программа> ").decode('utf8')
|
|
if not cmd.strip():
|
|
continue
|
|
plotter.initialize()
|
|
interpret_command(cmd, plotter)
|
|
plotter.finalize()
|
|
"""
|
|
|
|
time.sleep(1)
|
|
plotter.initialize()
|
|
|
|
# snowflake(0.75)
|
|
# christmas_tree()
|
|
# square_spiral()
|
|
# lego(plotter, FIELD_WIDTH / 7.0)
|
|
|
|
# plotter._tool_down()
|
|
# angles_experiment()
|
|
# try_speeds()
|
|
# moves()
|
|
# triangle()
|
|
# square()
|
|
# cross()
|
|
# romb()
|
|
# circles()
|
|
# plotter.spiral(4, 0.02)
|
|
# plotter.rectangle(FIELD_WIDTH / 5.0, FIELD_WIDTH / 5.0, solid=True)
|
|
|
|
pass
|
|
finally:
|
|
plotter.finalize()
|