You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.6 KiB
167 lines
4.6 KiB
#! /usr/bin/env python
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from selfdrive.controls.lib.longitudinal_mpc import libmpc_py
|
|
from selfdrive.controls.lib.drive_helpers import MPC_COST_LONG
|
|
|
|
# plot liongitudinal MPC trajectory by defining boundary conditions:
|
|
# ego and lead vehicles state. Use this script to tune MPC costs
|
|
|
|
def RW(v_ego, v_l):
|
|
TR = 1.8
|
|
G = 9.81
|
|
return (v_ego * TR - (v_l - v_ego) * TR + v_ego*v_ego/(2*G) - v_l*v_l / (2*G))
|
|
|
|
|
|
def NORM_RW_ERROR(v_ego, v_l, p):
|
|
return (RW(v_ego, v_l) + 4.0 - p)
|
|
#return (RW(v_ego, v_l) + 4.0 - p) / (np.sqrt(v_ego + 0.5) + 0.1)
|
|
|
|
|
|
v_ego = 20.0
|
|
a_ego = 0
|
|
|
|
x_lead = 10.0
|
|
v_lead = 20.0
|
|
a_lead = -3.0
|
|
a_lead_tau = 0.
|
|
|
|
# v_ego = 7.02661012716
|
|
# a_ego = -1.26143024772
|
|
|
|
# x_lead = 29.625 + 20
|
|
# v_lead = 0.725235462189 + 1
|
|
# a_lead = -1.00025629997
|
|
|
|
# a_lead_tau = 2.90729817665
|
|
|
|
#min_a_lead_tau = (a_lead**2 * math.pi) / (2 * (v_lead + 0.01)**2)
|
|
min_a_lead_tau = 0.0
|
|
|
|
print(a_lead_tau, min_a_lead_tau)
|
|
a_lead_tau = max(a_lead_tau, min_a_lead_tau)
|
|
|
|
ffi, libmpc = libmpc_py.get_libmpc(1)
|
|
libmpc.init(MPC_COST_LONG.TTC, MPC_COST_LONG.DISTANCE, MPC_COST_LONG.ACCELERATION, MPC_COST_LONG.JERK)
|
|
libmpc.init_with_simulation(v_ego, x_lead, v_lead, a_lead, a_lead_tau)
|
|
|
|
cur_state = ffi.new("state_t *")
|
|
cur_state[0].x_ego = 0.0
|
|
cur_state[0].v_ego = v_ego
|
|
cur_state[0].a_ego = a_ego
|
|
cur_state[0].x_l = x_lead
|
|
cur_state[0].v_l = v_lead
|
|
|
|
mpc_solution = ffi.new("log_t *")
|
|
|
|
for _ in range(10):
|
|
print(libmpc.run_mpc(cur_state, mpc_solution, a_lead_tau, a_lead))
|
|
|
|
|
|
for i in range(21):
|
|
print("t: %.2f\t x_e: %.2f\t v_e: %.2f\t a_e: %.2f\t" % (mpc_solution[0].t[i], mpc_solution[0].x_ego[i], mpc_solution[0].v_ego[i], mpc_solution[0].a_ego[i]))
|
|
print("x_l: %.2f\t v_l: %.2f\t \t" % (mpc_solution[0].x_l[i], mpc_solution[0].v_l[i]))
|
|
|
|
t = np.hstack([np.arange(0., 1.0, 0.2), np.arange(1.0, 10.1, 0.6)])
|
|
|
|
print(map(float, mpc_solution[0].x_ego)[-1])
|
|
print(map(float, mpc_solution[0].x_l)[-1] - map(float, mpc_solution[0].x_ego)[-1])
|
|
|
|
plt.figure(figsize=(8, 8))
|
|
|
|
plt.subplot(4, 1, 1)
|
|
x_l = np.array(map(float, mpc_solution[0].x_l))
|
|
plt.plot(t, map(float, mpc_solution[0].x_ego))
|
|
plt.plot(t, x_l)
|
|
plt.legend(['ego', 'lead'])
|
|
plt.title('x')
|
|
plt.grid()
|
|
|
|
plt.subplot(4, 1, 2)
|
|
v_ego = np.array(map(float, mpc_solution[0].v_ego))
|
|
v_l = np.array(map(float, mpc_solution[0].v_l))
|
|
plt.plot(t, v_ego)
|
|
plt.plot(t, v_l)
|
|
plt.legend(['ego', 'lead'])
|
|
plt.ylim([-1, max(max(v_ego), max(v_l))])
|
|
plt.title('v')
|
|
plt.grid()
|
|
|
|
plt.subplot(4, 1, 3)
|
|
plt.plot(t, map(float, mpc_solution[0].a_ego))
|
|
plt.plot(t, map(float, mpc_solution[0].a_l))
|
|
plt.legend(['ego', 'lead'])
|
|
plt.title('a')
|
|
plt.grid()
|
|
|
|
|
|
plt.subplot(4, 1, 4)
|
|
d_l = np.array(map(float, mpc_solution[0].x_l)) - np.array(map(float, mpc_solution[0].x_ego))
|
|
desired = 4.0 + RW(v_ego, v_l)
|
|
|
|
plt.plot(t, d_l)
|
|
plt.plot(t, desired, '--')
|
|
plt.ylim(-1, max(max(desired), max(d_l)))
|
|
plt.legend(['relative distance', 'desired distance'])
|
|
plt.grid()
|
|
|
|
plt.show()
|
|
|
|
# c1 = np.exp(0.3 * NORM_RW_ERROR(v_ego, v_l, d_l))
|
|
# c2 = np.exp(4.5 - d_l)
|
|
# print(c1)
|
|
# print(c2)
|
|
|
|
# plt.figure()
|
|
# plt.plot(t, c1, label="NORM_RW_ERROR")
|
|
# plt.plot(t, c2, label="penalty function")
|
|
# plt.legend()
|
|
|
|
# ## OLD MPC
|
|
# a_lead_tau = 1.5
|
|
# a_lead_tau = max(a_lead_tau, -a_lead / (v_lead + 0.01))
|
|
|
|
# ffi, libmpc = libmpc_py.get_libmpc(1)
|
|
# libmpc.init(MPC_COST_LONG.TTC, MPC_COST_LONG.DISTANCE, MPC_COST_LONG.ACCELERATION, MPC_COST_LONG.JERK)
|
|
# libmpc.init_with_simulation(v_ego, x_lead, v_lead, a_lead, a_lead_tau)
|
|
|
|
# cur_state = ffi.new("state_t *")
|
|
# cur_state[0].x_ego = 0.0
|
|
# cur_state[0].v_ego = v_ego
|
|
# cur_state[0].a_ego = a_ego
|
|
# cur_state[0].x_lead = x_lead
|
|
# cur_state[0].v_lead = v_lead
|
|
# cur_state[0].a_lead = a_lead
|
|
|
|
# mpc_solution = ffi.new("log_t *")
|
|
|
|
# for _ in range(10):
|
|
# print libmpc.run_mpc(cur_state, mpc_solution, a_lead_tau)
|
|
|
|
# t = np.hstack([np.arange(0., 1.0, 0.2), np.arange(1.0, 10.1, 0.6)])
|
|
|
|
# print(map(float, mpc_solution[0].x_ego)[-1])
|
|
# print(map(float, mpc_solution[0].x_lead)[-1] - map(float, mpc_solution[0].x_ego)[-1])
|
|
# plt.subplot(4, 2, 2)
|
|
# plt.plot(t, map(float, mpc_solution[0].x_ego))
|
|
# plt.plot(t, map(float, mpc_solution[0].x_lead))
|
|
# plt.legend(['ego', 'lead'])
|
|
# plt.title('x')
|
|
|
|
# plt.subplot(4, 2, 4)
|
|
# plt.plot(t, map(float, mpc_solution[0].v_ego))
|
|
# plt.plot(t, map(float, mpc_solution[0].v_lead))
|
|
# plt.legend(['ego', 'lead'])
|
|
# plt.title('v')
|
|
|
|
# plt.subplot(4, 2, 6)
|
|
# plt.plot(t, map(float, mpc_solution[0].a_ego))
|
|
# plt.plot(t, map(float, mpc_solution[0].a_lead))
|
|
# plt.legend(['ego', 'lead'])
|
|
# plt.title('a')
|
|
|
|
|
|
# plt.subplot(4, 2, 8)
|
|
# plt.plot(t, np.array(map(float, mpc_solution[0].x_lead)) - np.array(map(float, mpc_solution[0].x_ego)))
|
|
|
|
# plt.show()
|
|
|