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