From 9b1ceb0cfae514ffb42f5de61edf7c378860a47e Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 03:46:43 -0500 Subject: [PATCH 01/45] playback.py shows rangefinder --- webots/controllers/controller/Makefile | 2 +- webots/controllers/playback/Makefile | 2 +- webots/controllers/playback/playback.py | 40 ++++++++++++++++++++++++- webots/worlds/twoexit.wbt | 7 ++--- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/webots/controllers/controller/Makefile b/webots/controllers/controller/Makefile index fa1dccc6a..5e6811d91 100644 --- a/webots/controllers/controller/Makefile +++ b/webots/controllers/controller/Makefile @@ -12,7 +12,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Command-line variables; e.g. make run world=maze --------------------------- +# Command-line variables; e.g. make run world=twoexit ------------------------ world = simple poselogname = poselog.csv setpointlogname = setpointlog.csv diff --git a/webots/controllers/playback/Makefile b/webots/controllers/playback/Makefile index 478b750ce..a58a08be7 100644 --- a/webots/controllers/playback/Makefile +++ b/webots/controllers/playback/Makefile @@ -26,7 +26,7 @@ run: ./playback.py $(logfile) edit: - vim main.cpp + vim pyplayback.py ### Do not modify: this includes Webots global Makefile.include null := diff --git a/webots/controllers/playback/playback.py b/webots/controllers/playback/playback.py index 85157a2cb..dade4d0c8 100644 --- a/webots/controllers/playback/playback.py +++ b/webots/controllers/playback/playback.py @@ -22,6 +22,13 @@ from controller import Supervisor +import numpy as np + +try: + import cv2 +except Exception: + cv2 = None + class DiyQuad(Supervisor): @@ -62,6 +69,32 @@ def start_motor(quad, motor_name, direction): motor.setVelocity(direction * 60) +def show_rangefinder_distances(distances_mm, width, height, + dmin_m=.01, dmax_m=4, scaleup=32): + + new_width = width * scaleup + new_height = height * scaleup + + img = np.zeros((new_height, new_width), dtype=np.uint8) + + for x in range(width): + + for y in range(height): + + d_mm = distances_mm[y * width + x] + + grayval = (255 if d_mm == -1 + else int((d_mm/1000. - dmin_m) / + (dmax_m - dmin_m) * 255)) + + cv2.rectangle(img, (x*scaleup, y*scaleup), + ((x+1)*scaleup, (y+1)*scaleup), + grayval, -1) + + cv2.imshow('lidar', img) + cv2.waitKey(1) + + def main(): quad = DiyQuad() @@ -93,7 +126,12 @@ def main(): rotation_field.setSFRotation( euler_to_rotation(vals[3], vals[4], -vals[5])) - # rangefinder_distances = vals[6:] + rangefinder_distances = vals[6:] + + if cv2 is None: + print(rangefinder_distances) + else: + show_rangefinder_distances(rangefinder_distances, 8, 1) main() diff --git a/webots/worlds/twoexit.wbt b/webots/worlds/twoexit.wbt index 6e4e390bb..f062d6381 100644 --- a/webots/worlds/twoexit.wbt +++ b/webots/worlds/twoexit.wbt @@ -8,7 +8,6 @@ EXTERNPROTO "../protos/DiyQuad.proto" WorldInfo { title "Hackflight" - #physics "experimental" gravity 0 contactProperties [ ContactProperties { @@ -22,12 +21,12 @@ WorldInfo { } Viewpoint { orientation -0.007365968524207539 0.9998100918073269 -0.01804225118783057 1.4721798116781641 - position -0.9331254679963351 0.6384823031995971 5.00766176099283 + position -1.042412150179457 0.6657680853928192 6.1113744057183315 follow "DiyQuad" } DEF diyquad DiyQuad { - translation -0.27 0.81 0.037985 - rotation 0 0 1 1.5707999514237778 + translation 0.616 0.938 0.416 + rotation -0.003495169512613645 -0.0524814409308571 0.9986157830456612 0.1331838118862579 } TexturedBackground { } From 07f20adac7f86100f53bdaf0e0387e51032d6e8d Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 04:00:34 -0500 Subject: [PATCH 02/45] Use tmp worldfile file for playback --- webots/controllers/controller/Makefile | 3 +-- webots/controllers/playback/Makefile | 13 +++++++------ webots/worlds/.gitignore | 2 +- webots/worlds/twoexit.wbt | 9 +++++---- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/webots/controllers/controller/Makefile b/webots/controllers/controller/Makefile index 5e6811d91..eb9bfebbd 100644 --- a/webots/controllers/controller/Makefile +++ b/webots/controllers/controller/Makefile @@ -43,8 +43,7 @@ USE_C_API = true VERBOSE = 1 run: - sed 's/#physics/physics/' $(WORLDS_DIR)/$(world).wbt > $(WORLDS_DIR)/tmp.wbt - webots $(WORLDS_DIR)/tmp.wbt & + webots $(WORLDS_DIR)/$(world).wbt & /usr/local/webots/webots-controller --stdout-redirect $(EXE) $(world) \ $(poselogname) $(setpointlogname) diff --git a/webots/controllers/playback/Makefile b/webots/controllers/playback/Makefile index a58a08be7..d8613dcbc 100644 --- a/webots/controllers/playback/Makefile +++ b/webots/controllers/playback/Makefile @@ -12,16 +12,17 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Command-line variables; e.g. make run world=maze --------------------------- - - -# Command-line variables; e.g. make run world=maze --------------------------- +# Command-line variables; e.g.: +# make run world=simple logfile=../controller/log.csv +# world = twoexit logfile = ../../../simtest/log.csv -#----------------------------------------------------------------------------- + +WORLDS_DIR = ../../worlds run: - webots ../../worlds/$(world).wbt & + sed 's/physics.*//' $(WORLDS_DIR)/$(world).wbt > $(WORLDS_DIR)/$(world)_playback.wbt + webots $(WORLDS_DIR)/$(world)_playback.wbt & /usr/local/webots/webots-controller --stdout-redirect \ ./playback.py $(logfile) diff --git a/webots/worlds/.gitignore b/webots/worlds/.gitignore index 6bc0ba111..11b8e4a4e 100644 --- a/webots/worlds/.gitignore +++ b/webots/worlds/.gitignore @@ -1,2 +1,2 @@ -tmp.wbt .*.jpg +*_playback.wbt diff --git a/webots/worlds/twoexit.wbt b/webots/worlds/twoexit.wbt index f062d6381..1137a5171 100644 --- a/webots/worlds/twoexit.wbt +++ b/webots/worlds/twoexit.wbt @@ -9,6 +9,7 @@ EXTERNPROTO "../protos/DiyQuad.proto" WorldInfo { title "Hackflight" gravity 0 + physics "experimental" contactProperties [ ContactProperties { coulombFriction [ @@ -20,13 +21,13 @@ WorldInfo { ] } Viewpoint { - orientation -0.007365968524207539 0.9998100918073269 -0.01804225118783057 1.4721798116781641 - position -1.042412150179457 0.6657680853928192 6.1113744057183315 + orientation -0.006243249098038479 0.999827300157543 -0.017504048114038242 1.5621635181989688 + position -0.4585315057596007 0.5629292671215622 6.724944923564715 follow "DiyQuad" } DEF diyquad DiyQuad { - translation 0.616 0.938 0.416 - rotation -0.003495169512613645 -0.0524814409308571 0.9986157830456612 0.1331838118862579 + translation -0.560658 0.780204 0.00774505 + rotation -0.003500030644016716 -0.003062950563592598 0.9999891840011749 1.7038 } TexturedBackground { } From 776bed400d1ad86e6d6ba944c3ddd1b89697867b Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Sun, 8 Feb 2026 16:21:13 -0500 Subject: [PATCH 03/45] new file: webots/controllers/pycontroller/pycontroller.py --- webots/controllers/pycontroller/Makefile | 35 +++++++++++++++++++ .../controllers/pycontroller/pycontroller.py | 34 ++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 webots/controllers/pycontroller/Makefile create mode 100644 webots/controllers/pycontroller/pycontroller.py diff --git a/webots/controllers/pycontroller/Makefile b/webots/controllers/pycontroller/Makefile new file mode 100644 index 000000000..a16c1e892 --- /dev/null +++ b/webots/controllers/pycontroller/Makefile @@ -0,0 +1,35 @@ +# Copyright (C) 2026 Simon D. Levy + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, in version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +world = simple +poselogname = poselog.csv +setpointlogname = setpointlog.csv +# ---------------------------------------------------------------------------- + +WORLDS_DIR = ../../worlds + +run: + webots $(WORLDS_DIR)/$(world).wbt & + /usr/local/webots/webots-controller --stdout-redirect \ + ./pycontroller.py $(world) $(poselogname) $(setpointlogname) + +edit: + vim pycontroller.py + +### Do not modify: this includes Webots global Makefile.include +null := +space := $(null) $(null) +WEBOTS_HOME_PATH=$(subst $(space),\ ,$(strip $(subst \,/,$(WEBOTS_HOME)))) +include $(WEBOTS_HOME_PATH)/resources/Makefile.include + diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py new file mode 100644 index 000000000..6b5e7c816 --- /dev/null +++ b/webots/controllers/pycontroller/pycontroller.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +''' + Python flight simulator main for Hackflight with C++ custom physics plugin + + Copyright (C) 2026 Simon D. Levy + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, in version 3. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' + +from sys import argv + +MODE_IDLE = 0 +MODE_ARMED = 1 +MODE_HOVERING = 2 +MODE_AUTONOMOUS = 3 +MODE_LANDING = 4 +MODE_PANIC = 5 + +def main(): + + + setpointlogfp = open(argv[3], 'w') + + mode = MODE_IDLE From 59a457dc0320263fdef7d5e5454b345a7caa6794 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Sun, 8 Feb 2026 16:58:38 -0500 Subject: [PATCH 04/45] modified: pycontroller.py --- webots/controllers/pycontroller/.gitignore | 1 + .../controllers/pycontroller/pycontroller.py | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 webots/controllers/pycontroller/.gitignore mode change 100644 => 100755 webots/controllers/pycontroller/pycontroller.py diff --git a/webots/controllers/pycontroller/.gitignore b/webots/controllers/pycontroller/.gitignore new file mode 100644 index 000000000..afed0735d --- /dev/null +++ b/webots/controllers/pycontroller/.gitignore @@ -0,0 +1 @@ +*.csv diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py old mode 100644 new mode 100755 index 6b5e7c816..c39b17b3e --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -19,6 +19,10 @@ from sys import argv +from controller import Robot, Joystick + +TIME_STEP = 32 + MODE_IDLE = 0 MODE_ARMED = 1 MODE_HOVERING = 2 @@ -28,7 +32,24 @@ def main(): - setpointlogfp = open(argv[3], 'w') mode = MODE_IDLE + + robot = Robot() + + joystick = Joystick() + + joystick.enable(TIME_STEP) + + while True: + + if robot.step(TIME_STEP) == -1: + break + + try: + print(joystick.model) + except: + pass + +main() From 4bf00cd6d49dd4ff4aea84f7f88c4836734ddb44 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Sun, 8 Feb 2026 17:07:05 -0500 Subject: [PATCH 05/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index c39b17b3e..d794c73f5 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -30,6 +30,10 @@ MODE_LANDING = 4 MODE_PANIC = 5 +JOYSTICK_NONE = 0 +JOYSTICK_UNRECOGNIZED = 1 +JOYSTICK_RECOGNIZED = 2 + def main(): setpointlogfp = open(argv[3], 'w') @@ -38,18 +42,25 @@ def main(): robot = Robot() - joystick = Joystick() + joystick = robot.getJoystick() joystick.enable(TIME_STEP) + did_warn = False + while True: if robot.step(TIME_STEP) == -1: break - try: - print(joystick.model) - except: - pass + if not joystick.is_connected: + + if not did_warn: + print('Using keyboard instead:\n'); + print('- Use Enter to take off and land\n'); + print('- Use W and S to go up and down\n'); + print('- Use arrow keys to move horizontally\n'); + print('- Use Q and E to change heading\n'); + did_warn = True main() From b083ad5a9fa605040eaf68732c68e0731f6864af Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Sun, 8 Feb 2026 17:09:13 -0500 Subject: [PATCH 06/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index d794c73f5..d956bf913 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -34,6 +34,14 @@ JOYSTICK_UNRECOGNIZED = 1 JOYSTICK_RECOGNIZED = 2 +def printKeyboardInstructions(): + print('Using keyboard instead:\n'); + print('- Use Enter to take off and land\n'); + print('- Use W and S to go up and down\n'); + print('- Use arrow keys to move horizontally\n'); + print('- Use Q and E to change heading\n'); + + def main(): setpointlogfp = open(argv[3], 'w') @@ -53,14 +61,12 @@ def main(): if robot.step(TIME_STEP) == -1: break - if not joystick.is_connected: + if joystick.is_connected: + pass + + elif not did_warn: + printKeyboardInstructions() - if not did_warn: - print('Using keyboard instead:\n'); - print('- Use Enter to take off and land\n'); - print('- Use W and S to go up and down\n'); - print('- Use arrow keys to move horizontally\n'); - print('- Use Q and E to change heading\n'); - did_warn = True + did_warn = True main() From 25fe79a0e956acd98a02da327fc9ce6ce7cfc4aa Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 20:06:30 -0500 Subject: [PATCH 07/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index d956bf913..6cd9c8aca 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -30,9 +30,11 @@ MODE_LANDING = 4 MODE_PANIC = 5 -JOYSTICK_NONE = 0 -JOYSTICK_UNRECOGNIZED = 1 -JOYSTICK_RECOGNIZED = 2 +JOYSTICK_AXIS_MAP = { + 'Logitech Gamepad F310': (-2, 4, -5, 1) , + 'Microsoft X-Box 360 pad': (-2, 4, -5, 1 ) +} + def printKeyboardInstructions(): print('Using keyboard instead:\n'); @@ -42,6 +44,13 @@ def printKeyboardInstructions(): print('- Use Q and E to change heading\n'); +def reportUnrecognizedJoystick(joystick): + print('Unrecognized joystick %s with axes ' % joystick.model, end='') + for k in range(joystick.number_of_axes): + print('%2d=%+6d |' % (k+1, joystick.getAxisValue(k)), end=' ') + print() + + def main(): setpointlogfp = open(argv[3], 'w') @@ -62,7 +71,12 @@ def main(): break if joystick.is_connected: - pass + + if joystick.model in JOYSTICK_AXIS_MAP: + print('okay') + + else: + reportUnrecognizedJoystick(joystick) elif not did_warn: printKeyboardInstructions() From fe507ff4d7272d0f9c09c4916436d892cd99cb9a Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 20:17:54 -0500 Subject: [PATCH 08/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 6cd9c8aca..3bac351ea 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -19,9 +19,7 @@ from sys import argv -from controller import Robot, Joystick - -TIME_STEP = 32 +from controller import Robot MODE_IDLE = 0 MODE_ARMED = 1 @@ -37,11 +35,11 @@ def printKeyboardInstructions(): - print('Using keyboard instead:\n'); - print('- Use Enter to take off and land\n'); - print('- Use W and S to go up and down\n'); - print('- Use arrow keys to move horizontally\n'); - print('- Use Q and E to change heading\n'); + print('Using keyboard instead:\n') + print('- Use Enter to take off and land\n') + print('- Use W and S to go up and down\n') + print('- Use arrow keys to move horizontally\n') + print('- Use Q and E to change heading\n') def reportUnrecognizedJoystick(joystick): @@ -51,6 +49,10 @@ def reportUnrecognizedJoystick(joystick): print() +def getSimInfoFromKeyboard(mode): + print('mode=', mode) + + def main(): setpointlogfp = open(argv[3], 'w') @@ -59,28 +61,48 @@ def main(): robot = Robot() + timestep = int(robot.getBasicTimeStep()) + joystick = robot.getJoystick() - joystick.enable(TIME_STEP) + joystick.enable(timestep) + + gps = robot.getDevice('gps') + gps.enable(timestep) + + img = robot.getDevice('inertial unit') + img.enable(timestep) + + camera = robot.getDevice('camera') + camera.enable(timestep) + + ranger = robot.getDevice('range-finder') + ranger.enable(timestep) + + keyboard = robot.getKeyboard() + keyboard.enable(timestep) did_warn = False while True: - if robot.step(TIME_STEP) == -1: + if robot.step(timestep) == -1: break if joystick.is_connected: if joystick.model in JOYSTICK_AXIS_MAP: - print('okay') + print(timestep) else: reportUnrecognizedJoystick(joystick) + getSimInfoFromKeyboard(mode) - elif not did_warn: - printKeyboardInstructions() + else: + if not did_warn: + printKeyboardInstructions() + did_warn = True + getSimInfoFromKeyboard(mode) - did_warn = True main() From 5fc2dc325d83dbc120ec80500501693651c83966 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 20:27:28 -0500 Subject: [PATCH 09/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 3bac351ea..b14f94f34 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -34,6 +34,13 @@ } +def start_motor(quad, motor_name, direction): + + motor = quad.getDevice(motor_name) + motor.setPosition(float('inf')) + motor.setVelocity(direction * 60) + + def printKeyboardInstructions(): print('Using keyboard instead:\n') print('- Use Enter to take off and land\n') @@ -49,8 +56,8 @@ def reportUnrecognizedJoystick(joystick): print() -def getSimInfoFromKeyboard(mode): - print('mode=', mode) +def getSimInfoFromKeyboard(keyboard, mode): + pass def main(): @@ -82,27 +89,32 @@ def main(): keyboard = robot.getKeyboard() keyboard.enable(timestep) - did_warn = False + robot.step(timestep) + + use_keyboard = False + + if joystick.is_connected: + + if joystick.model not in JOYSTICK_AXIS_MAP: + print('Unrecognized joystick %s' % joystick.model) + use_keyboard = True + + else: + use_keyboard = True + + if use_keyboard: + printKeyboardInstructions() while True: if robot.step(timestep) == -1: break - if joystick.is_connected: - - if joystick.model in JOYSTICK_AXIS_MAP: - print(timestep) - - else: - reportUnrecognizedJoystick(joystick) - getSimInfoFromKeyboard(mode) + if use_keyboard: + getSimInfoFromKeyboard(keyboard, mode) else: - if not did_warn: - printKeyboardInstructions() - did_warn = True - getSimInfoFromKeyboard(mode) + print('okay') main() From 02feba877b3cf550ce82bdeeb725994be6da7240 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 20:29:58 -0500 Subject: [PATCH 10/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index b14f94f34..4be9006da 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -60,6 +60,11 @@ def getSimInfoFromKeyboard(keyboard, mode): pass +def getAndEnableDevice(robot, timestep, device_name): + device = robot.getDevice(device_name) + device.enable(timestep) + return device + def main(): setpointlogfp = open(argv[3], 'w') @@ -74,17 +79,10 @@ def main(): joystick.enable(timestep) - gps = robot.getDevice('gps') - gps.enable(timestep) - - img = robot.getDevice('inertial unit') - img.enable(timestep) - - camera = robot.getDevice('camera') - camera.enable(timestep) - - ranger = robot.getDevice('range-finder') - ranger.enable(timestep) + gps = getAndEnableDevice(robot, timestep, 'gps') + img = getAndEnableDevice(robot, timestep, 'inertial unit') + camera = getAndEnableDevice(robot, timestep, 'camera') + ranger = getAndEnableDevice(robot, timestep, 'range-finder') keyboard = robot.getKeyboard() keyboard.enable(timestep) From dbaf0bcc7d4aab780db64417741314064e399994 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 20:33:18 -0500 Subject: [PATCH 11/45] modified: pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 4be9006da..a7bc642ce 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -57,9 +57,12 @@ def reportUnrecognizedJoystick(joystick): def getSimInfoFromKeyboard(keyboard, mode): - pass + return None +def getSimInfoFromJoystick(joystick, mode): + return None + def getAndEnableDevice(robot, timestep, device_name): device = robot.getDevice(device_name) device.enable(timestep) @@ -108,11 +111,9 @@ def main(): if robot.step(timestep) == -1: break - if use_keyboard: - getSimInfoFromKeyboard(keyboard, mode) - - else: - print('okay') + siminfo = (getSimInfoFromKeyboard(keyboard, mode) + if use_keyboard + else getSimInfoFromJoystick(joystick, mode)) main() From b3549ad983a0b10f880470f245d3c7b89717ceda Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sun, 8 Feb 2026 20:38:21 -0500 Subject: [PATCH 12/45] modified: pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index a7bc642ce..201e4af0e 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -61,6 +61,9 @@ def getSimInfoFromKeyboard(keyboard, mode): def getSimInfoFromJoystick(joystick, mode): + axes = JOYSTICK_AXIS_MAP[joystick.model] + button = joystick.getPressedButton() + print(button) return None def getAndEnableDevice(robot, timestep, device_name): From e32813b55e1b8363a414157e4d469395fbaaa1da Mon Sep 17 00:00:00 2001 From: simondlevy Date: Mon, 9 Feb 2026 00:50:23 -0500 Subject: [PATCH 13/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 54 +++++++++++++++---- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 201e4af0e..434facab2 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -21,7 +21,7 @@ from controller import Robot -MODE_IDLE = 0 +MODE_IDLE = 0 MODE_ARMED = 1 MODE_HOVERING = 2 MODE_AUTONOMOUS = 3 @@ -29,8 +29,8 @@ MODE_PANIC = 5 JOYSTICK_AXIS_MAP = { - 'Logitech Gamepad F310': (-2, 4, -5, 1) , - 'Microsoft X-Box 360 pad': (-2, 4, -5, 1 ) + 'Logitech Gamepad F310': (-2, 4, -5, 1), + 'Microsoft X-Box 360 pad': (-2, 4, -5, 1) } @@ -56,21 +56,51 @@ def reportUnrecognizedJoystick(joystick): print() -def getSimInfoFromKeyboard(keyboard, mode): +def switchMode(what, mode): + return ( + MODE_HOVERING if mode == MODE_IDLE and what == 'hover' else + MODE_LANDING if mode == MODE_HOVERING and what == 'hover' else + MODE_AUTONOMOUS if mode == MODE_HOVERING and what == 'auto' else + MODE_HOVERING if mode == MODE_AUTONOMOUS and what == 'auto' else + mode) + + +def checkButton(button, target, what, buttons_down): + + if button == target: + if not buttons_down[what]: + print('switch ' + what) + buttons_down[what] = True + else: + buttons_down[what] = False + + +def getSimInfoFromKeyboard(keyboard, mode, buttons_down): return None -def getSimInfoFromJoystick(joystick, mode): - axes = JOYSTICK_AXIS_MAP[joystick.model] +def getSimInfoFromJoystick(joystick, buttons_down): + button = joystick.getPressedButton() - print(button) - return None + + checkButton(button, 5, 'hover', buttons_down) + + if button == 5: + if not buttons_down['hover']: + print('switch hover') + buttons_down['hover'] = True + else: + buttons_down['hover'] = False + + + def getAndEnableDevice(robot, timestep, device_name): device = robot.getDevice(device_name) device.enable(timestep) return device + def main(): setpointlogfp = open(argv[3], 'w') @@ -109,14 +139,20 @@ def main(): if use_keyboard: printKeyboardInstructions() + buttons_down = {'hover':False, 'auto':False} + while True: if robot.step(timestep) == -1: break + getSimInfoFromJoystick(joystick, buttons_down) + + ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) if use_keyboard - else getSimInfoFromJoystick(joystick, mode)) + else getSimInfoFromJoystick(joystick, mode, buttons_down)) + ''' main() From 29a42c07c7d43767c55832866f5f396e4377aa06 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Mon, 9 Feb 2026 00:51:54 -0500 Subject: [PATCH 14/45] modified: pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 434facab2..df3e2ff20 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -80,19 +80,9 @@ def getSimInfoFromKeyboard(keyboard, mode, buttons_down): def getSimInfoFromJoystick(joystick, buttons_down): - button = joystick.getPressedButton() - checkButton(button, 5, 'hover', buttons_down) - - if button == 5: - if not buttons_down['hover']: - print('switch hover') - buttons_down['hover'] = True - else: - buttons_down['hover'] = False - - + checkButton(button, 4, 'auto', buttons_down) def getAndEnableDevice(robot, timestep, device_name): From 4d2b421726672c1ef56f39d90357394f737c424a Mon Sep 17 00:00:00 2001 From: simondlevy Date: Mon, 9 Feb 2026 01:03:35 -0500 Subject: [PATCH 15/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index df3e2ff20..8869771fa 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -21,13 +21,6 @@ from controller import Robot -MODE_IDLE = 0 -MODE_ARMED = 1 -MODE_HOVERING = 2 -MODE_AUTONOMOUS = 3 -MODE_LANDING = 4 -MODE_PANIC = 5 - JOYSTICK_AXIS_MAP = { 'Logitech Gamepad F310': (-2, 4, -5, 1), 'Microsoft X-Box 360 pad': (-2, 4, -5, 1) @@ -58,31 +51,32 @@ def reportUnrecognizedJoystick(joystick): def switchMode(what, mode): return ( - MODE_HOVERING if mode == MODE_IDLE and what == 'hover' else - MODE_LANDING if mode == MODE_HOVERING and what == 'hover' else - MODE_AUTONOMOUS if mode == MODE_HOVERING and what == 'auto' else - MODE_HOVERING if mode == MODE_AUTONOMOUS and what == 'auto' else + 'hovering' if mode == 'idle' and what == 'hover' else + 'landing' if mode == 'hovering' and what == 'hover' else + 'autonomous' if mode == 'hovering' and what == 'auto' else + 'hovering' if mode == 'autonomous' and what == 'auto' else mode) -def checkButton(button, target, what, buttons_down): - +def checkButton(button, target, what, buttons_down, mode): if button == target: if not buttons_down[what]: - print('switch ' + what) + mode = switchMode(what, mode) buttons_down[what] = True else: buttons_down[what] = False + return mode def getSimInfoFromKeyboard(keyboard, mode, buttons_down): return None -def getSimInfoFromJoystick(joystick, buttons_down): +def getSimInfoFromJoystick(joystick, buttons_down, mode): button = joystick.getPressedButton() - checkButton(button, 5, 'hover', buttons_down) - checkButton(button, 4, 'auto', buttons_down) + mode = checkButton(button, 5, 'hover', buttons_down, mode) + mode = checkButton(button, 4, 'auto', buttons_down, mode) + return mode def getAndEnableDevice(robot, timestep, device_name): @@ -95,7 +89,7 @@ def main(): setpointlogfp = open(argv[3], 'w') - mode = MODE_IDLE + mode = 'idle' robot = Robot() @@ -136,7 +130,9 @@ def main(): if robot.step(timestep) == -1: break - getSimInfoFromJoystick(joystick, buttons_down) + mode = getSimInfoFromJoystick(joystick, buttons_down, mode) + + print(mode) ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) From 7d00d4990bae37950cd54cc65e2f6f14851e03bd Mon Sep 17 00:00:00 2001 From: simondlevy Date: Mon, 9 Feb 2026 01:08:03 -0500 Subject: [PATCH 16/45] =More pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 8869771fa..461ac142f 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -72,11 +72,12 @@ def getSimInfoFromKeyboard(keyboard, mode, buttons_down): return None -def getSimInfoFromJoystick(joystick, buttons_down, mode): +def getSimInfoFromJoystick(joystick, buttons_down, siminfo): button = joystick.getPressedButton() + mode = siminfo['mode'] mode = checkButton(button, 5, 'hover', buttons_down, mode) mode = checkButton(button, 4, 'auto', buttons_down, mode) - return mode + siminfo['mode'] = mode def getAndEnableDevice(robot, timestep, device_name): @@ -89,8 +90,6 @@ def main(): setpointlogfp = open(argv[3], 'w') - mode = 'idle' - robot = Robot() timestep = int(robot.getBasicTimeStep()) @@ -125,14 +124,16 @@ def main(): buttons_down = {'hover':False, 'auto':False} + siminfo = {'mode':'idle', 'setpoint':(0, 0, 0, 0)} + while True: if robot.step(timestep) == -1: break - mode = getSimInfoFromJoystick(joystick, buttons_down, mode) + getSimInfoFromJoystick(joystick, buttons_down, siminfo) - print(mode) + print(siminfo['mode']) ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) From 5b1d7f668241d487bee9dc2c46e8b8d1571da0e1 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Mon, 9 Feb 2026 01:23:55 -0500 Subject: [PATCH 17/45] =More pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 461ac142f..bc5c20144 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -72,13 +72,32 @@ def getSimInfoFromKeyboard(keyboard, mode, buttons_down): return None +def normalizeJoystickAxis(rawval): + return 2 * rawval / (2**16) + + +def readJoystickRaw(joystick, index): + axis = abs(index) - 1 + sign = -1 if index < 0 else +1 + return sign * joystick.getAxisValue(axis) + + +def readJoystickAxis(joystick, index): + return normalizeJoystickAxis(readJoystickRaw(joystick, index)) + + def getSimInfoFromJoystick(joystick, buttons_down, siminfo): + button = joystick.getPressedButton() mode = siminfo['mode'] mode = checkButton(button, 5, 'hover', buttons_down, mode) mode = checkButton(button, 4, 'auto', buttons_down, mode) siminfo['mode'] = mode + axes = JOYSTICK_AXIS_MAP[joystick.model] + + siminfo['setpoint']['thrust'] = readJoystickAxis(joystick, axes[0]) + def getAndEnableDevice(robot, timestep, device_name): device = robot.getDevice(device_name) @@ -122,9 +141,10 @@ def main(): if use_keyboard: printKeyboardInstructions() - buttons_down = {'hover':False, 'auto':False} + buttons_down = {'hover': False, 'auto': False} - siminfo = {'mode':'idle', 'setpoint':(0, 0, 0, 0)} + siminfo = {'mode': 'idle', + 'setpoint': {'thrust': 0, 'roll': 0, 'pitch': 0, 'yaw': 0}} while True: @@ -133,7 +153,8 @@ def main(): getSimInfoFromJoystick(joystick, buttons_down, siminfo) - print(siminfo['mode']) + setpoint = siminfo['setpoint'] + print('m=%10s | t=%3.3f' % (siminfo['mode'], setpoint['thrust'])) ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) From 98d008a433325320739ed51dba8aed1072632285 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Mon, 9 Feb 2026 01:28:39 -0500 Subject: [PATCH 18/45] =More pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index bc5c20144..d9782aca6 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -95,8 +95,12 @@ def getSimInfoFromJoystick(joystick, buttons_down, siminfo): siminfo['mode'] = mode axes = JOYSTICK_AXIS_MAP[joystick.model] + setpoint = siminfo['setpoint'] - siminfo['setpoint']['thrust'] = readJoystickAxis(joystick, axes[0]) + setpoint['thrust'] = readJoystickAxis(joystick, axes[0]) + setpoint['roll'] = readJoystickAxis(joystick, axes[1]) + setpoint['pitch'] = readJoystickAxis(joystick, axes[2]) + setpoint['yaw'] = readJoystickAxis(joystick, axes[3]) def getAndEnableDevice(robot, timestep, device_name): @@ -153,8 +157,9 @@ def main(): getSimInfoFromJoystick(joystick, buttons_down, siminfo) - setpoint = siminfo['setpoint'] - print('m=%10s | t=%3.3f' % (siminfo['mode'], setpoint['thrust'])) + s = siminfo['setpoint'] + print('m=%10s | t=%3.3f r=%+3.3f p=%+3.3f y=%+3.3f' % + (siminfo['mode'], s['thrust'], s['roll'], s['pitch'], s['yaw'])) ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) From f59922ada269cf1f5e4a11ffaea8d36112203b65 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 11:21:59 -0500 Subject: [PATCH 19/45] modified: pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index d9782aca6..6f15820ee 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -111,7 +111,7 @@ def getAndEnableDevice(robot, timestep, device_name): def main(): - setpointlogfp = open(argv[3], 'w') + logfile = open(argv[3], 'w') robot = Robot() @@ -158,8 +158,9 @@ def main(): getSimInfoFromJoystick(joystick, buttons_down, siminfo) s = siminfo['setpoint'] - print('m=%10s | t=%3.3f r=%+3.3f p=%+3.3f y=%+3.3f' % + logfile.write('%s,%f,%f,%f,%f\n' % (siminfo['mode'], s['thrust'], s['roll'], s['pitch'], s['yaw'])) + logfile.flush() ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) From 44a2d6b0154065ed5abe3cc0a19b45e214cde6dd Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 11:35:17 -0500 Subject: [PATCH 20/45] =More pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 6f15820ee..a0e1ac8f9 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -26,6 +26,7 @@ 'Microsoft X-Box 360 pad': (-2, 4, -5, 1) } +MODES = {'idle': 0, 'hovering': 2, 'autonomous': 2, 'landing': 3} def start_motor(quad, motor_name, direction): @@ -122,7 +123,7 @@ def main(): joystick.enable(timestep) gps = getAndEnableDevice(robot, timestep, 'gps') - img = getAndEnableDevice(robot, timestep, 'inertial unit') + imu = getAndEnableDevice(robot, timestep, 'inertial unit') camera = getAndEnableDevice(robot, timestep, 'camera') ranger = getAndEnableDevice(robot, timestep, 'range-finder') @@ -150,6 +151,12 @@ def main(): siminfo = {'mode': 'idle', 'setpoint': {'thrust': 0, 'roll': 0, 'pitch': 0, 'yaw': 0}} + xyz = gps.getValues() + rpy = imu.getRollPitchYaw() + + # Negate for leftward/nose-right positive + startingPose = (xyz[0], -xyz[1], xyz[2], rpy[0], rpy[1], -rpy[2]) + while True: if robot.step(timestep) == -1: @@ -158,8 +165,8 @@ def main(): getSimInfoFromJoystick(joystick, buttons_down, siminfo) s = siminfo['setpoint'] - logfile.write('%s,%f,%f,%f,%f\n' % - (siminfo['mode'], s['thrust'], s['roll'], s['pitch'], s['yaw'])) + logfile.write('%d,%f,%f,%f,%f\n' % (MODES[siminfo['mode']], + s['thrust'], s['roll'], s['pitch'], s['yaw'])) logfile.flush() ''' From 5c27198a3c49f2926c0eda938e16c57db1730c05 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 11:57:09 -0500 Subject: [PATCH 21/45] =More pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index a0e1ac8f9..57a8ba75f 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -18,6 +18,7 @@ ''' from sys import argv +from os import getcwd from controller import Robot @@ -110,9 +111,14 @@ def getAndEnableDevice(robot, timestep, device_name): return device -def main(): +def makeFixedSizePathArray(path): + # https://stackoverflow.com/a/24271591 + by = bytes(path, 'utf-8') + by += b'0' * (200 - len(by)) + return by + - logfile = open(argv[3], 'w') +def main(): robot = Robot() @@ -157,6 +163,16 @@ def main(): # Negate for leftward/nose-right positive startingPose = (xyz[0], -xyz[1], xyz[2], rpy[0], rpy[1], -rpy[2]) + framerate = 1 / timestep + + path = makeFixedSizePathArray(getcwd()) + + worldname = makeFixedSizePathArray(argv[1]) + + print(path) + + poselogname = makeFixedSizePathArray(argv[2]) + while True: if robot.step(timestep) == -1: @@ -164,10 +180,10 @@ def main(): getSimInfoFromJoystick(joystick, buttons_down, siminfo) + mode = MODES[siminfo['mode']] + s = siminfo['setpoint'] - logfile.write('%d,%f,%f,%f,%f\n' % (MODES[siminfo['mode']], - s['thrust'], s['roll'], s['pitch'], s['yaw'])) - logfile.flush() + setpoint = s['thrust'], s['roll'], s['pitch'], s['yaw'] ''' siminfo = (getSimInfoFromKeyboard(keyboard, mode) From 34b571708b94d9f7184437b2e44ffbd8cbeb81a3 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 12:06:25 -0500 Subject: [PATCH 22/45] =More pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 57a8ba75f..521c52f91 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -29,6 +29,7 @@ MODES = {'idle': 0, 'hovering': 2, 'autonomous': 2, 'landing': 3} + def start_motor(quad, motor_name, direction): motor = quad.getDevice(motor_name) @@ -60,7 +61,7 @@ def switchMode(what, mode): mode) -def checkButton(button, target, what, buttons_down, mode): +def checkJoystickButton(button, target, what, buttons_down, mode): if button == target: if not buttons_down[what]: mode = switchMode(what, mode) @@ -70,10 +71,6 @@ def checkButton(button, target, what, buttons_down, mode): return mode -def getSimInfoFromKeyboard(keyboard, mode, buttons_down): - return None - - def normalizeJoystickAxis(rawval): return 2 * rawval / (2**16) @@ -88,21 +85,21 @@ def readJoystickAxis(joystick, index): return normalizeJoystickAxis(readJoystickRaw(joystick, index)) -def getSimInfoFromJoystick(joystick, buttons_down, siminfo): +def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): button = joystick.getPressedButton() - mode = siminfo['mode'] - mode = checkButton(button, 5, 'hover', buttons_down, mode) - mode = checkButton(button, 4, 'auto', buttons_down, mode) - siminfo['mode'] = mode + mode = cmdinfo[0] + mode = checkJoystickButton(button, 5, 'hover', buttons_down, mode) + mode = checkJoystickButton(button, 4, 'auto', buttons_down, mode) axes = JOYSTICK_AXIS_MAP[joystick.model] - setpoint = siminfo['setpoint'] - setpoint['thrust'] = readJoystickAxis(joystick, axes[0]) - setpoint['roll'] = readJoystickAxis(joystick, axes[1]) - setpoint['pitch'] = readJoystickAxis(joystick, axes[2]) - setpoint['yaw'] = readJoystickAxis(joystick, axes[3]) + thrust = readJoystickAxis(joystick, axes[0]) + roll = readJoystickAxis(joystick, axes[1]) + pitch = readJoystickAxis(joystick, axes[2]) + yaw = readJoystickAxis(joystick, axes[3]) + + return mode, thrust, roll, pitch, yaw def getAndEnableDevice(robot, timestep, device_name): @@ -130,7 +127,6 @@ def main(): gps = getAndEnableDevice(robot, timestep, 'gps') imu = getAndEnableDevice(robot, timestep, 'inertial unit') - camera = getAndEnableDevice(robot, timestep, 'camera') ranger = getAndEnableDevice(robot, timestep, 'range-finder') keyboard = robot.getKeyboard() @@ -154,9 +150,6 @@ def main(): buttons_down = {'hover': False, 'auto': False} - siminfo = {'mode': 'idle', - 'setpoint': {'thrust': 0, 'roll': 0, 'pitch': 0, 'yaw': 0}} - xyz = gps.getValues() rpy = imu.getRollPitchYaw() @@ -169,26 +162,23 @@ def main(): worldname = makeFixedSizePathArray(argv[1]) - print(path) - poselogname = makeFixedSizePathArray(argv[2]) + cmdinfo = 'idle', 0, 0, 0, 0 + while True: if robot.step(timestep) == -1: break - getSimInfoFromJoystick(joystick, buttons_down, siminfo) - - mode = MODES[siminfo['mode']] + cmdinfo = getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo) - s = siminfo['setpoint'] - setpoint = s['thrust'], s['roll'], s['pitch'], s['yaw'] + print(cmdinfo) ''' - siminfo = (getSimInfoFromKeyboard(keyboard, mode) + cmdinfo = (getCommandInfoFromKeyboard(keyboard, mode) if use_keyboard - else getSimInfoFromJoystick(joystick, mode, buttons_down)) + else getCommandInfoFromJoystick(joystick, mode, buttons_down)) ''' From b6ce9e52dd98e6a564c8ae2144dd14426a225651 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 12:14:25 -0500 Subject: [PATCH 23/45] modified: ../../../../src/simulator/message.h --- src/simulator/message.h | 5 +++-- webots/controllers/pycontroller/pycontroller.py | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/simulator/message.h b/src/simulator/message.h index 32ea19868..10083eb10 100644 --- a/src/simulator/message.h +++ b/src/simulator/message.h @@ -27,11 +27,12 @@ namespace hf { pose_t startingPose; float framerate; + mode_e mode; + demands_t setpoint; + char path[200]; char worldname[200]; char poselogname[200]; - mode_e mode; - demands_t setpoint; } siminfo_t; } diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 521c52f91..743afaa3e 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -128,6 +128,7 @@ def main(): gps = getAndEnableDevice(robot, timestep, 'gps') imu = getAndEnableDevice(robot, timestep, 'inertial unit') ranger = getAndEnableDevice(robot, timestep, 'range-finder') + emitter = robot.getDevice('emitter') keyboard = robot.getKeyboard() keyboard.enable(timestep) @@ -173,7 +174,9 @@ def main(): cmdinfo = getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo) - print(cmdinfo) + # print(cmdinfo) + + print(emitter) ''' cmdinfo = (getCommandInfoFromKeyboard(keyboard, mode) From d9b9156c0de9c396653d589c3cf1e22b24bec2ec Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 12:45:51 -0500 Subject: [PATCH 24/45] Sim uses default logfile name --- src/simulator/message.h | 1 - webots/controllers/controller/Makefile | 9 ++------- webots/controllers/controller/main.cpp | 2 +- webots/plugins/physics/experimental/experimental.cpp | 9 +++++++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/simulator/message.h b/src/simulator/message.h index 10083eb10..066754d0c 100644 --- a/src/simulator/message.h +++ b/src/simulator/message.h @@ -32,7 +32,6 @@ namespace hf { char path[200]; char worldname[200]; - char poselogname[200]; } siminfo_t; } diff --git a/webots/controllers/controller/Makefile b/webots/controllers/controller/Makefile index eb9bfebbd..a39255f07 100644 --- a/webots/controllers/controller/Makefile +++ b/webots/controllers/controller/Makefile @@ -12,11 +12,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Command-line variables; e.g. make run world=twoexit ------------------------ +# Command-line variable; e.g. make run world=twoexit ------------------------ world = simple -poselogname = poselog.csv -setpointlogname = setpointlog.csv -# ---------------------------------------------------------------------------- EXE = $(shell basename "`pwd`") @@ -44,9 +41,7 @@ VERBOSE = 1 run: webots $(WORLDS_DIR)/$(world).wbt & - /usr/local/webots/webots-controller --stdout-redirect $(EXE) $(world) \ - $(poselogname) $(setpointlogname) - + /usr/local/webots/webots-controller --stdout-redirect $(EXE) $(world) edit: vim main.cpp diff --git a/webots/controllers/controller/main.cpp b/webots/controllers/controller/main.cpp index 653a50100..bf40bd91f 100644 --- a/webots/controllers/controller/main.cpp +++ b/webots/controllers/controller/main.cpp @@ -256,9 +256,9 @@ int main(int argc, char ** argv) while (true) { hf::siminfo_t siminfo = {}; + strcpy(siminfo.path, getcwd(siminfo.path, sizeof(siminfo.path))); strcpy(siminfo.worldname, argv[1]); - strcpy(siminfo.poselogname, argv[2]); if (!platform_step()) { break; diff --git a/webots/plugins/physics/experimental/experimental.cpp b/webots/plugins/physics/experimental/experimental.cpp index 20c5b1f4e..c2b084f1f 100644 --- a/webots/plugins/physics/experimental/experimental.cpp +++ b/webots/plugins/physics/experimental/experimental.cpp @@ -16,6 +16,9 @@ * along with this program. If not, see . */ +// C/C++ +#include + // Webots #include "../common.hpp" @@ -31,6 +34,8 @@ static const uint8_t RANGEFINDER_DISPLAY_SCALEUP = 64; +static const char * LOG_FILE_NAME = "log.csv"; + static simsens::Rangefinder * _rangefinder; static simsens::RangefinderVisualizer * _rangefinderVisualizer; @@ -40,7 +45,7 @@ static void load(const hf::siminfo_t & siminfo, simsens::Robot & robot, FILE ** logfpp) { - char path[1000]; + char path[1000] = {}; sprintf(path, "%s/../../worlds/%s.wbt", siminfo.path, siminfo.worldname); simsens::WorldParser::parse(path, world); @@ -52,7 +57,7 @@ static void load(const hf::siminfo_t & siminfo, _rangefinderVisualizer = new simsens::RangefinderVisualizer(_rangefinder); - sprintf(path, "%s/%s", siminfo.path, siminfo.poselogname); + sprintf(path, "%s/%s", siminfo.path, LOG_FILE_NAME); *logfpp = fopen(path, "w"); } From 3b30483693d74b44715ec4332c8df54db758db81 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 12:59:52 -0500 Subject: [PATCH 25/45] modified: main.cpp --- webots/controllers/controller/main.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/webots/controllers/controller/main.cpp b/webots/controllers/controller/main.cpp index bf40bd91f..48db59481 100644 --- a/webots/controllers/controller/main.cpp +++ b/webots/controllers/controller/main.cpp @@ -16,10 +16,13 @@ along with this program. If not, see . */ -// C/C++ +// C #include #include +#include #include + +// C++ #include #include using namespace std; @@ -30,7 +33,6 @@ using namespace std; #include #include - #include "platform.h" typedef struct { @@ -251,8 +253,6 @@ int main(int argc, char ** argv) platform_get_vehicle_psi() }; - FILE * setpointlogfp = fopen(argv[3], "w"); - while (true) { hf::siminfo_t siminfo = {}; @@ -289,16 +289,8 @@ int main(int argc, char ** argv) memcpy(&siminfo.startingPose, &startingPose, sizeof(hf::pose_t)); siminfo.framerate = platform_get_framerate(); platform_send_siminfo(&siminfo, sizeof(siminfo)); - - // Save mode and setpoint to logfile - const auto sp = siminfo.setpoint; - fprintf(setpointlogfp, "%d,%f,%f,%f,%f\n", - siminfo.mode, sp.thrust, sp.roll, sp.pitch, sp.yaw); - } - fclose(setpointlogfp); - platform_cleanup(); return 0; From e01d9ba8c8470646c4fcb90c1551f9b6041de5c1 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 15:13:24 -0500 Subject: [PATCH 26/45] Sim passes pwd, worldname as environment variables --- webots/controllers/controller/Makefile | 5 +++++ .../plugins/physics/experimental/experimental.cpp | 13 ++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/webots/controllers/controller/Makefile b/webots/controllers/controller/Makefile index a39255f07..f8f742c65 100644 --- a/webots/controllers/controller/Makefile +++ b/webots/controllers/controller/Makefile @@ -39,6 +39,11 @@ USE_C_API = true VERBOSE = 1 +# https://stackoverflow.com/a/49524393 +.EXPORT_ALL_VARIABLES: +WEBOTS_WORLD = $(world) +WEBOTS_PATH = $(shell pwd) + run: webots $(WORLDS_DIR)/$(world).wbt & /usr/local/webots/webots-controller --stdout-redirect $(EXE) $(world) diff --git a/webots/plugins/physics/experimental/experimental.cpp b/webots/plugins/physics/experimental/experimental.cpp index c2b084f1f..59ff3d18a 100644 --- a/webots/plugins/physics/experimental/experimental.cpp +++ b/webots/plugins/physics/experimental/experimental.cpp @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -// C/C++ +// C +#include #include // Webots @@ -36,6 +37,9 @@ static const uint8_t RANGEFINDER_DISPLAY_SCALEUP = 64; static const char * LOG_FILE_NAME = "log.csv"; +static const char * PATH_VARIABLE_NAME = "WEBOTS_PATH"; +static const char * WORLD_VARIABLE_NAME = "WEBOTS_WORLD"; + static simsens::Rangefinder * _rangefinder; static simsens::RangefinderVisualizer * _rangefinderVisualizer; @@ -45,12 +49,15 @@ static void load(const hf::siminfo_t & siminfo, simsens::Robot & robot, FILE ** logfpp) { + const auto pwd = getenv(PATH_VARIABLE_NAME); + const auto worldname = getenv(WORLD_VARIABLE_NAME); + char path[1000] = {}; - sprintf(path, "%s/../../worlds/%s.wbt", siminfo.path, siminfo.worldname); + sprintf(path, "%s/../../worlds/%s.wbt", pwd, worldname); simsens::WorldParser::parse(path, world); - sprintf(path, "%s/../../protos/DiyQuad.proto", siminfo.path); + sprintf(path, "%s/../../protos/DiyQuad.proto", pwd); simsens::RobotParser::parse(path, robot); _rangefinder = new simsens::Rangefinder(*robot.rangefinders[0]); From a288d8dc56e9f85eb0853e70fa2a5ccab4eaf288 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 15:18:49 -0500 Subject: [PATCH 27/45] Cleanup --- src/simulator/message.h | 3 --- webots/controllers/controller/main.cpp | 7 +----- .../physics/experimental/experimental.cpp | 22 ++++++++++--------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/simulator/message.h b/src/simulator/message.h index 066754d0c..727aca788 100644 --- a/src/simulator/message.h +++ b/src/simulator/message.h @@ -30,8 +30,5 @@ namespace hf { mode_e mode; demands_t setpoint; - char path[200]; - char worldname[200]; - } siminfo_t; } diff --git a/webots/controllers/controller/main.cpp b/webots/controllers/controller/main.cpp index 48db59481..867438421 100644 --- a/webots/controllers/controller/main.cpp +++ b/webots/controllers/controller/main.cpp @@ -236,10 +236,8 @@ static void getSimInfoFromJoystick(hf::siminfo_t & siminfo, hf::mode_e & mode) siminfo.setpoint.thrust = readJoystickAxis(axes.throttle); } -int main(int argc, char ** argv) +int main() { - (void)argc; - hf::mode_e mode = hf::MODE_IDLE; platform_init(); @@ -257,9 +255,6 @@ int main(int argc, char ** argv) hf::siminfo_t siminfo = {}; - strcpy(siminfo.path, getcwd(siminfo.path, sizeof(siminfo.path))); - strcpy(siminfo.worldname, argv[1]); - if (!platform_step()) { break; } diff --git a/webots/plugins/physics/experimental/experimental.cpp b/webots/plugins/physics/experimental/experimental.cpp index 59ff3d18a..f9fb7d101 100644 --- a/webots/plugins/physics/experimental/experimental.cpp +++ b/webots/plugins/physics/experimental/experimental.cpp @@ -44,17 +44,19 @@ static simsens::Rangefinder * _rangefinder; static simsens::RangefinderVisualizer * _rangefinderVisualizer; -static void load(const hf::siminfo_t & siminfo, - simsens::World & world, - simsens::Robot & robot, - FILE ** logfpp) +static char * worldname() +{ + return getenv(WORLD_VARIABLE_NAME); +} + +static void load( + simsens::World & world, simsens::Robot & robot, FILE ** logfpp) { const auto pwd = getenv(PATH_VARIABLE_NAME); - const auto worldname = getenv(WORLD_VARIABLE_NAME); char path[1000] = {}; - sprintf(path, "%s/../../worlds/%s.wbt", pwd, worldname); + sprintf(path, "%s/../../worlds/%s.wbt", pwd, worldname()); simsens::WorldParser::parse(path, world); sprintf(path, "%s/../../protos/DiyQuad.proto", pwd); @@ -64,7 +66,7 @@ static void load(const hf::siminfo_t & siminfo, _rangefinderVisualizer = new simsens::RangefinderVisualizer(_rangefinder); - sprintf(path, "%s/%s", siminfo.path, LOG_FILE_NAME); + sprintf(path, "%s/%s", pwd, LOG_FILE_NAME); *logfpp = fopen(path, "w"); } @@ -81,13 +83,13 @@ static bool run_normal(hf::siminfo_t & siminfo) // In autonomous mode, use current pose to get setpoints if (autonomous) { - if (string(siminfo.worldname) == "twoexit") { + if (string(worldname()) == "twoexit") { hf::RangefinderSetpoint::runTwoExit( _rangefinder_distances_mm, siminfo.setpoint); } else { - printf("No autopilot for world %s\n", siminfo.worldname); + printf("No autopilot for world %s\n", worldname()); } } @@ -96,7 +98,7 @@ static bool run_normal(hf::siminfo_t & siminfo) // Load world and robot info first time around if (!_rangefinder) { - load(siminfo, _world, _robot, &_logfp); + load(_world, _robot, &_logfp); } // Get simulated rangefinder distances From 1190ed743851f965069659f639f4f881fa7d9e61 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 15:23:04 -0500 Subject: [PATCH 28/45] modified: pycontroller.py --- webots/controllers/pycontroller/Makefile | 11 +++++++---- webots/controllers/pycontroller/pycontroller.py | 16 ---------------- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/webots/controllers/pycontroller/Makefile b/webots/controllers/pycontroller/Makefile index a16c1e892..39ac6d5d3 100644 --- a/webots/controllers/pycontroller/Makefile +++ b/webots/controllers/pycontroller/Makefile @@ -12,17 +12,20 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +# Command-line variable; e.g. make run world=twoexit world = simple -poselogname = poselog.csv -setpointlogname = setpointlog.csv -# ---------------------------------------------------------------------------- WORLDS_DIR = ../../worlds +# https://stackoverflow.com/a/49524393 +.EXPORT_ALL_VARIABLES: +WEBOTS_WORLD = $(world) +WEBOTS_PATH = $(shell pwd) + run: webots $(WORLDS_DIR)/$(world).wbt & /usr/local/webots/webots-controller --stdout-redirect \ - ./pycontroller.py $(world) $(poselogname) $(setpointlogname) + ./pycontroller.py $(world) edit: vim pycontroller.py diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 743afaa3e..75d848648 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -17,9 +17,6 @@ along with this program. If not, see . ''' -from sys import argv -from os import getcwd - from controller import Robot JOYSTICK_AXIS_MAP = { @@ -108,13 +105,6 @@ def getAndEnableDevice(robot, timestep, device_name): return device -def makeFixedSizePathArray(path): - # https://stackoverflow.com/a/24271591 - by = bytes(path, 'utf-8') - by += b'0' * (200 - len(by)) - return by - - def main(): robot = Robot() @@ -159,12 +149,6 @@ def main(): framerate = 1 / timestep - path = makeFixedSizePathArray(getcwd()) - - worldname = makeFixedSizePathArray(argv[1]) - - poselogname = makeFixedSizePathArray(argv[2]) - cmdinfo = 'idle', 0, 0, 0, 0 while True: From ce6d5c97b34ff32df89f8451d9ff86ce05d9a3c3 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 15:32:08 -0500 Subject: [PATCH 29/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 75d848648..86b438262 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -27,9 +27,9 @@ MODES = {'idle': 0, 'hovering': 2, 'autonomous': 2, 'landing': 3} -def start_motor(quad, motor_name, direction): +def startMotor(robot, motor_name, direction): - motor = quad.getDevice(motor_name) + motor = robot.getDevice(motor_name) motor.setPosition(float('inf')) motor.setVelocity(direction * 60) @@ -85,6 +85,7 @@ def readJoystickAxis(joystick, index): def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): button = joystick.getPressedButton() + mode = cmdinfo[0] mode = checkJoystickButton(button, 5, 'hover', buttons_down, mode) mode = checkJoystickButton(button, 4, 'auto', buttons_down, mode) @@ -98,6 +99,19 @@ def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): return mode, thrust, roll, pitch, yaw +def getCommandInfoFromKeyboard(keyboard, buttons_down, cmdinfo): + + mode = cmdinfo[0] + # mode = checkJoystickButton(button, 5, 'hover', buttons_down, mode) + # mode = checkJoystickButton(button, 4, 'auto', buttons_down, mode) + + thrust = 0 # readJoystickAxis(joystick, axes[0]) + roll = 0 # readJoystickAxis(joystick, axes[1]) + pitch = 0 # readJoystickAxis(joystick, axes[2]) + yaw = 0 # readJoystickAxis(joystick, axes[3]) + + return mode, thrust, roll, pitch, yaw + def getAndEnableDevice(robot, timestep, device_name): device = robot.getDevice(device_name) @@ -151,22 +165,21 @@ def main(): cmdinfo = 'idle', 0, 0, 0, 0 + startMotor(robot, 'motor1', -1) + startMotor(robot, 'motor2', +1) + startMotor(robot, 'motor3', +1) + startMotor(robot, 'motor4', -1) + while True: if robot.step(timestep) == -1: break - cmdinfo = getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo) - - # print(cmdinfo) - - print(emitter) - - ''' - cmdinfo = (getCommandInfoFromKeyboard(keyboard, mode) + cmdinfo = (getCommandInfoFromKeyboard(keyboard, buttons_down, cmdinfo) if use_keyboard - else getCommandInfoFromJoystick(joystick, mode, buttons_down)) - ''' + else getCommandInfoFromJoystick( + joystick, buttons_down, cmdinfo)) + print(cmdinfo) main() From 0933ba121f89c4bdcdfb2a578b81a9e6012391dd Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 15:40:35 -0500 Subject: [PATCH 30/45] =More pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 86b438262..e6a1f2626 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -58,7 +58,7 @@ def switchMode(what, mode): mode) -def checkJoystickButton(button, target, what, buttons_down, mode): +def checkPressed(button, target, what, buttons_down, mode): if button == target: if not buttons_down[what]: mode = switchMode(what, mode) @@ -87,8 +87,8 @@ def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): button = joystick.getPressedButton() mode = cmdinfo[0] - mode = checkJoystickButton(button, 5, 'hover', buttons_down, mode) - mode = checkJoystickButton(button, 4, 'auto', buttons_down, mode) + mode = checkPressed(button, 5, 'hover', buttons_down, mode) + mode = checkPressed(button, 4, 'auto', buttons_down, mode) axes = JOYSTICK_AXIS_MAP[joystick.model] @@ -99,11 +99,13 @@ def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): return mode, thrust, roll, pitch, yaw -def getCommandInfoFromKeyboard(keyboard, buttons_down, cmdinfo): +def getCommandInfoFromKeyboard(keyboard, keys_down, cmdinfo): + + key = keyboard.getKey() mode = cmdinfo[0] - # mode = checkJoystickButton(button, 5, 'hover', buttons_down, mode) - # mode = checkJoystickButton(button, 4, 'auto', buttons_down, mode) + mode = checkPressed(key, 4, 'hover', keys_down, mode) + mode = checkPressed(key, 32, 'auto', keys_down, mode) thrust = 0 # readJoystickAxis(joystick, axes[0]) roll = 0 # readJoystickAxis(joystick, axes[1]) From 1576ef59e4f5c508eb5e2edd704da3af1e836a8c Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 15:54:31 -0500 Subject: [PATCH 31/45] =More pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index e6a1f2626..eaabbc9f3 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -82,13 +82,18 @@ def readJoystickAxis(joystick, index): return normalizeJoystickAxis(readJoystickRaw(joystick, index)) -def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): - - button = joystick.getPressedButton() +def getModeFromButton( + button, hover_button, auto_button, buttons_down, cmdinfo): mode = cmdinfo[0] - mode = checkPressed(button, 5, 'hover', buttons_down, mode) - mode = checkPressed(button, 4, 'auto', buttons_down, mode) + mode = checkPressed(button, hover_button, 'hover', buttons_down, mode) + return checkPressed(button, auto_button, 'auto', buttons_down, mode) + + +def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): + + mode = getModeFromButton(joystick.getPressedButton(), 5, 4, buttons_down, + cmdinfo) axes = JOYSTICK_AXIS_MAP[joystick.model] @@ -99,18 +104,17 @@ def getCommandInfoFromJoystick(joystick, buttons_down, cmdinfo): return mode, thrust, roll, pitch, yaw + def getCommandInfoFromKeyboard(keyboard, keys_down, cmdinfo): key = keyboard.getKey() - mode = cmdinfo[0] - mode = checkPressed(key, 4, 'hover', keys_down, mode) - mode = checkPressed(key, 32, 'auto', keys_down, mode) + mode = getModeFromButton(key, 4, 32, keys_down, cmdinfo) - thrust = 0 # readJoystickAxis(joystick, axes[0]) - roll = 0 # readJoystickAxis(joystick, axes[1]) - pitch = 0 # readJoystickAxis(joystick, axes[2]) - yaw = 0 # readJoystickAxis(joystick, axes[3]) + thrust = 0 # readJoystickAxis(joystick, axes[0]) + roll = 0 # readJoystickAxis(joystick, axes[1]) + pitch = 0 # readJoystickAxis(joystick, axes[2]) + yaw = 0 # readJoystickAxis(joystick, axes[3]) return mode, thrust, roll, pitch, yaw @@ -184,4 +188,5 @@ def main(): print(cmdinfo) + main() From ff6047e116e5f039f34d0d324023cdea677fd40f Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 17:07:37 -0500 Subject: [PATCH 32/45] =More pycontroller.py --- webots/controllers/pycontroller/pycontroller.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index eaabbc9f3..f868c5159 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -111,10 +111,17 @@ def getCommandInfoFromKeyboard(keyboard, keys_down, cmdinfo): mode = getModeFromButton(key, 4, 32, keys_down, cmdinfo) - thrust = 0 # readJoystickAxis(joystick, axes[0]) - roll = 0 # readJoystickAxis(joystick, axes[1]) - pitch = 0 # readJoystickAxis(joystick, axes[2]) - yaw = 0 # readJoystickAxis(joystick, axes[3]) + thrust = +1 if key == ord('W') else -1 if key == ord('S') else 0 + + roll = (+1 if key == keyboard.RIGHT else + -1 if key == keyboard.LEFT else + 0) + + pitch = (+1 if key == keyboard.UP else + -1 if key == keyboard.DOWN else + 0) + + yaw = +0.5 if key == ord('E') else -0.5 if key == ord('Q') else 0 return mode, thrust, roll, pitch, yaw From 4128c936d5bc2778913df4346e2dee377bbbca60 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 17:21:45 -0500 Subject: [PATCH 33/45] =More pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index f868c5159..e1e1e9801 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -17,6 +17,8 @@ along with this program. If not, see . ''' +import struct + from controller import Robot JOYSTICK_AXIS_MAP = { @@ -139,17 +141,16 @@ def main(): timestep = int(robot.getBasicTimeStep()) joystick = robot.getJoystick() - joystick.enable(timestep) + keyboard = robot.getKeyboard() + keyboard.enable(timestep) + gps = getAndEnableDevice(robot, timestep, 'gps') imu = getAndEnableDevice(robot, timestep, 'inertial unit') ranger = getAndEnableDevice(robot, timestep, 'range-finder') emitter = robot.getDevice('emitter') - keyboard = robot.getKeyboard() - keyboard.enable(timestep) - robot.step(timestep) use_keyboard = False @@ -172,9 +173,7 @@ def main(): rpy = imu.getRollPitchYaw() # Negate for leftward/nose-right positive - startingPose = (xyz[0], -xyz[1], xyz[2], rpy[0], rpy[1], -rpy[2]) - - framerate = 1 / timestep + startpose = (xyz[0], -xyz[1], xyz[2], rpy[0], rpy[1], -rpy[2]) cmdinfo = 'idle', 0, 0, 0, 0 @@ -195,5 +194,11 @@ def main(): print(cmdinfo) + siminfo = struct.pack( + 'fffffffIffff', startpose[0], startpose[1], startpose[2], + startpose[3], startpose[4], startpose[5], 1/timestep, + MODES[cmdinfo[0]], cmdinfo[1], cmdinfo[2], cmdinfo[3], + cmdinfo[4]) + main() From 9327935f91fb20d5b6d8cf3188bc6d5b977c4237 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 17:40:51 -0500 Subject: [PATCH 34/45] pycontroller.py flying --- src/simulator/message.h | 8 +++---- .../controllers/pycontroller/pycontroller.py | 23 +++++++++++++++---- webots/plugins/physics/common.hpp | 3 +++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/simulator/message.h b/src/simulator/message.h index 727aca788..4f2f794ac 100644 --- a/src/simulator/message.h +++ b/src/simulator/message.h @@ -25,10 +25,10 @@ namespace hf { typedef struct { - pose_t startingPose; - float framerate; - mode_e mode; - demands_t setpoint; + pose_t startingPose; // 48 + float framerate; // 4 + mode_e mode; // 4 + demands_t setpoint; // 16 } siminfo_t; } diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index e1e1e9801..78d842936 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -192,13 +192,26 @@ def main(): else getCommandInfoFromJoystick( joystick, buttons_down, cmdinfo)) - print(cmdinfo) + # print(cmdinfo) siminfo = struct.pack( - 'fffffffIffff', startpose[0], startpose[1], startpose[2], - startpose[3], startpose[4], startpose[5], 1/timestep, - MODES[cmdinfo[0]], cmdinfo[1], cmdinfo[2], cmdinfo[3], - cmdinfo[4]) + + 'ddddddfIffff', + + # starting pose + startpose[0], startpose[1], startpose[2], + startpose[3], startpose[4], startpose[5], + + # framerate + timestep, + + # mode + int(MODES[cmdinfo[0]]), + + # setpoint + cmdinfo[1], cmdinfo[2], cmdinfo[3], cmdinfo[4]) + + emitter.send(siminfo) main() diff --git a/webots/plugins/physics/common.hpp b/webots/plugins/physics/common.hpp index 36f7026ac..7e418ee24 100644 --- a/webots/plugins/physics/common.hpp +++ b/webots/plugins/physics/common.hpp @@ -69,6 +69,8 @@ class PhysicsPluginHelper { // Get sim info from main program const auto buffer = (hf::siminfo_t *)dWebotsReceive(&bytes_received); + printf("received: %d\n", bytes_received); + if (bytes_received == sizeof(hf::siminfo_t)) { memcpy(&siminfo, buffer, sizeof(siminfo)); } @@ -82,6 +84,7 @@ class PhysicsPluginHelper { // Set pose first time around static bool _ready; if (!_ready) { + printf("framerate=%f\n", siminfo.framerate); _simulator.init(siminfo.startingPose, siminfo.framerate); } _ready = true; From f345c220a009952db51a428ba66397f845749700 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 17:41:54 -0500 Subject: [PATCH 35/45] Cleanup --- webots/plugins/physics/common.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/webots/plugins/physics/common.hpp b/webots/plugins/physics/common.hpp index 7e418ee24..36f7026ac 100644 --- a/webots/plugins/physics/common.hpp +++ b/webots/plugins/physics/common.hpp @@ -69,8 +69,6 @@ class PhysicsPluginHelper { // Get sim info from main program const auto buffer = (hf::siminfo_t *)dWebotsReceive(&bytes_received); - printf("received: %d\n", bytes_received); - if (bytes_received == sizeof(hf::siminfo_t)) { memcpy(&siminfo, buffer, sizeof(siminfo)); } @@ -84,7 +82,6 @@ class PhysicsPluginHelper { // Set pose first time around static bool _ready; if (!_ready) { - printf("framerate=%f\n", siminfo.framerate); _simulator.init(siminfo.startingPose, siminfo.framerate); } _ready = true; From 1eeef553daa29ae0911a0c557c18a2fc60949d9b Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 19:19:56 -0500 Subject: [PATCH 36/45] modified: kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb --- .../teensy2-bottom-bmi088.kicad_pcb | 8 ++++---- .../teensy2-bottom-small.kicad_pcb | 12 ++++++------ webots/controllers/pycontroller/pycontroller.py | 8 ++------ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb b/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb index 4388b88f9..593ef203c 100644 --- a/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb +++ b/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb @@ -2251,7 +2251,7 @@ ) ) (gr_text "CS" - (at 143.91 85.41 270) + (at 148 85.41 270) (layer "F.SilkS") (uuid "bacaeae0-c411-4564-8f7e-80f9a69cbf78") (effects @@ -2407,7 +2407,7 @@ ) ) (gr_text "SO" - (at 147.93 85.45 270) + (at 144 85.25 270) (layer "F.SilkS") (uuid "f52a00b7-0695-4179-b822-d5bf698c6df3") (effects @@ -2455,7 +2455,7 @@ ) ) (gr_text "CS" - (at 143.88 87.05 270) + (at 148 87.05 270) (layer "B.SilkS") (uuid "32cea446-2810-4452-9529-ffe9db9992dc") (effects @@ -2575,7 +2575,7 @@ ) ) (gr_text "SO" - (at 147.91 87.22 270) + (at 144 87 270) (layer "B.SilkS") (uuid "cdee91b0-cf45-46a4-9644-2afe901e933c") (effects diff --git a/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb b/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb index fd7a11223..e91395431 100644 --- a/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb +++ b/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb @@ -1842,7 +1842,7 @@ ) ) (gr_text "SI" - (at 145.97 85.91 270) + (at 145.97 85.5 270) (layer "F.SilkS") (uuid "3d2bab48-b6a6-4fdb-923b-296e7261f944") (effects @@ -2106,7 +2106,7 @@ ) ) (gr_text "CS" - (at 143.91 85.41 270) + (at 148 85.25 270) (layer "F.SilkS") (uuid "bacaeae0-c411-4564-8f7e-80f9a69cbf78") (effects @@ -2262,7 +2262,7 @@ ) ) (gr_text "SO" - (at 147.93 85.45 270) + (at 144 85.25 270) (layer "F.SilkS") (uuid "f52a00b7-0695-4179-b822-d5bf698c6df3") (effects @@ -2310,7 +2310,7 @@ ) ) (gr_text "CS" - (at 143.88 87.05 270) + (at 148 87 270) (layer "B.SilkS") (uuid "32cea446-2810-4452-9529-ffe9db9992dc") (effects @@ -2394,7 +2394,7 @@ ) ) (gr_text "SI" - (at 145.97 87.21 270) + (at 145.97 87 270) (layer "B.SilkS") (uuid "8ce5a58e-4a87-4b89-8d5c-de0849b92994") (effects @@ -2430,7 +2430,7 @@ ) ) (gr_text "SO" - (at 147.91 87.22 270) + (at 144 87 270) (layer "B.SilkS") (uuid "cdee91b0-cf45-46a4-9644-2afe901e933c") (effects diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 78d842936..28591f6a0 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -192,9 +192,7 @@ def main(): else getCommandInfoFromJoystick( joystick, buttons_down, cmdinfo)) - # print(cmdinfo) - - siminfo = struct.pack( + emitter.send(struct.pack( 'ddddddfIffff', @@ -209,9 +207,7 @@ def main(): int(MODES[cmdinfo[0]]), # setpoint - cmdinfo[1], cmdinfo[2], cmdinfo[3], cmdinfo[4]) - - emitter.send(siminfo) + cmdinfo[1], cmdinfo[2], cmdinfo[3], cmdinfo[4])) main() From 9d3f1860d0ecd9d82b9c49e3a07be42ba4c5fb46 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 19:29:24 -0500 Subject: [PATCH 37/45] modified: pycontroller.py --- .../controllers/pycontroller/pycontroller.py | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/pycontroller/pycontroller.py index 28591f6a0..14fc89cd2 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/pycontroller/pycontroller.py @@ -26,7 +26,9 @@ 'Microsoft X-Box 360 pad': (-2, 4, -5, 1) } -MODES = {'idle': 0, 'hovering': 2, 'autonomous': 2, 'landing': 3} +MODES = {'idle': 0, 'hovering': 2, 'autonomous': 2, 'landing': 4} + +ZDIST_LANDING_MAX_M = 0.01 def startMotor(robot, motor_name, direction): @@ -192,22 +194,23 @@ def main(): else getCommandInfoFromJoystick( joystick, buttons_down, cmdinfo)) - emitter.send(struct.pack( + mode = cmdinfo[0] - 'ddddddfIffff', - - # starting pose - startpose[0], startpose[1], startpose[2], - startpose[3], startpose[4], startpose[5], + print(mode) - # framerate - timestep, + # On descent, switch mode to idle when close enough to ground + if (mode == 'landing' and + (gps.getValues()[2] - startpose[2]) < ZDIST_LANDING_MAX_M): + mode = 'idle' - # mode - int(MODES[cmdinfo[0]]), - - # setpoint - cmdinfo[1], cmdinfo[2], cmdinfo[3], cmdinfo[4])) + # Send siminfo to fast thread + emitter.send(struct.pack( + 'ddddddfIffff', + startpose[0], startpose[1], startpose[2], # starting pose + startpose[3], startpose[4], startpose[5], + timestep, # framerate + int(MODES[mode]), # mode + cmdinfo[1], cmdinfo[2], cmdinfo[3], cmdinfo[4])) # setpoint main() From ab9e948d7e007f1b3eddcef44d623e7d30fcdec0 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 19:38:10 -0500 Subject: [PATCH 38/45] renamed: webots/controllers/pycontroller/pycontroller.py -> webots/controllers/standard/standard.py --- .../webots}/controller/.gitignore | 0 .../webots}/controller/Makefile | 0 .../webots}/controller/main.cpp | 0 .../webots}/controller/platform.h | 0 .../webots}/controller/platform_webots.cpp | 0 attic/webots/controllers/controller/Makefile | 72 ------------------- webots/README.md | 3 +- .../{pycontroller => standard}/.gitignore | 0 .../{pycontroller => standard}/Makefile | 6 +- .../pycontroller.py => standard/standard.py} | 9 +-- 10 files changed, 8 insertions(+), 82 deletions(-) rename {webots/controllers => attic/webots}/controller/.gitignore (100%) rename {webots/controllers => attic/webots}/controller/Makefile (100%) rename {webots/controllers => attic/webots}/controller/main.cpp (100%) rename {webots/controllers => attic/webots}/controller/platform.h (100%) rename {webots/controllers => attic/webots}/controller/platform_webots.cpp (100%) delete mode 100644 attic/webots/controllers/controller/Makefile rename webots/controllers/{pycontroller => standard}/.gitignore (100%) rename webots/controllers/{pycontroller => standard}/Makefile (93%) rename webots/controllers/{pycontroller/pycontroller.py => standard/standard.py} (95%) diff --git a/webots/controllers/controller/.gitignore b/attic/webots/controller/.gitignore similarity index 100% rename from webots/controllers/controller/.gitignore rename to attic/webots/controller/.gitignore diff --git a/webots/controllers/controller/Makefile b/attic/webots/controller/Makefile similarity index 100% rename from webots/controllers/controller/Makefile rename to attic/webots/controller/Makefile diff --git a/webots/controllers/controller/main.cpp b/attic/webots/controller/main.cpp similarity index 100% rename from webots/controllers/controller/main.cpp rename to attic/webots/controller/main.cpp diff --git a/webots/controllers/controller/platform.h b/attic/webots/controller/platform.h similarity index 100% rename from webots/controllers/controller/platform.h rename to attic/webots/controller/platform.h diff --git a/webots/controllers/controller/platform_webots.cpp b/attic/webots/controller/platform_webots.cpp similarity index 100% rename from webots/controllers/controller/platform_webots.cpp rename to attic/webots/controller/platform_webots.cpp diff --git a/attic/webots/controllers/controller/Makefile b/attic/webots/controllers/controller/Makefile deleted file mode 100644 index 852a1f3ad..000000000 --- a/attic/webots/controllers/controller/Makefile +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright (C) 2025 Simon D. Levy - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, in version 3. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# TeNNLab framework stuff ---------------------------------------------------- - -include ../../../snn_path.makefile - -NET = $(EMBDIR)/examples/difference/difference.txt - -VIZ_DIR = $(HOME)/Desktop/framework/viz -VIZ_PORT = 8100 - -# Support different worlds and closed-loop controllers ------------------------ - -world = empty -closedloop = standard - -# ----------------------------------------------------------------------------- - -CFLAGS = -O3 -std=c++11 -Wall -Wextra - -SRCDIR = ../../../src -INCLUDE = -I$(SRCDIR) - -CXX_SOURCES = controller.cpp - -all: controller - -# Use the Webots C API in your C++ controller program -USE_C_API = true - -VERBOSE = 1 - -run: - cp ../../plugins/physics/$(closedloop)/lib$(closedloop).so \ - ../../plugins/physics/__custom__/lib__custom__.so - webots ../../worlds/$(world).wbt & - /usr/local/webots/webots-controller --stdout-redirect controller - -runsnn: - cp ../../plugins/physics/snn/libsnn.so \ - ../../plugins/physics/__custom__/lib__custom__.so - webots ../../worlds/$(world).wbt & - /usr/local/webots/webots-controller --stdout-redirect controller & - sleep 1 - cd $(VIZ_DIR); \ - love . -i '{"source":"request","port":$(VIZ_PORT),"host":"localhost"}' \ - -n $(NET) --set_num_screen_shot 0 --use_name_neuron \ - '{"0":"I1","1":"I2","2":"S","3":"D1","4":"D2","5":"O","6":"S2"}' \ - --set_font_size 16 \ - > /dev/null - -### Do not modify: this includes Webots global Makefile.include -null := -space := $(null) $(null) -WEBOTS_HOME_PATH=$(subst $(space),\ ,$(strip $(subst \,/,$(WEBOTS_HOME)))) -include $(WEBOTS_HOME_PATH)/resources/Makefile.include - -edit: - vim main.cpp - diff --git a/webots/README.md b/webots/README.md index 69180efeb..c176b4497 100644 --- a/webots/README.md +++ b/webots/README.md @@ -18,8 +18,7 @@ on your computer. ``` cd webots/plugins/physics/simple make -cd ../../../controllers/controller -make +cd ../../../controllers/standard make run ``` diff --git a/webots/controllers/pycontroller/.gitignore b/webots/controllers/standard/.gitignore similarity index 100% rename from webots/controllers/pycontroller/.gitignore rename to webots/controllers/standard/.gitignore diff --git a/webots/controllers/pycontroller/Makefile b/webots/controllers/standard/Makefile similarity index 93% rename from webots/controllers/pycontroller/Makefile rename to webots/controllers/standard/Makefile index 39ac6d5d3..475e3f611 100644 --- a/webots/controllers/pycontroller/Makefile +++ b/webots/controllers/standard/Makefile @@ -22,13 +22,15 @@ WORLDS_DIR = ../../worlds WEBOTS_WORLD = $(world) WEBOTS_PATH = $(shell pwd) +FILES_TO_REMOVE += *.csv __pycache__/ + run: webots $(WORLDS_DIR)/$(world).wbt & /usr/local/webots/webots-controller --stdout-redirect \ - ./pycontroller.py $(world) + ./standard.py $(world) edit: - vim pycontroller.py + vim standard.py ### Do not modify: this includes Webots global Makefile.include null := diff --git a/webots/controllers/pycontroller/pycontroller.py b/webots/controllers/standard/standard.py similarity index 95% rename from webots/controllers/pycontroller/pycontroller.py rename to webots/controllers/standard/standard.py index 14fc89cd2..6fecb5d14 100755 --- a/webots/controllers/pycontroller/pycontroller.py +++ b/webots/controllers/standard/standard.py @@ -26,7 +26,7 @@ 'Microsoft X-Box 360 pad': (-2, 4, -5, 1) } -MODES = {'idle': 0, 'hovering': 2, 'autonomous': 2, 'landing': 4} +MODES = {'idle': 0, 'hovering': 2, 'autonomous': 3, 'landing': 4} ZDIST_LANDING_MAX_M = 0.01 @@ -150,7 +150,6 @@ def main(): gps = getAndEnableDevice(robot, timestep, 'gps') imu = getAndEnableDevice(robot, timestep, 'inertial unit') - ranger = getAndEnableDevice(robot, timestep, 'range-finder') emitter = robot.getDevice('emitter') robot.step(timestep) @@ -196,12 +195,10 @@ def main(): mode = cmdinfo[0] - print(mode) - # On descent, switch mode to idle when close enough to ground if (mode == 'landing' and - (gps.getValues()[2] - startpose[2]) < ZDIST_LANDING_MAX_M): - mode = 'idle' + (gps.getValues()[2] - startpose[2]) < ZDIST_LANDING_MAX_M): + mode = 'idle' # Send siminfo to fast thread emitter.send(struct.pack( From a5a34894d1747dce72cc5e800e9f2c0f2b3d9002 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 19:55:45 -0500 Subject: [PATCH 39/45] deleted: src/simulator/message.h --- src/simulator/message.h | 34 ------------------- webots/plugins/physics/common.hpp | 20 ++++++++--- .../physics/experimental/experimental.cpp | 4 +-- webots/plugins/physics/simple/simple.cpp | 2 +- 4 files changed, 18 insertions(+), 42 deletions(-) delete mode 100644 src/simulator/message.h diff --git a/src/simulator/message.h b/src/simulator/message.h deleted file mode 100644 index 4f2f794ac..000000000 --- a/src/simulator/message.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Simulation data message sent from slow (UI) to fast (PID / dynamics) threads - * - * Copyright (C) 2026 Simon D. Levy - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, in version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include -#include - -namespace hf { - - typedef struct { - - pose_t startingPose; // 48 - float framerate; // 4 - mode_e mode; // 4 - demands_t setpoint; // 16 - - } siminfo_t; -} diff --git a/webots/plugins/physics/common.hpp b/webots/plugins/physics/common.hpp index 36f7026ac..f2f7b93b0 100644 --- a/webots/plugins/physics/common.hpp +++ b/webots/plugins/physics/common.hpp @@ -21,7 +21,8 @@ // Hackflight #define _MAIN -#include +#include +#include #include static constexpr char ROBOT_NAME[] = "diyquad"; @@ -58,7 +59,16 @@ class PhysicsPluginHelper { public: - static bool get_siminfo(hf::siminfo_t & siminfo) + typedef struct { + + hf::pose_t startingPose; + float framerate; + hf::mode_e mode; + hf::demands_t setpoint; + + } siminfo_t; + + static bool get_siminfo(siminfo_t & siminfo) { if (_robot == NULL) { return false; @@ -67,9 +77,9 @@ class PhysicsPluginHelper { int bytes_received = 0; // Get sim info from main program - const auto buffer = (hf::siminfo_t *)dWebotsReceive(&bytes_received); + const auto buffer = (siminfo_t *)dWebotsReceive(&bytes_received); - if (bytes_received == sizeof(hf::siminfo_t)) { + if (bytes_received == sizeof(siminfo_t)) { memcpy(&siminfo, buffer, sizeof(siminfo)); } @@ -77,7 +87,7 @@ class PhysicsPluginHelper { return siminfo.framerate > 0; } - static hf::pose_t get_pose_from_siminfo(const hf::siminfo_t & siminfo) + static hf::pose_t get_pose_from_siminfo(const siminfo_t & siminfo) { // Set pose first time around static bool _ready; diff --git a/webots/plugins/physics/experimental/experimental.cpp b/webots/plugins/physics/experimental/experimental.cpp index f9fb7d101..6f5ec1a98 100644 --- a/webots/plugins/physics/experimental/experimental.cpp +++ b/webots/plugins/physics/experimental/experimental.cpp @@ -71,7 +71,7 @@ static void load( } // Returns false on collision, true otherwise -static bool run_normal(hf::siminfo_t & siminfo) +static bool run_normal(PhysicsPluginHelper::siminfo_t & siminfo) { static simsens::World _world; static simsens::Robot _robot; @@ -141,7 +141,7 @@ DLLEXPORT void webots_physics_step() else { - hf::siminfo_t siminfo = {}; + PhysicsPluginHelper::siminfo_t siminfo = {}; if (PhysicsPluginHelper::get_siminfo(siminfo)) { diff --git a/webots/plugins/physics/simple/simple.cpp b/webots/plugins/physics/simple/simple.cpp index bb3cea298..4eb8b116b 100644 --- a/webots/plugins/physics/simple/simple.cpp +++ b/webots/plugins/physics/simple/simple.cpp @@ -21,7 +21,7 @@ // This is called by Webots in the outer (display, kinematics) loop DLLEXPORT void webots_physics_step() { - hf::siminfo_t siminfo = {}; + PhysicsPluginHelper::siminfo_t siminfo = {}; if (PhysicsPluginHelper::get_siminfo(siminfo)) { From 3897d8c4288c2c043c7fa65e3cbefae5e27b7485 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Mon, 9 Feb 2026 21:39:14 -0500 Subject: [PATCH 40/45] modified: kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb --- .../teensy2-bottom-bmi088.kicad_pcb | 504 ++++++------ .../teensy2-bottom-bmi088.kicad_pro | 8 +- .../teensy2-bottom-small.kicad_pcb | 768 ++++++++---------- 3 files changed, 621 insertions(+), 659 deletions(-) diff --git a/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb b/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb index 593ef203c..b32592020 100644 --- a/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb +++ b/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pcb @@ -166,7 +166,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 1.11 0.5) + (at 1.11 1.5) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -577,7 +577,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 0.365 -0.11) + (at 0.365 -1.11) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -1706,7 +1706,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 0.425 0.33) + (at 0.425 1.33) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -1774,7 +1774,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 1.23 -0.8) + (at 1.23 -1.8) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -2694,21 +2694,13 @@ (net 2) (uuid "19fab7e3-e88a-47d6-adfd-f1ecef35113a") ) - (segment - (start 131.52 77.52) - (end 131.52 76.25) - (width 0.2) - (layer "F.Cu") - (net 2) - (uuid "1a9c19fd-95e1-4caf-86d3-893111dde0b7") - ) - (segment - (start 139.436903 85.436903) - (end 131.52 77.52) - (width 0.2) - (layer "F.Cu") + (via + (at 139.436903 85.436903) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") (net 2) - (uuid "496027c7-2289-44a2-a04d-b630d32960f6") + (uuid "1bb914f9-a4bb-4c16-bcf3-ab258271c229") ) (via (at 143.963147 85.436903) @@ -2718,6 +2710,14 @@ (net 2) (uuid "afe9a1bd-b214-411e-be33-f711a9b4e978") ) + (segment + (start 131.52 76.25) + (end 131.52 78.484156) + (width 0.2) + (layer "B.Cu") + (net 2) + (uuid "9fc78240-9251-40eb-b805-f0589b179899") + ) (segment (start 143.963147 85.436903) (end 144.289123 85.436903) @@ -2726,6 +2726,14 @@ (net 2) (uuid "aca33f5f-07b3-4b95-9404-5ffc8b4d8186") ) + (segment + (start 131.52 78.484156) + (end 138.472747 85.436903) + (width 0.2) + (layer "B.Cu") + (net 2) + (uuid "b5f25cbd-1aed-4df0-b126-8ae704f0eb0f") + ) (segment (start 144.289123 85.436903) (end 145.42103 86.56881) @@ -2742,6 +2750,14 @@ (net 2) (uuid "c79b5ea6-f389-44de-8b3d-df869982f3b1") ) + (segment + (start 138.472747 85.436903) + (end 139.436903 85.436903) + (width 0.2) + (layer "B.Cu") + (net 2) + (uuid "cf293652-22bc-4dc5-b1a6-f271c6eae5f1") + ) (segment (start 145.42103 86.56881) (end 145.42103 87.30103) @@ -3512,162 +3528,162 @@ (xy 150.23 81.585) (xy 150.702828 81.585) (xy 150.702844 81.584999) (xy 150.762372 81.578598) (xy 150.762379 81.578596) (xy 150.897086 81.528354) (xy 150.897093 81.52835) (xy 151.012187 81.44219) (xy 151.01219 81.442187) (xy 151.09835 81.327093) (xy 151.098354 81.327086) (xy 151.148596 81.192379) (xy 151.148598 81.192372) - (xy 151.154999 81.132844) (xy 151.155 81.132827) (xy 151.155 80.66) (xy 150.295686 80.66) (xy 150.30008 80.655606) - (xy 150.352741 80.564394) (xy 150.38 80.462661) (xy 150.38 80.357339) (xy 150.352741 80.255606) - (xy 150.30008 80.164394) (xy 150.295686 80.16) (xy 151.155 80.16) (xy 151.155 80.158501) (xy 151.174685 80.091462) - (xy 151.185718 80.081902) (xy 154.4995 80.081902) (xy 154.4995 80.318097) (xy 154.536446 80.551368) - (xy 154.609433 80.775996) (xy 154.652865 80.861235) (xy 154.716657 80.986433) (xy 154.855483 81.17751) - (xy 155.02249 81.344517) (xy 155.213567 81.483343) (xy 155.253528 81.503704) (xy 155.424003 81.590566) - (xy 155.424005 81.590566) (xy 155.424008 81.590568) (xy 155.544412 81.629689) (xy 155.648631 81.663553) - (xy 155.881903 81.7005) (xy 155.881908 81.7005) (xy 156.118097 81.7005) (xy 156.351368 81.663553) - (xy 156.39925 81.647995) (xy 156.575992 81.590568) (xy 156.786433 81.483343) (xy 156.97751 81.344517) - (xy 157.144517 81.17751) (xy 157.283343 80.986433) (xy 157.390568 80.775992) (xy 157.463553 80.551368) - (xy 157.477603 80.462661) (xy 157.5005 80.318097) (xy 157.5005 80.081902) (xy 157.463553 79.848631) - (xy 157.390566 79.624003) (xy 157.283342 79.413566) (xy 157.276844 79.404622) (xy 157.144517 79.22249) - (xy 156.97751 79.055483) (xy 156.786433 78.916657) (xy 156.575996 78.809433) (xy 156.351368 78.736446) - (xy 156.118097 78.6995) (xy 156.118092 78.6995) (xy 155.881908 78.6995) (xy 155.881903 78.6995) - (xy 155.648631 78.736446) (xy 155.424003 78.809433) (xy 155.213566 78.916657) (xy 155.10455 78.995862) - (xy 155.02249 79.055483) (xy 155.022488 79.055485) (xy 155.022487 79.055485) (xy 154.855485 79.222487) - (xy 154.855485 79.222488) (xy 154.855483 79.22249) (xy 154.821798 79.268853) (xy 154.716657 79.413566) - (xy 154.609433 79.624003) (xy 154.536446 79.848631) (xy 154.4995 80.081902) (xy 151.185718 80.081902) - (xy 151.227489 80.045707) (xy 151.267195 80.037069) (xy 151.266997 80.035562) (xy 151.275054 80.034501) - (xy 151.275057 80.034501) (xy 151.427785 79.993577) (xy 151.488079 79.958765) (xy 151.488082 79.958765) - (xy 151.564709 79.914524) (xy 151.564708 79.914524) (xy 151.564716 79.91452) (xy 151.67652 79.802716) - (xy 151.67652 79.802714) (xy 151.686724 79.792511) (xy 151.686728 79.792506) (xy 153.895478 77.583755) - (xy 153.956799 77.550272) (xy 154.021473 77.553506) (xy 154.063757 77.567246) (xy 154.273713 77.6005) - (xy 154.273714 77.6005) (xy 154.486286 77.6005) (xy 154.486287 77.6005) (xy 154.696243 77.567246) - (xy 154.898412 77.501557) (xy 155.087816 77.405051) (xy 155.109789 77.389086) (xy 155.259786 77.280109) - (xy 155.259788 77.280106) (xy 155.259792 77.280104) (xy 155.410104 77.129792) (xy 155.410106 77.129788) - (xy 155.410109 77.129786) (xy 155.535048 76.95782) (xy 155.535047 76.95782) (xy 155.535051 76.957816) - (xy 155.539514 76.949054) (xy 155.587488 76.898259) (xy 155.655308 76.881463) (xy 155.721444 76.903999) - (xy 155.760486 76.949056) (xy 155.764951 76.95782) (xy 155.88989 77.129786) (xy 156.040213 77.280109) - (xy 156.212179 77.405048) (xy 156.212181 77.405049) (xy 156.212184 77.405051) (xy 156.401588 77.501557) - (xy 156.603757 77.567246) (xy 156.813713 77.6005) (xy 156.813714 77.6005) (xy 157.026286 77.6005) - (xy 157.026287 77.6005) (xy 157.236243 77.567246) (xy 157.438412 77.501557) (xy 157.627816 77.405051) - (xy 157.649789 77.389086) (xy 157.799786 77.280109) (xy 157.799788 77.280106) (xy 157.799792 77.280104) - (xy 157.950104 77.129792) (xy 157.950106 77.129788) (xy 157.950109 77.129786) (xy 158.075048 76.95782) - (xy 158.075047 76.95782) (xy 158.075051 76.957816) (xy 158.079514 76.949054) (xy 158.127488 76.898259) - (xy 158.195308 76.881463) (xy 158.261444 76.903999) (xy 158.300486 76.949056) (xy 158.304951 76.95782) - (xy 158.42989 77.129786) (xy 158.580213 77.280109) (xy 158.752179 77.405048) (xy 158.752181 77.405049) - (xy 158.752184 77.405051) (xy 158.941588 77.501557) (xy 159.143757 77.567246) (xy 159.353713 77.6005) - (xy 159.353714 77.6005) (xy 159.566286 77.6005) (xy 159.566287 77.6005) (xy 159.776243 77.567246) - (xy 159.978412 77.501557) (xy 160.167816 77.405051) (xy 160.254478 77.342088) (xy 160.339784 77.28011) - (xy 160.339784 77.280109) (xy 160.339792 77.280104) (xy 160.453717 77.166178) (xy 160.515036 77.132696) - (xy 160.584728 77.13768) (xy 160.640662 77.179551) (xy 160.657577 77.210528) (xy 160.706646 77.342088) - (xy 160.706649 77.342093) (xy 160.792809 77.457187) (xy 160.792812 77.45719) (xy 160.907906 77.54335) - (xy 160.907913 77.543354) (xy 161.04262 77.593596) (xy 161.042627 77.593598) (xy 161.102155 77.599999) - (xy 161.102172 77.6) (xy 161.75 77.6) (xy 161.75 76.683012) (xy 161.807007 76.715925) (xy 161.934174 76.75) - (xy 162.065826 76.75) (xy 162.192993 76.715925) (xy 162.25 76.683012) (xy 162.25 77.6) (xy 162.897828 77.6) - (xy 162.897844 77.599999) (xy 162.957372 77.593598) (xy 162.957379 77.593596) (xy 163.092086 77.543354) - (xy 163.092093 77.54335) (xy 163.207187 77.45719) (xy 163.20719 77.457187) (xy 163.29335 77.342093) - (xy 163.293354 77.342086) (xy 163.343596 77.207379) (xy 163.343598 77.207372) (xy 163.349999 77.147844) - (xy 163.35 77.147827) (xy 163.35 76.5) (xy 162.433012 76.5) (xy 162.465925 76.442993) (xy 162.5 76.315826) - (xy 162.5 76.184174) (xy 162.465925 76.057007) (xy 162.433012 76) (xy 163.35 76) (xy 163.35 75.352172) - (xy 163.349999 75.352155) (xy 163.343598 75.292627) (xy 163.343596 75.29262) (xy 163.293354 75.157913) - (xy 163.29335 75.157906) (xy 163.20719 75.042812) (xy 163.207187 75.042809) (xy 163.092093 74.956649) - (xy 163.092086 74.956645) (xy 162.957379 74.906403) (xy 162.957372 74.906401) (xy 162.897844 74.9) - (xy 162.25 74.9) (xy 162.25 75.816988) (xy 162.192993 75.784075) (xy 162.065826 75.75) (xy 161.934174 75.75) - (xy 161.807007 75.784075) (xy 161.75 75.816988) (xy 161.75 74.9) (xy 161.102155 74.9) (xy 161.042627 74.906401) - (xy 161.04262 74.906403) (xy 160.907913 74.956645) (xy 160.907906 74.956649) (xy 160.792812 75.042809) - (xy 160.792809 75.042812) (xy 160.706649 75.157906) (xy 160.706646 75.157912) (xy 160.657577 75.289471) - (xy 160.615705 75.345404) (xy 160.550241 75.369821) (xy 160.481968 75.354969) (xy 160.453714 75.333818) - (xy 160.339786 75.21989) (xy 160.16782 75.094951) (xy 159.978414 74.998444) (xy 159.978413 74.998443) - (xy 159.978412 74.998443) (xy 159.776243 74.932754) (xy 159.776241 74.932753) (xy 159.77624 74.932753) - (xy 159.614957 74.907208) (xy 159.566287 74.8995) (xy 159.353713 74.8995) (xy 159.305042 74.907208) - (xy 159.14376 74.932753) (xy 158.941585 74.998444) (xy 158.752179 75.094951) (xy 158.580213 75.21989) - (xy 158.42989 75.370213) (xy 158.304949 75.542182) (xy 158.300484 75.550946) (xy 158.252509 75.601742) - (xy 158.184688 75.618536) (xy 158.118553 75.595998) (xy 158.079516 75.550946) (xy 158.07505 75.542182) - (xy 157.950109 75.370213) (xy 157.799786 75.21989) (xy 157.62782 75.094951) (xy 157.438414 74.998444) - (xy 157.438413 74.998443) (xy 157.438412 74.998443) (xy 157.236243 74.932754) (xy 157.236241 74.932753) - (xy 157.23624 74.932753) (xy 157.074957 74.907208) (xy 157.026287 74.8995) (xy 156.813713 74.8995) - (xy 156.765042 74.907208) (xy 156.60376 74.932753) (xy 156.401585 74.998444) (xy 156.212179 75.094951) - (xy 156.040213 75.21989) (xy 155.88989 75.370213) (xy 155.764949 75.542182) (xy 155.760484 75.550946) - (xy 155.712509 75.601742) (xy 155.644688 75.618536) (xy 155.578553 75.595998) (xy 155.539516 75.550946) - (xy 155.53505 75.542182) (xy 155.410109 75.370213) (xy 155.259786 75.21989) (xy 155.08782 75.094951) - (xy 154.898414 74.998444) (xy 154.898413 74.998443) (xy 154.898412 74.998443) (xy 154.696243 74.932754) - (xy 154.696241 74.932753) (xy 154.69624 74.932753) (xy 154.534957 74.907208) (xy 154.486287 74.8995) - (xy 154.273713 74.8995) (xy 154.225042 74.907208) (xy 154.06376 74.932753) (xy 153.861585 74.998444) - (xy 153.672179 75.094951) (xy 153.500213 75.21989) (xy 153.34989 75.370213) (xy 153.224949 75.542182) - (xy 153.220484 75.550946) (xy 153.172509 75.601742) (xy 153.104688 75.618536) (xy 153.038553 75.595998) - (xy 152.999516 75.550946) (xy 152.99505 75.542182) (xy 152.870109 75.370213) (xy 152.719786 75.21989) - (xy 152.54782 75.094951) (xy 152.358414 74.998444) (xy 152.358413 74.998443) (xy 152.358412 74.998443) - (xy 152.156243 74.932754) (xy 152.156241 74.932753) (xy 152.15624 74.932753) (xy 151.994957 74.907208) - (xy 151.946287 74.8995) (xy 151.733713 74.8995) (xy 151.685042 74.907208) (xy 151.52376 74.932753) - (xy 151.321585 74.998444) (xy 151.132179 75.094951) (xy 150.960213 75.21989) (xy 150.80989 75.370213) - (xy 150.684949 75.542182) (xy 150.680484 75.550946) (xy 150.632509 75.601742) (xy 150.564688 75.618536) - (xy 150.498553 75.595998) (xy 150.459516 75.550946) (xy 150.45505 75.542182) (xy 150.330109 75.370213) - (xy 150.179786 75.21989) (xy 150.00782 75.094951) (xy 149.818414 74.998444) (xy 149.818413 74.998443) - (xy 149.818412 74.998443) (xy 149.616243 74.932754) (xy 149.616241 74.932753) (xy 149.61624 74.932753) - (xy 149.454957 74.907208) (xy 149.406287 74.8995) (xy 149.193713 74.8995) (xy 149.145042 74.907208) - (xy 148.98376 74.932753) (xy 148.781585 74.998444) (xy 148.592179 75.094951) (xy 148.420213 75.21989) - (xy 148.26989 75.370213) (xy 148.144949 75.542182) (xy 148.140484 75.550946) (xy 148.092509 75.601742) - (xy 148.024688 75.618536) (xy 147.958553 75.595998) (xy 147.919516 75.550946) (xy 147.91505 75.542182) - (xy 147.790109 75.370213) (xy 147.639786 75.21989) (xy 147.46782 75.094951) (xy 147.278414 74.998444) - (xy 147.278413 74.998443) (xy 147.278412 74.998443) (xy 147.076243 74.932754) (xy 147.076241 74.932753) - (xy 147.07624 74.932753) (xy 146.914957 74.907208) (xy 146.866287 74.8995) (xy 146.653713 74.8995) - (xy 146.605042 74.907208) (xy 146.44376 74.932753) (xy 146.241585 74.998444) (xy 146.052179 75.094951) - (xy 145.880213 75.21989) (xy 145.72989 75.370213) (xy 145.604949 75.542182) (xy 145.600484 75.550946) - (xy 145.552509 75.601742) (xy 145.484688 75.618536) (xy 145.418553 75.595998) (xy 145.379516 75.550946) - (xy 145.37505 75.542182) (xy 145.250109 75.370213) (xy 145.099786 75.21989) (xy 144.92782 75.094951) - (xy 144.738414 74.998444) (xy 144.738413 74.998443) (xy 144.738412 74.998443) (xy 144.536243 74.932754) - (xy 144.536241 74.932753) (xy 144.53624 74.932753) (xy 144.374957 74.907208) (xy 144.326287 74.8995) - (xy 144.113713 74.8995) (xy 144.065042 74.907208) (xy 143.90376 74.932753) (xy 143.701585 74.998444) - (xy 143.512179 75.094951) (xy 143.340213 75.21989) (xy 143.18989 75.370213) (xy 143.064949 75.542182) - (xy 143.060484 75.550946) (xy 143.012509 75.601742) (xy 142.944688 75.618536) (xy 142.878553 75.595998) - (xy 142.839516 75.550946) (xy 142.83505 75.542182) (xy 142.710109 75.370213) (xy 142.559786 75.21989) - (xy 142.38782 75.094951) (xy 142.198414 74.998444) (xy 142.198413 74.998443) (xy 142.198412 74.998443) - (xy 141.996243 74.932754) (xy 141.996241 74.932753) (xy 141.99624 74.932753) (xy 141.834957 74.907208) - (xy 141.786287 74.8995) (xy 141.573713 74.8995) (xy 141.525042 74.907208) (xy 141.36376 74.932753) - (xy 141.161585 74.998444) (xy 140.972179 75.094951) (xy 140.800213 75.21989) (xy 140.64989 75.370213) - (xy 140.524949 75.542182) (xy 140.520484 75.550946) (xy 140.472509 75.601742) (xy 140.404688 75.618536) - (xy 140.338553 75.595998) (xy 140.299516 75.550946) (xy 140.29505 75.542182) (xy 140.170109 75.370213) - (xy 140.019786 75.21989) (xy 139.84782 75.094951) (xy 139.658414 74.998444) (xy 139.658413 74.998443) - (xy 139.658412 74.998443) (xy 139.456243 74.932754) (xy 139.456241 74.932753) (xy 139.45624 74.932753) - (xy 139.294957 74.907208) (xy 139.246287 74.8995) (xy 139.033713 74.8995) (xy 138.985042 74.907208) - (xy 138.82376 74.932753) (xy 138.621585 74.998444) (xy 138.432179 75.094951) (xy 138.260213 75.21989) - (xy 138.10989 75.370213) (xy 137.984949 75.542182) (xy 137.980484 75.550946) (xy 137.932509 75.601742) - (xy 137.864688 75.618536) (xy 137.798553 75.595998) (xy 137.759516 75.550946) (xy 137.75505 75.542182) - (xy 137.630109 75.370213) (xy 137.479786 75.21989) (xy 137.30782 75.094951) (xy 137.118414 74.998444) - (xy 137.118413 74.998443) (xy 137.118412 74.998443) (xy 136.916243 74.932754) (xy 136.916241 74.932753) - (xy 136.91624 74.932753) (xy 136.754957 74.907208) (xy 136.706287 74.8995) (xy 136.493713 74.8995) - (xy 136.445042 74.907208) (xy 136.28376 74.932753) (xy 136.081585 74.998444) (xy 135.892179 75.094951) - (xy 135.720213 75.21989) (xy 135.56989 75.370213) (xy 135.444949 75.542182) (xy 135.440484 75.550946) - (xy 135.392509 75.601742) (xy 135.324688 75.618536) (xy 135.258553 75.595998) (xy 135.219516 75.550946) - (xy 135.21505 75.542182) (xy 135.090109 75.370213) (xy 134.939786 75.21989) (xy 134.76782 75.094951) - (xy 134.578414 74.998444) (xy 134.578413 74.998443) (xy 134.578412 74.998443) (xy 134.376243 74.932754) - (xy 134.376241 74.932753) (xy 134.37624 74.932753) (xy 134.214957 74.907208) (xy 134.166287 74.8995) - (xy 133.953713 74.8995) (xy 133.905042 74.907208) (xy 133.74376 74.932753) (xy 133.541585 74.998444) - (xy 133.352179 75.094951) (xy 133.180213 75.21989) (xy 133.02989 75.370213) (xy 132.904949 75.542182) - (xy 132.900484 75.550946) (xy 132.852509 75.601742) (xy 132.784688 75.618536) (xy 132.718553 75.595998) - (xy 132.679516 75.550946) (xy 132.67505 75.542182) (xy 132.550109 75.370213) (xy 132.399786 75.21989) - (xy 132.22782 75.094951) (xy 132.038414 74.998444) (xy 132.038413 74.998443) (xy 132.038412 74.998443) - (xy 131.836243 74.932754) (xy 131.836241 74.932753) (xy 131.83624 74.932753) (xy 131.674957 74.907208) - (xy 131.626287 74.8995) (xy 131.413713 74.8995) (xy 131.365042 74.907208) (xy 131.20376 74.932753) - (xy 131.001585 74.998444) (xy 130.812179 75.094951) (xy 130.640213 75.21989) (xy 130.48989 75.370213) - (xy 130.364949 75.542182) (xy 130.360484 75.550946) (xy 130.312509 75.601742) (xy 130.244688 75.618536) - (xy 130.178553 75.595998) (xy 130.139516 75.550946) (xy 130.13505 75.542182) (xy 130.010109 75.370213) - (xy 129.859786 75.21989) (xy 129.68782 75.094951) (xy 129.498414 74.998444) (xy 129.498413 74.998443) - (xy 129.498412 74.998443) (xy 129.296243 74.932754) (xy 129.296241 74.932753) (xy 129.29624 74.932753) - (xy 129.134957 74.907208) (xy 129.086287 74.8995) (xy 128.873713 74.8995) (xy 128.825042 74.907208) - (xy 128.66376 74.932753) (xy 128.461585 74.998444) (xy 128.272179 75.094951) (xy 128.100213 75.21989) - (xy 127.94989 75.370213) (xy 127.824951 75.542179) (xy 127.728444 75.731585) (xy 127.662753 75.93376) - (xy 127.6295 76.143713) (xy 127.6295 76.356286) (xy 127.662753 76.566239) (xy 127.728444 76.768414) - (xy 127.824951 76.95782) (xy 127.94989 77.129786) (xy 128.100213 77.280109) (xy 128.272179 77.405048) - (xy 128.272181 77.405049) (xy 128.272184 77.405051) (xy 128.461588 77.501557) (xy 128.663757 77.567246) - (xy 128.873713 77.6005) (xy 128.873714 77.6005) (xy 129.086286 77.6005) (xy 129.086287 77.6005) - (xy 129.296243 77.567246) (xy 129.338523 77.553507) (xy 129.408362 77.551511) (xy 129.464522 77.583757) - (xy 138.414035 86.53327) (xy 138.414045 86.533281) (xy 138.418375 86.537611) (xy 138.418376 86.537612) - (xy 138.53018 86.649416) (xy 138.581741 86.679184) (xy 138.616991 86.699535) (xy 138.616993 86.699537) - (xy 138.667109 86.728472) (xy 138.667111 86.728473) (xy 138.819838 86.769396) (xy 138.819839 86.769396) - (xy 142.284774 86.769396) (xy 142.302917 86.774723) (xy 142.321827 86.775061) (xy 142.350044 86.788561) - (xy 142.351813 86.789081) (xy 142.353665 86.790294) (xy 142.454093 86.857398) (xy 142.498898 86.91101) - (xy 142.507605 86.980335) (xy 142.477451 87.043363) (xy 142.418008 87.080082) (xy 142.385202 87.0845) - (xy 142.287486 87.0845) (xy 142.247028 87.090908) (xy 142.104734 87.113445) (xy 141.928767 87.170619) - (xy 141.928764 87.17062) (xy 141.763903 87.254622) (xy 141.684188 87.312539) (xy 141.614213 87.363379) - (xy 141.614211 87.363381) (xy 141.61421 87.363381) (xy 141.483378 87.494213) (xy 141.429163 87.568833) - (xy 141.409745 87.583805) (xy 140.78 88.213551) (xy 140.78 88.207339) (xy 140.752741 88.105606) - (xy 140.70008 88.014394) (xy 140.625606 87.93992) (xy 140.534394 87.887259) (xy 140.432661 87.86) - (xy 140.426447 87.86) (xy 141.016431 87.270016) (xy 141.01643 87.270015) (xy 140.995834 87.25505) + (xy 151.154999 81.132844) (xy 151.155 81.132827) (xy 151.155 81.081902) (xy 154.4995 81.081902) + (xy 154.4995 81.318097) (xy 154.536446 81.551368) (xy 154.609433 81.775996) (xy 154.716657 81.986433) + (xy 154.855483 82.17751) (xy 155.02249 82.344517) (xy 155.213567 82.483343) (xy 155.312991 82.534002) + (xy 155.424003 82.590566) (xy 155.424005 82.590566) (xy 155.424008 82.590568) (xy 155.544412 82.629689) + (xy 155.648631 82.663553) (xy 155.881903 82.7005) (xy 155.881908 82.7005) (xy 156.118097 82.7005) + (xy 156.351368 82.663553) (xy 156.575992 82.590568) (xy 156.786433 82.483343) (xy 156.97751 82.344517) + (xy 157.144517 82.17751) (xy 157.283343 81.986433) (xy 157.390568 81.775992) (xy 157.463553 81.551368) + (xy 157.471787 81.499379) (xy 157.5005 81.318097) (xy 157.5005 81.081902) (xy 157.463553 80.848631) + (xy 157.410471 80.685264) (xy 157.390568 80.624008) (xy 157.390566 80.624005) (xy 157.390566 80.624003) + (xy 157.328664 80.502514) (xy 157.283343 80.413567) (xy 157.144517 80.22249) (xy 156.97751 80.055483) + (xy 156.786433 79.916657) (xy 156.771472 79.909034) (xy 156.575996 79.809433) (xy 156.351368 79.736446) + (xy 156.118097 79.6995) (xy 156.118092 79.6995) (xy 155.881908 79.6995) (xy 155.881903 79.6995) + (xy 155.648631 79.736446) (xy 155.424003 79.809433) (xy 155.213566 79.916657) (xy 155.185121 79.937324) + (xy 155.02249 80.055483) (xy 155.022488 80.055485) (xy 155.022487 80.055485) (xy 154.855485 80.222487) + (xy 154.855485 80.222488) (xy 154.855483 80.22249) (xy 154.831423 80.255606) (xy 154.716657 80.413566) + (xy 154.609433 80.624003) (xy 154.536446 80.848631) (xy 154.4995 81.081902) (xy 151.155 81.081902) + (xy 151.155 80.66) (xy 150.295686 80.66) (xy 150.30008 80.655606) (xy 150.352741 80.564394) (xy 150.38 80.462661) + (xy 150.38 80.357339) (xy 150.352741 80.255606) (xy 150.30008 80.164394) (xy 150.295686 80.16) (xy 151.155 80.16) + (xy 151.155 80.158501) (xy 151.174685 80.091462) (xy 151.227489 80.045707) (xy 151.267195 80.037069) + (xy 151.266997 80.035562) (xy 151.275054 80.034501) (xy 151.275057 80.034501) (xy 151.427785 79.993577) + (xy 151.488081 79.958765) (xy 151.488082 79.958765) (xy 151.564709 79.914524) (xy 151.564708 79.914524) + (xy 151.564716 79.91452) (xy 151.67652 79.802716) (xy 151.67652 79.802714) (xy 151.686724 79.792511) + (xy 151.686728 79.792506) (xy 153.895478 77.583755) (xy 153.956799 77.550272) (xy 154.021473 77.553506) + (xy 154.063757 77.567246) (xy 154.273713 77.6005) (xy 154.273714 77.6005) (xy 154.486286 77.6005) + (xy 154.486287 77.6005) (xy 154.696243 77.567246) (xy 154.898412 77.501557) (xy 155.087816 77.405051) + (xy 155.174478 77.342088) (xy 155.259786 77.280109) (xy 155.259788 77.280106) (xy 155.259792 77.280104) + (xy 155.410104 77.129792) (xy 155.410106 77.129788) (xy 155.410109 77.129786) (xy 155.535048 76.95782) + (xy 155.535047 76.95782) (xy 155.535051 76.957816) (xy 155.539514 76.949054) (xy 155.587488 76.898259) + (xy 155.655308 76.881463) (xy 155.721444 76.903999) (xy 155.760486 76.949056) (xy 155.764951 76.95782) + (xy 155.88989 77.129786) (xy 156.040213 77.280109) (xy 156.212179 77.405048) (xy 156.212181 77.405049) + (xy 156.212184 77.405051) (xy 156.401588 77.501557) (xy 156.603757 77.567246) (xy 156.813713 77.6005) + (xy 156.813714 77.6005) (xy 157.026286 77.6005) (xy 157.026287 77.6005) (xy 157.236243 77.567246) + (xy 157.438412 77.501557) (xy 157.627816 77.405051) (xy 157.714478 77.342088) (xy 157.799786 77.280109) + (xy 157.799788 77.280106) (xy 157.799792 77.280104) (xy 157.950104 77.129792) (xy 157.950106 77.129788) + (xy 157.950109 77.129786) (xy 158.075048 76.95782) (xy 158.075047 76.95782) (xy 158.075051 76.957816) + (xy 158.079514 76.949054) (xy 158.127488 76.898259) (xy 158.195308 76.881463) (xy 158.261444 76.903999) + (xy 158.300486 76.949056) (xy 158.304951 76.95782) (xy 158.42989 77.129786) (xy 158.580213 77.280109) + (xy 158.752179 77.405048) (xy 158.752181 77.405049) (xy 158.752184 77.405051) (xy 158.941588 77.501557) + (xy 159.143757 77.567246) (xy 159.353713 77.6005) (xy 159.353714 77.6005) (xy 159.566286 77.6005) + (xy 159.566287 77.6005) (xy 159.776243 77.567246) (xy 159.978412 77.501557) (xy 160.167816 77.405051) + (xy 160.254478 77.342088) (xy 160.339784 77.28011) (xy 160.339784 77.280109) (xy 160.339792 77.280104) + (xy 160.453717 77.166178) (xy 160.515036 77.132696) (xy 160.584728 77.13768) (xy 160.640662 77.179551) + (xy 160.657577 77.210528) (xy 160.706646 77.342088) (xy 160.706649 77.342093) (xy 160.792809 77.457187) + (xy 160.792812 77.45719) (xy 160.907906 77.54335) (xy 160.907913 77.543354) (xy 161.04262 77.593596) + (xy 161.042627 77.593598) (xy 161.102155 77.599999) (xy 161.102172 77.6) (xy 161.75 77.6) (xy 161.75 76.683012) + (xy 161.807007 76.715925) (xy 161.934174 76.75) (xy 162.065826 76.75) (xy 162.192993 76.715925) + (xy 162.25 76.683012) (xy 162.25 77.6) (xy 162.897828 77.6) (xy 162.897844 77.599999) (xy 162.957372 77.593598) + (xy 162.957379 77.593596) (xy 163.092086 77.543354) (xy 163.092093 77.54335) (xy 163.207187 77.45719) + (xy 163.20719 77.457187) (xy 163.29335 77.342093) (xy 163.293354 77.342086) (xy 163.343596 77.207379) + (xy 163.343598 77.207372) (xy 163.349999 77.147844) (xy 163.35 77.147827) (xy 163.35 76.5) (xy 162.433012 76.5) + (xy 162.465925 76.442993) (xy 162.5 76.315826) (xy 162.5 76.184174) (xy 162.465925 76.057007) (xy 162.433012 76) + (xy 163.35 76) (xy 163.35 75.352172) (xy 163.349999 75.352155) (xy 163.343598 75.292627) (xy 163.343596 75.29262) + (xy 163.293354 75.157913) (xy 163.29335 75.157906) (xy 163.20719 75.042812) (xy 163.207187 75.042809) + (xy 163.092093 74.956649) (xy 163.092086 74.956645) (xy 162.957379 74.906403) (xy 162.957372 74.906401) + (xy 162.897844 74.9) (xy 162.25 74.9) (xy 162.25 75.816988) (xy 162.192993 75.784075) (xy 162.065826 75.75) + (xy 161.934174 75.75) (xy 161.807007 75.784075) (xy 161.75 75.816988) (xy 161.75 74.9) (xy 161.102155 74.9) + (xy 161.042627 74.906401) (xy 161.04262 74.906403) (xy 160.907913 74.956645) (xy 160.907906 74.956649) + (xy 160.792812 75.042809) (xy 160.792809 75.042812) (xy 160.706649 75.157906) (xy 160.706646 75.157912) + (xy 160.657577 75.289471) (xy 160.615705 75.345404) (xy 160.550241 75.369821) (xy 160.481968 75.354969) + (xy 160.453714 75.333818) (xy 160.339786 75.21989) (xy 160.16782 75.094951) (xy 159.978414 74.998444) + (xy 159.978413 74.998443) (xy 159.978412 74.998443) (xy 159.776243 74.932754) (xy 159.776241 74.932753) + (xy 159.77624 74.932753) (xy 159.614957 74.907208) (xy 159.566287 74.8995) (xy 159.353713 74.8995) + (xy 159.305042 74.907208) (xy 159.14376 74.932753) (xy 158.941585 74.998444) (xy 158.752179 75.094951) + (xy 158.580213 75.21989) (xy 158.42989 75.370213) (xy 158.304949 75.542182) (xy 158.300484 75.550946) + (xy 158.252509 75.601742) (xy 158.184688 75.618536) (xy 158.118553 75.595998) (xy 158.079516 75.550946) + (xy 158.07505 75.542182) (xy 157.950109 75.370213) (xy 157.799786 75.21989) (xy 157.62782 75.094951) + (xy 157.438414 74.998444) (xy 157.438413 74.998443) (xy 157.438412 74.998443) (xy 157.236243 74.932754) + (xy 157.236241 74.932753) (xy 157.23624 74.932753) (xy 157.074957 74.907208) (xy 157.026287 74.8995) + (xy 156.813713 74.8995) (xy 156.765042 74.907208) (xy 156.60376 74.932753) (xy 156.401585 74.998444) + (xy 156.212179 75.094951) (xy 156.040213 75.21989) (xy 155.88989 75.370213) (xy 155.764949 75.542182) + (xy 155.760484 75.550946) (xy 155.712509 75.601742) (xy 155.644688 75.618536) (xy 155.578553 75.595998) + (xy 155.539516 75.550946) (xy 155.53505 75.542182) (xy 155.410109 75.370213) (xy 155.259786 75.21989) + (xy 155.08782 75.094951) (xy 154.898414 74.998444) (xy 154.898413 74.998443) (xy 154.898412 74.998443) + (xy 154.696243 74.932754) (xy 154.696241 74.932753) (xy 154.69624 74.932753) (xy 154.534957 74.907208) + (xy 154.486287 74.8995) (xy 154.273713 74.8995) (xy 154.225042 74.907208) (xy 154.06376 74.932753) + (xy 153.861585 74.998444) (xy 153.672179 75.094951) (xy 153.500213 75.21989) (xy 153.34989 75.370213) + (xy 153.224949 75.542182) (xy 153.220484 75.550946) (xy 153.172509 75.601742) (xy 153.104688 75.618536) + (xy 153.038553 75.595998) (xy 152.999516 75.550946) (xy 152.99505 75.542182) (xy 152.870109 75.370213) + (xy 152.719786 75.21989) (xy 152.54782 75.094951) (xy 152.358414 74.998444) (xy 152.358413 74.998443) + (xy 152.358412 74.998443) (xy 152.156243 74.932754) (xy 152.156241 74.932753) (xy 152.15624 74.932753) + (xy 151.994957 74.907208) (xy 151.946287 74.8995) (xy 151.733713 74.8995) (xy 151.685042 74.907208) + (xy 151.52376 74.932753) (xy 151.321585 74.998444) (xy 151.132179 75.094951) (xy 150.960213 75.21989) + (xy 150.80989 75.370213) (xy 150.684949 75.542182) (xy 150.680484 75.550946) (xy 150.632509 75.601742) + (xy 150.564688 75.618536) (xy 150.498553 75.595998) (xy 150.459516 75.550946) (xy 150.45505 75.542182) + (xy 150.330109 75.370213) (xy 150.179786 75.21989) (xy 150.00782 75.094951) (xy 149.818414 74.998444) + (xy 149.818413 74.998443) (xy 149.818412 74.998443) (xy 149.616243 74.932754) (xy 149.616241 74.932753) + (xy 149.61624 74.932753) (xy 149.454957 74.907208) (xy 149.406287 74.8995) (xy 149.193713 74.8995) + (xy 149.145042 74.907208) (xy 148.98376 74.932753) (xy 148.781585 74.998444) (xy 148.592179 75.094951) + (xy 148.420213 75.21989) (xy 148.26989 75.370213) (xy 148.144949 75.542182) (xy 148.140484 75.550946) + (xy 148.092509 75.601742) (xy 148.024688 75.618536) (xy 147.958553 75.595998) (xy 147.919516 75.550946) + (xy 147.91505 75.542182) (xy 147.790109 75.370213) (xy 147.639786 75.21989) (xy 147.46782 75.094951) + (xy 147.278414 74.998444) (xy 147.278413 74.998443) (xy 147.278412 74.998443) (xy 147.076243 74.932754) + (xy 147.076241 74.932753) (xy 147.07624 74.932753) (xy 146.914957 74.907208) (xy 146.866287 74.8995) + (xy 146.653713 74.8995) (xy 146.605042 74.907208) (xy 146.44376 74.932753) (xy 146.241585 74.998444) + (xy 146.052179 75.094951) (xy 145.880213 75.21989) (xy 145.72989 75.370213) (xy 145.604949 75.542182) + (xy 145.600484 75.550946) (xy 145.552509 75.601742) (xy 145.484688 75.618536) (xy 145.418553 75.595998) + (xy 145.379516 75.550946) (xy 145.37505 75.542182) (xy 145.250109 75.370213) (xy 145.099786 75.21989) + (xy 144.92782 75.094951) (xy 144.738414 74.998444) (xy 144.738413 74.998443) (xy 144.738412 74.998443) + (xy 144.536243 74.932754) (xy 144.536241 74.932753) (xy 144.53624 74.932753) (xy 144.374957 74.907208) + (xy 144.326287 74.8995) (xy 144.113713 74.8995) (xy 144.065042 74.907208) (xy 143.90376 74.932753) + (xy 143.701585 74.998444) (xy 143.512179 75.094951) (xy 143.340213 75.21989) (xy 143.18989 75.370213) + (xy 143.064949 75.542182) (xy 143.060484 75.550946) (xy 143.012509 75.601742) (xy 142.944688 75.618536) + (xy 142.878553 75.595998) (xy 142.839516 75.550946) (xy 142.83505 75.542182) (xy 142.710109 75.370213) + (xy 142.559786 75.21989) (xy 142.38782 75.094951) (xy 142.198414 74.998444) (xy 142.198413 74.998443) + (xy 142.198412 74.998443) (xy 141.996243 74.932754) (xy 141.996241 74.932753) (xy 141.99624 74.932753) + (xy 141.834957 74.907208) (xy 141.786287 74.8995) (xy 141.573713 74.8995) (xy 141.525042 74.907208) + (xy 141.36376 74.932753) (xy 141.161585 74.998444) (xy 140.972179 75.094951) (xy 140.800213 75.21989) + (xy 140.64989 75.370213) (xy 140.524949 75.542182) (xy 140.520484 75.550946) (xy 140.472509 75.601742) + (xy 140.404688 75.618536) (xy 140.338553 75.595998) (xy 140.299516 75.550946) (xy 140.29505 75.542182) + (xy 140.170109 75.370213) (xy 140.019786 75.21989) (xy 139.84782 75.094951) (xy 139.658414 74.998444) + (xy 139.658413 74.998443) (xy 139.658412 74.998443) (xy 139.456243 74.932754) (xy 139.456241 74.932753) + (xy 139.45624 74.932753) (xy 139.294957 74.907208) (xy 139.246287 74.8995) (xy 139.033713 74.8995) + (xy 138.985042 74.907208) (xy 138.82376 74.932753) (xy 138.621585 74.998444) (xy 138.432179 75.094951) + (xy 138.260213 75.21989) (xy 138.10989 75.370213) (xy 137.984949 75.542182) (xy 137.980484 75.550946) + (xy 137.932509 75.601742) (xy 137.864688 75.618536) (xy 137.798553 75.595998) (xy 137.759516 75.550946) + (xy 137.75505 75.542182) (xy 137.630109 75.370213) (xy 137.479786 75.21989) (xy 137.30782 75.094951) + (xy 137.118414 74.998444) (xy 137.118413 74.998443) (xy 137.118412 74.998443) (xy 136.916243 74.932754) + (xy 136.916241 74.932753) (xy 136.91624 74.932753) (xy 136.754957 74.907208) (xy 136.706287 74.8995) + (xy 136.493713 74.8995) (xy 136.445042 74.907208) (xy 136.28376 74.932753) (xy 136.081585 74.998444) + (xy 135.892179 75.094951) (xy 135.720213 75.21989) (xy 135.56989 75.370213) (xy 135.444949 75.542182) + (xy 135.440484 75.550946) (xy 135.392509 75.601742) (xy 135.324688 75.618536) (xy 135.258553 75.595998) + (xy 135.219516 75.550946) (xy 135.21505 75.542182) (xy 135.090109 75.370213) (xy 134.939786 75.21989) + (xy 134.76782 75.094951) (xy 134.578414 74.998444) (xy 134.578413 74.998443) (xy 134.578412 74.998443) + (xy 134.376243 74.932754) (xy 134.376241 74.932753) (xy 134.37624 74.932753) (xy 134.214957 74.907208) + (xy 134.166287 74.8995) (xy 133.953713 74.8995) (xy 133.905042 74.907208) (xy 133.74376 74.932753) + (xy 133.541585 74.998444) (xy 133.352179 75.094951) (xy 133.180213 75.21989) (xy 133.02989 75.370213) + (xy 132.904949 75.542182) (xy 132.900484 75.550946) (xy 132.852509 75.601742) (xy 132.784688 75.618536) + (xy 132.718553 75.595998) (xy 132.679516 75.550946) (xy 132.67505 75.542182) (xy 132.550109 75.370213) + (xy 132.399786 75.21989) (xy 132.22782 75.094951) (xy 132.038414 74.998444) (xy 132.038413 74.998443) + (xy 132.038412 74.998443) (xy 131.836243 74.932754) (xy 131.836241 74.932753) (xy 131.83624 74.932753) + (xy 131.674957 74.907208) (xy 131.626287 74.8995) (xy 131.413713 74.8995) (xy 131.365042 74.907208) + (xy 131.20376 74.932753) (xy 131.001585 74.998444) (xy 130.812179 75.094951) (xy 130.640213 75.21989) + (xy 130.48989 75.370213) (xy 130.364949 75.542182) (xy 130.360484 75.550946) (xy 130.312509 75.601742) + (xy 130.244688 75.618536) (xy 130.178553 75.595998) (xy 130.139516 75.550946) (xy 130.13505 75.542182) + (xy 130.010109 75.370213) (xy 129.859786 75.21989) (xy 129.68782 75.094951) (xy 129.498414 74.998444) + (xy 129.498413 74.998443) (xy 129.498412 74.998443) (xy 129.296243 74.932754) (xy 129.296241 74.932753) + (xy 129.29624 74.932753) (xy 129.134957 74.907208) (xy 129.086287 74.8995) (xy 128.873713 74.8995) + (xy 128.825042 74.907208) (xy 128.66376 74.932753) (xy 128.461585 74.998444) (xy 128.272179 75.094951) + (xy 128.100213 75.21989) (xy 127.94989 75.370213) (xy 127.824951 75.542179) (xy 127.728444 75.731585) + (xy 127.662753 75.93376) (xy 127.6295 76.143713) (xy 127.6295 76.356286) (xy 127.662753 76.566239) + (xy 127.728444 76.768414) (xy 127.824951 76.95782) (xy 127.94989 77.129786) (xy 128.100213 77.280109) + (xy 128.272179 77.405048) (xy 128.272181 77.405049) (xy 128.272184 77.405051) (xy 128.461588 77.501557) + (xy 128.663757 77.567246) (xy 128.873713 77.6005) (xy 128.873714 77.6005) (xy 129.086286 77.6005) + (xy 129.086287 77.6005) (xy 129.296243 77.567246) (xy 129.338523 77.553507) (xy 129.408362 77.551511) + (xy 129.464522 77.583757) (xy 138.414035 86.53327) (xy 138.414045 86.533281) (xy 138.418375 86.537611) + (xy 138.418376 86.537612) (xy 138.53018 86.649416) (xy 138.581741 86.679184) (xy 138.616991 86.699535) + (xy 138.616993 86.699537) (xy 138.667109 86.728472) (xy 138.667111 86.728473) (xy 138.819838 86.769396) + (xy 138.819839 86.769396) (xy 142.284774 86.769396) (xy 142.302917 86.774723) (xy 142.321827 86.775061) + (xy 142.350044 86.788561) (xy 142.351813 86.789081) (xy 142.353665 86.790294) (xy 142.454093 86.857398) + (xy 142.498898 86.91101) (xy 142.507605 86.980335) (xy 142.477451 87.043363) (xy 142.418008 87.080082) + (xy 142.385202 87.0845) (xy 142.287486 87.0845) (xy 142.247028 87.090908) (xy 142.104734 87.113445) + (xy 141.928767 87.170619) (xy 141.928764 87.17062) (xy 141.763903 87.254622) (xy 141.684188 87.312539) + (xy 141.614213 87.363379) (xy 141.614211 87.363381) (xy 141.61421 87.363381) (xy 141.483378 87.494213) + (xy 141.429163 87.568833) (xy 141.409745 87.583805) (xy 140.78 88.213551) (xy 140.78 88.207339) + (xy 140.752741 88.105606) (xy 140.70008 88.014394) (xy 140.625606 87.93992) (xy 140.534394 87.887259) + (xy 140.432661 87.86) (xy 140.426447 87.86) (xy 141.016431 87.270016) (xy 141.01643 87.270015) (xy 140.995834 87.25505) (xy 140.831043 87.171084) (xy 140.83104 87.171083) (xy 140.655147 87.113933) (xy 140.472473 87.085) (xy 140.287527 87.085) (xy 140.104852 87.113933) (xy 139.928959 87.171083) (xy 139.928956 87.171084) (xy 139.764167 87.255049) (xy 139.743568 87.270015) (xy 140.333554 87.86) (xy 140.327339 87.86) @@ -3766,76 +3782,76 @@ (xy 134.949501 104.682116) (xy 134.949501 104.682123) (xy 134.9495 104.682135) (xy 134.9495 104.74301) (xy 134.929815 104.810049) (xy 134.877011 104.855804) (xy 134.807853 104.865748) (xy 134.744297 104.836723) (xy 134.728704 104.820512) (xy 134.722819 104.813162) (xy 134.7105 104.791825) (xy 134.686593 104.767918) - (xy 134.682319 104.76258) (xy 134.682205 104.762304) (xy 134.681224 104.761192) (xy 131.720328 100.95315) - (xy 131.66493 100.881902) (xy 134.9995 100.881902) (xy 134.9995 101.118097) (xy 135.036446 101.351368) - (xy 135.109433 101.575996) (xy 135.2005 101.754723) (xy 135.216657 101.786433) (xy 135.355483 101.97751) - (xy 135.52249 102.144517) (xy 135.713567 102.283343) (xy 135.772381 102.31331) (xy 135.924003 102.390566) - (xy 135.924005 102.390566) (xy 135.924008 102.390568) (xy 136.044412 102.429689) (xy 136.148631 102.463553) - (xy 136.381903 102.5005) (xy 136.381908 102.5005) (xy 136.618097 102.5005) (xy 136.851368 102.463553) - (xy 137.075992 102.390568) (xy 137.286433 102.283343) (xy 137.47751 102.144517) (xy 137.644517 101.97751) - (xy 137.783343 101.786433) (xy 137.890568 101.575992) (xy 137.963553 101.351368) (xy 137.964971 101.342416) - (xy 138.0005 101.118097) (xy 138.0005 100.881902) (xy 137.963553 100.648631) (xy 137.890566 100.424003) - (xy 137.783342 100.213566) (xy 137.644517 100.02249) (xy 137.47751 99.855483) (xy 137.286433 99.716657) - (xy 137.245617 99.69586) (xy 137.075996 99.609433) (xy 136.851368 99.536446) (xy 136.618097 99.4995) - (xy 136.618092 99.4995) (xy 136.381908 99.4995) (xy 136.381903 99.4995) (xy 136.148631 99.536446) - (xy 135.924003 99.609433) (xy 135.713566 99.716657) (xy 135.60455 99.795862) (xy 135.52249 99.855483) - (xy 135.522488 99.855485) (xy 135.522487 99.855485) (xy 135.355485 100.022487) (xy 135.355485 100.022488) - (xy 135.355483 100.02249) (xy 135.295862 100.10455) (xy 135.216657 100.213566) (xy 135.109433 100.424003) - (xy 135.036446 100.648631) (xy 134.9995 100.881902) (xy 131.66493 100.881902) (xy 126.206609 93.861895) - (xy 126.180998 93.796888) (xy 126.1805 93.785781) (xy 126.1805 72.935097) (xy 126.200185 72.868058) - (xy 126.252989 72.822303) (xy 126.280909 72.813362) (xy 126.640319 72.743713) (xy 144.2195 72.743713) - (xy 144.2195 72.956286) (xy 144.252753 73.166239) (xy 144.318444 73.368414) (xy 144.414951 73.55782) - (xy 144.53989 73.729786) (xy 144.690213 73.880109) (xy 144.862179 74.005048) (xy 144.862181 74.005049) - (xy 144.862184 74.005051) (xy 145.051588 74.101557) (xy 145.253757 74.167246) (xy 145.463713 74.2005) - (xy 145.463714 74.2005) (xy 145.676286 74.2005) (xy 145.676287 74.2005) (xy 145.886243 74.167246) - (xy 146.088412 74.101557) (xy 146.277816 74.005051) (xy 146.364138 73.942335) (xy 146.449786 73.880109) - (xy 146.449788 73.880106) (xy 146.449792 73.880104) (xy 146.600104 73.729792) (xy 146.600106 73.729788) - (xy 146.600109 73.729786) (xy 146.667515 73.637007) (xy 146.725051 73.557816) (xy 146.729793 73.548508) - (xy 146.777763 73.497711) (xy 146.845583 73.480911) (xy 146.911719 73.503445) (xy 146.950763 73.5485) - (xy 146.955373 73.557547) (xy 146.994728 73.611716) (xy 147.627037 72.979408) (xy 147.644075 73.042993) - (xy 147.709901 73.157007) (xy 147.802993 73.250099) (xy 147.917007 73.315925) (xy 147.98059 73.332962) - (xy 147.348282 73.965269) (xy 147.348282 73.96527) (xy 147.402449 74.004624) (xy 147.591782 74.101095) - (xy 147.79387 74.166757) (xy 148.003754 74.2) (xy 148.216246 74.2) (xy 148.426127 74.166757) (xy 148.42613 74.166757) - (xy 148.628217 74.101095) (xy 148.817554 74.004622) (xy 148.871716 73.96527) (xy 148.871717 73.96527) - (xy 148.239408 73.332962) (xy 148.302993 73.315925) (xy 148.417007 73.250099) (xy 148.510099 73.157007) - (xy 148.575925 73.042993) (xy 148.592962 72.979408) (xy 149.263181 73.649628) (xy 149.296666 73.710951) - (xy 149.2995 73.7373) (xy 149.2995 73.747865) (xy 149.299501 73.747876) (xy 149.305908 73.807483) - (xy 149.356202 73.942328) (xy 149.356206 73.942335) (xy 149.442452 74.057544) (xy 149.442455 74.057547) - (xy 149.557664 74.143793) (xy 149.557671 74.143797) (xy 149.692517 74.194091) (xy 149.692516 74.194091) - (xy 149.699444 74.194835) (xy 149.752127 74.2005) (xy 151.547872 74.200499) (xy 151.607483 74.194091) - (xy 151.742331 74.143796) (xy 151.857546 74.057546) (xy 151.943796 73.942331) (xy 151.994091 73.807483) - (xy 152.0005 73.747873) (xy 152.000499 71.952128) (xy 151.994091 71.892517) (xy 151.943796 71.757669) - (xy 151.943795 71.757668) (xy 151.943793 71.757664) (xy 151.857547 71.642455) (xy 151.857544 71.642452) - (xy 151.742335 71.556206) (xy 151.742328 71.556202) (xy 151.607482 71.505908) (xy 151.607483 71.505908) - (xy 151.547883 71.499501) (xy 151.547881 71.4995) (xy 151.547873 71.4995) (xy 151.547864 71.4995) - (xy 149.752129 71.4995) (xy 149.752123 71.499501) (xy 149.692516 71.505908) (xy 149.557671 71.556202) - (xy 149.557664 71.556206) (xy 149.442455 71.642452) (xy 149.442452 71.642455) (xy 149.356206 71.757664) - (xy 149.356202 71.757671) (xy 149.305908 71.892517) (xy 149.301639 71.932232) (xy 149.299501 71.952123) - (xy 149.2995 71.952135) (xy 149.2995 71.96269) (xy 149.279815 72.029729) (xy 149.263181 72.050371) - (xy 148.592962 72.72059) (xy 148.575925 72.657007) (xy 148.510099 72.542993) (xy 148.417007 72.449901) - (xy 148.302993 72.384075) (xy 148.239409 72.367037) (xy 148.871716 71.734728) (xy 148.81755 71.695375) - (xy 148.628217 71.598904) (xy 148.426129 71.533242) (xy 148.216246 71.5) (xy 148.003754 71.5) (xy 147.793872 71.533242) - (xy 147.793869 71.533242) (xy 147.591782 71.598904) (xy 147.402439 71.69538) (xy 147.348282 71.734727) - (xy 147.348282 71.734728) (xy 147.980591 72.367037) (xy 147.917007 72.384075) (xy 147.802993 72.449901) - (xy 147.709901 72.542993) (xy 147.644075 72.657007) (xy 147.627037 72.720591) (xy 146.994728 72.088282) - (xy 146.994727 72.088282) (xy 146.95538 72.14244) (xy 146.955376 72.142446) (xy 146.95076 72.151505) - (xy 146.902781 72.202297) (xy 146.834959 72.219087) (xy 146.768826 72.196543) (xy 146.729794 72.151493) - (xy 146.725051 72.142184) (xy 146.725049 72.142181) (xy 146.725048 72.142179) (xy 146.600109 71.970213) - (xy 146.449786 71.81989) (xy 146.27782 71.694951) (xy 146.088414 71.598444) (xy 146.088413 71.598443) - (xy 146.088412 71.598443) (xy 145.886243 71.532754) (xy 145.886241 71.532753) (xy 145.88624 71.532753) - (xy 145.724957 71.507208) (xy 145.676287 71.4995) (xy 145.463713 71.4995) (xy 145.415042 71.507208) - (xy 145.25376 71.532753) (xy 145.051585 71.598444) (xy 144.862179 71.694951) (xy 144.690213 71.81989) - (xy 144.53989 71.970213) (xy 144.414951 72.142179) (xy 144.318444 72.331585) (xy 144.252753 72.53376) - (xy 144.2195 72.743713) (xy 126.640319 72.743713) (xy 127.29365 72.617106) (xy 127.723757 72.533757) - (xy 139.248047 70.3005) (xy 139.265892 70.3005) (xy 139.312515 70.288006) (xy 139.316797 70.287177) - (xy 139.316798 70.287177) (xy 139.335235 70.283603) (xy 139.359907 70.278823) (xy 139.365246 70.276222) - (xy 139.387445 70.26793) (xy 139.393186 70.266392) (xy 139.434992 70.242254) (xy 139.478387 70.221121) - (xy 139.491858 70.209421) (xy 139.496314 70.206849) (xy 139.502171 70.203468) (xy 139.502173 70.203468) - (xy 139.502179 70.203464) (xy 139.507314 70.2005) (xy 139.541445 70.166368) (xy 139.577895 70.13472) - (xy 139.587881 70.119932) (xy 139.6005 70.107314) (xy 139.622468 70.069263) (xy 139.627057 70.061922) - (xy 139.651651 70.025507) (xy 139.657469 70.008639) (xy 139.666392 69.993186) (xy 139.678885 69.94656) - (xy 139.694627 69.900928) (xy 139.695044 69.895002) (xy 139.698965 69.871618) (xy 139.7005 69.865891) - (xy 139.7005 69.817615) (xy 139.703894 69.76947) (xy 139.7005 69.751955) (xy 139.7005 56.7245) (xy 139.720185 56.657461) + (xy 134.682319 104.76258) (xy 134.682205 104.762304) (xy 134.681224 104.761192) (xy 130.94279 99.95315) + (xy 130.887392 99.881902) (xy 134.9995 99.881902) (xy 134.9995 100.118097) (xy 135.036446 100.351368) + (xy 135.109433 100.575996) (xy 135.203843 100.761284) (xy 135.216657 100.786433) (xy 135.355483 100.97751) + (xy 135.52249 101.144517) (xy 135.713567 101.283343) (xy 135.772381 101.31331) (xy 135.924003 101.390566) + (xy 135.924005 101.390566) (xy 135.924008 101.390568) (xy 136.044412 101.429689) (xy 136.148631 101.463553) + (xy 136.381903 101.5005) (xy 136.381908 101.5005) (xy 136.618097 101.5005) (xy 136.851368 101.463553) + (xy 137.075992 101.390568) (xy 137.286433 101.283343) (xy 137.47751 101.144517) (xy 137.644517 100.97751) + (xy 137.783343 100.786433) (xy 137.890568 100.575992) (xy 137.963553 100.351368) (xy 138.0005 100.118097) + (xy 138.0005 99.881902) (xy 137.963553 99.648631) (xy 137.890566 99.424003) (xy 137.783342 99.213566) + (xy 137.644517 99.02249) (xy 137.47751 98.855483) (xy 137.286433 98.716657) (xy 137.245617 98.69586) + (xy 137.075996 98.609433) (xy 136.851368 98.536446) (xy 136.618097 98.4995) (xy 136.618092 98.4995) + (xy 136.381908 98.4995) (xy 136.381903 98.4995) (xy 136.148631 98.536446) (xy 135.924003 98.609433) + (xy 135.713566 98.716657) (xy 135.60455 98.795862) (xy 135.52249 98.855483) (xy 135.522488 98.855485) + (xy 135.522487 98.855485) (xy 135.355485 99.022487) (xy 135.355485 99.022488) (xy 135.355483 99.02249) + (xy 135.295862 99.10455) (xy 135.216657 99.213566) (xy 135.109433 99.424003) (xy 135.036446 99.648631) + (xy 134.9995 99.881902) (xy 130.887392 99.881902) (xy 126.206609 93.861895) (xy 126.180998 93.796888) + (xy 126.1805 93.785781) (xy 126.1805 72.935097) (xy 126.200185 72.868058) (xy 126.252989 72.822303) + (xy 126.280909 72.813362) (xy 126.640319 72.743713) (xy 144.2195 72.743713) (xy 144.2195 72.956286) + (xy 144.252753 73.166239) (xy 144.318444 73.368414) (xy 144.414951 73.55782) (xy 144.53989 73.729786) + (xy 144.690213 73.880109) (xy 144.862179 74.005048) (xy 144.862181 74.005049) (xy 144.862184 74.005051) + (xy 145.051588 74.101557) (xy 145.253757 74.167246) (xy 145.463713 74.2005) (xy 145.463714 74.2005) + (xy 145.676286 74.2005) (xy 145.676287 74.2005) (xy 145.886243 74.167246) (xy 146.088412 74.101557) + (xy 146.277816 74.005051) (xy 146.364138 73.942335) (xy 146.449786 73.880109) (xy 146.449788 73.880106) + (xy 146.449792 73.880104) (xy 146.600104 73.729792) (xy 146.600106 73.729788) (xy 146.600109 73.729786) + (xy 146.667515 73.637007) (xy 146.725051 73.557816) (xy 146.729793 73.548508) (xy 146.777763 73.497711) + (xy 146.845583 73.480911) (xy 146.911719 73.503445) (xy 146.950763 73.5485) (xy 146.955373 73.557547) + (xy 146.994728 73.611716) (xy 147.627037 72.979408) (xy 147.644075 73.042993) (xy 147.709901 73.157007) + (xy 147.802993 73.250099) (xy 147.917007 73.315925) (xy 147.98059 73.332962) (xy 147.348282 73.965269) + (xy 147.348282 73.96527) (xy 147.402449 74.004624) (xy 147.591782 74.101095) (xy 147.79387 74.166757) + (xy 148.003754 74.2) (xy 148.216246 74.2) (xy 148.426127 74.166757) (xy 148.42613 74.166757) (xy 148.628217 74.101095) + (xy 148.817554 74.004622) (xy 148.871716 73.96527) (xy 148.871717 73.96527) (xy 148.239408 73.332962) + (xy 148.302993 73.315925) (xy 148.417007 73.250099) (xy 148.510099 73.157007) (xy 148.575925 73.042993) + (xy 148.592962 72.979408) (xy 149.263181 73.649628) (xy 149.296666 73.710951) (xy 149.2995 73.7373) + (xy 149.2995 73.747865) (xy 149.299501 73.747876) (xy 149.305908 73.807483) (xy 149.356202 73.942328) + (xy 149.356206 73.942335) (xy 149.442452 74.057544) (xy 149.442455 74.057547) (xy 149.557664 74.143793) + (xy 149.557671 74.143797) (xy 149.692517 74.194091) (xy 149.692516 74.194091) (xy 149.699444 74.194835) + (xy 149.752127 74.2005) (xy 151.547872 74.200499) (xy 151.607483 74.194091) (xy 151.742331 74.143796) + (xy 151.857546 74.057546) (xy 151.943796 73.942331) (xy 151.994091 73.807483) (xy 152.0005 73.747873) + (xy 152.000499 71.952128) (xy 151.994091 71.892517) (xy 151.943796 71.757669) (xy 151.943795 71.757668) + (xy 151.943793 71.757664) (xy 151.857547 71.642455) (xy 151.857544 71.642452) (xy 151.742335 71.556206) + (xy 151.742328 71.556202) (xy 151.607482 71.505908) (xy 151.607483 71.505908) (xy 151.547883 71.499501) + (xy 151.547881 71.4995) (xy 151.547873 71.4995) (xy 151.547864 71.4995) (xy 149.752129 71.4995) + (xy 149.752123 71.499501) (xy 149.692516 71.505908) (xy 149.557671 71.556202) (xy 149.557664 71.556206) + (xy 149.442455 71.642452) (xy 149.442452 71.642455) (xy 149.356206 71.757664) (xy 149.356202 71.757671) + (xy 149.305908 71.892517) (xy 149.301639 71.932232) (xy 149.299501 71.952123) (xy 149.2995 71.952135) + (xy 149.2995 71.96269) (xy 149.279815 72.029729) (xy 149.263181 72.050371) (xy 148.592962 72.72059) + (xy 148.575925 72.657007) (xy 148.510099 72.542993) (xy 148.417007 72.449901) (xy 148.302993 72.384075) + (xy 148.239409 72.367037) (xy 148.871716 71.734728) (xy 148.81755 71.695375) (xy 148.628217 71.598904) + (xy 148.426129 71.533242) (xy 148.216246 71.5) (xy 148.003754 71.5) (xy 147.793872 71.533242) (xy 147.793869 71.533242) + (xy 147.591782 71.598904) (xy 147.402439 71.69538) (xy 147.348282 71.734727) (xy 147.348282 71.734728) + (xy 147.980591 72.367037) (xy 147.917007 72.384075) (xy 147.802993 72.449901) (xy 147.709901 72.542993) + (xy 147.644075 72.657007) (xy 147.627037 72.720591) (xy 146.994728 72.088282) (xy 146.994727 72.088282) + (xy 146.95538 72.14244) (xy 146.955376 72.142446) (xy 146.95076 72.151505) (xy 146.902781 72.202297) + (xy 146.834959 72.219087) (xy 146.768826 72.196543) (xy 146.729794 72.151493) (xy 146.725051 72.142184) + (xy 146.725049 72.142181) (xy 146.725048 72.142179) (xy 146.600109 71.970213) (xy 146.449786 71.81989) + (xy 146.27782 71.694951) (xy 146.088414 71.598444) (xy 146.088413 71.598443) (xy 146.088412 71.598443) + (xy 145.886243 71.532754) (xy 145.886241 71.532753) (xy 145.88624 71.532753) (xy 145.724957 71.507208) + (xy 145.676287 71.4995) (xy 145.463713 71.4995) (xy 145.415042 71.507208) (xy 145.25376 71.532753) + (xy 145.051585 71.598444) (xy 144.862179 71.694951) (xy 144.690213 71.81989) (xy 144.53989 71.970213) + (xy 144.414951 72.142179) (xy 144.318444 72.331585) (xy 144.252753 72.53376) (xy 144.2195 72.743713) + (xy 126.640319 72.743713) (xy 127.29365 72.617106) (xy 127.723757 72.533757) (xy 139.248047 70.3005) + (xy 139.265892 70.3005) (xy 139.312515 70.288006) (xy 139.316797 70.287177) (xy 139.316798 70.287177) + (xy 139.335235 70.283603) (xy 139.359907 70.278823) (xy 139.365246 70.276222) (xy 139.387445 70.26793) + (xy 139.393186 70.266392) (xy 139.434992 70.242254) (xy 139.478387 70.221121) (xy 139.491858 70.209421) + (xy 139.496314 70.206849) (xy 139.502171 70.203468) (xy 139.502173 70.203468) (xy 139.502179 70.203464) + (xy 139.507314 70.2005) (xy 139.541445 70.166368) (xy 139.577895 70.13472) (xy 139.587881 70.119932) + (xy 139.6005 70.107314) (xy 139.622468 70.069263) (xy 139.627057 70.061922) (xy 139.651651 70.025507) + (xy 139.657469 70.008639) (xy 139.666392 69.993186) (xy 139.678885 69.94656) (xy 139.694627 69.900928) + (xy 139.695044 69.895002) (xy 139.698965 69.871618) (xy 139.7005 69.865891) (xy 139.7005 69.817615) + (xy 139.703894 69.76947) (xy 139.7005 69.751955) (xy 139.7005 56.7245) (xy 139.720185 56.657461) (xy 139.772989 56.611706) (xy 139.8245 56.6005) (xy 151.573209 56.6005) ) ) diff --git a/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pro b/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pro index aee79a9c3..e795ac570 100644 --- a/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pro +++ b/kicad/teensy2-bottom-bmi088/teensy2-bottom-bmi088.kicad_pro @@ -37,9 +37,9 @@ "other_text_thickness": 0.15, "other_text_upright": false, "pads": { - "drill": 1.0, - "height": 1.7, - "width": 1.7 + "drill": 2.5, + "height": 2.5, + "width": 2.5 }, "silk_line_width": 0.1, "silk_text_italic": false, @@ -451,7 +451,7 @@ "pinned_symbol_libs": [] }, "meta": { - "filename": "teensy2-bottom-small.kicad_pro", + "filename": "teensy2-bottom-bmi088.kicad_pro", "version": 3 }, "net_settings": { diff --git a/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb b/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb index e91395431..7a002f0bc 100644 --- a/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb +++ b/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb @@ -166,7 +166,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 1.11 0.5) + (at 1.11 1.5) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -422,7 +422,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 0.365 -0.11) + (at 0.365 -1.11) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -433,11 +433,11 @@ (footprint "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" (layer "F.Cu") (uuid "851f6f9a-cb4a-40db-8fc8-1a32585d0c2f") - (at 150.65 72.85 -90) + (at 153 62.58 180) (descr "Through hole straight pin header, 1x03, 2.54mm pitch, single row") (tags "Through hole pin header THT 1x03 2.54mm single row") (property "Reference" "J4" - (at 0 -2.38 90) + (at 0 -2.38 0) (layer "F.SilkS") (hide yes) (uuid "03c1f2e1-c934-474a-9a04-86a62a38cc42") @@ -449,7 +449,7 @@ ) ) (property "Value" "Conn_01x03_Socket" - (at 0 7.46 90) + (at 0 7.46 0) (layer "F.Fab") (hide yes) (uuid "aa143893-c0fc-4481-aca9-a924b386f2a4") @@ -461,7 +461,7 @@ ) ) (property "Datasheet" "~" - (at 0 0 90) + (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "b6bc1bd3-dd5d-41bd-8197-5281bcd3acc0") @@ -473,7 +473,7 @@ ) ) (property "Description" "Generic connector, single row, 01x03, script generated" - (at 0 0 90) + (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "6c36266f-ad03-4d20-940b-f1706e9373eb") @@ -490,57 +490,57 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr through_hole) (fp_line - (start -1.27 6.35) - (end -1.27 -0.635) + (start 1.27 6.35) + (end -1.27 6.35) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "0c5278ab-c4ec-4aa9-ad9a-736df65ececf") + (uuid "4f23749d-a007-4449-b51a-638886b3f24c") ) (fp_line - (start 1.27 6.35) - (end -1.27 6.35) + (start 1.27 -1.27) + (end 1.27 6.35) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "4f23749d-a007-4449-b51a-638886b3f24c") + (uuid "ef6b8d5c-eb50-4ca4-9caa-c114949e7899") ) (fp_line - (start -1.27 -0.635) - (end -0.635 -1.27) + (start -0.635 -1.27) + (end 1.27 -1.27) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "eaad279e-3d41-4bb8-a045-4f79160e715c") + (uuid "5a01d790-264e-42d4-868b-386277d42a21") ) (fp_line - (start -0.635 -1.27) - (end 1.27 -1.27) + (start -1.27 6.35) + (end -1.27 -0.635) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "5a01d790-264e-42d4-868b-386277d42a21") + (uuid "0c5278ab-c4ec-4aa9-ad9a-736df65ececf") ) (fp_line - (start 1.27 -1.27) - (end 1.27 6.35) + (start -1.27 -0.635) + (end -0.635 -1.27) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "ef6b8d5c-eb50-4ca4-9caa-c114949e7899") + (uuid "eaad279e-3d41-4bb8-a045-4f79160e715c") ) (pad "1" thru_hole rect - (at 0 0 270) + (at 0 0 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") @@ -551,7 +551,7 @@ (uuid "10f8fe12-7359-4e31-bbb4-0964cc38b106") ) (pad "2" thru_hole circle - (at 0 2.54 270) + (at 0 2.54 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") @@ -562,7 +562,7 @@ (uuid "58d7b506-2272-4e27-93da-81d2789ce958") ) (pad "3" thru_hole circle - (at 0 5.08 270) + (at 0 5.08 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") @@ -1573,7 +1573,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 0.425 0.33) + (at 0.425 1.33) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -1641,7 +1641,7 @@ (sheetfile "teensy2-bottom-small.kicad_sch") (attr exclude_from_pos_files exclude_from_bom) (pad "" np_thru_hole circle - (at 1.23 -0.8) + (at 1.23 -1.8) (size 2.5 2.5) (drill 2.5) (layers "*.Cu" "*.Mask") @@ -1661,6 +1661,16 @@ (layer "F.SilkS") (uuid "920577dc-1d47-4bb7-84aa-ab775b95cb72") ) + (gr_line + (start 137 65) + (end 140 65) + (stroke + (width 0.2) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "05d42d06-35a5-4c3e-a493-f9a9bcf54f3c") + ) (gr_line (start 134.31 116) (end 157.03 116) @@ -1672,7 +1682,7 @@ (uuid "11cbb8f1-cda5-44ac-8f0f-457e4f0103a1") ) (gr_line - (start 139.2 69.8) + (start 140 69.8) (end 125.68 72.42) (stroke (width 0.2) @@ -1691,6 +1701,16 @@ (layer "Edge.Cuts") (uuid "25ebff6b-89c8-4ff8-8e35-e49c38041a8b") ) + (gr_line + (start 155 55) + (end 155 65) + (stroke + (width 0.2) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "2e931d85-eafc-498c-b524-2b02b01de22c") + ) (gr_line (start 165.66 72.42) (end 165.66 94) @@ -1722,8 +1742,18 @@ (uuid "565197f1-9f27-43d7-9162-84b73c8c71c1") ) (gr_line - (start 139.2 56.1) - (end 152.2 56.1) + (start 152 65) + (end 155 65) + (stroke + (width 0.2) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "6d6fa6f5-a146-4855-9da1-6ce567474484") + ) + (gr_line + (start 137 55) + (end 155 55) (stroke (width 0.2) (type solid) @@ -1732,8 +1762,8 @@ (uuid "7bc54955-1609-4a3a-91dd-17b2e86a6848") ) (gr_line - (start 152.2 56.1) - (end 152.15 69.75) + (start 152 65) + (end 152 69.75) (stroke (width 0.2) (type solid) @@ -1742,7 +1772,7 @@ (uuid "a6f0969d-6dfa-4092-b4e0-b7fc690f743d") ) (gr_line - (start 152.15 69.75) + (start 152 69.75) (end 165.66 72.42) (stroke (width 0.2) @@ -1751,6 +1781,16 @@ (layer "Edge.Cuts") (uuid "b096fba2-1961-4f7c-85a4-f8a13ede2e0e") ) + (gr_line + (start 137 55) + (end 137 65) + (stroke + (width 0.2) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "b4f9bd62-b299-44b0-8797-04207f0702cc") + ) (gr_line (start 157.03 105.099139) (end 157.03 116) @@ -1762,8 +1802,8 @@ (uuid "d9ea27f9-1664-432a-924f-bea6b0653ebb") ) (gr_line - (start 139.2 56.1) - (end 139.2 69.8) + (start 140 65) + (end 140 69.8) (stroke (width 0.2) (type solid) @@ -1926,7 +1966,7 @@ ) ) (gr_text "VB" - (at 144.9 71.5 0) + (at 149.75 58 0) (layer "F.SilkS") (uuid "6e66e792-51c2-46d2-bfe7-85d71cca5112") (effects @@ -1986,7 +2026,7 @@ ) ) (gr_text "5V" - (at 149.9 71.4 0) + (at 149.75 63 0) (layer "F.SilkS") (uuid "8bf597a1-7328-4180-ad9e-fb3a61db75d7") (effects @@ -2118,7 +2158,7 @@ ) ) (gr_text "GD" - (at 147.25 71.45 0) + (at 149.75 60.5 0) (layer "F.SilkS") (uuid "bb719984-70ce-43fb-8be3-976b9a906fea") (effects @@ -2542,28 +2582,28 @@ (uuid "9401d924-0dc0-45f5-8945-d06eb080e0db") ) (segment - (start 143.963147 85.436903) - (end 139.436903 85.436903) + (start 131.52 78.484156) + (end 131.52 76.25) (width 0.2) (layer "F.Cu") (net 2) - (uuid "19fab7e3-e88a-47d6-adfd-f1ecef35113a") + (uuid "b6363b2d-fc9c-4b09-99f4-f081a8ee6526") ) (segment - (start 131.52 77.52) - (end 131.52 76.25) + (start 143.963147 85.436903) + (end 138.472747 85.436903) (width 0.2) (layer "F.Cu") (net 2) - (uuid "1a9c19fd-95e1-4caf-86d3-893111dde0b7") + (uuid "cbfd3843-acb1-4b48-8c49-70c582bfb7ae") ) (segment - (start 139.436903 85.436903) - (end 131.52 77.52) + (start 138.472747 85.436903) + (end 131.52 78.484156) (width 0.2) (layer "F.Cu") (net 2) - (uuid "496027c7-2289-44a2-a04d-b630d32960f6") + (uuid "dc02c14b-acc5-4bfb-818b-bd5b81f34435") ) (via (at 143.963147 85.436903) @@ -2621,14 +2661,6 @@ (net 3) (uuid "10fa8bac-904d-4255-817b-8243c7a574d8") ) - (segment - (start 160 74.25) - (end 149.51 74.25) - (width 0.4) - (layer "F.Cu") - (net 3) - (uuid "12a45a18-7f0d-4765-abb1-1ff99f39540e") - ) (segment (start 153.384423 80.41) (end 156.293423 77.501) @@ -2653,14 +2685,6 @@ (net 3) (uuid "7079ba51-263a-4c78-a3e4-4d27bac913ee") ) - (segment - (start 160 74.25) - (end 162 76.25) - (width 0.4) - (layer "F.Cu") - (net 3) - (uuid "71af8ea8-61ee-4a6e-a760-f240e54c4b7d") - ) (segment (start 149.98 80.41) (end 153.384423 80.41) @@ -2677,14 +2701,6 @@ (net 3) (uuid "a495234b-af5b-48db-891c-85d6e469c356") ) - (segment - (start 149.51 74.25) - (end 148.11 72.85) - (width 0.4) - (layer "F.Cu") - (net 3) - (uuid "cf022f4d-afc0-437c-bf6c-b6757dac71a1") - ) (segment (start 160.749 77.501) (end 162 76.25) @@ -2750,20 +2766,28 @@ (uuid "e4c4d240-ae4b-414b-803b-31028099ad4e") ) (segment - (start 128.98 76.25) - (end 138.898896 86.168896) + (start 128.98 84.98) + (end 128.98 76.25) (width 0.2) (layer "F.Cu") (net 4) - (uuid "b126d743-83c9-418d-8ce9-30eba67e87bb") + (uuid "4d2fa5ce-4dda-47ff-b323-d636a6af084d") ) (segment - (start 138.898896 86.168896) - (end 142.86454 86.168896) + (start 130.168896 86.168896) + (end 128.98 84.98) (width 0.2) (layer "F.Cu") (net 4) - (uuid "f174c04b-66b4-477f-a9e3-9752bf17ebcb") + (uuid "80fb2c93-f71f-411e-ab5b-36a186767a82") + ) + (segment + (start 142.86454 86.168896) + (end 130.168896 86.168896) + (width 0.2) + (layer "F.Cu") + (net 4) + (uuid "e329aa70-5f1c-4268-a92d-46fb65b734c9") ) (via (at 142.86454 86.168896) @@ -2822,28 +2846,36 @@ (uuid "eba1835f-8e80-41ba-b967-67185478b695") ) (segment - (start 156.92 82.42) - (end 144.22 82.42) + (start 144.22 82.42) + (end 138.38 88.26) + (width 0.4) + (layer "B.Cu") + (net 5) + (uuid "20927433-16a6-440b-951c-0b8acc91002a") + ) + (segment + (start 156.92 90.648) + (end 156.92 91.25) (width 0.4) (layer "B.Cu") (net 5) - (uuid "1de51082-50ca-4492-aae2-8f501bec7168") + (uuid "4e5e6130-5b61-4c8d-a23b-24d2a3a09c47") ) (segment (start 144.22 82.42) - (end 138.38 88.26) + (end 148.692 82.42) (width 0.4) (layer "B.Cu") (net 5) - (uuid "20927433-16a6-440b-951c-0b8acc91002a") + (uuid "8638fa41-6c70-45e8-bb6e-5218a46badcf") ) (segment - (start 156.92 82.42) - (end 156.92 91.25) + (start 148.692 82.42) + (end 156.92 90.648) (width 0.4) (layer "B.Cu") (net 5) - (uuid "2c3ec326-5450-4a29-a3b3-3e04bbef2672") + (uuid "a0997d57-0654-46dd-b447-e39a45eb7738") ) (segment (start 130.994 89.236) @@ -2877,22 +2909,6 @@ (net 13) (uuid "08470869-6e84-466b-a036-7a27489cf99d") ) - (segment - (start 158.171 75.731818) - (end 155.289182 72.85) - (width 0.4) - (layer "B.Cu") - (net 13) - (uuid "1a4eff35-68ba-409d-97c9-f71ab3b48080") - ) - (segment - (start 155.289182 72.85) - (end 150.65 72.85) - (width 0.4) - (layer "B.Cu") - (net 13) - (uuid "dba57bdf-8c83-46b5-8930-4d652e811529") - ) (segment (start 162 91.25) (end 158.171 87.421) @@ -2981,22 +2997,6 @@ (net 17) (uuid "726904cb-37f3-46f5-a404-ddb7ad43d03b") ) - (segment - (start 145.5 78.039) - (end 145.609 78.039) - (width 0.4) - (layer "B.Cu") - (net 18) - (uuid "29015d2e-d959-4f63-a012-ea3d33fc76d0") - ) - (segment - (start 145.5 78.039) - (end 145.5 75.27) - (width 0.4) - (layer "B.Cu") - (net 18) - (uuid "59b2614f-04cd-4f0b-b6c5-9d78840aa800") - ) (segment (start 147.98 80.41) (end 148.011 80.379) @@ -3005,14 +3005,6 @@ (net 18) (uuid "753a4cf9-eb61-4dc8-aa1f-cda42d742e3f") ) - (segment - (start 145.57 75.2) - (end 145.57 72.85) - (width 0.4) - (layer "B.Cu") - (net 18) - (uuid "764e3e53-d88f-4c4f-a606-fb5c26421148") - ) (segment (start 145.5 75.27) (end 145.57 75.2) @@ -3021,14 +3013,6 @@ (net 18) (uuid "ad9ebe0e-a4ff-4e5e-ae88-d0a7420bc76a") ) - (segment - (start 145.609 78.039) - (end 147.98 80.41) - (width 0.4) - (layer "B.Cu") - (net 18) - (uuid "dbc1b062-9ffc-4695-97a4-934f0b54d353") - ) (segment (start 143.758 78.632) (end 141.98 80.41) @@ -3142,27 +3126,29 @@ ) (polygon (pts - (xy 139.2 56.05) (xy 152.15 56.15) (xy 152.35 69.75) (xy 165.73 72.57) (xy 165.65 93.96) (xy 157.08 105.14) - (xy 157.08 116.02) (xy 134.35 116.02) (xy 134.39 105.21) (xy 125.63 94.07) (xy 125.63 72.57) (xy 139.15 69.75) - (xy 139.2 56) + (xy 139.2 54.8) (xy 158 54.75) (xy 155.5 69.25) (xy 165.73 72.57) (xy 165.65 93.96) (xy 157.08 105.14) + (xy 157.08 116.02) (xy 134.35 116.02) (xy 134.39 105.21) (xy 125.63 94.07) (xy 125.63 72.57) (xy 133.75 55.25) + (xy 139.25 54.75) ) ) (filled_polygon (layer "F.Cu") (pts - (xy 151.640248 56.620185) (xy 151.686003 56.672989) (xy 151.697208 56.724954) (xy 151.649722 69.688202) - (xy 151.647372 69.711778) (xy 151.646221 69.7176) (xy 151.649148 69.761432) (xy 151.649147 69.761432) - (xy 151.649437 69.765788) (xy 151.649262 69.814058) (xy 151.653812 69.831295) (xy 151.654605 69.843162) - (xy 151.654607 69.843171) (xy 151.655003 69.849096) (xy 151.655004 69.8491) (xy 151.669167 69.890655) - (xy 151.671688 69.899002) (xy 151.682902 69.941473) (xy 151.682903 69.941477) (xy 151.685848 69.946622) - (xy 151.691764 69.956957) (xy 151.697517 69.973833) (xy 151.72438 70.013928) (xy 151.72655 70.017719) - (xy 151.726556 70.017728) (xy 151.748376 70.055844) (xy 151.748378 70.055847) (xy 151.75255 70.060049) - (xy 151.752554 70.060053) (xy 151.760943 70.068504) (xy 151.770868 70.083318) (xy 151.8072 70.115102) - (xy 151.810267 70.118191) (xy 151.826676 70.13472) (xy 151.841221 70.149372) (xy 151.856633 70.158345) - (xy 151.870055 70.170087) (xy 151.913377 70.191384) (xy 151.917146 70.193579) (xy 151.929034 70.2005) - (xy 151.955107 70.215681) (xy 151.972315 70.220359) (xy 151.988321 70.228228) (xy 152.035689 70.237589) - (xy 152.082275 70.250255) (xy 152.088193 70.250276) (xy 152.11178 70.252627) (xy 165.059544 72.81151) - (xy 165.121492 72.843818) (xy 165.156141 72.904491) (xy 165.1595 72.933156) (xy 165.1595 93.78578) + (xy 154.442539 55.520185) (xy 154.488294 55.572989) (xy 154.4995 55.6245) (xy 154.4995 64.3755) + (xy 154.479815 64.442539) (xy 154.427011 64.488294) (xy 154.3755 64.4995) (xy 151.934108 64.4995) + (xy 151.806812 64.533608) (xy 151.692686 64.5995) (xy 151.692683 64.599502) (xy 151.599502 64.692683) + (xy 151.5995 64.692686) (xy 151.533608 64.806812) (xy 151.4995 64.934108) (xy 151.4995 69.701543) + (xy 151.496155 69.718657) (xy 151.4995 69.767218) (xy 151.4995 69.815889) (xy 151.499501 69.815898) + (xy 151.500905 69.821138) (xy 151.504012 69.832733) (xy 151.505211 69.85013) (xy 151.521004 69.896153) + (xy 151.522106 69.900265) (xy 151.522109 69.900275) (xy 151.533607 69.943184) (xy 151.533609 69.943188) + (xy 151.536324 69.947891) (xy 151.542327 69.958288) (xy 151.547986 69.974778) (xy 151.575156 70.015152) + (xy 151.577294 70.018854) (xy 151.5995 70.057315) (xy 151.603339 70.061154) (xy 151.61853 70.079601) + (xy 151.621565 70.08411) (xy 151.658272 70.116086) (xy 151.692686 70.1505) (xy 151.707784 70.159217) + (xy 151.720933 70.170671) (xy 151.760835 70.190183) (xy 151.768349 70.194184) (xy 151.806814 70.216392) + (xy 151.812056 70.217797) (xy 151.812058 70.217797) (xy 151.823656 70.220904) (xy 151.83932 70.228565) + (xy 151.887093 70.237902) (xy 151.891208 70.239005) (xy 151.897684 70.24074) (xy 151.934108 70.2505) + (xy 151.939537 70.2505) (xy 151.963324 70.252803) (xy 152.1469 70.288685) (xy 165.059287 72.812555) + (xy 165.121305 72.844734) (xy 165.156081 72.905335) (xy 165.1595 72.934252) (xy 165.1595 93.78578) (xy 165.139815 93.852819) (xy 165.133391 93.861894) (xy 156.658774 104.761192) (xy 156.658773 104.761193) (xy 156.654025 104.767298) (xy 156.6295 104.791825) (xy 156.613766 104.819074) (xy 156.608532 104.825806) (xy 156.608532 104.825807) (xy 156.594439 104.843934) (xy 156.594437 104.843937) (xy 156.583957 104.868785) @@ -3176,39 +3162,40 @@ (xy 134.800464 104.992081) (xy 134.796773 104.965368) (xy 134.796773 104.965367) (xy 134.784538 104.936357) (xy 134.776392 104.905953) (xy 134.759044 104.875907) (xy 134.745563 104.843939) (xy 134.731473 104.825817) (xy 134.721978 104.811704) (xy 134.710504 104.791831) (xy 134.710501 104.791828) (xy 134.7105 104.791825) - (xy 134.691434 104.772759) (xy 134.681224 104.761192) (xy 131.720328 100.95315) (xy 131.66493 100.881902) - (xy 134.9995 100.881902) (xy 134.9995 101.118097) (xy 135.036446 101.351368) (xy 135.109433 101.575996) - (xy 135.216657 101.786433) (xy 135.355483 101.97751) (xy 135.52249 102.144517) (xy 135.713567 102.283343) - (xy 135.779941 102.317162) (xy 135.924003 102.390566) (xy 135.924005 102.390566) (xy 135.924008 102.390568) - (xy 136.044412 102.429689) (xy 136.148631 102.463553) (xy 136.381903 102.5005) (xy 136.381908 102.5005) - (xy 136.618097 102.5005) (xy 136.851368 102.463553) (xy 137.075992 102.390568) (xy 137.286433 102.283343) - (xy 137.47751 102.144517) (xy 137.644517 101.97751) (xy 137.783343 101.786433) (xy 137.890568 101.575992) - (xy 137.963553 101.351368) (xy 137.981562 101.237664) (xy 138.0005 101.118097) (xy 138.0005 100.881902) - (xy 137.963553 100.648631) (xy 137.890566 100.424003) (xy 137.783342 100.213566) (xy 137.644517 100.02249) - (xy 137.47751 99.855483) (xy 137.286433 99.716657) (xy 137.075996 99.609433) (xy 136.851368 99.536446) - (xy 136.618097 99.4995) (xy 136.618092 99.4995) (xy 136.381908 99.4995) (xy 136.381903 99.4995) - (xy 136.148631 99.536446) (xy 135.924003 99.609433) (xy 135.713566 99.716657) (xy 135.60455 99.795862) - (xy 135.52249 99.855483) (xy 135.522488 99.855485) (xy 135.522487 99.855485) (xy 135.355485 100.022487) - (xy 135.355485 100.022488) (xy 135.355483 100.02249) (xy 135.295862 100.10455) (xy 135.216657 100.213566) - (xy 135.109433 100.424003) (xy 135.036446 100.648631) (xy 134.9995 100.881902) (xy 131.66493 100.881902) - (xy 126.206609 93.861895) (xy 126.180998 93.796888) (xy 126.1805 93.785781) (xy 126.1805 76.143713) - (xy 127.6295 76.143713) (xy 127.6295 76.356286) (xy 127.662753 76.566239) (xy 127.728444 76.768414) - (xy 127.824951 76.95782) (xy 127.94989 77.129786) (xy 128.100213 77.280109) (xy 128.272179 77.405048) - (xy 128.272181 77.405049) (xy 128.272184 77.405051) (xy 128.461588 77.501557) (xy 128.663757 77.567246) - (xy 128.873713 77.6005) (xy 128.873714 77.6005) (xy 129.086286 77.6005) (xy 129.086287 77.6005) - (xy 129.296243 77.567246) (xy 129.338523 77.553507) (xy 129.408362 77.551511) (xy 129.464522 77.583757) - (xy 138.414035 86.53327) (xy 138.414045 86.533281) (xy 138.418375 86.537611) (xy 138.418376 86.537612) - (xy 138.53018 86.649416) (xy 138.581741 86.679184) (xy 138.616991 86.699535) (xy 138.616993 86.699537) - (xy 138.667109 86.728472) (xy 138.667111 86.728473) (xy 138.819838 86.769396) (xy 138.819839 86.769396) - (xy 142.284774 86.769396) (xy 142.302917 86.774723) (xy 142.321827 86.775061) (xy 142.350044 86.788561) - (xy 142.351813 86.789081) (xy 142.353665 86.790294) (xy 142.454093 86.857398) (xy 142.498898 86.91101) - (xy 142.507605 86.980335) (xy 142.477451 87.043363) (xy 142.418008 87.080082) (xy 142.385202 87.0845) - (xy 142.287486 87.0845) (xy 142.247028 87.090908) (xy 142.104734 87.113445) (xy 141.928767 87.170619) - (xy 141.928764 87.17062) (xy 141.763903 87.254622) (xy 141.684188 87.312539) (xy 141.614213 87.363379) - (xy 141.614211 87.363381) (xy 141.61421 87.363381) (xy 141.483378 87.494213) (xy 141.429163 87.568833) - (xy 141.409745 87.583805) (xy 140.78 88.213551) (xy 140.78 88.207339) (xy 140.752741 88.105606) - (xy 140.70008 88.014394) (xy 140.625606 87.93992) (xy 140.534394 87.887259) (xy 140.432661 87.86) - (xy 140.426447 87.86) (xy 141.016431 87.270016) (xy 141.01643 87.270015) (xy 140.995834 87.25505) + (xy 134.691434 104.772759) (xy 134.681224 104.761192) (xy 130.94279 99.95315) (xy 130.887392 99.881902) + (xy 134.9995 99.881902) (xy 134.9995 100.118097) (xy 135.036446 100.351368) (xy 135.109433 100.575996) + (xy 135.216657 100.786433) (xy 135.355483 100.97751) (xy 135.52249 101.144517) (xy 135.713567 101.283343) + (xy 135.812991 101.334002) (xy 135.924003 101.390566) (xy 135.924005 101.390566) (xy 135.924008 101.390568) + (xy 136.044412 101.429689) (xy 136.148631 101.463553) (xy 136.381903 101.5005) (xy 136.381908 101.5005) + (xy 136.618097 101.5005) (xy 136.851368 101.463553) (xy 137.075992 101.390568) (xy 137.286433 101.283343) + (xy 137.47751 101.144517) (xy 137.644517 100.97751) (xy 137.783343 100.786433) (xy 137.890568 100.575992) + (xy 137.963553 100.351368) (xy 138.0005 100.118097) (xy 138.0005 99.881902) (xy 137.963553 99.648631) + (xy 137.890566 99.424003) (xy 137.783342 99.213566) (xy 137.644517 99.02249) (xy 137.47751 98.855483) + (xy 137.286433 98.716657) (xy 137.075996 98.609433) (xy 136.851368 98.536446) (xy 136.618097 98.4995) + (xy 136.618092 98.4995) (xy 136.381908 98.4995) (xy 136.381903 98.4995) (xy 136.148631 98.536446) + (xy 135.924003 98.609433) (xy 135.713566 98.716657) (xy 135.60455 98.795862) (xy 135.52249 98.855483) + (xy 135.522488 98.855485) (xy 135.522487 98.855485) (xy 135.355485 99.022487) (xy 135.355485 99.022488) + (xy 135.355483 99.02249) (xy 135.295862 99.10455) (xy 135.216657 99.213566) (xy 135.109433 99.424003) + (xy 135.036446 99.648631) (xy 134.9995 99.881902) (xy 130.887392 99.881902) (xy 126.206609 93.861895) + (xy 126.180998 93.796888) (xy 126.1805 93.785781) (xy 126.1805 76.143713) (xy 127.6295 76.143713) + (xy 127.6295 76.356286) (xy 127.662753 76.566239) (xy 127.728444 76.768414) (xy 127.824951 76.95782) + (xy 127.94989 77.129786) (xy 128.100213 77.280109) (xy 128.272184 77.405051) (xy 128.272184 77.405052) + (xy 128.311793 77.425233) (xy 128.36259 77.473206) (xy 128.3795 77.535718) (xy 128.3795 84.89333) + (xy 128.379499 84.893348) (xy 128.379499 85.059054) (xy 128.379498 85.059054) (xy 128.420423 85.211785) + (xy 128.449358 85.2619) (xy 128.449359 85.261904) (xy 128.44936 85.261904) (xy 128.499479 85.348714) + (xy 128.499481 85.348717) (xy 128.618349 85.467585) (xy 128.618355 85.46759) (xy 129.684035 86.53327) + (xy 129.684045 86.533281) (xy 129.688375 86.537611) (xy 129.688376 86.537612) (xy 129.80018 86.649416) + (xy 129.851741 86.679184) (xy 129.886991 86.699535) (xy 129.886993 86.699537) (xy 129.925047 86.721507) + (xy 129.937111 86.728473) (xy 130.089839 86.769397) (xy 130.089842 86.769397) (xy 130.255549 86.769397) + (xy 130.255565 86.769396) (xy 142.284774 86.769396) (xy 142.302917 86.774723) (xy 142.321827 86.775061) + (xy 142.350044 86.788561) (xy 142.351813 86.789081) (xy 142.353665 86.790294) (xy 142.454093 86.857398) + (xy 142.498898 86.91101) (xy 142.507605 86.980335) (xy 142.477451 87.043363) (xy 142.418008 87.080082) + (xy 142.385202 87.0845) (xy 142.287486 87.0845) (xy 142.247028 87.090908) (xy 142.104734 87.113445) + (xy 141.928767 87.170619) (xy 141.928764 87.17062) (xy 141.763903 87.254622) (xy 141.684188 87.312539) + (xy 141.614213 87.363379) (xy 141.614211 87.363381) (xy 141.61421 87.363381) (xy 141.483378 87.494213) + (xy 141.429163 87.568833) (xy 141.409745 87.583805) (xy 140.78 88.213551) (xy 140.78 88.207339) + (xy 140.752741 88.105606) (xy 140.70008 88.014394) (xy 140.625606 87.93992) (xy 140.534394 87.887259) + (xy 140.432661 87.86) (xy 140.426447 87.86) (xy 141.016431 87.270016) (xy 141.01643 87.270015) (xy 140.995834 87.25505) (xy 140.831043 87.171084) (xy 140.83104 87.171083) (xy 140.655147 87.113933) (xy 140.472473 87.085) (xy 140.287527 87.085) (xy 140.104852 87.113933) (xy 139.928959 87.171083) (xy 139.928956 87.171084) (xy 139.764167 87.255049) (xy 139.743568 87.270015) (xy 140.333554 87.86) (xy 140.327339 87.86) @@ -3317,185 +3304,185 @@ (xy 152.8505 109.843713) (xy 152.825715 109.687227) (xy 152.83467 109.617933) (xy 152.860502 109.580153) (xy 153.295114 109.145543) (xy 153.371775 109.030811) (xy 153.42458 108.903329) (xy 153.42458 108.903325) (xy 153.424582 108.903322) (xy 153.429934 108.876411) (xy 153.429934 108.876409) (xy 153.4515 108.767993) - (xy 153.4515 100.881902) (xy 154.4995 100.881902) (xy 154.4995 101.118097) (xy 154.536446 101.351368) - (xy 154.609433 101.575996) (xy 154.716657 101.786433) (xy 154.855483 101.97751) (xy 155.02249 102.144517) - (xy 155.213567 102.283343) (xy 155.279941 102.317162) (xy 155.424003 102.390566) (xy 155.424005 102.390566) - (xy 155.424008 102.390568) (xy 155.544412 102.429689) (xy 155.648631 102.463553) (xy 155.881903 102.5005) - (xy 155.881908 102.5005) (xy 156.118097 102.5005) (xy 156.351368 102.463553) (xy 156.575992 102.390568) - (xy 156.786433 102.283343) (xy 156.97751 102.144517) (xy 157.144517 101.97751) (xy 157.283343 101.786433) - (xy 157.390568 101.575992) (xy 157.463553 101.351368) (xy 157.481562 101.237664) (xy 157.5005 101.118097) - (xy 157.5005 100.881902) (xy 157.463553 100.648631) (xy 157.390566 100.424003) (xy 157.283342 100.213566) - (xy 157.144517 100.02249) (xy 156.97751 99.855483) (xy 156.786433 99.716657) (xy 156.575996 99.609433) - (xy 156.351368 99.536446) (xy 156.118097 99.4995) (xy 156.118092 99.4995) (xy 155.881908 99.4995) - (xy 155.881903 99.4995) (xy 155.648631 99.536446) (xy 155.424003 99.609433) (xy 155.213566 99.716657) - (xy 155.10455 99.795862) (xy 155.02249 99.855483) (xy 155.022488 99.855485) (xy 155.022487 99.855485) - (xy 154.855485 100.022487) (xy 154.855485 100.022488) (xy 154.855483 100.02249) (xy 154.795862 100.10455) - (xy 154.716657 100.213566) (xy 154.609433 100.424003) (xy 154.536446 100.648631) (xy 154.4995 100.881902) - (xy 153.4515 100.881902) (xy 153.4515 95.760517) (xy 153.471185 95.693478) (xy 153.487814 95.672841) - (xy 156.550149 92.610505) (xy 156.61147 92.577022) (xy 156.657226 92.575715) (xy 156.757451 92.591588) - (xy 156.813713 92.6005) (xy 156.813714 92.6005) (xy 157.026286 92.6005) (xy 157.026287 92.6005) - (xy 157.236243 92.567246) (xy 157.438412 92.501557) (xy 157.627816 92.405051) (xy 157.714138 92.342335) - (xy 157.799786 92.280109) (xy 157.799788 92.280106) (xy 157.799792 92.280104) (xy 157.950104 92.129792) - (xy 157.950106 92.129788) (xy 157.950109 92.129786) (xy 158.017515 92.037007) (xy 158.075051 91.957816) - (xy 158.079793 91.948508) (xy 158.127763 91.897711) (xy 158.195583 91.880911) (xy 158.261719 91.903445) - (xy 158.300763 91.9485) (xy 158.305373 91.957547) (xy 158.344728 92.011716) (xy 158.977037 91.379408) - (xy 158.994075 91.442993) (xy 159.059901 91.557007) (xy 159.152993 91.650099) (xy 159.267007 91.715925) - (xy 159.33059 91.732962) (xy 158.698282 92.365269) (xy 158.698282 92.36527) (xy 158.752449 92.404624) - (xy 158.941782 92.501095) (xy 159.14387 92.566757) (xy 159.353754 92.6) (xy 159.566246 92.6) (xy 159.776127 92.566757) - (xy 159.77613 92.566757) (xy 159.978217 92.501095) (xy 160.167554 92.404622) (xy 160.221716 92.36527) - (xy 160.221717 92.36527) (xy 159.589408 91.732962) (xy 159.652993 91.715925) (xy 159.767007 91.650099) - (xy 159.860099 91.557007) (xy 159.925925 91.442993) (xy 159.942962 91.379409) (xy 160.613181 92.049628) - (xy 160.646666 92.110951) (xy 160.6495 92.1373) (xy 160.6495 92.147865) (xy 160.649501 92.147876) - (xy 160.655908 92.207483) (xy 160.706202 92.342328) (xy 160.706206 92.342335) (xy 160.792452 92.457544) - (xy 160.792455 92.457547) (xy 160.907664 92.543793) (xy 160.907671 92.543797) (xy 161.042517 92.594091) - (xy 161.042516 92.594091) (xy 161.049444 92.594835) (xy 161.102127 92.6005) (xy 162.897872 92.600499) - (xy 162.957483 92.594091) (xy 163.092331 92.543796) (xy 163.207546 92.457546) (xy 163.293796 92.342331) - (xy 163.344091 92.207483) (xy 163.3505 92.147873) (xy 163.350499 90.352128) (xy 163.344091 90.292517) - (xy 163.293796 90.157669) (xy 163.293795 90.157668) (xy 163.293793 90.157664) (xy 163.207547 90.042455) - (xy 163.207544 90.042452) (xy 163.092335 89.956206) (xy 163.092328 89.956202) (xy 162.957482 89.905908) - (xy 162.957483 89.905908) (xy 162.897883 89.899501) (xy 162.897881 89.8995) (xy 162.897873 89.8995) - (xy 162.897864 89.8995) (xy 161.102129 89.8995) (xy 161.102123 89.899501) (xy 161.042516 89.905908) - (xy 160.907671 89.956202) (xy 160.907664 89.956206) (xy 160.792455 90.042452) (xy 160.792452 90.042455) - (xy 160.706206 90.157664) (xy 160.706202 90.157671) (xy 160.655908 90.292517) (xy 160.649501 90.352116) - (xy 160.649501 90.352123) (xy 160.6495 90.352135) (xy 160.6495 90.36269) (xy 160.629815 90.429729) - (xy 160.613181 90.450371) (xy 159.942962 91.12059) (xy 159.925925 91.057007) (xy 159.860099 90.942993) - (xy 159.767007 90.849901) (xy 159.652993 90.784075) (xy 159.589409 90.767037) (xy 160.221716 90.134728) - (xy 160.16755 90.095375) (xy 159.978217 89.998904) (xy 159.776129 89.933242) (xy 159.566246 89.9) - (xy 159.353754 89.9) (xy 159.143872 89.933242) (xy 159.143869 89.933242) (xy 158.941782 89.998904) - (xy 158.752439 90.09538) (xy 158.698282 90.134727) (xy 158.698282 90.134728) (xy 159.330591 90.767037) - (xy 159.267007 90.784075) (xy 159.152993 90.849901) (xy 159.059901 90.942993) (xy 158.994075 91.057007) - (xy 158.977037 91.120591) (xy 158.344728 90.488282) (xy 158.344727 90.488282) (xy 158.30538 90.54244) - (xy 158.305376 90.542446) (xy 158.30076 90.551505) (xy 158.252781 90.602297) (xy 158.184959 90.619087) - (xy 158.118826 90.596543) (xy 158.079794 90.551493) (xy 158.075051 90.542184) (xy 158.075049 90.542181) - (xy 158.075048 90.542179) (xy 157.950109 90.370213) (xy 157.799786 90.21989) (xy 157.62782 90.094951) - (xy 157.438414 89.998444) (xy 157.438413 89.998443) (xy 157.438412 89.998443) (xy 157.236243 89.932754) - (xy 157.236241 89.932753) (xy 157.23624 89.932753) (xy 157.074957 89.907208) (xy 157.026287 89.8995) - (xy 156.813713 89.8995) (xy 156.765042 89.907208) (xy 156.60376 89.932753) (xy 156.401585 89.998444) - (xy 156.212179 90.094951) (xy 156.040213 90.21989) (xy 155.88989 90.370213) (xy 155.764949 90.542182) - (xy 155.760484 90.550946) (xy 155.712509 90.601742) (xy 155.644688 90.618536) (xy 155.578553 90.595998) - (xy 155.539516 90.550946) (xy 155.53505 90.542182) (xy 155.410109 90.370213) (xy 155.259786 90.21989) - (xy 155.08782 90.094951) (xy 154.898414 89.998444) (xy 154.898413 89.998443) (xy 154.898412 89.998443) - (xy 154.696243 89.932754) (xy 154.696241 89.932753) (xy 154.69624 89.932753) (xy 154.534957 89.907208) - (xy 154.486287 89.8995) (xy 154.273713 89.8995) (xy 154.225042 89.907208) (xy 154.06376 89.932753) - (xy 153.861585 89.998444) (xy 153.672179 90.094951) (xy 153.500213 90.21989) (xy 153.34989 90.370213) - (xy 153.224949 90.542182) (xy 153.220484 90.550946) (xy 153.172509 90.601742) (xy 153.104688 90.618536) - (xy 153.038553 90.595998) (xy 152.999516 90.550946) (xy 152.99505 90.542182) (xy 152.870109 90.370213) - (xy 152.719786 90.21989) (xy 152.54782 90.094951) (xy 152.358414 89.998444) (xy 152.358413 89.998443) - (xy 152.358412 89.998443) (xy 152.156243 89.932754) (xy 152.156241 89.932753) (xy 152.15624 89.932753) - (xy 151.994957 89.907208) (xy 151.946287 89.8995) (xy 151.889096 89.8995) (xy 151.822057 89.879815) - (xy 151.776302 89.827011) (xy 151.766358 89.757853) (xy 151.795383 89.694297) (xy 151.801415 89.687819) - (xy 152.017416 89.471818) (xy 152.078739 89.438333) (xy 152.105097 89.435499) (xy 153.102871 89.435499) - (xy 153.102872 89.435499) (xy 153.162483 89.429091) (xy 153.297331 89.378796) (xy 153.412546 89.292546) - (xy 153.498796 89.177331) (xy 153.549091 89.042483) (xy 153.5555 88.982873) (xy 153.555499 87.537128) - (xy 153.549091 87.477517) (xy 153.535775 87.441816) (xy 153.498797 87.342671) (xy 153.498793 87.342664) - (xy 153.412547 87.227455) (xy 153.412544 87.227452) (xy 153.297335 87.141206) (xy 153.297328 87.141202) - (xy 153.162482 87.090908) (xy 153.162483 87.090908) (xy 153.102883 87.084501) (xy 153.102881 87.0845) - (xy 153.102873 87.0845) (xy 153.102864 87.0845) (xy 151.657129 87.0845) (xy 151.657123 87.084501) - (xy 151.597516 87.090908) (xy 151.462671 87.141202) (xy 151.462664 87.141206) (xy 151.347455 87.227452) - (xy 151.283758 87.312539) (xy 151.227823 87.35441) (xy 151.158132 87.359393) (xy 151.111607 87.338545) - (xy 150.996099 87.254624) (xy 150.996098 87.254623) (xy 150.996096 87.254622) (xy 150.942772 87.227452) - (xy 150.831235 87.17062) (xy 150.831232 87.170619) (xy 150.655265 87.113445) (xy 150.512972 87.090908) - (xy 150.472514 87.0845) (xy 150.287486 87.0845) (xy 150.247028 87.090908) (xy 150.104734 87.113445) - (xy 149.928767 87.170619) (xy 149.928764 87.17062) (xy 149.763903 87.254622) (xy 149.684188 87.312539) - (xy 149.614213 87.363379) (xy 149.614211 87.363381) (xy 149.61421 87.363381) (xy 149.483381 87.49421) - (xy 149.480314 87.498432) (xy 149.424981 87.541094) (xy 149.355367 87.547069) (xy 149.293574 87.514459) - (xy 149.279686 87.498432) (xy 149.276621 87.494213) (xy 149.145787 87.363379) (xy 148.996096 87.254622) - (xy 148.942778 87.227455) (xy 148.831235 87.17062) (xy 148.831232 87.170619) (xy 148.655265 87.113445) - (xy 148.512972 87.090908) (xy 148.472514 87.0845) (xy 148.287486 87.0845) (xy 148.247028 87.090908) - (xy 148.104734 87.113445) (xy 147.928767 87.170619) (xy 147.928764 87.17062) (xy 147.763903 87.254622) - (xy 147.684188 87.312539) (xy 147.614213 87.363379) (xy 147.614211 87.363381) (xy 147.61421 87.363381) - (xy 147.483381 87.49421) (xy 147.480314 87.498432) (xy 147.424981 87.541094) (xy 147.355367 87.547069) - (xy 147.293574 87.514459) (xy 147.279686 87.498432) (xy 147.276621 87.494213) (xy 147.145787 87.363379) - (xy 146.996096 87.254622) (xy 146.942778 87.227455) (xy 146.831235 87.17062) (xy 146.831232 87.170619) - (xy 146.655265 87.113445) (xy 146.512972 87.090908) (xy 146.472514 87.0845) (xy 146.287486 87.0845) - (xy 146.247028 87.090908) (xy 146.104734 87.113445) (xy 145.928767 87.170619) (xy 145.928764 87.17062) - (xy 145.763903 87.254622) (xy 145.684188 87.312539) (xy 145.614213 87.363379) (xy 145.614211 87.363381) - (xy 145.61421 87.363381) (xy 145.483381 87.49421) (xy 145.480314 87.498432) (xy 145.424981 87.541094) - (xy 145.355367 87.547069) (xy 145.293574 87.514459) (xy 145.279686 87.498432) (xy 145.276621 87.494213) - (xy 145.145787 87.363379) (xy 144.996096 87.254622) (xy 144.942778 87.227455) (xy 144.831235 87.17062) - (xy 144.831232 87.170619) (xy 144.655265 87.113445) (xy 144.512972 87.090908) (xy 144.472514 87.0845) - (xy 144.287486 87.0845) (xy 144.247028 87.090908) (xy 144.104734 87.113445) (xy 143.928767 87.170619) - (xy 143.928764 87.17062) (xy 143.763903 87.254622) (xy 143.684188 87.312539) (xy 143.614213 87.363379) - (xy 143.614211 87.363381) (xy 143.61421 87.363381) (xy 143.483381 87.49421) (xy 143.480314 87.498432) - (xy 143.424981 87.541094) (xy 143.355367 87.547069) (xy 143.293574 87.514459) (xy 143.279686 87.498432) - (xy 143.276621 87.494213) (xy 143.145787 87.363379) (xy 143.070941 87.309) (xy 142.996094 87.25462) - (xy 142.89597 87.203604) (xy 142.845175 87.15563) (xy 142.82838 87.087809) (xy 142.850918 87.021674) - (xy 142.905633 86.978223) (xy 142.940128 86.969716) (xy 142.943379 86.969396) (xy 142.943382 86.969396) - (xy 142.943385 86.969395) (xy 142.943389 86.969395) (xy 143.005074 86.957124) (xy 143.098037 86.938633) - (xy 143.243719 86.87829) (xy 143.374829 86.790685) (xy 143.486329 86.679185) (xy 143.573934 86.548075) - (xy 143.634277 86.402393) (xy 143.651172 86.317459) (xy 143.683557 86.255548) (xy 143.744273 86.220974) - (xy 143.796981 86.220033) (xy 143.804848 86.221597) (xy 143.884302 86.237403) (xy 143.884305 86.237403) - (xy 144.041991 86.237403) (xy 144.041992 86.237402) (xy 144.196644 86.20664) (xy 144.342326 86.146297) - (xy 144.473436 86.058692) (xy 144.584936 85.947192) (xy 144.672541 85.816082) (xy 144.732884 85.6704) - (xy 144.763647 85.515745) (xy 144.763647 85.358061) (xy 144.763647 85.358058) (xy 144.763646 85.358056) - (xy 144.732885 85.203413) (xy 144.732884 85.203406) (xy 144.703778 85.133139) (xy 144.696311 85.06367) - (xy 144.727587 85.001191) (xy 144.787676 84.965539) (xy 144.818341 84.961688) (xy 144.941496 84.961688) - (xy 144.941497 84.961687) (xy 145.096149 84.930925) (xy 145.241831 84.870582) (xy 145.372941 84.782977) - (xy 145.484441 84.671477) (xy 145.572046 84.540367) (xy 145.632389 84.394685) (xy 145.663152 84.24003) - (xy 145.663152 84.082346) (xy 145.663152 84.082343) (xy 145.663151 84.082341) (xy 145.63239 83.927698) - (xy 145.632389 83.927691) (xy 145.632387 83.927686) (xy 145.572049 83.782015) (xy 145.572042 83.782002) - (xy 145.484441 83.650899) (xy 145.484438 83.650895) (xy 145.372944 83.539401) (xy 145.37294 83.539398) - (xy 145.241837 83.451797) (xy 145.241824 83.45179) (xy 145.096153 83.391452) (xy 145.096141 83.391449) - (xy 144.941497 83.360688) (xy 144.941494 83.360688) (xy 144.78381 83.360688) (xy 144.783807 83.360688) - (xy 144.629162 83.391449) (xy 144.62915 83.391452) (xy 144.483479 83.45179) (xy 144.483466 83.451797) - (xy 144.351777 83.53979) (xy 144.285099 83.560668) (xy 144.282886 83.560688) (xy 142.271285 83.560688) - (xy 142.204246 83.541003) (xy 142.183604 83.524369) (xy 140.368553 81.709318) (xy 140.335068 81.647995) - (xy 140.340052 81.578303) (xy 140.381924 81.52237) (xy 140.417918 81.503705) (xy 140.431235 81.499379) - (xy 140.596096 81.415378) (xy 140.745787 81.306621) (xy 140.876621 81.175787) (xy 140.87968 81.171576) - (xy 140.935006 81.128909) (xy 141.004619 81.122926) (xy 141.066415 81.155529) (xy 141.080315 81.17157) - (xy 141.083379 81.175787) (xy 141.214213 81.306621) (xy 141.363904 81.415378) (xy 141.444763 81.456577) - (xy 141.528764 81.499379) (xy 141.528767 81.49938) (xy 141.61675 81.527967) (xy 141.704736 81.556555) - (xy 141.887486 81.5855) (xy 141.887487 81.5855) (xy 142.072513 81.5855) (xy 142.072514 81.5855) - (xy 142.255264 81.556555) (xy 142.431235 81.499379) (xy 142.596096 81.415378) (xy 142.745787 81.306621) - (xy 142.876621 81.175787) (xy 142.87968 81.171576) (xy 142.935006 81.128909) (xy 143.004619 81.122926) - (xy 143.066415 81.155529) (xy 143.080315 81.17157) (xy 143.083379 81.175787) (xy 143.214213 81.306621) - (xy 143.363904 81.415378) (xy 143.444763 81.456577) (xy 143.528764 81.499379) (xy 143.528767 81.49938) - (xy 143.61675 81.527967) (xy 143.704736 81.556555) (xy 143.887486 81.5855) (xy 143.887487 81.5855) - (xy 144.072513 81.5855) (xy 144.072514 81.5855) (xy 144.255264 81.556555) (xy 144.431235 81.499379) - (xy 144.596096 81.415378) (xy 144.745787 81.306621) (xy 144.876621 81.175787) (xy 144.87968 81.171576) - (xy 144.935006 81.128909) (xy 145.004619 81.122926) (xy 145.066415 81.155529) (xy 145.080315 81.17157) - (xy 145.083379 81.175787) (xy 145.214213 81.306621) (xy 145.363904 81.415378) (xy 145.444763 81.456577) - (xy 145.528764 81.499379) (xy 145.528767 81.49938) (xy 145.61675 81.527967) (xy 145.704736 81.556555) - (xy 145.887486 81.5855) (xy 145.887487 81.5855) (xy 146.072513 81.5855) (xy 146.072514 81.5855) - (xy 146.255264 81.556555) (xy 146.431235 81.499379) (xy 146.596096 81.415378) (xy 146.745787 81.306621) - (xy 146.876621 81.175787) (xy 146.87968 81.171576) (xy 146.935006 81.128909) (xy 147.004619 81.122926) - (xy 147.066415 81.155529) (xy 147.080315 81.17157) (xy 147.083379 81.175787) (xy 147.214213 81.306621) - (xy 147.363904 81.415378) (xy 147.444763 81.456577) (xy 147.528764 81.499379) (xy 147.528767 81.49938) - (xy 147.61675 81.527967) (xy 147.704736 81.556555) (xy 147.887486 81.5855) (xy 147.887487 81.5855) - (xy 148.072513 81.5855) (xy 148.072514 81.5855) (xy 148.255264 81.556555) (xy 148.431235 81.499379) - (xy 148.596096 81.415378) (xy 148.712013 81.331158) (xy 148.777816 81.30768) (xy 148.84587 81.323505) - (xy 148.884162 81.357166) (xy 148.947812 81.44219) (xy 149.062906 81.52835) (xy 149.062913 81.528354) - (xy 149.19762 81.578596) (xy 149.197627 81.578598) (xy 149.257155 81.584999) (xy 149.257172 81.585) - (xy 149.73 81.585) (xy 149.73 80.725686) (xy 149.734394 80.73008) (xy 149.825606 80.782741) (xy 149.927339 80.81) - (xy 150.032661 80.81) (xy 150.134394 80.782741) (xy 150.225606 80.73008) (xy 150.23 80.725686) (xy 150.23 81.585) - (xy 150.702828 81.585) (xy 150.702844 81.584999) (xy 150.762372 81.578598) (xy 150.762379 81.578596) - (xy 150.897086 81.528354) (xy 150.897093 81.52835) (xy 151.012187 81.44219) (xy 151.01219 81.442187) - (xy 151.09835 81.327093) (xy 151.098354 81.327086) (xy 151.148596 81.192379) (xy 151.148598 81.192372) - (xy 151.154999 81.132844) (xy 151.155 81.132827) (xy 151.155 80.66) (xy 150.295686 80.66) (xy 150.30008 80.655606) - (xy 150.352741 80.564394) (xy 150.38 80.462661) (xy 150.38 80.357339) (xy 150.352741 80.255606) + (xy 153.4515 99.881902) (xy 154.4995 99.881902) (xy 154.4995 100.118097) (xy 154.536446 100.351368) + (xy 154.609433 100.575996) (xy 154.716657 100.786433) (xy 154.855483 100.97751) (xy 155.02249 101.144517) + (xy 155.213567 101.283343) (xy 155.312991 101.334002) (xy 155.424003 101.390566) (xy 155.424005 101.390566) + (xy 155.424008 101.390568) (xy 155.544412 101.429689) (xy 155.648631 101.463553) (xy 155.881903 101.5005) + (xy 155.881908 101.5005) (xy 156.118097 101.5005) (xy 156.351368 101.463553) (xy 156.575992 101.390568) + (xy 156.786433 101.283343) (xy 156.97751 101.144517) (xy 157.144517 100.97751) (xy 157.283343 100.786433) + (xy 157.390568 100.575992) (xy 157.463553 100.351368) (xy 157.5005 100.118097) (xy 157.5005 99.881902) + (xy 157.463553 99.648631) (xy 157.390566 99.424003) (xy 157.283342 99.213566) (xy 157.144517 99.02249) + (xy 156.97751 98.855483) (xy 156.786433 98.716657) (xy 156.575996 98.609433) (xy 156.351368 98.536446) + (xy 156.118097 98.4995) (xy 156.118092 98.4995) (xy 155.881908 98.4995) (xy 155.881903 98.4995) + (xy 155.648631 98.536446) (xy 155.424003 98.609433) (xy 155.213566 98.716657) (xy 155.10455 98.795862) + (xy 155.02249 98.855483) (xy 155.022488 98.855485) (xy 155.022487 98.855485) (xy 154.855485 99.022487) + (xy 154.855485 99.022488) (xy 154.855483 99.02249) (xy 154.795862 99.10455) (xy 154.716657 99.213566) + (xy 154.609433 99.424003) (xy 154.536446 99.648631) (xy 154.4995 99.881902) (xy 153.4515 99.881902) + (xy 153.4515 95.760517) (xy 153.471185 95.693478) (xy 153.487814 95.672841) (xy 156.550149 92.610505) + (xy 156.61147 92.577022) (xy 156.657226 92.575715) (xy 156.757451 92.591588) (xy 156.813713 92.6005) + (xy 156.813714 92.6005) (xy 157.026286 92.6005) (xy 157.026287 92.6005) (xy 157.236243 92.567246) + (xy 157.438412 92.501557) (xy 157.627816 92.405051) (xy 157.714138 92.342335) (xy 157.799786 92.280109) + (xy 157.799788 92.280106) (xy 157.799792 92.280104) (xy 157.950104 92.129792) (xy 157.950106 92.129788) + (xy 157.950109 92.129786) (xy 158.017515 92.037007) (xy 158.075051 91.957816) (xy 158.079793 91.948508) + (xy 158.127763 91.897711) (xy 158.195583 91.880911) (xy 158.261719 91.903445) (xy 158.300763 91.9485) + (xy 158.305373 91.957547) (xy 158.344728 92.011716) (xy 158.977037 91.379408) (xy 158.994075 91.442993) + (xy 159.059901 91.557007) (xy 159.152993 91.650099) (xy 159.267007 91.715925) (xy 159.33059 91.732962) + (xy 158.698282 92.365269) (xy 158.698282 92.36527) (xy 158.752449 92.404624) (xy 158.941782 92.501095) + (xy 159.14387 92.566757) (xy 159.353754 92.6) (xy 159.566246 92.6) (xy 159.776127 92.566757) (xy 159.77613 92.566757) + (xy 159.978217 92.501095) (xy 160.167554 92.404622) (xy 160.221716 92.36527) (xy 160.221717 92.36527) + (xy 159.589408 91.732962) (xy 159.652993 91.715925) (xy 159.767007 91.650099) (xy 159.860099 91.557007) + (xy 159.925925 91.442993) (xy 159.942962 91.379409) (xy 160.613181 92.049628) (xy 160.646666 92.110951) + (xy 160.6495 92.1373) (xy 160.6495 92.147865) (xy 160.649501 92.147876) (xy 160.655908 92.207483) + (xy 160.706202 92.342328) (xy 160.706206 92.342335) (xy 160.792452 92.457544) (xy 160.792455 92.457547) + (xy 160.907664 92.543793) (xy 160.907671 92.543797) (xy 161.042517 92.594091) (xy 161.042516 92.594091) + (xy 161.049444 92.594835) (xy 161.102127 92.6005) (xy 162.897872 92.600499) (xy 162.957483 92.594091) + (xy 163.092331 92.543796) (xy 163.207546 92.457546) (xy 163.293796 92.342331) (xy 163.344091 92.207483) + (xy 163.3505 92.147873) (xy 163.350499 90.352128) (xy 163.344091 90.292517) (xy 163.293796 90.157669) + (xy 163.293795 90.157668) (xy 163.293793 90.157664) (xy 163.207547 90.042455) (xy 163.207544 90.042452) + (xy 163.092335 89.956206) (xy 163.092328 89.956202) (xy 162.957482 89.905908) (xy 162.957483 89.905908) + (xy 162.897883 89.899501) (xy 162.897881 89.8995) (xy 162.897873 89.8995) (xy 162.897864 89.8995) + (xy 161.102129 89.8995) (xy 161.102123 89.899501) (xy 161.042516 89.905908) (xy 160.907671 89.956202) + (xy 160.907664 89.956206) (xy 160.792455 90.042452) (xy 160.792452 90.042455) (xy 160.706206 90.157664) + (xy 160.706202 90.157671) (xy 160.655908 90.292517) (xy 160.649501 90.352116) (xy 160.649501 90.352123) + (xy 160.6495 90.352135) (xy 160.6495 90.36269) (xy 160.629815 90.429729) (xy 160.613181 90.450371) + (xy 159.942962 91.12059) (xy 159.925925 91.057007) (xy 159.860099 90.942993) (xy 159.767007 90.849901) + (xy 159.652993 90.784075) (xy 159.589409 90.767037) (xy 160.221716 90.134728) (xy 160.16755 90.095375) + (xy 159.978217 89.998904) (xy 159.776129 89.933242) (xy 159.566246 89.9) (xy 159.353754 89.9) (xy 159.143872 89.933242) + (xy 159.143869 89.933242) (xy 158.941782 89.998904) (xy 158.752439 90.09538) (xy 158.698282 90.134727) + (xy 158.698282 90.134728) (xy 159.330591 90.767037) (xy 159.267007 90.784075) (xy 159.152993 90.849901) + (xy 159.059901 90.942993) (xy 158.994075 91.057007) (xy 158.977037 91.120591) (xy 158.344728 90.488282) + (xy 158.344727 90.488282) (xy 158.30538 90.54244) (xy 158.305376 90.542446) (xy 158.30076 90.551505) + (xy 158.252781 90.602297) (xy 158.184959 90.619087) (xy 158.118826 90.596543) (xy 158.079794 90.551493) + (xy 158.075051 90.542184) (xy 158.075049 90.542181) (xy 158.075048 90.542179) (xy 157.950109 90.370213) + (xy 157.799786 90.21989) (xy 157.62782 90.094951) (xy 157.438414 89.998444) (xy 157.438413 89.998443) + (xy 157.438412 89.998443) (xy 157.236243 89.932754) (xy 157.236241 89.932753) (xy 157.23624 89.932753) + (xy 157.074957 89.907208) (xy 157.026287 89.8995) (xy 156.813713 89.8995) (xy 156.765042 89.907208) + (xy 156.60376 89.932753) (xy 156.401585 89.998444) (xy 156.212179 90.094951) (xy 156.040213 90.21989) + (xy 155.88989 90.370213) (xy 155.764949 90.542182) (xy 155.760484 90.550946) (xy 155.712509 90.601742) + (xy 155.644688 90.618536) (xy 155.578553 90.595998) (xy 155.539516 90.550946) (xy 155.53505 90.542182) + (xy 155.410109 90.370213) (xy 155.259786 90.21989) (xy 155.08782 90.094951) (xy 154.898414 89.998444) + (xy 154.898413 89.998443) (xy 154.898412 89.998443) (xy 154.696243 89.932754) (xy 154.696241 89.932753) + (xy 154.69624 89.932753) (xy 154.534957 89.907208) (xy 154.486287 89.8995) (xy 154.273713 89.8995) + (xy 154.225042 89.907208) (xy 154.06376 89.932753) (xy 153.861585 89.998444) (xy 153.672179 90.094951) + (xy 153.500213 90.21989) (xy 153.34989 90.370213) (xy 153.224949 90.542182) (xy 153.220484 90.550946) + (xy 153.172509 90.601742) (xy 153.104688 90.618536) (xy 153.038553 90.595998) (xy 152.999516 90.550946) + (xy 152.99505 90.542182) (xy 152.870109 90.370213) (xy 152.719786 90.21989) (xy 152.54782 90.094951) + (xy 152.358414 89.998444) (xy 152.358413 89.998443) (xy 152.358412 89.998443) (xy 152.156243 89.932754) + (xy 152.156241 89.932753) (xy 152.15624 89.932753) (xy 151.994957 89.907208) (xy 151.946287 89.8995) + (xy 151.889096 89.8995) (xy 151.822057 89.879815) (xy 151.776302 89.827011) (xy 151.766358 89.757853) + (xy 151.795383 89.694297) (xy 151.801415 89.687819) (xy 152.017416 89.471818) (xy 152.078739 89.438333) + (xy 152.105097 89.435499) (xy 153.102871 89.435499) (xy 153.102872 89.435499) (xy 153.162483 89.429091) + (xy 153.297331 89.378796) (xy 153.412546 89.292546) (xy 153.498796 89.177331) (xy 153.549091 89.042483) + (xy 153.5555 88.982873) (xy 153.555499 87.537128) (xy 153.549091 87.477517) (xy 153.535775 87.441816) + (xy 153.498797 87.342671) (xy 153.498793 87.342664) (xy 153.412547 87.227455) (xy 153.412544 87.227452) + (xy 153.297335 87.141206) (xy 153.297328 87.141202) (xy 153.162482 87.090908) (xy 153.162483 87.090908) + (xy 153.102883 87.084501) (xy 153.102881 87.0845) (xy 153.102873 87.0845) (xy 153.102864 87.0845) + (xy 151.657129 87.0845) (xy 151.657123 87.084501) (xy 151.597516 87.090908) (xy 151.462671 87.141202) + (xy 151.462664 87.141206) (xy 151.347455 87.227452) (xy 151.283758 87.312539) (xy 151.227823 87.35441) + (xy 151.158132 87.359393) (xy 151.111607 87.338545) (xy 150.996099 87.254624) (xy 150.996098 87.254623) + (xy 150.996096 87.254622) (xy 150.942772 87.227452) (xy 150.831235 87.17062) (xy 150.831232 87.170619) + (xy 150.655265 87.113445) (xy 150.512972 87.090908) (xy 150.472514 87.0845) (xy 150.287486 87.0845) + (xy 150.247028 87.090908) (xy 150.104734 87.113445) (xy 149.928767 87.170619) (xy 149.928764 87.17062) + (xy 149.763903 87.254622) (xy 149.684188 87.312539) (xy 149.614213 87.363379) (xy 149.614211 87.363381) + (xy 149.61421 87.363381) (xy 149.483381 87.49421) (xy 149.480314 87.498432) (xy 149.424981 87.541094) + (xy 149.355367 87.547069) (xy 149.293574 87.514459) (xy 149.279686 87.498432) (xy 149.276621 87.494213) + (xy 149.145787 87.363379) (xy 148.996096 87.254622) (xy 148.942778 87.227455) (xy 148.831235 87.17062) + (xy 148.831232 87.170619) (xy 148.655265 87.113445) (xy 148.512972 87.090908) (xy 148.472514 87.0845) + (xy 148.287486 87.0845) (xy 148.247028 87.090908) (xy 148.104734 87.113445) (xy 147.928767 87.170619) + (xy 147.928764 87.17062) (xy 147.763903 87.254622) (xy 147.684188 87.312539) (xy 147.614213 87.363379) + (xy 147.614211 87.363381) (xy 147.61421 87.363381) (xy 147.483381 87.49421) (xy 147.480314 87.498432) + (xy 147.424981 87.541094) (xy 147.355367 87.547069) (xy 147.293574 87.514459) (xy 147.279686 87.498432) + (xy 147.276621 87.494213) (xy 147.145787 87.363379) (xy 146.996096 87.254622) (xy 146.942778 87.227455) + (xy 146.831235 87.17062) (xy 146.831232 87.170619) (xy 146.655265 87.113445) (xy 146.512972 87.090908) + (xy 146.472514 87.0845) (xy 146.287486 87.0845) (xy 146.247028 87.090908) (xy 146.104734 87.113445) + (xy 145.928767 87.170619) (xy 145.928764 87.17062) (xy 145.763903 87.254622) (xy 145.684188 87.312539) + (xy 145.614213 87.363379) (xy 145.614211 87.363381) (xy 145.61421 87.363381) (xy 145.483381 87.49421) + (xy 145.480314 87.498432) (xy 145.424981 87.541094) (xy 145.355367 87.547069) (xy 145.293574 87.514459) + (xy 145.279686 87.498432) (xy 145.276621 87.494213) (xy 145.145787 87.363379) (xy 144.996096 87.254622) + (xy 144.942778 87.227455) (xy 144.831235 87.17062) (xy 144.831232 87.170619) (xy 144.655265 87.113445) + (xy 144.512972 87.090908) (xy 144.472514 87.0845) (xy 144.287486 87.0845) (xy 144.247028 87.090908) + (xy 144.104734 87.113445) (xy 143.928767 87.170619) (xy 143.928764 87.17062) (xy 143.763903 87.254622) + (xy 143.684188 87.312539) (xy 143.614213 87.363379) (xy 143.614211 87.363381) (xy 143.61421 87.363381) + (xy 143.483381 87.49421) (xy 143.480314 87.498432) (xy 143.424981 87.541094) (xy 143.355367 87.547069) + (xy 143.293574 87.514459) (xy 143.279686 87.498432) (xy 143.276621 87.494213) (xy 143.145787 87.363379) + (xy 143.070941 87.309) (xy 142.996094 87.25462) (xy 142.89597 87.203604) (xy 142.845175 87.15563) + (xy 142.82838 87.087809) (xy 142.850918 87.021674) (xy 142.905633 86.978223) (xy 142.940128 86.969716) + (xy 142.943379 86.969396) (xy 142.943382 86.969396) (xy 142.943385 86.969395) (xy 142.943389 86.969395) + (xy 143.005074 86.957124) (xy 143.098037 86.938633) (xy 143.243719 86.87829) (xy 143.374829 86.790685) + (xy 143.486329 86.679185) (xy 143.573934 86.548075) (xy 143.634277 86.402393) (xy 143.651172 86.317459) + (xy 143.683557 86.255548) (xy 143.744273 86.220974) (xy 143.796981 86.220033) (xy 143.804848 86.221597) + (xy 143.884302 86.237403) (xy 143.884305 86.237403) (xy 144.041991 86.237403) (xy 144.041992 86.237402) + (xy 144.196644 86.20664) (xy 144.342326 86.146297) (xy 144.473436 86.058692) (xy 144.584936 85.947192) + (xy 144.672541 85.816082) (xy 144.732884 85.6704) (xy 144.763647 85.515745) (xy 144.763647 85.358061) + (xy 144.763647 85.358058) (xy 144.763646 85.358056) (xy 144.744519 85.2619) (xy 144.732884 85.203406) + (xy 144.703778 85.133139) (xy 144.696311 85.06367) (xy 144.727587 85.001191) (xy 144.787676 84.965539) + (xy 144.818341 84.961688) (xy 144.941496 84.961688) (xy 144.941497 84.961687) (xy 145.096149 84.930925) + (xy 145.241831 84.870582) (xy 145.372941 84.782977) (xy 145.484441 84.671477) (xy 145.572046 84.540367) + (xy 145.632389 84.394685) (xy 145.663152 84.24003) (xy 145.663152 84.082346) (xy 145.663152 84.082343) + (xy 145.663151 84.082341) (xy 145.63239 83.927698) (xy 145.632389 83.927691) (xy 145.632387 83.927686) + (xy 145.572049 83.782015) (xy 145.572042 83.782002) (xy 145.484441 83.650899) (xy 145.484438 83.650895) + (xy 145.372944 83.539401) (xy 145.37294 83.539398) (xy 145.241837 83.451797) (xy 145.241824 83.45179) + (xy 145.096153 83.391452) (xy 145.096141 83.391449) (xy 144.941497 83.360688) (xy 144.941494 83.360688) + (xy 144.78381 83.360688) (xy 144.783807 83.360688) (xy 144.629162 83.391449) (xy 144.62915 83.391452) + (xy 144.483479 83.45179) (xy 144.483466 83.451797) (xy 144.351777 83.53979) (xy 144.285099 83.560668) + (xy 144.282886 83.560688) (xy 142.271285 83.560688) (xy 142.204246 83.541003) (xy 142.183604 83.524369) + (xy 140.368553 81.709318) (xy 140.335068 81.647995) (xy 140.340052 81.578303) (xy 140.381924 81.52237) + (xy 140.417918 81.503705) (xy 140.431235 81.499379) (xy 140.596096 81.415378) (xy 140.745787 81.306621) + (xy 140.876621 81.175787) (xy 140.87968 81.171576) (xy 140.935006 81.128909) (xy 141.004619 81.122926) + (xy 141.066415 81.155529) (xy 141.080315 81.17157) (xy 141.083379 81.175787) (xy 141.214213 81.306621) + (xy 141.363904 81.415378) (xy 141.444763 81.456577) (xy 141.528764 81.499379) (xy 141.528767 81.49938) + (xy 141.61675 81.527967) (xy 141.704736 81.556555) (xy 141.887486 81.5855) (xy 141.887487 81.5855) + (xy 142.072513 81.5855) (xy 142.072514 81.5855) (xy 142.255264 81.556555) (xy 142.431235 81.499379) + (xy 142.596096 81.415378) (xy 142.745787 81.306621) (xy 142.876621 81.175787) (xy 142.87968 81.171576) + (xy 142.935006 81.128909) (xy 143.004619 81.122926) (xy 143.066415 81.155529) (xy 143.080315 81.17157) + (xy 143.083379 81.175787) (xy 143.214213 81.306621) (xy 143.363904 81.415378) (xy 143.444763 81.456577) + (xy 143.528764 81.499379) (xy 143.528767 81.49938) (xy 143.61675 81.527967) (xy 143.704736 81.556555) + (xy 143.887486 81.5855) (xy 143.887487 81.5855) (xy 144.072513 81.5855) (xy 144.072514 81.5855) + (xy 144.255264 81.556555) (xy 144.431235 81.499379) (xy 144.596096 81.415378) (xy 144.745787 81.306621) + (xy 144.876621 81.175787) (xy 144.87968 81.171576) (xy 144.935006 81.128909) (xy 145.004619 81.122926) + (xy 145.066415 81.155529) (xy 145.080315 81.17157) (xy 145.083379 81.175787) (xy 145.214213 81.306621) + (xy 145.363904 81.415378) (xy 145.444763 81.456577) (xy 145.528764 81.499379) (xy 145.528767 81.49938) + (xy 145.61675 81.527967) (xy 145.704736 81.556555) (xy 145.887486 81.5855) (xy 145.887487 81.5855) + (xy 146.072513 81.5855) (xy 146.072514 81.5855) (xy 146.255264 81.556555) (xy 146.431235 81.499379) + (xy 146.596096 81.415378) (xy 146.745787 81.306621) (xy 146.876621 81.175787) (xy 146.87968 81.171576) + (xy 146.935006 81.128909) (xy 147.004619 81.122926) (xy 147.066415 81.155529) (xy 147.080315 81.17157) + (xy 147.083379 81.175787) (xy 147.214213 81.306621) (xy 147.363904 81.415378) (xy 147.444763 81.456577) + (xy 147.528764 81.499379) (xy 147.528767 81.49938) (xy 147.61675 81.527967) (xy 147.704736 81.556555) + (xy 147.887486 81.5855) (xy 147.887487 81.5855) (xy 148.072513 81.5855) (xy 148.072514 81.5855) + (xy 148.255264 81.556555) (xy 148.431235 81.499379) (xy 148.596096 81.415378) (xy 148.712013 81.331158) + (xy 148.777816 81.30768) (xy 148.84587 81.323505) (xy 148.884162 81.357166) (xy 148.947812 81.44219) + (xy 149.062906 81.52835) (xy 149.062913 81.528354) (xy 149.19762 81.578596) (xy 149.197627 81.578598) + (xy 149.257155 81.584999) (xy 149.257172 81.585) (xy 149.73 81.585) (xy 149.73 80.725686) (xy 149.734394 80.73008) + (xy 149.825606 80.782741) (xy 149.927339 80.81) (xy 150.032661 80.81) (xy 150.134394 80.782741) + (xy 150.225606 80.73008) (xy 150.23 80.725686) (xy 150.23 81.585) (xy 150.702828 81.585) (xy 150.702844 81.584999) + (xy 150.762372 81.578598) (xy 150.762379 81.578596) (xy 150.897086 81.528354) (xy 150.897093 81.52835) + (xy 151.012187 81.44219) (xy 151.01219 81.442187) (xy 151.09835 81.327093) (xy 151.098354 81.327086) + (xy 151.148596 81.192379) (xy 151.148598 81.192372) (xy 151.154999 81.132844) (xy 151.155 81.132827) + (xy 151.155 81.081902) (xy 154.4995 81.081902) (xy 154.4995 81.318097) (xy 154.536446 81.551368) + (xy 154.609433 81.775996) (xy 154.716657 81.986433) (xy 154.855483 82.17751) (xy 155.02249 82.344517) + (xy 155.213567 82.483343) (xy 155.312991 82.534002) (xy 155.424003 82.590566) (xy 155.424005 82.590566) + (xy 155.424008 82.590568) (xy 155.544412 82.629689) (xy 155.648631 82.663553) (xy 155.881903 82.7005) + (xy 155.881908 82.7005) (xy 156.118097 82.7005) (xy 156.351368 82.663553) (xy 156.351374 82.663551) + (xy 156.575992 82.590568) (xy 156.786433 82.483343) (xy 156.97751 82.344517) (xy 157.144517 82.17751) + (xy 157.283343 81.986433) (xy 157.390568 81.775992) (xy 157.463553 81.551368) (xy 157.471787 81.499379) + (xy 157.5005 81.318097) (xy 157.5005 81.081902) (xy 157.463553 80.848631) (xy 157.410471 80.685264) + (xy 157.390568 80.624008) (xy 157.390566 80.624005) (xy 157.390566 80.624003) (xy 157.328664 80.502514) + (xy 157.283343 80.413567) (xy 157.144517 80.22249) (xy 156.97751 80.055483) (xy 156.786433 79.916657) + (xy 156.771472 79.909034) (xy 156.575996 79.809433) (xy 156.351368 79.736446) (xy 156.118097 79.6995) + (xy 156.118092 79.6995) (xy 155.881908 79.6995) (xy 155.881903 79.6995) (xy 155.648631 79.736446) + (xy 155.424003 79.809433) (xy 155.213566 79.916657) (xy 155.185121 79.937324) (xy 155.02249 80.055483) + (xy 155.022488 80.055485) (xy 155.022487 80.055485) (xy 154.855485 80.222487) (xy 154.855485 80.222488) + (xy 154.855483 80.22249) (xy 154.831423 80.255606) (xy 154.716657 80.413566) (xy 154.609433 80.624003) + (xy 154.536446 80.848631) (xy 154.4995 81.081902) (xy 151.155 81.081902) (xy 151.155 80.66) (xy 150.295686 80.66) + (xy 150.30008 80.655606) (xy 150.352741 80.564394) (xy 150.38 80.462661) (xy 150.38 80.357339) (xy 150.352741 80.255606) (xy 150.30008 80.164394) (xy 150.295686 80.16) (xy 151.155 80.16) (xy 151.155 80.158501) (xy 151.174685 80.091462) - (xy 151.185718 80.081902) (xy 154.4995 80.081902) (xy 154.4995 80.318097) (xy 154.536446 80.551368) - (xy 154.609433 80.775996) (xy 154.652865 80.861235) (xy 154.716657 80.986433) (xy 154.855483 81.17751) - (xy 155.02249 81.344517) (xy 155.213567 81.483343) (xy 155.253528 81.503704) (xy 155.424003 81.590566) - (xy 155.424005 81.590566) (xy 155.424008 81.590568) (xy 155.544412 81.629689) (xy 155.648631 81.663553) - (xy 155.881903 81.7005) (xy 155.881908 81.7005) (xy 156.118097 81.7005) (xy 156.351368 81.663553) - (xy 156.39925 81.647995) (xy 156.575992 81.590568) (xy 156.786433 81.483343) (xy 156.97751 81.344517) - (xy 157.144517 81.17751) (xy 157.283343 80.986433) (xy 157.390568 80.775992) (xy 157.463553 80.551368) - (xy 157.477603 80.462661) (xy 157.5005 80.318097) (xy 157.5005 80.081902) (xy 157.463553 79.848631) - (xy 157.390566 79.624003) (xy 157.283342 79.413566) (xy 157.276844 79.404622) (xy 157.144517 79.22249) - (xy 156.97751 79.055483) (xy 156.786433 78.916657) (xy 156.575996 78.809433) (xy 156.351368 78.736446) - (xy 156.118097 78.6995) (xy 156.118092 78.6995) (xy 155.881908 78.6995) (xy 155.881903 78.6995) - (xy 155.648631 78.736446) (xy 155.424003 78.809433) (xy 155.213566 78.916657) (xy 155.10455 78.995862) - (xy 155.02249 79.055483) (xy 155.022488 79.055485) (xy 155.022487 79.055485) (xy 154.855485 79.222487) - (xy 154.855485 79.222488) (xy 154.855483 79.22249) (xy 154.821798 79.268853) (xy 154.716657 79.413566) - (xy 154.609433 79.624003) (xy 154.536446 79.848631) (xy 154.4995 80.081902) (xy 151.185718 80.081902) (xy 151.227489 80.045707) (xy 151.267195 80.037069) (xy 151.266997 80.035562) (xy 151.275054 80.034501) - (xy 151.275057 80.034501) (xy 151.427785 79.993577) (xy 151.488079 79.958765) (xy 151.488082 79.958765) + (xy 151.275057 80.034501) (xy 151.427785 79.993577) (xy 151.488081 79.958765) (xy 151.488082 79.958765) (xy 151.564709 79.914524) (xy 151.564708 79.914524) (xy 151.564716 79.91452) (xy 151.67652 79.802716) (xy 151.67652 79.802714) (xy 151.686724 79.792511) (xy 151.686728 79.792506) (xy 153.895478 77.583755) (xy 153.956799 77.550272) (xy 154.021473 77.553506) (xy 154.063757 77.567246) (xy 154.273713 77.6005) (xy 154.273714 77.6005) (xy 154.486286 77.6005) (xy 154.486287 77.6005) (xy 154.696243 77.567246) - (xy 154.898412 77.501557) (xy 155.087816 77.405051) (xy 155.109789 77.389086) (xy 155.259786 77.280109) + (xy 154.898412 77.501557) (xy 155.087816 77.405051) (xy 155.174478 77.342088) (xy 155.259786 77.280109) (xy 155.259788 77.280106) (xy 155.259792 77.280104) (xy 155.410104 77.129792) (xy 155.410106 77.129788) (xy 155.410109 77.129786) (xy 155.535048 76.95782) (xy 155.535047 76.95782) (xy 155.535051 76.957816) (xy 155.539514 76.949054) (xy 155.587488 76.898259) (xy 155.655308 76.881463) (xy 155.721444 76.903999) @@ -3503,7 +3490,7 @@ (xy 156.212179 77.405048) (xy 156.212181 77.405049) (xy 156.212184 77.405051) (xy 156.401588 77.501557) (xy 156.603757 77.567246) (xy 156.813713 77.6005) (xy 156.813714 77.6005) (xy 157.026286 77.6005) (xy 157.026287 77.6005) (xy 157.236243 77.567246) (xy 157.438412 77.501557) (xy 157.627816 77.405051) - (xy 157.649789 77.389086) (xy 157.799786 77.280109) (xy 157.799788 77.280106) (xy 157.799792 77.280104) + (xy 157.714478 77.342088) (xy 157.799786 77.280109) (xy 157.799788 77.280106) (xy 157.799792 77.280104) (xy 157.950104 77.129792) (xy 157.950106 77.129788) (xy 157.950109 77.129786) (xy 158.075048 76.95782) (xy 158.075047 76.95782) (xy 158.075051 76.957816) (xy 158.079514 76.949054) (xy 158.127488 76.898259) (xy 158.195308 76.881463) (xy 158.261444 76.903999) (xy 158.300486 76.949056) (xy 158.304951 76.95782) @@ -3610,61 +3597,20 @@ (xy 129.134957 74.907208) (xy 129.086287 74.8995) (xy 128.873713 74.8995) (xy 128.825042 74.907208) (xy 128.66376 74.932753) (xy 128.461585 74.998444) (xy 128.272179 75.094951) (xy 128.100213 75.21989) (xy 127.94989 75.370213) (xy 127.824951 75.542179) (xy 127.728444 75.731585) (xy 127.662753 75.93376) - (xy 127.6295 76.143713) (xy 126.1805 76.143713) (xy 126.1805 72.935097) (xy 126.200185 72.868058) - (xy 126.252989 72.822303) (xy 126.280909 72.813362) (xy 126.640319 72.743713) (xy 144.2195 72.743713) - (xy 144.2195 72.956286) (xy 144.252753 73.166239) (xy 144.318444 73.368414) (xy 144.414951 73.55782) - (xy 144.53989 73.729786) (xy 144.690213 73.880109) (xy 144.862179 74.005048) (xy 144.862181 74.005049) - (xy 144.862184 74.005051) (xy 145.051588 74.101557) (xy 145.253757 74.167246) (xy 145.463713 74.2005) - (xy 145.463714 74.2005) (xy 145.676286 74.2005) (xy 145.676287 74.2005) (xy 145.886243 74.167246) - (xy 146.088412 74.101557) (xy 146.277816 74.005051) (xy 146.364138 73.942335) (xy 146.449786 73.880109) - (xy 146.449788 73.880106) (xy 146.449792 73.880104) (xy 146.600104 73.729792) (xy 146.600106 73.729788) - (xy 146.600109 73.729786) (xy 146.667515 73.637007) (xy 146.725051 73.557816) (xy 146.729793 73.548508) - (xy 146.777763 73.497711) (xy 146.845583 73.480911) (xy 146.911719 73.503445) (xy 146.950763 73.5485) - (xy 146.955373 73.557547) (xy 146.994728 73.611716) (xy 147.627037 72.979408) (xy 147.644075 73.042993) - (xy 147.709901 73.157007) (xy 147.802993 73.250099) (xy 147.917007 73.315925) (xy 147.98059 73.332962) - (xy 147.348282 73.965269) (xy 147.348282 73.96527) (xy 147.402449 74.004624) (xy 147.591782 74.101095) - (xy 147.79387 74.166757) (xy 148.003754 74.2) (xy 148.216246 74.2) (xy 148.426127 74.166757) (xy 148.42613 74.166757) - (xy 148.628217 74.101095) (xy 148.817554 74.004622) (xy 148.871716 73.96527) (xy 148.871717 73.96527) - (xy 148.239408 73.332962) (xy 148.302993 73.315925) (xy 148.417007 73.250099) (xy 148.510099 73.157007) - (xy 148.575925 73.042993) (xy 148.592962 72.979408) (xy 149.263181 73.649628) (xy 149.296666 73.710951) - (xy 149.2995 73.7373) (xy 149.2995 73.747865) (xy 149.299501 73.747876) (xy 149.305908 73.807483) - (xy 149.356202 73.942328) (xy 149.356206 73.942335) (xy 149.442452 74.057544) (xy 149.442455 74.057547) - (xy 149.557664 74.143793) (xy 149.557671 74.143797) (xy 149.692517 74.194091) (xy 149.692516 74.194091) - (xy 149.699444 74.194835) (xy 149.752127 74.2005) (xy 151.547872 74.200499) (xy 151.607483 74.194091) - (xy 151.742331 74.143796) (xy 151.857546 74.057546) (xy 151.943796 73.942331) (xy 151.994091 73.807483) - (xy 152.0005 73.747873) (xy 152.000499 71.952128) (xy 151.994091 71.892517) (xy 151.943796 71.757669) - (xy 151.943795 71.757668) (xy 151.943793 71.757664) (xy 151.857547 71.642455) (xy 151.857544 71.642452) - (xy 151.742335 71.556206) (xy 151.742328 71.556202) (xy 151.607482 71.505908) (xy 151.607483 71.505908) - (xy 151.547883 71.499501) (xy 151.547881 71.4995) (xy 151.547873 71.4995) (xy 151.547864 71.4995) - (xy 149.752129 71.4995) (xy 149.752123 71.499501) (xy 149.692516 71.505908) (xy 149.557671 71.556202) - (xy 149.557664 71.556206) (xy 149.442455 71.642452) (xy 149.442452 71.642455) (xy 149.356206 71.757664) - (xy 149.356202 71.757671) (xy 149.305908 71.892517) (xy 149.301639 71.932232) (xy 149.299501 71.952123) - (xy 149.2995 71.952135) (xy 149.2995 71.96269) (xy 149.279815 72.029729) (xy 149.263181 72.050371) - (xy 148.592962 72.72059) (xy 148.575925 72.657007) (xy 148.510099 72.542993) (xy 148.417007 72.449901) - (xy 148.302993 72.384075) (xy 148.239409 72.367037) (xy 148.871716 71.734728) (xy 148.81755 71.695375) - (xy 148.628217 71.598904) (xy 148.426129 71.533242) (xy 148.216246 71.5) (xy 148.003754 71.5) (xy 147.793872 71.533242) - (xy 147.793869 71.533242) (xy 147.591782 71.598904) (xy 147.402439 71.69538) (xy 147.348282 71.734727) - (xy 147.348282 71.734728) (xy 147.980591 72.367037) (xy 147.917007 72.384075) (xy 147.802993 72.449901) - (xy 147.709901 72.542993) (xy 147.644075 72.657007) (xy 147.627037 72.720591) (xy 146.994728 72.088282) - (xy 146.994727 72.088282) (xy 146.95538 72.14244) (xy 146.955376 72.142446) (xy 146.95076 72.151505) - (xy 146.902781 72.202297) (xy 146.834959 72.219087) (xy 146.768826 72.196543) (xy 146.729794 72.151493) - (xy 146.725051 72.142184) (xy 146.725049 72.142181) (xy 146.725048 72.142179) (xy 146.600109 71.970213) - (xy 146.449786 71.81989) (xy 146.27782 71.694951) (xy 146.088414 71.598444) (xy 146.088413 71.598443) - (xy 146.088412 71.598443) (xy 145.886243 71.532754) (xy 145.886241 71.532753) (xy 145.88624 71.532753) - (xy 145.724957 71.507208) (xy 145.676287 71.4995) (xy 145.463713 71.4995) (xy 145.415042 71.507208) - (xy 145.25376 71.532753) (xy 145.051585 71.598444) (xy 144.862179 71.694951) (xy 144.690213 71.81989) - (xy 144.53989 71.970213) (xy 144.414951 72.142179) (xy 144.318444 72.331585) (xy 144.252753 72.53376) - (xy 144.2195 72.743713) (xy 126.640319 72.743713) (xy 127.29365 72.617106) (xy 127.723757 72.533757) - (xy 139.248047 70.3005) (xy 139.265892 70.3005) (xy 139.312515 70.288006) (xy 139.316797 70.287177) - (xy 139.316798 70.287177) (xy 139.335235 70.283603) (xy 139.359907 70.278823) (xy 139.365246 70.276222) - (xy 139.387445 70.26793) (xy 139.393186 70.266392) (xy 139.434992 70.242254) (xy 139.478387 70.221121) - (xy 139.491858 70.209421) (xy 139.496314 70.206849) (xy 139.502171 70.203468) (xy 139.502173 70.203468) - (xy 139.502179 70.203464) (xy 139.507314 70.2005) (xy 139.541445 70.166368) (xy 139.577895 70.13472) - (xy 139.587881 70.119932) (xy 139.6005 70.107314) (xy 139.622468 70.069263) (xy 139.627057 70.061922) - (xy 139.651651 70.025507) (xy 139.657469 70.008639) (xy 139.666392 69.993186) (xy 139.678885 69.94656) - (xy 139.694627 69.900928) (xy 139.695044 69.895002) (xy 139.698965 69.871618) (xy 139.7005 69.865891) - (xy 139.7005 69.817615) (xy 139.703894 69.76947) (xy 139.7005 69.751955) (xy 139.7005 56.7245) (xy 139.720185 56.657461) - (xy 139.772989 56.611706) (xy 139.8245 56.6005) (xy 151.573209 56.6005) + (xy 127.6295 76.143713) (xy 126.1805 76.143713) (xy 126.1805 72.940605) (xy 126.200185 72.873566) + (xy 126.252989 72.827811) (xy 126.282175 72.818632) (xy 140.045411 70.3005) (xy 140.065892 70.3005) + (xy 140.109985 70.288685) (xy 140.154893 70.280469) (xy 140.163237 70.276512) (xy 140.184266 70.268781) + (xy 140.193186 70.266392) (xy 140.228399 70.24606) (xy 140.237228 70.241428) (xy 140.27397 70.224008) + (xy 140.289576 70.21074) (xy 140.307314 70.2005) (xy 140.33959 70.168223) (xy 140.374376 70.138652) + (xy 140.386017 70.121796) (xy 140.4005 70.107314) (xy 140.423323 70.067782) (xy 140.449269 70.030217) + (xy 140.456151 70.010923) (xy 140.466392 69.993186) (xy 140.478206 69.949092) (xy 140.493545 69.906093) + (xy 140.495199 69.885674) (xy 140.5005 69.865892) (xy 140.5005 69.820247) (xy 140.504187 69.774739) + (xy 140.502525 69.765654) (xy 140.5005 69.743337) (xy 140.5005 64.93411) (xy 140.5005 64.934108) + (xy 140.466392 64.806814) (xy 140.4005 64.692686) (xy 140.307314 64.5995) (xy 140.25025 64.566554) + (xy 140.193187 64.533608) (xy 140.129539 64.516554) (xy 140.065892 64.4995) (xy 140.065891 64.4995) + (xy 137.6245 64.4995) (xy 137.557461 64.479815) (xy 137.511706 64.427011) (xy 137.5005 64.3755) + (xy 137.5005 55.6245) (xy 137.520185 55.557461) (xy 137.572989 55.511706) (xy 137.6245 55.5005) + (xy 154.3755 55.5005) ) ) ) From 54b4e1ca57ccecb52558e70951b10428c87874fb Mon Sep 17 00:00:00 2001 From: Levy Date: Mon, 9 Feb 2026 21:52:52 -0500 Subject: [PATCH 41/45] modified: kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb --- .../teensy2-bottom-small.kicad_pcb | 396 +++++++++++------- 1 file changed, 248 insertions(+), 148 deletions(-) diff --git a/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb b/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb index 7a002f0bc..52df15c58 100644 --- a/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb +++ b/kicad/teensy2-bottom-small/teensy2-bottom-small.kicad_pcb @@ -106,6 +106,65 @@ (net 26 "unconnected-(J2-Pin_6-Pad6)") (net 27 "unconnected-(J2-Pin_12-Pad12)") (net 28 "unconnected-(J2-Pin_13-Pad13)") + (footprint "" + (layer "F.Cu") + (uuid "18dae091-1f41-4866-961f-584d99bd4d14") + (at 137.4 66.7) + (property "Reference" "" + (at 0 0 0) + (layer "F.SilkS") + (uuid "f104b7b3-4822-46b1-8751-812715b8f22f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Value" "" + (at 0 0 0) + (layer "F.Fab") + (uuid "f49b8cfb-78cd-407f-a7f0-f28d3fed923c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "2fe7213b-65ad-4334-86ce-588a327f8f1c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "a27862b8-2523-4c8e-99ff-fcd6a918584f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at -1.4 0) + (size 2.5 2.5) + (drill 2.5) + (layers "*.Cu" "*.Mask") + (uuid "61fa0ab9-bad8-4ddb-b035-d287296a28b3") + ) + (embedded_fonts no) + ) (footprint "MountingHole:MountingHole_2.5mm" (layer "F.Cu") (uuid "2135fbde-93de-4687-898f-77ded28967a7") @@ -174,6 +233,65 @@ ) (embedded_fonts no) ) + (footprint "" + (layer "F.Cu") + (uuid "3135c92c-4476-49aa-8cae-a47810aa9c4f") + (at 154 66.8) + (property "Reference" "" + (at 0 0 0) + (layer "F.SilkS") + (uuid "cea75d6b-ddb2-488e-aaad-a80494073480") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Value" "" + (at 0 0 0) + (layer "F.Fab") + (uuid "dd5b1e46-e676-497c-aabb-5bae4c153e7c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "a55da770-5b21-44d0-97d4-54ec63eceb09") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "820fbe12-ca38-45cb-8d74-a3bdb7155633") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 1 0) + (size 2.5 2.5) + (drill 2.5) + (layers "*.Cu" "*.Mask") + (uuid "87d90436-65e3-42b8-aaf8-2fe6b9dab2ab") + ) + (embedded_fonts no) + ) (footprint "Connector_PinHeader_2.00mm:PinHeader_1x06_P2.00mm_Vertical" (layer "F.Cu") (uuid "42ed1cbd-cdd3-413a-b0ad-4ade5b8e5db3") @@ -433,7 +551,7 @@ (footprint "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" (layer "F.Cu") (uuid "851f6f9a-cb4a-40db-8fc8-1a32585d0c2f") - (at 153 62.58 180) + (at 153.6 62.54 180) (descr "Through hole straight pin header, 1x03, 2.54mm pitch, single row") (tags "Through hole pin header THT 1x03 2.54mm single row") (property "Reference" "J4" @@ -1661,16 +1779,6 @@ (layer "F.SilkS") (uuid "920577dc-1d47-4bb7-84aa-ab775b95cb72") ) - (gr_line - (start 137 65) - (end 140 65) - (stroke - (width 0.2) - (type solid) - ) - (layer "Edge.Cuts") - (uuid "05d42d06-35a5-4c3e-a493-f9a9bcf54f3c") - ) (gr_line (start 134.31 116) (end 157.03 116) @@ -1682,7 +1790,7 @@ (uuid "11cbb8f1-cda5-44ac-8f0f-457e4f0103a1") ) (gr_line - (start 140 69.8) + (start 137 55) (end 125.68 72.42) (stroke (width 0.2) @@ -1701,16 +1809,6 @@ (layer "Edge.Cuts") (uuid "25ebff6b-89c8-4ff8-8e35-e49c38041a8b") ) - (gr_line - (start 155 55) - (end 155 65) - (stroke - (width 0.2) - (type solid) - ) - (layer "Edge.Cuts") - (uuid "2e931d85-eafc-498c-b524-2b02b01de22c") - ) (gr_line (start 165.66 72.42) (end 165.66 94) @@ -1741,16 +1839,6 @@ (layer "Edge.Cuts") (uuid "565197f1-9f27-43d7-9162-84b73c8c71c1") ) - (gr_line - (start 152 65) - (end 155 65) - (stroke - (width 0.2) - (type solid) - ) - (layer "Edge.Cuts") - (uuid "6d6fa6f5-a146-4855-9da1-6ce567474484") - ) (gr_line (start 137 55) (end 155 55) @@ -1762,17 +1850,7 @@ (uuid "7bc54955-1609-4a3a-91dd-17b2e86a6848") ) (gr_line - (start 152 65) - (end 152 69.75) - (stroke - (width 0.2) - (type solid) - ) - (layer "Edge.Cuts") - (uuid "a6f0969d-6dfa-4092-b4e0-b7fc690f743d") - ) - (gr_line - (start 152 69.75) + (start 155 55) (end 165.66 72.42) (stroke (width 0.2) @@ -1781,16 +1859,6 @@ (layer "Edge.Cuts") (uuid "b096fba2-1961-4f7c-85a4-f8a13ede2e0e") ) - (gr_line - (start 137 55) - (end 137 65) - (stroke - (width 0.2) - (type solid) - ) - (layer "Edge.Cuts") - (uuid "b4f9bd62-b299-44b0-8797-04207f0702cc") - ) (gr_line (start 157.03 105.099139) (end 157.03 116) @@ -1801,16 +1869,6 @@ (layer "Edge.Cuts") (uuid "d9ea27f9-1664-432a-924f-bea6b0653ebb") ) - (gr_line - (start 140 65) - (end 140 69.8) - (stroke - (width 0.2) - (type solid) - ) - (layer "Edge.Cuts") - (uuid "e8bde646-0ec6-4e19-b35e-3420c4f6a177") - ) (gr_line (start 134.31 105.099139) (end 134.31 116) @@ -3005,14 +3063,6 @@ (net 18) (uuid "753a4cf9-eb61-4dc8-aa1f-cda42d742e3f") ) - (segment - (start 145.5 75.27) - (end 145.57 75.2) - (width 0.4) - (layer "B.Cu") - (net 18) - (uuid "ad9ebe0e-a4ff-4e5e-ae88-d0a7420bc76a") - ) (segment (start 143.758 78.632) (end 141.98 80.41) @@ -3126,7 +3176,7 @@ ) (polygon (pts - (xy 139.2 54.8) (xy 158 54.75) (xy 155.5 69.25) (xy 165.73 72.57) (xy 165.65 93.96) (xy 157.08 105.14) + (xy 139.2 54.8) (xy 158 54.75) (xy 163.9 66.8) (xy 165.73 72.57) (xy 165.65 93.96) (xy 157.08 105.14) (xy 157.08 116.02) (xy 134.35 116.02) (xy 134.39 105.21) (xy 125.63 94.07) (xy 125.63 72.57) (xy 133.75 55.25) (xy 139.25 54.75) ) @@ -3134,68 +3184,55 @@ (filled_polygon (layer "F.Cu") (pts - (xy 154.442539 55.520185) (xy 154.488294 55.572989) (xy 154.4995 55.6245) (xy 154.4995 64.3755) - (xy 154.479815 64.442539) (xy 154.427011 64.488294) (xy 154.3755 64.4995) (xy 151.934108 64.4995) - (xy 151.806812 64.533608) (xy 151.692686 64.5995) (xy 151.692683 64.599502) (xy 151.599502 64.692683) - (xy 151.5995 64.692686) (xy 151.533608 64.806812) (xy 151.4995 64.934108) (xy 151.4995 69.701543) - (xy 151.496155 69.718657) (xy 151.4995 69.767218) (xy 151.4995 69.815889) (xy 151.499501 69.815898) - (xy 151.500905 69.821138) (xy 151.504012 69.832733) (xy 151.505211 69.85013) (xy 151.521004 69.896153) - (xy 151.522106 69.900265) (xy 151.522109 69.900275) (xy 151.533607 69.943184) (xy 151.533609 69.943188) - (xy 151.536324 69.947891) (xy 151.542327 69.958288) (xy 151.547986 69.974778) (xy 151.575156 70.015152) - (xy 151.577294 70.018854) (xy 151.5995 70.057315) (xy 151.603339 70.061154) (xy 151.61853 70.079601) - (xy 151.621565 70.08411) (xy 151.658272 70.116086) (xy 151.692686 70.1505) (xy 151.707784 70.159217) - (xy 151.720933 70.170671) (xy 151.760835 70.190183) (xy 151.768349 70.194184) (xy 151.806814 70.216392) - (xy 151.812056 70.217797) (xy 151.812058 70.217797) (xy 151.823656 70.220904) (xy 151.83932 70.228565) - (xy 151.887093 70.237902) (xy 151.891208 70.239005) (xy 151.897684 70.24074) (xy 151.934108 70.2505) - (xy 151.939537 70.2505) (xy 151.963324 70.252803) (xy 152.1469 70.288685) (xy 165.059287 72.812555) - (xy 165.121305 72.844734) (xy 165.156081 72.905335) (xy 165.1595 72.934252) (xy 165.1595 93.78578) - (xy 165.139815 93.852819) (xy 165.133391 93.861894) (xy 156.658774 104.761192) (xy 156.658773 104.761193) - (xy 156.654025 104.767298) (xy 156.6295 104.791825) (xy 156.613766 104.819074) (xy 156.608532 104.825806) - (xy 156.608532 104.825807) (xy 156.594439 104.843934) (xy 156.594437 104.843937) (xy 156.583957 104.868785) - (xy 156.583958 104.868786) (xy 156.580956 104.875905) (xy 156.563608 104.905953) (xy 156.55546 104.936358) - (xy 156.552149 104.944209) (xy 156.543227 104.965366) (xy 156.539536 104.992083) (xy 156.539535 104.992082) - (xy 156.538476 104.999744) (xy 156.5295 105.033247) (xy 156.5295 105.06472) (xy 156.528333 105.073168) - (xy 156.525191 105.095909) (xy 156.52854 105.122668) (xy 156.5295 105.138067) (xy 156.5295 115.3755) - (xy 156.509815 115.442539) (xy 156.457011 115.488294) (xy 156.4055 115.4995) (xy 134.9345 115.4995) - (xy 134.867461 115.479815) (xy 134.821706 115.427011) (xy 134.8105 115.3755) (xy 134.8105 105.130339) - (xy 134.814809 105.095911) (xy 134.8105 105.064722) (xy 134.8105 105.033247) (xy 134.803522 105.007204) - (xy 134.800464 104.992081) (xy 134.796773 104.965368) (xy 134.796773 104.965367) (xy 134.784538 104.936357) - (xy 134.776392 104.905953) (xy 134.759044 104.875907) (xy 134.745563 104.843939) (xy 134.731473 104.825817) - (xy 134.721978 104.811704) (xy 134.710504 104.791831) (xy 134.710501 104.791828) (xy 134.7105 104.791825) - (xy 134.691434 104.772759) (xy 134.681224 104.761192) (xy 130.94279 99.95315) (xy 130.887392 99.881902) - (xy 134.9995 99.881902) (xy 134.9995 100.118097) (xy 135.036446 100.351368) (xy 135.109433 100.575996) - (xy 135.216657 100.786433) (xy 135.355483 100.97751) (xy 135.52249 101.144517) (xy 135.713567 101.283343) - (xy 135.812991 101.334002) (xy 135.924003 101.390566) (xy 135.924005 101.390566) (xy 135.924008 101.390568) - (xy 136.044412 101.429689) (xy 136.148631 101.463553) (xy 136.381903 101.5005) (xy 136.381908 101.5005) - (xy 136.618097 101.5005) (xy 136.851368 101.463553) (xy 137.075992 101.390568) (xy 137.286433 101.283343) - (xy 137.47751 101.144517) (xy 137.644517 100.97751) (xy 137.783343 100.786433) (xy 137.890568 100.575992) - (xy 137.963553 100.351368) (xy 138.0005 100.118097) (xy 138.0005 99.881902) (xy 137.963553 99.648631) - (xy 137.890566 99.424003) (xy 137.783342 99.213566) (xy 137.644517 99.02249) (xy 137.47751 98.855483) - (xy 137.286433 98.716657) (xy 137.075996 98.609433) (xy 136.851368 98.536446) (xy 136.618097 98.4995) - (xy 136.618092 98.4995) (xy 136.381908 98.4995) (xy 136.381903 98.4995) (xy 136.148631 98.536446) - (xy 135.924003 98.609433) (xy 135.713566 98.716657) (xy 135.60455 98.795862) (xy 135.52249 98.855483) - (xy 135.522488 98.855485) (xy 135.522487 98.855485) (xy 135.355485 99.022487) (xy 135.355485 99.022488) - (xy 135.355483 99.02249) (xy 135.295862 99.10455) (xy 135.216657 99.213566) (xy 135.109433 99.424003) - (xy 135.036446 99.648631) (xy 134.9995 99.881902) (xy 130.887392 99.881902) (xy 126.206609 93.861895) - (xy 126.180998 93.796888) (xy 126.1805 93.785781) (xy 126.1805 76.143713) (xy 127.6295 76.143713) - (xy 127.6295 76.356286) (xy 127.662753 76.566239) (xy 127.728444 76.768414) (xy 127.824951 76.95782) - (xy 127.94989 77.129786) (xy 128.100213 77.280109) (xy 128.272184 77.405051) (xy 128.272184 77.405052) - (xy 128.311793 77.425233) (xy 128.36259 77.473206) (xy 128.3795 77.535718) (xy 128.3795 84.89333) - (xy 128.379499 84.893348) (xy 128.379499 85.059054) (xy 128.379498 85.059054) (xy 128.420423 85.211785) - (xy 128.449358 85.2619) (xy 128.449359 85.261904) (xy 128.44936 85.261904) (xy 128.499479 85.348714) - (xy 128.499481 85.348717) (xy 128.618349 85.467585) (xy 128.618355 85.46759) (xy 129.684035 86.53327) - (xy 129.684045 86.533281) (xy 129.688375 86.537611) (xy 129.688376 86.537612) (xy 129.80018 86.649416) - (xy 129.851741 86.679184) (xy 129.886991 86.699535) (xy 129.886993 86.699537) (xy 129.925047 86.721507) - (xy 129.937111 86.728473) (xy 130.089839 86.769397) (xy 130.089842 86.769397) (xy 130.255549 86.769397) - (xy 130.255565 86.769396) (xy 142.284774 86.769396) (xy 142.302917 86.774723) (xy 142.321827 86.775061) - (xy 142.350044 86.788561) (xy 142.351813 86.789081) (xy 142.353665 86.790294) (xy 142.454093 86.857398) - (xy 142.498898 86.91101) (xy 142.507605 86.980335) (xy 142.477451 87.043363) (xy 142.418008 87.080082) - (xy 142.385202 87.0845) (xy 142.287486 87.0845) (xy 142.247028 87.090908) (xy 142.104734 87.113445) - (xy 141.928767 87.170619) (xy 141.928764 87.17062) (xy 141.763903 87.254622) (xy 141.684188 87.312539) - (xy 141.614213 87.363379) (xy 141.614211 87.363381) (xy 141.61421 87.363381) (xy 141.483378 87.494213) - (xy 141.429163 87.568833) (xy 141.409745 87.583805) (xy 140.78 88.213551) (xy 140.78 88.207339) - (xy 140.752741 88.105606) (xy 140.70008 88.014394) (xy 140.625606 87.93992) (xy 140.534394 87.887259) - (xy 140.432661 87.86) (xy 140.426447 87.86) (xy 141.016431 87.270016) (xy 141.01643 87.270015) (xy 140.995834 87.25505) + (xy 154.717045 55.520185) (xy 154.755774 55.559776) (xy 161.500661 66.581908) (xy 165.105707 72.473081) + (xy 165.141268 72.531192) (xy 165.1595 72.595916) (xy 165.1595 93.78578) (xy 165.139815 93.852819) + (xy 165.133391 93.861894) (xy 156.658774 104.761192) (xy 156.658773 104.761193) (xy 156.654025 104.767298) + (xy 156.6295 104.791825) (xy 156.613766 104.819074) (xy 156.608532 104.825806) (xy 156.608532 104.825807) + (xy 156.594439 104.843934) (xy 156.594437 104.843937) (xy 156.583957 104.868785) (xy 156.583958 104.868786) + (xy 156.580956 104.875905) (xy 156.563608 104.905953) (xy 156.55546 104.936358) (xy 156.552149 104.944209) + (xy 156.543227 104.965366) (xy 156.539536 104.992083) (xy 156.539535 104.992082) (xy 156.538476 104.999744) + (xy 156.5295 105.033247) (xy 156.5295 105.06472) (xy 156.528333 105.073168) (xy 156.525191 105.095909) + (xy 156.52854 105.122668) (xy 156.5295 105.138067) (xy 156.5295 115.3755) (xy 156.509815 115.442539) + (xy 156.457011 115.488294) (xy 156.4055 115.4995) (xy 134.9345 115.4995) (xy 134.867461 115.479815) + (xy 134.821706 115.427011) (xy 134.8105 115.3755) (xy 134.8105 105.130339) (xy 134.814809 105.095911) + (xy 134.8105 105.064722) (xy 134.8105 105.033247) (xy 134.803522 105.007204) (xy 134.800464 104.992081) + (xy 134.796773 104.965368) (xy 134.796773 104.965367) (xy 134.784538 104.936357) (xy 134.776392 104.905953) + (xy 134.759044 104.875907) (xy 134.745563 104.843939) (xy 134.731473 104.825817) (xy 134.721978 104.811704) + (xy 134.710504 104.791831) (xy 134.710501 104.791828) (xy 134.7105 104.791825) (xy 134.691434 104.772759) + (xy 134.681224 104.761192) (xy 130.94279 99.95315) (xy 130.887392 99.881902) (xy 134.9995 99.881902) + (xy 134.9995 100.118097) (xy 135.036446 100.351368) (xy 135.109433 100.575996) (xy 135.216657 100.786433) + (xy 135.355483 100.97751) (xy 135.52249 101.144517) (xy 135.713567 101.283343) (xy 135.812991 101.334002) + (xy 135.924003 101.390566) (xy 135.924005 101.390566) (xy 135.924008 101.390568) (xy 136.044412 101.429689) + (xy 136.148631 101.463553) (xy 136.381903 101.5005) (xy 136.381908 101.5005) (xy 136.618097 101.5005) + (xy 136.851368 101.463553) (xy 137.075992 101.390568) (xy 137.286433 101.283343) (xy 137.47751 101.144517) + (xy 137.644517 100.97751) (xy 137.783343 100.786433) (xy 137.890568 100.575992) (xy 137.963553 100.351368) + (xy 138.0005 100.118097) (xy 138.0005 99.881902) (xy 137.963553 99.648631) (xy 137.890566 99.424003) + (xy 137.783342 99.213566) (xy 137.644517 99.02249) (xy 137.47751 98.855483) (xy 137.286433 98.716657) + (xy 137.075996 98.609433) (xy 136.851368 98.536446) (xy 136.618097 98.4995) (xy 136.618092 98.4995) + (xy 136.381908 98.4995) (xy 136.381903 98.4995) (xy 136.148631 98.536446) (xy 135.924003 98.609433) + (xy 135.713566 98.716657) (xy 135.60455 98.795862) (xy 135.52249 98.855483) (xy 135.522488 98.855485) + (xy 135.522487 98.855485) (xy 135.355485 99.022487) (xy 135.355485 99.022488) (xy 135.355483 99.02249) + (xy 135.295862 99.10455) (xy 135.216657 99.213566) (xy 135.109433 99.424003) (xy 135.036446 99.648631) + (xy 134.9995 99.881902) (xy 130.887392 99.881902) (xy 126.206609 93.861895) (xy 126.180998 93.796888) + (xy 126.1805 93.785781) (xy 126.1805 76.143713) (xy 127.6295 76.143713) (xy 127.6295 76.356286) + (xy 127.662753 76.566239) (xy 127.728444 76.768414) (xy 127.824951 76.95782) (xy 127.94989 77.129786) + (xy 128.100213 77.280109) (xy 128.272184 77.405051) (xy 128.272184 77.405052) (xy 128.311793 77.425233) + (xy 128.36259 77.473206) (xy 128.3795 77.535718) (xy 128.3795 84.89333) (xy 128.379499 84.893348) + (xy 128.379499 85.059054) (xy 128.379498 85.059054) (xy 128.420423 85.211785) (xy 128.449358 85.2619) + (xy 128.449359 85.261904) (xy 128.44936 85.261904) (xy 128.499479 85.348714) (xy 128.499481 85.348717) + (xy 128.618349 85.467585) (xy 128.618355 85.46759) (xy 129.684035 86.53327) (xy 129.684045 86.533281) + (xy 129.688375 86.537611) (xy 129.688376 86.537612) (xy 129.80018 86.649416) (xy 129.851741 86.679184) + (xy 129.886991 86.699535) (xy 129.886993 86.699537) (xy 129.925047 86.721507) (xy 129.937111 86.728473) + (xy 130.089839 86.769397) (xy 130.089842 86.769397) (xy 130.255549 86.769397) (xy 130.255565 86.769396) + (xy 142.284774 86.769396) (xy 142.302917 86.774723) (xy 142.321827 86.775061) (xy 142.350044 86.788561) + (xy 142.351813 86.789081) (xy 142.353665 86.790294) (xy 142.454093 86.857398) (xy 142.498898 86.91101) + (xy 142.507605 86.980335) (xy 142.477451 87.043363) (xy 142.418008 87.080082) (xy 142.385202 87.0845) + (xy 142.287486 87.0845) (xy 142.247028 87.090908) (xy 142.104734 87.113445) (xy 141.928767 87.170619) + (xy 141.928764 87.17062) (xy 141.763903 87.254622) (xy 141.684188 87.312539) (xy 141.614213 87.363379) + (xy 141.614211 87.363381) (xy 141.61421 87.363381) (xy 141.483378 87.494213) (xy 141.429163 87.568833) + (xy 141.409745 87.583805) (xy 140.78 88.213551) (xy 140.78 88.207339) (xy 140.752741 88.105606) + (xy 140.70008 88.014394) (xy 140.625606 87.93992) (xy 140.534394 87.887259) (xy 140.432661 87.86) + (xy 140.426447 87.86) (xy 141.016431 87.270016) (xy 141.01643 87.270015) (xy 140.995834 87.25505) (xy 140.831043 87.171084) (xy 140.83104 87.171083) (xy 140.655147 87.113933) (xy 140.472473 87.085) (xy 140.287527 87.085) (xy 140.104852 87.113933) (xy 139.928959 87.171083) (xy 139.928956 87.171084) (xy 139.764167 87.255049) (xy 139.743568 87.270015) (xy 140.333554 87.86) (xy 140.327339 87.86) @@ -3597,20 +3634,83 @@ (xy 129.134957 74.907208) (xy 129.086287 74.8995) (xy 128.873713 74.8995) (xy 128.825042 74.907208) (xy 128.66376 74.932753) (xy 128.461585 74.998444) (xy 128.272179 75.094951) (xy 128.100213 75.21989) (xy 127.94989 75.370213) (xy 127.824951 75.542179) (xy 127.728444 75.731585) (xy 127.662753 75.93376) - (xy 127.6295 76.143713) (xy 126.1805 76.143713) (xy 126.1805 72.940605) (xy 126.200185 72.873566) - (xy 126.252989 72.827811) (xy 126.282175 72.818632) (xy 140.045411 70.3005) (xy 140.065892 70.3005) - (xy 140.109985 70.288685) (xy 140.154893 70.280469) (xy 140.163237 70.276512) (xy 140.184266 70.268781) - (xy 140.193186 70.266392) (xy 140.228399 70.24606) (xy 140.237228 70.241428) (xy 140.27397 70.224008) - (xy 140.289576 70.21074) (xy 140.307314 70.2005) (xy 140.33959 70.168223) (xy 140.374376 70.138652) - (xy 140.386017 70.121796) (xy 140.4005 70.107314) (xy 140.423323 70.067782) (xy 140.449269 70.030217) - (xy 140.456151 70.010923) (xy 140.466392 69.993186) (xy 140.478206 69.949092) (xy 140.493545 69.906093) - (xy 140.495199 69.885674) (xy 140.5005 69.865892) (xy 140.5005 69.820247) (xy 140.504187 69.774739) - (xy 140.502525 69.765654) (xy 140.5005 69.743337) (xy 140.5005 64.93411) (xy 140.5005 64.934108) - (xy 140.466392 64.806814) (xy 140.4005 64.692686) (xy 140.307314 64.5995) (xy 140.25025 64.566554) - (xy 140.193187 64.533608) (xy 140.129539 64.516554) (xy 140.065892 64.4995) (xy 140.065891 64.4995) - (xy 137.6245 64.4995) (xy 137.557461 64.479815) (xy 137.511706 64.427011) (xy 137.5005 64.3755) - (xy 137.5005 55.6245) (xy 137.520185 55.557461) (xy 137.572989 55.511706) (xy 137.6245 55.5005) - (xy 154.3755 55.5005) + (xy 127.6295 76.143713) (xy 126.1805 76.143713) (xy 126.1805 72.605084) (xy 126.200185 72.538045) + (xy 126.200525 72.537518) (xy 130.070651 66.581902) (xy 134.4995 66.581902) (xy 134.4995 66.818097) + (xy 134.536446 67.051368) (xy 134.609433 67.275996) (xy 134.716657 67.486433) (xy 134.855483 67.67751) + (xy 135.02249 67.844517) (xy 135.213567 67.983343) (xy 135.312991 68.034002) (xy 135.424003 68.090566) + (xy 135.424005 68.090566) (xy 135.424008 68.090568) (xy 135.544412 68.129689) (xy 135.648631 68.163553) + (xy 135.881903 68.2005) (xy 135.881908 68.2005) (xy 136.118097 68.2005) (xy 136.351368 68.163553) + (xy 136.575992 68.090568) (xy 136.786433 67.983343) (xy 136.97751 67.844517) (xy 137.144517 67.67751) + (xy 137.283343 67.486433) (xy 137.390568 67.275992) (xy 137.463553 67.051368) (xy 137.484662 66.918092) + (xy 137.5005 66.818097) (xy 137.5005 66.681902) (xy 153.4995 66.681902) (xy 153.4995 66.918097) + (xy 153.536446 67.151368) (xy 153.609433 67.375996) (xy 153.665704 67.486433) (xy 153.716657 67.586433) + (xy 153.855483 67.77751) (xy 154.02249 67.944517) (xy 154.213567 68.083343) (xy 154.312991 68.134002) + (xy 154.424003 68.190566) (xy 154.424005 68.190566) (xy 154.424008 68.190568) (xy 154.544412 68.229689) + (xy 154.648631 68.263553) (xy 154.881903 68.3005) (xy 154.881908 68.3005) (xy 155.118097 68.3005) + (xy 155.351368 68.263553) (xy 155.575992 68.190568) (xy 155.786433 68.083343) (xy 155.97751 67.944517) + (xy 156.144517 67.77751) (xy 156.283343 67.586433) (xy 156.390568 67.375992) (xy 156.463553 67.151368) + (xy 156.5005 66.918097) (xy 156.5005 66.681902) (xy 156.463553 66.448631) (xy 156.390566 66.224003) + (xy 156.283342 66.013566) (xy 156.144517 65.82249) (xy 155.97751 65.655483) (xy 155.786433 65.516657) + (xy 155.575996 65.409433) (xy 155.351368 65.336446) (xy 155.118097 65.2995) (xy 155.118092 65.2995) + (xy 154.881908 65.2995) (xy 154.881903 65.2995) (xy 154.648631 65.336446) (xy 154.424003 65.409433) + (xy 154.213566 65.516657) (xy 154.10455 65.595862) (xy 154.02249 65.655483) (xy 154.022488 65.655485) + (xy 154.022487 65.655485) (xy 153.855485 65.822487) (xy 153.855485 65.822488) (xy 153.855483 65.82249) + (xy 153.795862 65.90455) (xy 153.716657 66.013566) (xy 153.609433 66.224003) (xy 153.536446 66.448631) + (xy 153.4995 66.681902) (xy 137.5005 66.681902) (xy 137.5005 66.581902) (xy 137.463553 66.348631) + (xy 137.390566 66.124003) (xy 137.283342 65.913566) (xy 137.217171 65.82249) (xy 137.144517 65.72249) + (xy 136.97751 65.555483) (xy 136.786433 65.416657) (xy 136.772253 65.409432) (xy 136.575996 65.309433) + (xy 136.351368 65.236446) (xy 136.118097 65.1995) (xy 136.118092 65.1995) (xy 135.881908 65.1995) + (xy 135.881903 65.1995) (xy 135.648631 65.236446) (xy 135.424003 65.309433) (xy 135.213566 65.416657) + (xy 135.10455 65.495862) (xy 135.02249 65.555483) (xy 135.022488 65.555485) (xy 135.022487 65.555485) + (xy 134.855485 65.722487) (xy 134.855485 65.722488) (xy 134.855483 65.72249) (xy 134.795862 65.80455) + (xy 134.716657 65.913566) (xy 134.609433 66.124003) (xy 134.536446 66.348631) (xy 134.4995 66.581902) + (xy 130.070651 66.581902) (xy 130.117719 66.50947) (xy 133.326718 61.57124) (xy 134.02284 60.5) + (xy 135.538358 58.167816) (xy 136.067385 57.353713) (xy 152.2495 57.353713) (xy 152.2495 57.566286) + (xy 152.282753 57.776239) (xy 152.348444 57.978414) (xy 152.444951 58.16782) (xy 152.56989 58.339786) + (xy 152.720213 58.490109) (xy 152.892179 58.615048) (xy 152.892181 58.615049) (xy 152.892184 58.615051) + (xy 152.901493 58.619794) (xy 152.95229 58.667766) (xy 152.969087 58.735587) (xy 152.946552 58.801722) + (xy 152.901505 58.84076) (xy 152.892446 58.845376) (xy 152.89244 58.84538) (xy 152.838282 58.884727) + (xy 152.838282 58.884728) (xy 153.470591 59.517037) (xy 153.407007 59.534075) (xy 153.292993 59.599901) + (xy 153.199901 59.692993) (xy 153.134075 59.807007) (xy 153.117037 59.870591) (xy 152.484728 59.238282) + (xy 152.484727 59.238282) (xy 152.44538 59.292439) (xy 152.348904 59.481782) (xy 152.283242 59.683869) + (xy 152.283242 59.683872) (xy 152.25 59.893753) (xy 152.25 60.106246) (xy 152.283242 60.316127) + (xy 152.283242 60.31613) (xy 152.348904 60.518217) (xy 152.445375 60.70755) (xy 152.484728 60.761716) + (xy 153.117037 60.129408) (xy 153.134075 60.192993) (xy 153.199901 60.307007) (xy 153.292993 60.400099) + (xy 153.407007 60.465925) (xy 153.47059 60.482962) (xy 152.80037 61.153181) (xy 152.739047 61.186666) + (xy 152.712698 61.1895) (xy 152.702134 61.1895) (xy 152.702123 61.189501) (xy 152.642516 61.195908) + (xy 152.507671 61.246202) (xy 152.507664 61.246206) (xy 152.392455 61.332452) (xy 152.392452 61.332455) + (xy 152.306206 61.447664) (xy 152.306202 61.447671) (xy 152.255908 61.582517) (xy 152.249501 61.642116) + (xy 152.249501 61.642123) (xy 152.2495 61.642135) (xy 152.2495 63.43787) (xy 152.249501 63.437876) + (xy 152.255908 63.497483) (xy 152.306202 63.632328) (xy 152.306206 63.632335) (xy 152.392452 63.747544) + (xy 152.392455 63.747547) (xy 152.507664 63.833793) (xy 152.507671 63.833797) (xy 152.642517 63.884091) + (xy 152.642516 63.884091) (xy 152.649444 63.884835) (xy 152.702127 63.8905) (xy 154.497872 63.890499) + (xy 154.557483 63.884091) (xy 154.692331 63.833796) (xy 154.807546 63.747546) (xy 154.893796 63.632331) + (xy 154.944091 63.497483) (xy 154.9505 63.437873) (xy 154.950499 61.642128) (xy 154.944091 61.582517) + (xy 154.893796 61.447669) (xy 154.893795 61.447668) (xy 154.893793 61.447664) (xy 154.807547 61.332455) + (xy 154.807544 61.332452) (xy 154.692335 61.246206) (xy 154.692328 61.246202) (xy 154.557482 61.195908) + (xy 154.557483 61.195908) (xy 154.497883 61.189501) (xy 154.497881 61.1895) (xy 154.497873 61.1895) + (xy 154.497865 61.1895) (xy 154.487309 61.1895) (xy 154.42027 61.169815) (xy 154.399628 61.153181) + (xy 153.729408 60.482962) (xy 153.792993 60.465925) (xy 153.907007 60.400099) (xy 154.000099 60.307007) + (xy 154.065925 60.192993) (xy 154.082962 60.129409) (xy 154.71527 60.761717) (xy 154.71527 60.761716) + (xy 154.754622 60.707554) (xy 154.851095 60.518217) (xy 154.916757 60.31613) (xy 154.916757 60.316127) + (xy 154.95 60.106246) (xy 154.95 59.893753) (xy 154.916757 59.683872) (xy 154.916757 59.683869) + (xy 154.851095 59.481782) (xy 154.754624 59.292449) (xy 154.71527 59.238282) (xy 154.715269 59.238282) + (xy 154.082962 59.87059) (xy 154.065925 59.807007) (xy 154.000099 59.692993) (xy 153.907007 59.599901) + (xy 153.792993 59.534075) (xy 153.729409 59.517037) (xy 154.361716 58.884728) (xy 154.307547 58.845373) + (xy 154.307547 58.845372) (xy 154.2985 58.840763) (xy 154.247706 58.792788) (xy 154.230912 58.724966) + (xy 154.253451 58.658832) (xy 154.298508 58.619793) (xy 154.307816 58.615051) (xy 154.387007 58.557515) + (xy 154.479786 58.490109) (xy 154.479788 58.490106) (xy 154.479792 58.490104) (xy 154.630104 58.339792) + (xy 154.630106 58.339788) (xy 154.630109 58.339786) (xy 154.755048 58.16782) (xy 154.755047 58.16782) + (xy 154.755051 58.167816) (xy 154.851557 57.978412) (xy 154.917246 57.776243) (xy 154.9505 57.566287) + (xy 154.9505 57.353713) (xy 154.917246 57.143757) (xy 154.851557 56.941588) (xy 154.755051 56.752184) + (xy 154.755049 56.752181) (xy 154.755048 56.752179) (xy 154.630109 56.580213) (xy 154.479786 56.42989) + (xy 154.30782 56.304951) (xy 154.118414 56.208444) (xy 154.118413 56.208443) (xy 154.118412 56.208443) + (xy 153.916243 56.142754) (xy 153.916241 56.142753) (xy 153.91624 56.142753) (xy 153.754957 56.117208) + (xy 153.706287 56.1095) (xy 153.493713 56.1095) (xy 153.445042 56.117208) (xy 153.28376 56.142753) + (xy 153.081585 56.208444) (xy 152.892179 56.304951) (xy 152.720213 56.42989) (xy 152.56989 56.580213) + (xy 152.444951 56.752179) (xy 152.348444 56.941585) (xy 152.282753 57.14376) (xy 152.2495 57.353713) + (xy 136.067385 57.353713) (xy 136.114457 57.281275) (xy 137.234982 55.556934) (xy 137.288016 55.511447) + (xy 137.338957 55.5005) (xy 154.650006 55.5005) ) ) ) From 80eb015254bf6a061b039cd02ceef04baa2e54f9 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Tue, 10 Feb 2026 13:43:17 -0500 Subject: [PATCH 42/45] Eliminating returned structures --- src/mixers/crazyflie.hpp | 5 ----- src/simulator/simulator.hpp | 9 +++++---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/mixers/crazyflie.hpp b/src/mixers/crazyflie.hpp index 04a2ac9e7..8ef2f0150 100644 --- a/src/mixers/crazyflie.hpp +++ b/src/mixers/crazyflie.hpp @@ -38,11 +38,6 @@ namespace hf { static constexpr int8_t pitch[4] = {-1, +1, +1, -1}; static constexpr int8_t yaw[4] = {+1, -1, +1, -1}; - static float * mix(const demands_t & demands) - { - return RotorMixer::mix(demands, roll, pitch, yaw, 4); - } - static void mix(const demands_t & demands, float motors[]) { RotorMixer::mix(demands, roll, pitch, yaw, 4, motors); diff --git a/src/simulator/simulator.hpp b/src/simulator/simulator.hpp index 4a0d0ed99..a55276c31 100644 --- a/src/simulator/simulator.hpp +++ b/src/simulator/simulator.hpp @@ -90,16 +90,17 @@ namespace hf { }; // Get motor RPMS from mixer - const auto * motors = Mixer::mix(new_demands); + float motors[4] = {}; + Mixer::mix(new_demands, motors); // Convert motor values to double for dynamics - const auto * rpms = motors2doubless(motors, 4); + //const auto * rpms = motors2doubless(motors, 4); // Run dynamics in inner loop ----------------------------- for (uint32_t k=0; k Date: Tue, 10 Feb 2026 13:47:17 -0500 Subject: [PATCH 43/45] More tests --- src/mixers/crazyflie.hpp | 2 +- src/simulator/simulator.hpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mixers/crazyflie.hpp b/src/mixers/crazyflie.hpp index 8ef2f0150..697630643 100644 --- a/src/mixers/crazyflie.hpp +++ b/src/mixers/crazyflie.hpp @@ -40,7 +40,7 @@ namespace hf { static void mix(const demands_t & demands, float motors[]) { - RotorMixer::mix(demands, roll, pitch, yaw, 4, motors); + //RotorMixer::mix(demands, roll, pitch, yaw, 4, motors); } }; } diff --git a/src/simulator/simulator.hpp b/src/simulator/simulator.hpp index a55276c31..4f9189723 100644 --- a/src/simulator/simulator.hpp +++ b/src/simulator/simulator.hpp @@ -91,16 +91,16 @@ namespace hf { // Get motor RPMS from mixer float motors[4] = {}; - Mixer::mix(new_demands, motors); + //Mixer::mix(new_demands); // Convert motor values to double for dynamics - //const auto * rpms = motors2doubless(motors, 4); + const auto * rpms = motors2doubless(motors, 4); // Run dynamics in inner loop ----------------------------- for (uint32_t k=0; k Date: Wed, 11 Feb 2026 21:00:55 -0500 Subject: [PATCH 44/45] Upgraded project to C++17 which supports inline variables --- simtest/Makefile | 4 ++-- src/mixers/crazyflie.hpp | 2 +- src/simulator/simulator.hpp | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/simtest/Makefile b/simtest/Makefile index 729ec620b..ea86a450e 100644 --- a/simtest/Makefile +++ b/simtest/Makefile @@ -14,10 +14,10 @@ simtest: main.o twoexit.o main.o: main.cpp *.hpp ../src/*.hpp ../src/pids/*.hpp \ $(SIMSENSORS)/parsers/webots/* $(SIMSENSORS)/sensors/* - g++ -Wall -c -I$(ROOT) -I../src main.cpp + g++ -std=c++17 -Wall -c -I$(ROOT) -I../src main.cpp twoexit.o: twoexit.cpp *.hpp - g++ -Wall -c -I$(ROOT) -I../src twoexit.cpp + g++ -std=c++17 -Wall -c -I$(ROOT) -I../src twoexit.cpp edit: vim main.cpp diff --git a/src/mixers/crazyflie.hpp b/src/mixers/crazyflie.hpp index 697630643..8ef2f0150 100644 --- a/src/mixers/crazyflie.hpp +++ b/src/mixers/crazyflie.hpp @@ -40,7 +40,7 @@ namespace hf { static void mix(const demands_t & demands, float motors[]) { - //RotorMixer::mix(demands, roll, pitch, yaw, 4, motors); + RotorMixer::mix(demands, roll, pitch, yaw, 4, motors); } }; } diff --git a/src/simulator/simulator.hpp b/src/simulator/simulator.hpp index 4f9189723..4bbd3d9e9 100644 --- a/src/simulator/simulator.hpp +++ b/src/simulator/simulator.hpp @@ -91,7 +91,7 @@ namespace hf { // Get motor RPMS from mixer float motors[4] = {}; - //Mixer::mix(new_demands); + Mixer::mix(new_demands, motors); // Convert motor values to double for dynamics const auto * rpms = motors2doubless(motors, 4); @@ -99,8 +99,7 @@ namespace hf { // Run dynamics in inner loop ----------------------------- for (uint32_t k=0; k Date: Wed, 11 Feb 2026 21:35:06 -0500 Subject: [PATCH 45/45] Add Python dependencies for simtest playback - Add roboviz.py (Visualizer class for map/robot display) - Add simsensors Python package (Webots .wbt world file parser) - Update .gitignore: replace overly broad __*__.* with __pycache__/ - Add __pycache__/ to simtest/.gitignore --- .gitignore | 3 +- simtest/.gitignore | 1 + simtest/roboviz.py | 185 ++++++++++++++++++ simtest/simsensors/__init__.py | 0 simtest/simsensors/parsers/__init__.py | 0 simtest/simsensors/parsers/webots/__init__.py | 0 simtest/simsensors/parsers/webots/world.py | 79 ++++++++ 7 files changed, 266 insertions(+), 2 deletions(-) create mode 100644 simtest/roboviz.py create mode 100644 simtest/simsensors/__init__.py create mode 100644 simtest/simsensors/parsers/__init__.py create mode 100644 simtest/simsensors/parsers/webots/__init__.py create mode 100644 simtest/simsensors/parsers/webots/world.py diff --git a/.gitignore b/.gitignore index 8fdf03814..07e4e54e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ #auto_saved_files -#__pycache__/ +__pycache__/ *.swp -__*__.* diff --git a/simtest/.gitignore b/simtest/.gitignore index e4c50e698..96b7e716e 100644 --- a/simtest/.gitignore +++ b/simtest/.gitignore @@ -1,3 +1,4 @@ *.o simtest *.csv +__pycache__/ diff --git a/simtest/roboviz.py b/simtest/roboviz.py new file mode 100644 index 000000000..1c29aa843 --- /dev/null +++ b/simtest/roboviz.py @@ -0,0 +1,185 @@ +''' +roboviz.py - Python classes for displaying maps and robots + +Requires: numpy, matplotlib + +Copyright (C) 2018 Simon D. Levy + +This file is part of PyRoboViz. + +PyRoboViz is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +PyRoboViz is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +''' + +# Essential imports +import matplotlib.pyplot as plt +import matplotlib.cm as colormap +import matplotlib.lines as mlines +import numpy as np + +# Use native macOS backend; fall back to TkAgg on other platforms +import matplotlib +import platform +if platform.system() == 'Darwin': + matplotlib.use('macosx') +else: + matplotlib.use('TkAgg') + + +class Visualizer(object): + + # Robot display params + ROBOT_HEIGHT_M = 0.5 + ROBOT_WIDTH_M = 0.3 + + def __init__(self, map_size_meters, map_size_pixels=800): + + # Store constants for display + self.map_size_meters = map_size_meters + self.map_size_pixels = map_size_pixels + + # Create a byte array to display the map with a color overlay + self.bgrbytes = bytearray(map_size_pixels * map_size_pixels * 3) + + # Make a nice big (10"x10") figure + fig = plt.figure(figsize=(10, 10)) + + # Store Python ID of figure to detect window close + self.figid = id(fig) + + # Use an "artist" to speed up map drawing + self.img_artist = None + + # No vehicle to show yet + self.vehicle = None + + # Create axes + self.ax = fig.gca() + self.ax.grid(False) + + # Store previous position for trajectory + self.prevpos = None + + self.rotate_angle = 0 + + def display(self, x_m, y_m, theta_deg, + start_angle=0, + title='', + flip_axes=False, + map_bytes=None, + show_trajectory=False, + obstacles=[]): + + # print(x_m, y_m) + + self._set_pose(x_m, y_m, theta_deg, start_angle, + show_trajectory, flip_axes) + + shift = -self.map_size_pixels / 2 if map_bytes is None else 0 + + # We base the axis on pixels, to support displaying the map + self.ax.set_xlim([shift, self.map_size_pixels+shift]) + self.ax.set_ylim([shift, self.map_size_pixels+shift]) + + if map_bytes is not None: + self._showMap(map_bytes) + + self._show_obstacles(obstacles, flip_axes) + + plt.title(title) + + self.ax.set_xlabel('Y (mm)' if flip_axes else 'X (mm)') + self.ax.set_ylabel('X (mm)' if flip_axes else 'Y (mm)') + + return self._refresh() + + def _showMap(self, map_bytes): + + mapimg = np.reshape(np.frombuffer(map_bytes, dtype=np.uint8), + (self.map_size_pixels, self.map_size_pixels)) + + if self.img_artist is None: + + self.img_artist = self.ax.imshow(mapimg, cmap=colormap.gray) + + else: + + self.img_artist.set_data(mapimg) + + def _show_obstacles(self, obstacles, flip_axes): + + for obst in obstacles: + xs = [x * 100 for x in obst['x']] # (0, 100, 100, 0, 0) + ys = [y * 100 for y in obst['y']] # (0, 0, 100, 100, 0) + plt.fill(xs, ys, color='black') + + + def _set_pose(self, x_m, y_m, theta_deg, start_angle, showtraj, flip_axes): + + # If zero-angle was indicated, grab first angle to compute rotation + if start_angle is None and self.zero_angle != 0: + start_angle = theta_deg + self.rotate_angle = self.zero_angle - self.start_angle + + # Flip axes if indicated + if flip_axes: + x_m, y_m = y_m, x_m + theta_deg = 90 - theta_deg + + # Rotate by computed angle, or zero if no zero-angle indicated + d = self.rotate_angle + a = np.radians(d) + c = np.cos(a) + s = np.sin(a) + x_m, y_m = x_m*c-y_m*s, y_m*c+x_m*s + + # Erase previous vehicle image after first iteration + if self.vehicle is not None: + self.vehicle.remove() + + # Use a very short arrow shaft to orient the head of the arrow + theta_rad = np.radians(theta_deg+d) + c = np.cos(theta_rad) + s = np.sin(theta_rad) + L = 0.1 + dx = L * c + dy = L * s + + s = self.map_size_meters / self.map_size_pixels + + self.vehicle = self.ax.arrow(x_m/s, y_m/s, dx, dy, + head_width=Visualizer.ROBOT_WIDTH_M/s, + head_length=Visualizer.ROBOT_HEIGHT_M/s, + fc='r', ec='r') + + # Show trajectory if indicated + currpos = x_m/s, y_m/s + if showtraj and self.prevpos is not None: + self.ax.add_line(mlines.Line2D((self.prevpos[0], currpos[0]), + (self.prevpos[1], currpos[1]))) + self.prevpos = currpos + + def _refresh(self): + + # If we have a new figure, something went wrong (closing figure failed) + if self.figid != id(plt.gcf()): + return False + + # Redraw current objects without blocking + plt.draw() + + # Refresh display, setting flag on window close or keyboard interrupt + try: + plt.pause(.01) # Arbitrary pause to force redraw + return True + except Exception: + return False + + return True diff --git a/simtest/simsensors/__init__.py b/simtest/simsensors/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/simtest/simsensors/parsers/__init__.py b/simtest/simsensors/parsers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/simtest/simsensors/parsers/webots/__init__.py b/simtest/simsensors/parsers/webots/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/simtest/simsensors/parsers/webots/world.py b/simtest/simsensors/parsers/webots/world.py new file mode 100644 index 000000000..4cbcf49a7 --- /dev/null +++ b/simtest/simsensors/parsers/webots/world.py @@ -0,0 +1,79 @@ +''' +Simple VRML parser for Webots .wbt world files + +Python port of the C++ WorldParser from simsensors. + +Copyright (C) 2025 Simon D. Levy + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, in version 3. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +''' + + +def parse(world_file_name): + ''' + Parse a Webots .wbt world file and return a dict with a 'walls' list. + Each wall has 'translation' (3-list), 'rotation' (4-list), 'size' (3-list), + and 'name' (string). + ''' + + walls = [] + current_wall = None + + with open(world_file_name) as f: + for line in f: + line = line.strip() + + if 'Wall {' in line: + current_wall = { + 'translation': [0.0, 0.0, 0.0], + 'rotation': [0.0, 0.0, 1.0, 0.0], + 'size': [0.0, 0.0, 0.0], + 'name': '', + } + + if current_wall is not None: + _try_parse_vec3(line, 'translation', current_wall) + _try_parse_rotation(line, 'rotation', current_wall) + _try_parse_vec3(line, 'size', current_wall) + _try_parse_name(line, current_wall) + + if '}' in line: + walls.append(current_wall) + current_wall = None + + return {'walls': walls} + + +def _try_parse_vec3(line, field_name, wall): + if field_name in line: + toks = line.split() + if len(toks) >= 4: + wall[field_name] = [float(toks[1]), float(toks[2]), float(toks[3])] + + +def _try_parse_rotation(line, field_name, wall): + if field_name in line: + toks = line.split() + if len(toks) >= 5: + wall[field_name] = [ + float(toks[1]), float(toks[2]), + float(toks[3]), float(toks[4]), + ] + + +def _try_parse_name(line, wall): + if 'name' in line: + toks = line.split() + if len(toks) >= 2: + # Remove surrounding quotes + wall['name'] = toks[1].strip('"')