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()
 | |
| 
 |