WIP: Honda Steering Improvements (#983)
* move honda steer params to CarParams * use breakpoints/values from firmware * remove comment * civic fw mod max included deadzone * civic bosch needs to be separate * script to measure steering accuracy * civic tuning * update cr-v values * cleanup * averaging over 10 samples was silly * update stock civic and cr-v tuning * remove comment * update replay expected resultspull/1134/head
parent
1328a41a35
commit
57c44e3705
5 changed files with 148 additions and 35 deletions
@ -0,0 +1,80 @@ |
||||
#!/usr/bin/env python3 |
||||
import os |
||||
import argparse |
||||
import signal |
||||
from collections import deque, defaultdict |
||||
from statistics import mean |
||||
|
||||
import cereal.messaging as messaging |
||||
|
||||
def sigint_handler(signal, frame): |
||||
print("handler!") |
||||
exit(0) |
||||
signal.signal(signal.SIGINT, sigint_handler) |
||||
|
||||
if __name__ == "__main__": |
||||
|
||||
parser = argparse.ArgumentParser(description='Sniff a communcation socket') |
||||
parser.add_argument('--addr', default='127.0.0.1') |
||||
args = parser.parse_args() |
||||
|
||||
if args.addr != "127.0.0.1": |
||||
os.environ["ZMQ"] = "1" |
||||
messaging.context = messaging.Context() |
||||
|
||||
carControl = messaging.sub_sock('carControl', addr=args.addr, conflate=True) |
||||
sm = messaging.SubMaster(['carState', 'carControl', 'controlsState'], addr=args.addr) |
||||
|
||||
msg_cnt = 0 |
||||
stats = defaultdict(lambda: {'err': 0, "cnt": 0, "=": 0, "+": 0, "-": 0}) |
||||
cnt = 0 |
||||
total_error = 0 |
||||
|
||||
while messaging.recv_one(carControl): |
||||
sm.update() |
||||
msg_cnt += 1 |
||||
|
||||
actual_speed = sm['carState'].vEgo |
||||
enabled = sm['controlsState'].enabled |
||||
steer_override = sm['controlsState'].steerOverride |
||||
|
||||
# must be above 10 m/s, engaged and not overriding steering |
||||
if actual_speed > 10.0 and enabled and not steer_override: |
||||
cnt += 1 |
||||
|
||||
# wait 5 seconds after engage/override |
||||
if cnt >= 500: |
||||
# calculate error before rounding |
||||
actual_angle = sm['controlsState'].angleSteers |
||||
desired_angle = sm['carControl'].actuators.steerAngle |
||||
angle_error = abs(desired_angle - actual_angle) |
||||
|
||||
# round numbers |
||||
actual_angle = round(actual_angle, 1) |
||||
desired_angle = round(desired_angle, 1) |
||||
angle_error = round(angle_error, 2) |
||||
angle_abs = int(abs(round(desired_angle, 0))) |
||||
|
||||
# collect stats |
||||
stats[angle_abs]["err"] += angle_error |
||||
stats[angle_abs]["cnt"] += 1 |
||||
if actual_angle == desired_angle: |
||||
stats[angle_abs]["="] += 1 |
||||
else: |
||||
if desired_angle == 0.: |
||||
overshoot = True |
||||
else: |
||||
overshoot = desired_angle < actual_angle if desired_angle > 0. else desired_angle > actual_angle |
||||
stats[angle_abs]["+" if overshoot else "-"] += 1 |
||||
else: |
||||
cnt = 0 |
||||
|
||||
if msg_cnt % 100 == 0: |
||||
print(chr(27) + "[2J") |
||||
if cnt != 0: |
||||
print("COLLECTING ...") |
||||
else: |
||||
print("DISABLED (speed too low, not engaged, or steer override)") |
||||
for k in sorted(stats.keys()): |
||||
v = stats[k] |
||||
print(f'angle: {k:#2} | error: {round(v["err"] / v["cnt"], 2):2.2f} | =:{int(v["="] / v["cnt"] * 100):#3}% | +:{int(v["+"] / v["cnt"] * 100):#4}% | -:{int(v["-"] / v["cnt"] * 100):#3}% | count: {v["cnt"]:#4}') |
@ -1 +1 @@ |
||||
d0e2657d3a57ba231e3775d3bc901221d8794281 |
||||
e4fabe28e2223e40376320812ff803e833f72a7f |
Loading…
Reference in new issue