parent
							
								
									99e92c7ae2
								
							
						
					
					
						commit
						82c112dad0
					
				
				 1 changed files with 60 additions and 0 deletions
			
			
		| @ -0,0 +1,60 @@ | ||||
| #!/usr/bin/env python3 | ||||
| import sys | ||||
| import numpy as np | ||||
| import matplotlib.pyplot as plt | ||||
| from sklearn import linear_model | ||||
| 
 | ||||
| from tools.lib.route import Route | ||||
| from tools.lib.logreader import MultiLogIterator | ||||
| 
 | ||||
| 
 | ||||
| MIN_SAMPLES = 30*100 | ||||
| 
 | ||||
| def to_signed(n, bits): | ||||
|   if n >= (1 << max((bits - 1), 0)): | ||||
|     n = n - (1 << max(bits, 0)) | ||||
|   return n | ||||
| 
 | ||||
| def get_eps_factor(lr, plot=False): | ||||
| 
 | ||||
|   engaged = False | ||||
|   torque_cmd, eps_torque = None, None | ||||
|   cmds, eps = [], [] | ||||
| 
 | ||||
|   for msg in lr: | ||||
|     if msg.which() != 'can': | ||||
|       continue | ||||
| 
 | ||||
|     for m in msg.can: | ||||
|       if m.address == 0x2e4 and m.src == 128: | ||||
|         engaged = bool(m.dat[0] & 1) | ||||
|         torque_cmd = to_signed((m.dat[1] << 8) | m.dat[2], 16) | ||||
|       elif m.address == 0x260 and m.src == 0: | ||||
|         eps_torque = to_signed((m.dat[5] << 8) | m.dat[6], 16) | ||||
| 
 | ||||
|     if engaged and torque_cmd is not None and eps_torque is not None: | ||||
|       cmds.append(torque_cmd) | ||||
|       eps.append(eps_torque) | ||||
|     else: | ||||
|       if len(cmds) > MIN_SAMPLES: | ||||
|         break | ||||
|       cmds, eps = [], [] | ||||
| 
 | ||||
|   if len(cmds) < MIN_SAMPLES: | ||||
|     raise Exception("too few samples found in route") | ||||
| 
 | ||||
|   lm = linear_model.LinearRegression(fit_intercept=False) | ||||
|   lm.fit(np.array(cmds).reshape(-1, 1), eps) | ||||
|   scale_factor = 1./lm.coef_[0] | ||||
| 
 | ||||
|   if plot: | ||||
|     plt.plot(np.array(eps)*scale_factor) | ||||
|     plt.plot(cmds) | ||||
|     plt.show() | ||||
|   return scale_factor | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|   r = Route(sys.argv[1]) | ||||
|   lr = MultiLogIterator(r.log_paths(), wraparound=False) | ||||
|   n = get_eps_factor(lr, plot="--plot" in sys.argv) | ||||
|   print("EPS torque factor: ", n) | ||||
					Loading…
					
					
				
		Reference in new issue