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.
		
		
		
		
		
			
		
			
				
					
					
						
							130 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							130 lines
						
					
					
						
							3.2 KiB
						
					
					
				#! /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()
 | 
						|
 |