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.
		
		
		
		
		
			
		
			
				
					
					
						
							168 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							168 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
 | |
| import math
 | |
| 
 | |
| # 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()
 | |
| 
 |