#! /usr/bin/env python # type: ignore import matplotlib.pyplot as plt from selfdrive.controls.lib.lateral_mpc import libmpc_py from selfdrive.controls.lib.drive_helpers import MPC_COST_LAT import math libmpc = libmpc_py.libmpc libmpc.init(MPC_COST_LAT.PATH, MPC_COST_LAT.LANE, MPC_COST_LAT.HEADING, 1.) cur_state = libmpc_py.ffi.new("state_t *") cur_state[0].x = 0.0 cur_state[0].y = 0.0 cur_state[0].psi = 0.0 cur_state[0].delta = 0.0 mpc_solution = libmpc_py.ffi.new("log_t *") xx = [] yy = [] deltas = [] psis = [] times = [] curvature_factor = 0.3 v_ref = 1.0 * 20.12 # 45 mph LANE_WIDTH = 3.7 p = [0.0, 0.0, 0.0, 0.0] p_l = p[:] p_l[3] += LANE_WIDTH / 2.0 p_r = p[:] p_r[3] -= LANE_WIDTH / 2.0 l_poly = libmpc_py.ffi.new("double[4]", p_l) r_poly = libmpc_py.ffi.new("double[4]", p_r) p_poly = libmpc_py.ffi.new("double[4]", p) l_prob = 1.0 r_prob = 1.0 p_prob = 1.0 for i in range(1): cur_state[0].delta = math.radians(510. / 13.) libmpc.run_mpc(cur_state, mpc_solution, l_poly, r_poly, p_poly, l_prob, r_prob, curvature_factor, v_ref, LANE_WIDTH) timesi = [] ct = 0 for i in range(21): timesi.append(ct) if i <= 4: ct += 0.05 else: ct += 0.15 xi = list(mpc_solution[0].x) yi = list(mpc_solution[0].y) psii = list(mpc_solution[0].psi) deltai = list(mpc_solution[0].delta) print("COST: ", mpc_solution[0].cost) plt.figure(0) plt.subplot(3, 1, 1) plt.plot(timesi, psii) plt.ylabel('psi') plt.grid(True) plt.subplot(3, 1, 2) plt.plot(timesi, deltai) plt.ylabel('delta') plt.grid(True) plt.subplot(3, 1, 3) plt.plot(timesi, yi) plt.ylabel('y') plt.grid(True) plt.show() #### UNCOMMENT TO CHECK ITERATIVE SOLUTION #### ####for i in range(100): #### libmpc.run_mpc(cur_state, mpc_solution, l_poly, r_poly, p_poly, l_prob, r_prob, #### curvature_factor, v_ref, LANE_WIDTH) #### print "x", list(mpc_solution[0].x) #### print "y", list(mpc_solution[0].y) #### print "delta", list(mpc_solution[0].delta) #### print "psi", list(mpc_solution[0].psi) #### # cur_state[0].x = mpc_solution[0].x[1] #### # cur_state[0].y = mpc_solution[0].y[1] #### # cur_state[0].psi = mpc_solution[0].psi[1] #### cur_state[0].delta = radians(200 / 13.)#mpc_solution[0].delta[1] #### #### xx.append(cur_state[0].x) #### yy.append(cur_state[0].y) #### psis.append(cur_state[0].psi) #### deltas.append(cur_state[0].delta) #### times.append(i * 0.05) #### #### ####def f(x): #### return p_poly[0] * x**3 + p_poly[1] * x**2 + p_poly[2] * x + p_poly[3] #### #### ##### planned = map(f, xx) ##### plt.figure(1) ##### plt.plot(yy, xx, 'r-') ##### plt.plot(planned, xx, 'b--', linewidth=0.5) ##### plt.axes().set_aspect('equal', 'datalim') ##### plt.gca().invert_xaxis() #### ##### planned = map(f, map(float, list(mpc_solution[0].x)[1:])) ##### plt.figure(1) ##### plt.plot(map(float, list(mpc_solution[0].y)[1:]), map(float, list(mpc_solution[0].x)[1:]), 'r-') ##### plt.plot(planned, map(float, list(mpc_solution[0].x)[1:]), 'b--', linewidth=0.5) ##### plt.axes().set_aspect('equal', 'datalim') ##### plt.gca().invert_xaxis() #### ####plt.figure(2) ####plt.subplot(2, 1, 1) ####plt.plot(times, psis) ####plt.ylabel('psi') ####plt.subplot(2, 1, 2) ####plt.plot(times, deltas) ####plt.ylabel('delta') #### #### ####plt.show()