parent
2325580259
commit
f135b7d4df
12 changed files with 0 additions and 776 deletions
@ -1,21 +0,0 @@ |
||||
import time |
||||
import numpy as np |
||||
|
||||
from common.realtime import sec_since_boot |
||||
|
||||
N = 1000 |
||||
|
||||
times = [] |
||||
for i in range(1000): |
||||
t1 = sec_since_boot() |
||||
time.sleep(0.01) |
||||
t2 = sec_since_boot() |
||||
dt = t2 - t1 |
||||
times.append(dt) |
||||
|
||||
|
||||
print("Mean", np.mean(times)) |
||||
print("Max", np.max(times)) |
||||
print("Min", np.min(times)) |
||||
print("Variance", np.var(times)) |
||||
print("STD", np.sqrt(np.var(times))) |
@ -1,48 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import time |
||||
import sys |
||||
import argparse |
||||
import zmq |
||||
import json |
||||
import pyproj |
||||
import numpy as np |
||||
ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84') |
||||
lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84') |
||||
|
||||
import cereal.messaging as messaging |
||||
from cereal.services import service_list |
||||
|
||||
poller = zmq.Poller() |
||||
ll = messaging.sub_sock("liveLocation", poller) |
||||
tll = messaging.sub_sock("testLiveLocation", poller) |
||||
|
||||
l, tl = None, None |
||||
|
||||
lp = time.time() |
||||
|
||||
while 1: |
||||
polld = poller.poll(timeout=1000) |
||||
for sock, mode in polld: |
||||
if mode != zmq.POLLIN: |
||||
continue |
||||
if sock == ll: |
||||
l = messaging.recv_one(sock) |
||||
elif sock == tll: |
||||
tl = messaging.recv_one(sock) |
||||
if l is None or tl is None: |
||||
continue |
||||
|
||||
alt_err = np.abs(l.liveLocation.alt - tl.liveLocation.alt) |
||||
l1 = pyproj.transform(lla, ecef, l.liveLocation.lon, l.liveLocation.lat, l.liveLocation.alt) |
||||
l2 = pyproj.transform(lla, ecef, tl.liveLocation.lon, tl.liveLocation.lat, tl.liveLocation.alt) |
||||
|
||||
al1 = pyproj.transform(lla, ecef, l.liveLocation.lon, l.liveLocation.lat, l.liveLocation.alt) |
||||
al2 = pyproj.transform(lla, ecef, tl.liveLocation.lon, tl.liveLocation.lat, l.liveLocation.alt) |
||||
|
||||
tdiff = np.abs(l.logMonoTime - tl.logMonoTime) / 1e9 |
||||
|
||||
if time.time()-lp > 0.1: |
||||
print("tm: %f mse: %f mse(flat): %f alterr: %f" % (tdiff, np.mean((np.array(l1)-np.array(l2))**2), np.mean((np.array(al1)-np.array(al2))**2), alt_err)) |
||||
lp = time.time() |
||||
|
||||
|
@ -1,89 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import sys |
||||
import time |
||||
|
||||
import matplotlib.pyplot as plt |
||||
import numpy as np |
||||
import cereal.messaging as messaging |
||||
import zmq |
||||
from common.transformations.coordinates import LocalCoord |
||||
from cereal.services import service_list |
||||
|
||||
SCALE = 20. |
||||
|
||||
def mpc_vwr_thread(addr="127.0.0.1"): |
||||
plt.ion() |
||||
fig = plt.figure(figsize=(15, 15)) |
||||
ax = fig.add_subplot(1,1,1) |
||||
ax.set_xlim([-SCALE, SCALE]) |
||||
ax.set_ylim([-SCALE, SCALE]) |
||||
ax.grid(True) |
||||
|
||||
line, = ax.plot([0.0], [0.0], ".b") |
||||
line2, = ax.plot([0.0], [0.0], 'r') |
||||
|
||||
ax.set_aspect('equal', 'datalim') |
||||
plt.show() |
||||
|
||||
live_location = messaging.sub_sock('liveLocation', addr=addr, conflate=True) |
||||
gps_planner_points = messaging.sub_sock('gpsPlannerPoints', conflate=True) |
||||
gps_planner_plan = messaging.sub_sock('gpsPlannerPlan', conflate=True) |
||||
|
||||
last_points = messaging.recv_one(gps_planner_points) |
||||
last_plan = messaging.recv_one(gps_planner_plan) |
||||
while True: |
||||
p = messaging.recv_one_or_none(gps_planner_points) |
||||
pl = messaging.recv_one_or_none(gps_planner_plan) |
||||
ll = messaging.recv_one(live_location).liveLocation |
||||
|
||||
if p is not None: |
||||
last_points = p |
||||
if pl is not None: |
||||
last_plan = pl |
||||
|
||||
if not last_plan.gpsPlannerPlan.valid: |
||||
time.sleep(0.1) |
||||
line2.set_color('r') |
||||
continue |
||||
|
||||
p0 = last_points.gpsPlannerPoints.points[0] |
||||
p0 = np.array([p0.x, p0.y, p0.z]) |
||||
|
||||
n = LocalCoord.from_geodetic(np.array([ll.lat, ll.lon, ll.alt])) |
||||
points = [] |
||||
print(len(last_points.gpsPlannerPoints.points)) |
||||
for p in last_points.gpsPlannerPoints.points: |
||||
ecef = np.array([p.x, p.y, p.z]) |
||||
points.append(n.ecef2ned(ecef)) |
||||
|
||||
points = np.vstack(points) |
||||
line.set_xdata(points[:, 1]) |
||||
line.set_ydata(points[:, 0]) |
||||
|
||||
y = np.matrix(np.arange(-100, 100.0, 0.5)) |
||||
x = -np.matrix(np.polyval(last_plan.gpsPlannerPlan.poly, y)) |
||||
xy = np.hstack([x.T, y.T]) |
||||
|
||||
cur_heading = np.radians(ll.heading - 90) |
||||
c, s = np.cos(cur_heading), np.sin(cur_heading) |
||||
R = np.array([[c, -s], [s, c]]) |
||||
xy = xy.dot(R) |
||||
|
||||
line2.set_xdata(xy[:, 1]) |
||||
line2.set_ydata(-xy[:, 0]) |
||||
line2.set_color('g') |
||||
|
||||
|
||||
ax.set_xlim([-SCALE, SCALE]) |
||||
ax.set_ylim([-SCALE, SCALE]) |
||||
|
||||
fig.canvas.draw() |
||||
fig.canvas.flush_events() |
||||
|
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
if len(sys.argv) > 1: |
||||
mpc_vwr_thread(sys.argv[1]) |
||||
else: |
||||
mpc_vwr_thread() |
@ -1,16 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import time |
||||
import cereal.messaging as messaging |
||||
|
||||
|
||||
def init_message_bench(N=100000): |
||||
t = time.time() |
||||
for _ in range(N): |
||||
dat = messaging.new_message('controlsState') |
||||
|
||||
dt = time.time() - t |
||||
print("Init message %d its, %f s" % (N, dt)) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
init_message_bench() |
@ -1,41 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import zmq |
||||
|
||||
import cereal.messaging as messaging |
||||
from cereal.services import service_list |
||||
|
||||
if __name__ == "__main__": |
||||
poller = zmq.Poller() |
||||
|
||||
fsock = messaging.sub_sock("frame", poller) |
||||
msock = messaging.sub_sock("model", poller) |
||||
|
||||
frmTimes = {} |
||||
proc = [] |
||||
|
||||
last100 = [] |
||||
|
||||
while 1: |
||||
polld = poller.poll(timeout=1000) |
||||
for sock, mode in polld: |
||||
if mode != zmq.POLLIN: |
||||
continue |
||||
if sock == fsock: |
||||
f = messaging.recv_one(sock) |
||||
frmTimes[f.frame.frameId] = f.frame.timestampEof |
||||
else: |
||||
proc.append(messaging.recv_one(sock)) |
||||
nproc = [] |
||||
for mm in proc: |
||||
fid = mm.model.frameId |
||||
|
||||
if fid in frmTimes: |
||||
tm = (mm.logMonoTime-frmTimes[fid])/1e6 |
||||
del frmTimes[fid] |
||||
last100.append(tm) |
||||
last100 = last100[-100:] |
||||
print("%10d: %.2f ms min: %.2f max: %.2f" % (fid, tm, min(last100), max(last100))) |
||||
else: |
||||
nproc.append(mm) |
||||
proc = nproc |
||||
|
@ -1,96 +0,0 @@ |
||||
import timeit |
||||
|
||||
import numpy as np |
||||
import numpy.linalg |
||||
from scipy.linalg import cho_factor, cho_solve |
||||
|
||||
# We are trying to solve the following system |
||||
# (A.T * A) * x = A.T * b |
||||
# Where x are the polynomial coefficients and b is are the input points |
||||
|
||||
# First we build A |
||||
deg = 3 |
||||
x = np.arange(50 * 1.0) |
||||
A = np.vstack(tuple(x**n for n in range(deg, -1, -1))).T |
||||
|
||||
# The first way to solve this is using the pseudoinverse, which can be precomputed |
||||
# x = (A.T * A)^-1 * A^T * b = PINV b |
||||
PINV = np.linalg.pinv(A) |
||||
|
||||
# Another way is using the Cholesky decomposition |
||||
# We can note that at (A.T * A) is always positive definite |
||||
# By precomputing the Cholesky decomposition we can efficiently solve |
||||
# systems of the form (A.T * A) x = c |
||||
CHO = cho_factor(np.dot(A.T, A)) |
||||
|
||||
|
||||
def model_polyfit_old(points, deg=3): |
||||
A = np.vstack(tuple(x**n for n in range(deg, -1, -1))).T |
||||
pinv = np.linalg.pinv(A) |
||||
return np.dot(pinv, map(float, points)) |
||||
|
||||
|
||||
def model_polyfit(points, deg=3): |
||||
A = np.vander(x, deg + 1) |
||||
pinv = np.linalg.pinv(A) |
||||
return np.dot(pinv, map(float, points)) |
||||
|
||||
|
||||
def model_polyfit_cho(points, deg=3): |
||||
A = np.vander(x, deg + 1) |
||||
cho = cho_factor(np.dot(A.T, A)) |
||||
c = np.dot(A.T, points) |
||||
return cho_solve(cho, c, check_finite=False) |
||||
|
||||
|
||||
def model_polyfit_np(points, deg=3): |
||||
return np.polyfit(x, points, deg) |
||||
|
||||
|
||||
def model_polyfit_lstsq(points, deg=3): |
||||
A = np.vander(x, deg + 1) |
||||
return np.linalg.lstsq(A, points, rcond=None)[0] |
||||
|
||||
|
||||
TEST_DATA = np.linspace(0, 5, num=50) + 1. |
||||
|
||||
|
||||
def time_pinv_old(): |
||||
model_polyfit_old(TEST_DATA) |
||||
|
||||
|
||||
def time_pinv(): |
||||
model_polyfit(TEST_DATA) |
||||
|
||||
|
||||
def time_cho(): |
||||
model_polyfit_cho(TEST_DATA) |
||||
|
||||
|
||||
def time_np(): |
||||
model_polyfit_np(TEST_DATA) |
||||
|
||||
|
||||
def time_lstsq(): |
||||
model_polyfit_lstsq(TEST_DATA) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
# Verify correct results |
||||
pinv_old = model_polyfit_old(TEST_DATA) |
||||
pinv = model_polyfit(TEST_DATA) |
||||
cho = model_polyfit_cho(TEST_DATA) |
||||
numpy = model_polyfit_np(TEST_DATA) |
||||
lstsq = model_polyfit_lstsq(TEST_DATA) |
||||
|
||||
assert all(np.isclose(pinv, pinv_old)) |
||||
assert all(np.isclose(pinv, cho)) |
||||
assert all(np.isclose(pinv, numpy)) |
||||
assert all(np.isclose(pinv, lstsq)) |
||||
|
||||
# Run benchmark |
||||
print("Pseudo inverse (old)", timeit.timeit("time_pinv_old()", setup="from __main__ import time_pinv_old", number=10000)) |
||||
print("Pseudo inverse", timeit.timeit("time_pinv()", setup="from __main__ import time_pinv", number=10000)) |
||||
print("Cholesky", timeit.timeit("time_cho()", setup="from __main__ import time_cho", number=10000)) |
||||
print("Numpy leastsq", timeit.timeit("time_lstsq()", setup="from __main__ import time_lstsq", number=10000)) |
||||
print("Numpy polyfit", timeit.timeit("time_np()", setup="from __main__ import time_np", number=10000)) |
@ -1,22 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import time |
||||
|
||||
from common.realtime import sec_since_boot, monotonic_time |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
N = 100000 |
||||
|
||||
t = time.time() |
||||
for _ in range(N): |
||||
monotonic_time() |
||||
dt = time.time() - t |
||||
|
||||
print("Monotonic", dt) |
||||
|
||||
t = time.time() |
||||
for _ in range(N): |
||||
sec_since_boot() |
||||
dt = time.time() - t |
||||
|
||||
print("Boot", dt) |
@ -1,21 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import time |
||||
import zmq |
||||
from hexdump import hexdump |
||||
|
||||
import cereal.messaging as messaging |
||||
from cereal.services import service_list |
||||
|
||||
if __name__ == "__main__": |
||||
controls_state = messaging.pub_sock('controlsState') |
||||
|
||||
while 1: |
||||
dat = messaging.new_message('controlsState') |
||||
|
||||
dat.controlsState.alertText1 = "alert text 1" |
||||
dat.controlsState.alertText2 = "alert text 2" |
||||
dat.controlsState.alertType = "test" |
||||
dat.controlsState.alertSound = "chimeDisengage" |
||||
controls_state.send(dat.to_bytes()) |
||||
|
||||
time.sleep(0.01) |
@ -1,107 +0,0 @@ |
||||
import os |
||||
import sys |
||||
|
||||
import zmq |
||||
from lru import LRU |
||||
|
||||
from cereal import log |
||||
from common.realtime import Ratekeeper |
||||
import cereal.messaging as messaging |
||||
from cereal.services import service_list |
||||
|
||||
def cputime_total(ct): |
||||
return ct.user+ct.nice+ct.system+ct.idle+ct.iowait+ct.irq+ct.softirq |
||||
|
||||
def cputime_busy(ct): |
||||
return ct.user+ct.nice+ct.system+ct.irq+ct.softirq |
||||
|
||||
def cpu_dtotal(l1, l2): |
||||
t1_total = sum(cputime_total(ct) for ct in l1.cpuTimes) |
||||
t2_total = sum(cputime_total(ct) for ct in l2.cpuTimes) |
||||
return t2_total - t1_total |
||||
|
||||
def cpu_percent(l1, l2): |
||||
dtotal = cpu_dtotal(l1, l2) |
||||
t1_busy = sum(cputime_busy(ct) for ct in l1.cpuTimes) |
||||
t2_busy = sum(cputime_busy(ct) for ct in l2.cpuTimes) |
||||
|
||||
dbusy = t2_busy - t1_busy |
||||
|
||||
if dbusy < 0 or dtotal <= 0: |
||||
return 0.0 |
||||
return dbusy / dtotal |
||||
|
||||
def proc_cpu_percent(proc1, proc2, l1, l2): |
||||
dtotal = cpu_dtotal(l1, l2) |
||||
|
||||
dproc = (proc2.cpuUser+proc2.cpuSystem) - (proc1.cpuUser+proc1.cpuSystem) |
||||
if dproc < 0: |
||||
return 0.0 |
||||
|
||||
return dproc / dtotal |
||||
|
||||
def display_cpu(pl1, pl2): |
||||
l1, l2 = pl1.procLog, pl2.procLog |
||||
|
||||
print(cpu_percent(l1, l2)) |
||||
|
||||
procs1 = dict((proc.pid, proc) for proc in l1.procs) |
||||
procs2 = dict((proc.pid, proc) for proc in l2.procs) |
||||
|
||||
procs_print = 4 |
||||
|
||||
procs_with_percent = sorted((proc_cpu_percent(procs1[proc.pid], proc, l1, l2), proc) for proc in l2.procs |
||||
if proc.pid in procs1) |
||||
for percent, proc in procs_with_percent[-1:-procs_print-1:-1]: |
||||
print(percent, proc.name) |
||||
|
||||
print() |
||||
|
||||
|
||||
def main(): |
||||
frame_cache = LRU(16) |
||||
md_cache = LRU(16) |
||||
plan_cache = LRU(16) |
||||
|
||||
frame_sock = messaging.sub_sock('frame') |
||||
md_sock = messaging.sub_sock('model') |
||||
plan_sock = messaging.sub_sock('plan') |
||||
controls_state_sock = messaging.sub_sock('controlsState') |
||||
|
||||
proc = messaging.sub_sock('procLog') |
||||
pls = [None, None] |
||||
|
||||
rk = Ratekeeper(10) |
||||
while True: |
||||
|
||||
for msg in messaging.drain_sock(frame_sock): |
||||
frame_cache[msg.frame.frameId] = msg |
||||
|
||||
for msg in messaging.drain_sock(md_sock): |
||||
md_cache[msg.logMonoTime] = msg |
||||
|
||||
for msg in messaging.drain_sock(plan_sock): |
||||
plan_cache[msg.logMonoTime] = msg |
||||
|
||||
controls_state = messaging.recv_sock(controls_state_sock) |
||||
if controls_state is not None: |
||||
plan_time = controls_state.controlsState.planMonoTime |
||||
if plan_time != 0 and plan_time in plan_cache: |
||||
plan = plan_cache[plan_time] |
||||
md_time = plan.plan.mdMonoTime |
||||
if md_time != 0 and md_time in md_cache: |
||||
md = md_cache[md_time] |
||||
frame_id = md.model.frameId |
||||
if frame_id != 0 and frame_id in frame_cache: |
||||
frame = frame_cache[frame_id] |
||||
print("controls lag: %.2fms" % ((controls_state.logMonoTime - frame.frame.timestampEof) / 1e6)) |
||||
|
||||
|
||||
pls = (pls+messaging.drain_sock(proc))[-2:] |
||||
if None not in pls: |
||||
display_cpu(*pls) |
||||
|
||||
rk.keep_time() |
||||
|
||||
if __name__ == "__main__": |
||||
main() |
@ -1,83 +0,0 @@ |
||||
import numpy as np |
||||
import matplotlib.pyplot as plt |
||||
from mpl_toolkits.mplot3d import Axes3D |
||||
from matplotlib import cm |
||||
from matplotlib.ticker import LinearLocator, FormatStrFormatter |
||||
from scipy.optimize import minimize |
||||
|
||||
a = -9.81 |
||||
dt = 0.1 |
||||
|
||||
r = 2.0 |
||||
|
||||
v_ls = [] |
||||
x_ls = [] |
||||
v_egos = [] |
||||
|
||||
for vv_ego in np.arange(35, 40, 1): |
||||
for vv_l in np.arange(35, 40, 1): |
||||
for xx_l in np.arange(0, 100, 1.0): |
||||
x_l = xx_l |
||||
v_l = vv_l |
||||
v_ego = vv_ego |
||||
x_ego = 0.0 |
||||
|
||||
ttc = None |
||||
for t in np.arange(0, 100, dt): |
||||
x_l += v_l * dt |
||||
v_l += a * dt |
||||
v_l = max(v_l, 0.0) |
||||
|
||||
x_ego += v_ego * dt |
||||
if t > r: |
||||
v_ego += a * dt |
||||
v_ego = max(v_ego, 0.0) |
||||
|
||||
if x_ego >= x_l: |
||||
ttc = t |
||||
break |
||||
|
||||
if ttc is None: |
||||
if xx_l < 0.1: |
||||
break |
||||
|
||||
v_ls.append(vv_l) |
||||
x_ls.append(xx_l) |
||||
v_egos.append(vv_ego) |
||||
break |
||||
|
||||
|
||||
def eval_f(x, v_ego, v_l): |
||||
est = x[0] * v_l + x[1] * v_l**2 \ |
||||
+ x[2] * v_ego + x[3] * v_ego**2 |
||||
return est |
||||
|
||||
def f(x): |
||||
r = 0.0 |
||||
for v_ego, v_l, x_l in zip(v_egos, v_ls, x_ls): |
||||
est = eval_f(x, v_ego, v_l) |
||||
r += (x_l - est)**2 |
||||
|
||||
return r |
||||
|
||||
x0 = [0.5, 0.5, 0.5, 0.5] |
||||
res = minimize(f, x0, method='Nelder-Mead') |
||||
print(res) |
||||
print(res.x) |
||||
|
||||
g = 9.81 |
||||
t_r = 1.8 |
||||
|
||||
estimated = [4.0 + eval_f(res.x, v_ego, v_l) for (v_ego, v_l) in zip(v_egos, v_ls)] |
||||
new_formula = [4.0 + v_ego * t_r - (v_l - v_ego) * t_r + v_ego**2/(2*g) - v_l**2 / (2*g) for (v_ego, v_l) in zip(v_egos, v_ls)] |
||||
|
||||
fig = plt.figure() |
||||
ax = fig.add_subplot(111, projection='3d') |
||||
surf = ax.scatter(v_egos, v_ls, x_ls, s=1) |
||||
# surf = ax.scatter(v_egos, v_ls, estimated, s=1) |
||||
surf = ax.scatter(v_egos, v_ls, new_formula, s=1) |
||||
|
||||
ax.set_xlabel('v ego') |
||||
ax.set_ylabel('v lead') |
||||
ax.set_zlabel('min distance') |
||||
plt.show() |
@ -1,178 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import sys |
||||
import math |
||||
import pygame |
||||
import pyproj |
||||
|
||||
import zmq |
||||
import cereal.messaging as messaging |
||||
from cereal.services import service_list |
||||
import numpy as np |
||||
|
||||
METER = 25 |
||||
YSCALE = 1 |
||||
|
||||
def to_grid(pt): |
||||
return (int(round(pt[0] * METER + 100)), int(round(pt[1] * METER * YSCALE + 500))) |
||||
|
||||
def gps_latlong_to_meters(gps_values, zero): |
||||
inProj = pyproj.Proj(init='epsg:4326') |
||||
outProj = pyproj.Proj(("+proj=tmerc +lat_0={:f} +lon_0={:f} +units=m" |
||||
" +k=1. +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +no_defs" |
||||
"+towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37").format(*zero)) |
||||
gps_x, gps_y = pyproj.transform(inProj, outProj, gps_values[1], gps_values[0]) |
||||
return gps_x, gps_y |
||||
|
||||
def rot(hrad): |
||||
return [[math.cos(hrad), -math.sin(hrad)], |
||||
[math.sin(hrad), math.cos(hrad)]] |
||||
|
||||
class Car(): |
||||
CAR_WIDTH = 2.0 |
||||
CAR_LENGTH = 4.5 |
||||
|
||||
def __init__(self, c): |
||||
self.car = pygame.Surface((METER*self.CAR_LENGTH*YSCALE, METER*self.CAR_LENGTH)) |
||||
self.car.set_alpha(64) |
||||
self.car.fill((0,0,0)) |
||||
self.car.set_colorkey((0,0,0)) |
||||
pygame.draw.rect(self.car, c, (METER*1.25*YSCALE, 0, METER*self.CAR_WIDTH*YSCALE, METER*self.CAR_LENGTH), 1) |
||||
|
||||
self.x = 0.0 |
||||
self.y = 0.0 |
||||
self.heading = 0.0 |
||||
|
||||
def from_car_frame(self, pts): |
||||
ret = [] |
||||
for x, y in pts: |
||||
rx, ry = np.dot(rot(math.radians(self.heading)), [x,y]) |
||||
ret.append((self.x + rx, self.y + ry)) |
||||
return ret |
||||
|
||||
def draw(self, screen): |
||||
cars = pygame.transform.rotate(self.car, 90-self.heading) |
||||
pt = (self.x - self.CAR_LENGTH/2, self.y - self.CAR_LENGTH/2) |
||||
screen.blit(cars, to_grid(pt)) |
||||
|
||||
|
||||
def ui_thread(addr="127.0.0.1"): |
||||
#from selfdrive.radar.nidec.interface import RadarInterface |
||||
#RI = RadarInterface() |
||||
|
||||
pygame.display.set_caption("comma top down UI") |
||||
size = (1920,1000) |
||||
screen = pygame.display.set_mode(size, pygame.DOUBLEBUF) |
||||
|
||||
liveLocation = messaging.sub_sock('liveLocation', addr=addr) |
||||
|
||||
#model = messaging.sub_sock('testModel', addr=addr) |
||||
model = messaging.sub_sock('model', addr=addr) |
||||
|
||||
plan = messaging.sub_sock('plan', addr=addr) |
||||
frame = messaging.sub_sock('frame', addr=addr) |
||||
liveTracks = messaging.sub_sock('liveTracks', addr=addr) |
||||
|
||||
car = Car((255,0,255)) |
||||
|
||||
base = None |
||||
|
||||
lb = [] |
||||
|
||||
ts_map = {} |
||||
|
||||
while 1: |
||||
lloc = messaging.recv_sock(liveLocation, wait=True) |
||||
lloc_ts = lloc.logMonoTime |
||||
lloc = lloc.liveLocation |
||||
|
||||
# 50 ms of lag |
||||
lb.append(lloc) |
||||
if len(lb) < 2: |
||||
continue |
||||
lb = lb[-1:] |
||||
|
||||
lloc = lb[0] |
||||
|
||||
# spacebar reset |
||||
for event in pygame.event.get(): |
||||
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: |
||||
base = None |
||||
|
||||
# offscreen reset |
||||
rp = to_grid((car.x, car.y)) |
||||
if rp[0] > (size[0] - 100) or rp[1] > (size[1] - 100) or rp[0] < 0 or rp[1] < 100: |
||||
base = None |
||||
|
||||
|
||||
if base == None: |
||||
screen.fill((10,10,10)) |
||||
base = lloc |
||||
|
||||
# transform pt into local |
||||
pt = gps_latlong_to_meters((lloc.lat, lloc.lon), (base.lat, base.lon)) |
||||
hrad = math.radians(270+base.heading) |
||||
pt = np.dot(rot(hrad), pt) |
||||
|
||||
car.x, car.y = pt[0], -pt[1] |
||||
car.heading = lloc.heading - base.heading |
||||
|
||||
#car.draw(screen) |
||||
pygame.draw.circle(screen, (192,64,192,128), to_grid((car.x, car.y)), 4) |
||||
|
||||
""" |
||||
lt = messaging.recv_sock(liveTracks, wait=False) |
||||
if lt is not None: |
||||
for track in lt.liveTracks: |
||||
pt = car.from_car_frame([[track.dRel, -track.yRel]])[0] |
||||
if track.stationary: |
||||
pygame.draw.circle(screen, (192,128,32,64), to_grid(pt), 1) |
||||
""" |
||||
|
||||
|
||||
""" |
||||
rr = RI.update() |
||||
for pt in rr.points: |
||||
cpt = car.from_car_frame([[pt.dRel + 2.7, -pt.yRel]])[0] |
||||
if (pt.vRel + lloc.speed) < 1.0: |
||||
pygame.draw.circle(screen, (192,128,32,64), to_grid(cpt), 1) |
||||
""" |
||||
|
||||
|
||||
for f in messaging.drain_sock(frame): |
||||
ts_map[f.frame.frameId] = f.frame.timestampEof |
||||
|
||||
def draw_model_data(mm, c): |
||||
pts = car.from_car_frame(zip(np.arange(0.0, 50.0), -np.array(mm))) |
||||
lt = 255 |
||||
for pt in pts: |
||||
screen.set_at(to_grid(pt), (c[0]*lt,c[1]*lt,c[2]*lt,lt)) |
||||
lt -= 2 |
||||
#pygame.draw.lines(screen, (c[0]*lt,c[1]*lt,c[2]*lt,lt), False, map(to_grid, pts), 1) |
||||
|
||||
md = messaging.recv_sock(model, wait=False) |
||||
if md: |
||||
if md.model.frameId in ts_map: |
||||
f_ts = ts_map[md.model.frameId] |
||||
print((lloc_ts - f_ts) * 1e-6,"ms") |
||||
|
||||
#draw_model_data(md.model.path.points, (1,0,0)) |
||||
if md.model.leftLane.prob > 0.3: |
||||
draw_model_data(md.model.leftLane.points, (0,1,0)) |
||||
if md.model.rightLane.prob > 0.3: |
||||
draw_model_data(md.model.rightLane.points, (0,1,0)) |
||||
#if md.model.leftLane.prob > 0.3 and md.model.rightLane.prob > 0.3: |
||||
# draw_model_data([(x+y)/2 for x,y in zip(md.model.leftLane.points, md.model.rightLane.points)], (1,1,0)) |
||||
|
||||
tplan = messaging.recv_sock(plan, wait=False) |
||||
if tplan: |
||||
pts = np.polyval(tplan.plan.dPoly, np.arange(0.0, 50.0)) |
||||
draw_model_data(pts, (1,1,1)) |
||||
|
||||
pygame.display.flip() |
||||
|
||||
if __name__ == "__main__": |
||||
if len(sys.argv) > 1: |
||||
ui_thread(sys.argv[1]) |
||||
else: |
||||
ui_thread() |
||||
|
@ -1,54 +0,0 @@ |
||||
#!/usr/bin/env python3 |
||||
import numpy as np |
||||
from selfdrive.controls.lib.vehicle_model import VehicleModel, calc_slip_factor |
||||
from selfdrive.car.honda.interface import CarInterface |
||||
|
||||
def mpc_path_prediction(sa, u, psi_0, dt, VM): |
||||
# sa and u needs to be numpy arrays |
||||
sa_w = sa * np.pi / 180. / VM.CP.steerRatio |
||||
x = np.zeros(len(sa)) |
||||
y = np.zeros(len(sa)) |
||||
psi = np.ones(len(sa)) * psi_0 |
||||
|
||||
for i in range(0, len(sa)-1): |
||||
x[i+1] = x[i] + np.cos(psi[i]) * u[i] * dt |
||||
y[i+1] = y[i] + np.sin(psi[i]) * u[i] * dt |
||||
psi[i+1] = psi[i] + sa_w[i] * u[i] * dt * VM.curvature_factor(u[i]) |
||||
|
||||
return x, y, psi |
||||
|
||||
|
||||
def model_path_prediction(sa, u, psi_0, dt, VM): |
||||
# steady state solution |
||||
sa_r = sa * np.pi / 180. |
||||
x = np.zeros(len(sa)) |
||||
y = np.zeros(len(sa)) |
||||
psi = np.ones(len(sa)) * psi_0 |
||||
for i in range(0, len(sa)-1): |
||||
|
||||
out = VM.steady_state_sol(sa_r[i], u[i]) |
||||
|
||||
x[i+1] = x[i] + np.cos(psi[i]) * u[i] * dt - np.sin(psi[i]) * out[0] * dt |
||||
y[i+1] = y[i] + np.sin(psi[i]) * u[i] * dt + np.cos(psi[i]) * out[0] * dt |
||||
psi[i+1] = psi[i] + out[1] * dt |
||||
|
||||
return x, y, psi |
||||
|
||||
if __name__ == "__main__": |
||||
CP = CarInterface.get_params("HONDA CIVIC 2016 TOURING") |
||||
print(CP) |
||||
VM = VehicleModel(CP) |
||||
print(VM.steady_state_sol(.1, 0.15)) |
||||
print(calc_slip_factor(VM)) |
||||
print("Curv", VM.curvature_factor(30.)) |
||||
|
||||
dt = 0.05 |
||||
st = 20 |
||||
u = np.ones(st) * 1. |
||||
sa = np.ones(st) * 1. |
||||
|
||||
out = mpc_path_prediction(sa, u, dt, VM) |
||||
out_model = model_path_prediction(sa, u, dt, VM) |
||||
|
||||
print("mpc", out) |
||||
print("model", out_model) |
Loading…
Reference in new issue