Skip to content

Instantly share code, notes, and snippets.

@brandonhs
Created April 9, 2021 17:12
Show Gist options
  • Save brandonhs/0e6474ea7f19c345bfbbc0b54aa12e29 to your computer and use it in GitHub Desktop.
Save brandonhs/0e6474ea7f19c345bfbbc0b54aa12e29 to your computer and use it in GitHub Desktop.
# ------------------------------------------
#
# Project: Parking System
# Author: VEX
# Created: Brandon Stevens
# Description: Parking Space System
#
# ------------------------------------------
from vexcode import *
from math import *
import os
# cause python has no sign function?
def sign(x):
if x == 0:
return 0
elif x > 0:
return 1
elif x < 0:
return -1
return x # should never reach here
def get_position():
x = location.position(X, MM)
y = location.position(Y, MM)
return (x,y)
def to_coords(pix):
x, y = pix
return ((x*200)-900,(y*200)-900)
def from_coords(coords):
x, y = coords
return ((x+900)/200,(y+900)/200)
def length(vec):
x, y = vec
return sqrt(x**2 + y**2)
def degrees(rad):
return rad*(180/pi)
def create_line(a, b, x_first=True):
ax, ay = a
bx, by = b
path = [ a ];
x = ax
y = ay
dx = -1
if ax == bx:
dx = 0
elif bx > ax:
dx = 1
dy = -1
if ay == by:
dy = 0
elif by > ay:
dy = 1
# allows for user to decide whether horizontal or vertical will get preference
horiz = abs(bx - ax) >= abs(by - ay)
if x_first:
horiz = abs(bx - ax) > abs(by - ay)
if dx == 0 or dy == 0:
path.append((x,y))
elif horiz:
t = (by - ay) / (bx - ax);
m = (1 - abs(t)) / 2;
while x != bx or y != by:
ideal = ay + (x - ax) * t
if (ideal - y) * dy >= m:
y += dy;
else:
x += dx
path.append((x,y))
else:
cotan = (bx - ax) / (by - ay)
m = (1 - abs(cotan)) / 2
while x != bx or y != by:
ideal = ax + (y - ay) * cotan
if (ideal - x) * dx >= m:
x += dx
else:
y += dy
path.append((x,y))
path.append(b) # incredibly hacky way to ensure the dest is b
return path
def generate_path(positions, x_first=True):
lines = [ ]
start_pos = positions[0]
for pos in positions[1:]:
line = create_line(start_pos, pos, x_first)
lines += line
start_pos = pos
return lines
import itertools
def remove_consecutive_duplicates(l):
preprocessed_list = []
for x in itertools.groupby(l):
preprocessed_list.append(x[0])
return preprocessed_list
def dumb_generate_path(lot, positions):
lines = [ ]
start_pos = positions[0]
for pos in positions[1:]:
line = create_line(start_pos, pos, False)
for coord in line:
if lot[9-coord[1]][coord[0]] == 2:
brain.print(9-coord[1], coord[0], '\n')
line = create_line(start_pos, pos, True)
lines += line
start_pos = pos
return lines
async def draw_path(path: [tuple]):
# brain.print(f'Processing path: {path}\n')
preprocessed_list = []
for x in itertools.groupby(path):
preprocessed_list.append(x[0])
path = preprocessed_list
x, y = get_position()
a = 0
for pos in path:
px, py = to_coords(pos)
dx = px - x
dy = py - y
if px == x and py == y:
pen.move(DOWN)
a = atan2(dx, dy)
drivetrain.turn_to_heading(degrees(a), DEGREES)
l = length((dx,dy))
#brain.print(l)
#brain.new_line()
drivetrain.drive_for(FORWARD, l, MM)
x, y = get_position()
pen.move(DOWN)
pen.move(UP)
async def dumb_draw_path(lot, path: [tuple]):
brain.print(f'Processing path: {path}\n')
preprocessed_list = []
for x in itertools.groupby(path):
preprocessed_list.append(x[0])
path = preprocessed_list
x, y = get_position()
a = 0
for pos in path:
px, py = to_coords(pos)
dx = px - x
dy = py - y
if px == x and py == y:
pen.move(DOWN)
wx, wy = (from_coords((px, py)))
wx = int(wx)
wy = int(wy)
brain.print(lot[9-wy][wx])
if lot[wy][wx] != 2:
a = atan2(dx, dy)
drivetrain.turn_to_heading(degrees(a), DEGREES)
l = length((dx,dy))
brain.new_line()
drivetrain.drive_for(FORWARD, l, MM)
else:
drivetrain.drive_for(FORWARD, 200, MM)
x, y = get_position()
pen.move(DOWN)
pen.move(UP)
def generate_spiral(center, max_value):
path = []
cx, cy = center
d = UP
i = 1
j = True
while i <= max_value:
path.append((cx, cy))
if d == UP:
cy += i
d = RIGHT
elif d == DOWN:
cy -= i
d = LEFT
elif d == LEFT:
cx -= i
d = UP
elif d == RIGHT:
cx += i
d = DOWN
if j:
j = False
else:
i += 1
j = True
return path
def home():
x, y = get_position()
px, py = to_coords((0,0))
dx = px-x
dy = py-y
a = atan2(dx, dy)
l = length((dx,dy))
drivetrain.turn_to_heading(degrees(a), DEGREES)
drivetrain.drive_for(FORWARD, l, MM)
# A *
class Node():
def __init__(self, parent=None, position=None):
self.parent = parent
self.position = position
self.g = 0
self.h = 0
self.f = 0
def A_Star(grid, start, end):
start_node = Node(None, start)
start_node.g = start_node.h = start_node.f = 0
end_node = Node(None, end)
end_node.g = end_node.h = end_node.f = 0
open_list = []
closed_list = []
open_list.append(start_node)
while len(open_list) > 0:
js.eval('postMessage({command: "WorkerAlive"})') # trick the system into thinking we havent frozen
current_node = open_list[0]
current_index = 0
for index, item in enumerate(open_list):
if item.f < current_node.f:
current_node = item
current_index = index
open_list.pop(current_index)
closed_list.append(current_node)
if current_node.position == end_node.position:
path = []
current = current_node
while current is not None:
path.append(current.position)
current = current.parent
return path[::-1]
children = []
for new_position in [(0, -1), (0, 1), (-1, 0), (1, 0), (-1, -1), (-1, 1), (1, -1), (1, 1)]:
node_position = (current_node.position[0] + new_position[0], current_node.position[1] + new_position[1])
if node_position[0] > (len(grid) - 1) or node_position[0] < 0 or node_position[1] > (len(grid[len(grid)-1]) -1) or node_position[1] < 0:
continue
if grid[node_position[0]][node_position[1]] == 2:
continue
new_node = Node(current_node, node_position)
children.append(new_node)
for child in children:
for closed_child in closed_list:
if child.position == closed_child.position:
continue
child.g = current_node.g + 1
child.h = ((child.position[0] - end_node.position[0]) ** 2) + ((child.position[1] - end_node.position[1]) ** 2)
child.f = child.g + child.h
for open_node in open_list:
if child.position == open_node.position and child.g > open_node.g:
continue
open_list.append(child)
import js
# PARKING CODE
OPEN = 1
FULL = 2
DRIVE = 0
def create_lot(rows, cols):
lot = [ ]
for i in range(rows):
row = [ ]
for j in range(cols):
if j == 0 or j == cols-1:
row.append(DRIVE)
else:
row.append(FULL)
lot.append(row)
return lot
def get_spot(lot):
open_spots = [ ]
x, y = from_coords(get_position())
for row in range(len(lot)):
for col in range(len(lot[row])):
if lot[row][col] == OPEN:
open_spots.append((row, col))
min_dist = 10000
spot = (-1, -1)
for (row, col) in open_spots:
d = length((x-row, y-col))
if d < min_dist:
min_dist = d
spot = (col, row)
return spot
# COLOR STUFF :D
from js import XMLHttpRequest, Blob
import pyodide
import json
def pull_image(url):
data = {"a": 1}
req = XMLHttpRequest.new()
req.responseType = 'blob'
req.open("GET", url, False)
req.send()
return req.response
def set_arbitrary_color(col):
js.eval('postMessage({command: "PrintSetColor", color: "' + col + '", brandon: "brandon is best yes :D"})')
# lol
def gradient_fill(col1, col2, width, height):
r1, g1, b1 = col1
r2, g2, b2 = col2
offset = 0
for j in range(0, height, 1):
for i in range(int(abs(offset)), width+int(abs(offset)), 1):
js.eval('postMessage({command: "WorkerAlive"})') # ensure vexcode doesn't try to shutdown the program (haha another exploit)
p = i / float(width+int(abs(offset)) - 1)
r = int((1.0-p) * r1 + p * r2 + 0.5)
g = int((1.0-p) * g1 + p * g2 + 0.5)
b = int((1.0-p) * b1 + p * b2 + 0.5)
rgb = (r << 16) | (g << 8) | (b)
col = '#' + hex(rgb)[2:].zfill(6)
set_arbitrary_color(col)
brain.print('█')
offset += 0.1
brain.print('\n')
def gradient_fillstring(string, col1, col2):
r1, g1, b1 = col1
r2, g2, b2 = col2
arr = string.split('\n')
arr2 = []
for c in arr:
arr2 = list(c)
width = len(arr2)
for i, a in enumerate(arr2):
js.eval('postMessage({command: "WorkerAlive"})') # ensure vexcode doesn't try to shutdown the program (haha another exploit)
p = i / float(width - 1)
r = int((1.0-p) * r1 + p * r2 + 0.5)
g = int((1.0-p) * g1 + p * g2 + 0.5)
b = int((1.0-p) * b1 + p * b2 + 0.5)
rgb = (r << 16) | (g << 8) | (b)
col = '#' + hex(rgb)[2:].zfill(6)
set_arbitrary_color(col)
brain.print(a)
brain.print('\n')
def hex_to_rgb(string):
arr = list(string)
color = []
for x, y in zip(*[iter(arr)]*2):
c = x + y
color.append(int(c, 16))
return color
ROWS = 10
COLS = 10
explanation = ''' \n
An Explanation of how this (color thing) works:
Vexcode uses a system at its core called pyodide. This system allows for python to be executed in a browser.
A feature of the system vexcode uses is the ability for n-way communication between workers and hosts. This
is how vexcode is able to communicate with its renderer which renders the robot.
Pyodide not only allows for python execution in javascript, but javascript execution in python. Although slightly
paradoxical, this feature is how the vexcode python api is able to communicate with the site. An unforseen consequence
of this is that not only can the vexcode api communicate with the browser, but so can I. Using the simple code,
js.eval('postMessage...etc'), we can send the same commands vexcode does. It took me a little while but I managed to
reverse engineer the command system vexcode uses.
The following is a list of every command I found:
WorkerAlive - Communicates with the system to tell it that the worker is not stuck. This is how I circumvented the requirement for waits in loops
PythonReady - Send when the code is ready
PythonInitError - An error occured while initializing
PythonError - Throws an error which gets printed in the main console
PythonRunning - Send when the code is running
PythonRunComplete - Sent when the code has completed running
UnityCommand - Command sent from the unity engine backend (yes, the game engine)
WaitForUnityReady - Honestly I dont know
PrintText - print text to the console (literally brain.print)
PrintNewLine - Prints a newline
PrintSetColor - This is a fun one. This command allows for any color to be set to the brain color. The parameter for this is color.
It accepts a hex value, like #FFFFFF
PrintClearLines - Clears the console line by line
UpdateBraintimer - Updates the internal brain timer
PythonVariableValues - Internal command for monitor_variable
PythonSensorMonitor - Updates the internal sensor monitor?
PythonStopProject - Stops the project'''
def main():
brain.clear()
global ROWS
global COLS
global explanation
a = '''
const getUrl = (url) => {
var req = new XMLHttpRequest();
req.responseType = 'blob';
req.open("GET", url, false);
req.send();
return req.response;
}
const rgbToHex = (r, g, b) => {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
var w = 43;
var h = 76;
var canvas = new OffscreenCanvas(w, h);
var ctx = canvas.getContext('2d');
var img = getUrl('data:image/jpeg;base64,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')
var blob = img;
console.log(blob.type);
createImageBitmap(blob, 0, 0, w, h).then((bmp) => {
ctx.drawImage(bmp, 0, 0);
var imageData = ctx.getImageData(0, 0, w, h);
// postMessage({command: 'PrintText', text: imageData.data.toString()});
for (let i = 0; i < w*h*4; i+=4) {
let r = imageData.data[i];
let g = imageData.data[i+1];
let b = imageData.data[i+2];
let a = imageData.data[i+3];
let hex = rgbToHex(r, g, b);
postMessage({command: "PrintSetColor", color: hex})
postMessage({command: 'PrintText', text: '██'});
if (i % (w*4) == 0 && i != 0) postMessage({command: 'PrintNewLine'});
}
}).catch((e) => {
console.log(e);
});
'''
lot = [
[2, 2, 2, 2, 2, 2, 2, 2, 2],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 2, 1, 2, 2, 2, 2, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 2, 2, 2, 2, 2, 2, 2, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 2, 2, 2, 2, 2, 2, 2, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 2, 1, 2, 2, 2, 2, 2, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]]
start = (0, 0)
# end = (2, 1)
prom = js.eval(a)
gradient_fill((210, 41, 255), (0, 213, 230), 58, 20)
brain.print('\n\n')
gradient_fillstring('''\
██████╗░██████╗░░█████╗░███╗░░██╗██████╗░░█████╗░███╗░░██╗
██╔══██╗██╔══██╗██╔══██╗████╗░██║██╔══██╗██╔══██╗████╗░██║
██████╦╝██████╔╝███████║██╔██╗██║██║░░██║██║░░██║██╔██╗██║
██╔══██╗██╔══██╗██╔══██║██║╚████║██║░░██║██║░░██║██║╚████║
██████╦╝██║░░██║██║░░██║██║░╚███║██████╔╝╚█████╔╝██║░╚███║
╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚══╝╚═════╝░░╚════╝░╚═╝░░╚══╝''', (210, 41, 255), (0, 213, 230))
gradient_fillstring('Parking Space Algorithm Using a-star Pathfinding', (255, 0, 0), (255, 0, 255))
brain.print('\n\n')
img = pull_image('https://cors-anywhere.herokuapp.com/http://hmg-prod.s3.amazonaws.com/images/dog-puppy-on-garden-royalty-free-image-1586966191.jpg')
class LMAO:
# the only way to get around vecodes DUMB addition of asyncs to the beginning of every def
def __init__(self, x):
brain.print(x)
canvas = js.OffscreenCanvas.new(256, 256)
ctx = canvas.getContext('2d')
# import pyodide
# prom.then(lambda x: (
# ctx.drawImage(x, 0, 0),
# LMAO(ctx.getImageData(0, 0, 256, 256))
# )).catch(lambda e: brain.print(e))
# col = hex_to_rgb('753a88')
# gradient_fill(hex_to_rgb('cc2b5e'), col, 58, 20)
# gradient_fillstring(explanation, (210, 41, 255), (0, 213, 230))
spot = get_spot(lot[::-1])
path = A_Star(lot[::-1], start, spot)
dumb_path = dumb_generate_path(lot, path)
await draw_path(dumb_path)
# await draw_path(path)
# brain.print("Haha! Custom color codes are possible cause I exploited a bug in vexcode vr's main system LMAO.")
vr_thread(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment