add notebook

pull/31195/head
Cameron Clough 1 year ago
parent 062591411d
commit d2363b7492
  1. 297
      selfdrive/car/ford/tests/reduced_ecus.ipynb

@ -0,0 +1,297 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"kj/filesystem-disk-unix.c++:1703: warning: PWD environment variable doesn't match current directory; pwd = /mnt/c/Users/camer/AppData/Local/Programs/Microsoft VS Code\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Got 287 segments for platform FORD BRONCO SPORT 1ST GEN\n",
"Got 137 segments for platform FORD ESCAPE 4TH GEN\n",
"Got 1041 segments for platform FORD EXPLORER 6TH GEN\n",
"Got 5 segments for platform FORD F-150 14TH GEN\n",
"Got 56 segments for platform FORD FOCUS 4TH GEN\n",
"Got 637 segments for platform FORD MAVERICK 1ST GEN\n",
"Got 3 segments for platform FORD F-150 LIGHTNING 1ST GEN\n",
"Got 3 segments for platform FORD MUSTANG MACH-E 1ST GEN\n",
"Got 2169 segments total\n"
]
}
],
"source": [
"from openpilot.tools.lib.comma_car_segments import get_comma_car_segments_database\n",
"from openpilot.selfdrive.car.ford.values import CAR\n",
"\n",
"database = get_comma_car_segments_database()\n",
"platforms = [c.value for c in CAR]\n",
"segments = []\n",
"\n",
"for platform in platforms:\n",
" if platform not in database:\n",
" print(f'Skipping platform: {platform}, no data available')\n",
" continue\n",
"\n",
" platform_segments = database[platform]\n",
" print(f'Got {len(platform_segments)} segments for platform {platform}')\n",
" segments += platform_segments\n",
"\n",
"print(f'Got {len(segments)} segments total')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 2169/2169 [12:52<00:00, 2.81it/s] "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Got 76 car params to check\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"from multiprocessing import Pool\n",
"\n",
"from tqdm import tqdm\n",
"\n",
"from openpilot.tools.lib.logreader import LogReader\n",
"\n",
"\n",
"def get_car_params(segment):\n",
" lr = LogReader(segment)\n",
" return lr.first('carParams')\n",
"\n",
"\n",
"CAR_FW_TO_CHECK = []\n",
"VINS = set()\n",
"\n",
"with Pool(processes=10) as p:\n",
" with tqdm(total=len(segments)) as pbar:\n",
" for CP in p.imap_unordered(get_car_params, segments):\n",
" pbar.update()\n",
" if CP is None or CP.carVin in VINS:\n",
" continue\n",
" if not CP.carVin.startswith(\"000000\"):\n",
" VINS.add(CP.carVin)\n",
" CAR_FW_TO_CHECK.append(CP)\n",
"\n",
"print(f'Got {len(CAR_FW_TO_CHECK)} car params to check')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_144036/34027631.py:1: DeprecationWarning: \n",
"Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n",
"(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n",
"but was not found to be installed on your system.\n",
"If this would cause problems for you,\n",
"please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n",
" \n",
" import pandas as pd\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"vin='5LM5J7XC1LGXXXXXX' real_fingerprint=FORD EXPLORER 6TH GEN source=fixed determined_fingerprint=mock (exact_match=True)\n",
" addr=0x7e0 fw={b'LB5A-14C204-AZJ\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x730 fw={b'L1MC-14D003-AJ\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x706 fw={b'LC5T-14F397-AE\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x760 fw={b'L1MC-2D053-AJ\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x764 fw={b'LB5T-14D049-AB\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
"\n",
"vin='00000000000XXXXXX' real_fingerprint=FORD F-150 14TH GEN source=fixed determined_fingerprint=mock (exact_match=True)\n",
"\n",
"vin='00000000000XXXXXX' real_fingerprint=FORD F-150 14TH GEN source=fixed determined_fingerprint=mock (exact_match=True)\n",
"\n",
"vin='00000000000XXXXXX' real_fingerprint=FORD F-150 14TH GEN source=fixed determined_fingerprint=mock (exact_match=True)\n",
"\n",
"vin='00000000000XXXXXX' real_fingerprint=FORD F-150 14TH GEN source=fixed determined_fingerprint=mock (exact_match=True)\n",
"\n",
"vin='00000000000XXXXXX' real_fingerprint=FORD F-150 14TH GEN source=fixed determined_fingerprint=mock (exact_match=True)\n",
"\n",
"vin='3FTTW8E3XPRXXXXXX' real_fingerprint=FORD MAVERICK 1ST GEN source=fw determined_fingerprint=mock (exact_match=True)\n",
" addr=0x7e0 fw={b'PZ6A-14C204-JE\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x730 fw={b'NZ6C-14D003-AL\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x760 fw={b'PZ6C-2D053-ED\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
" addr=0x706 fw={b'NZ6T-14F397-AC\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}\n",
"\n",
" vin has_radar real_fingerprint real_fuzzy determined_fingerprint determined_fuzzy changed\n",
"0 3FMCR9B69NRXXXXXX True FORD BRONCO SPORT 1ST GEN False FORD BRONCO SPORT 1ST GEN False False\n",
"1 00000000000XXXXXX True FORD ESCAPE 4TH GEN False FORD ESCAPE 4TH GEN False False\n",
"2 00000000000XXXXXX True FORD ESCAPE 4TH GEN False FORD ESCAPE 4TH GEN False False\n",
"3 00000000000XXXXXX True FORD ESCAPE 4TH GEN False FORD ESCAPE 4TH GEN False False\n",
"4 1FMCU9J94MUXXXXXX True FORD ESCAPE 4TH GEN False FORD ESCAPE 4TH GEN False False\n",
"5 1FM5K7LC0MGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"6 5LM5J7XC9LGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"7 1FM5K8GC7LGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"8 1FM5K8GC7NGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"9 1FM5K8HC7MGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"10 5LM5J7XC8MGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"11 5LM5J7XC1LGXXXXXX True FORD EXPLORER 6TH GEN False mock False True\n",
"12 1FM5K8HC2LGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"13 1FMSK8DHXNGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"14 1FMSK8DH0NGXXXXXX True FORD EXPLORER 6TH GEN False FORD EXPLORER 6TH GEN False False\n",
"15 00000000000XXXXXX False FORD F-150 14TH GEN False mock False True\n",
"16 00000000000XXXXXX False FORD F-150 14TH GEN False mock False True\n",
"17 00000000000XXXXXX False FORD F-150 14TH GEN False mock False True\n",
"18 00000000000XXXXXX False FORD F-150 14TH GEN False mock False True\n",
"19 00000000000XXXXXX False FORD F-150 14TH GEN False mock False True\n",
"20 WF0NXXGCHNJXXXXXX True FORD FOCUS 4TH GEN False FORD FOCUS 4TH GEN False False\n",
"21 3FTTW8E31PRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"22 3FTTW8E99NRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"23 3FTTW8E33NRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"24 3FTTW8F98NRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"25 3FTTW8E3XPRXXXXXX False FORD MAVERICK 1ST GEN True mock False True\n",
"26 3FTTW8F97NRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"27 3FTTW8E34PRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"28 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"29 3FTTW8E33PRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"30 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"31 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"32 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"33 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"34 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"35 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"36 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"37 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"38 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"39 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"40 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"41 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"42 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"43 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"44 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"45 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"46 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"47 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"48 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"49 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"50 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"51 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"52 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"53 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"54 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"55 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"56 3FTTW8E36PRXXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"57 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"58 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"59 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"60 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"61 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"62 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"63 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"64 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"65 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"66 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"67 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"68 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"69 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"70 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"71 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"72 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"73 00000000000XXXXXX True FORD MAVERICK 1ST GEN False FORD MAVERICK 1ST GEN False False\n",
"74 1FTVW1EL4NWXXXXXX True FORD F-150 LIGHTNING 1ST GEN False FORD F-150 LIGHTNING 1ST GEN False False\n",
"75 3FMTK3SU0MMXXXXXX True FORD MUSTANG MACH-E 1ST GEN False FORD MUSTANG MACH-E 1ST GEN False False\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"from openpilot.selfdrive.car.fw_versions import build_fw_dict, match_fw_to_car\n",
"\n",
"results = []\n",
"for CP in CAR_FW_TO_CHECK:\n",
" vin = CP.carVin\n",
" real_fingerprint, real_fuzzy, source = CP.carFingerprint, CP.fuzzyFingerprint, CP.fingerprintSource\n",
" car_fw = CP.carFw\n",
"\n",
" exact_match, determined_fingerprint = match_fw_to_car(car_fw, log=False)\n",
" determined_fuzzy = not exact_match\n",
"\n",
" if len(determined_fingerprint) == 1:\n",
" determined_fingerprint = determined_fingerprint.pop()\n",
" elif len(determined_fingerprint) == 0:\n",
" determined_fingerprint = 'mock'\n",
" else:\n",
" determined_fingerprint = 'multiple'\n",
"\n",
" fw_dict = build_fw_dict(CP.carFw)\n",
" has_radar = (0x764, None) in fw_dict.keys()\n",
"\n",
" changed = (real_fingerprint != determined_fingerprint) or (real_fuzzy != determined_fuzzy)\n",
" results.append((vin, has_radar,\n",
" real_fingerprint, real_fuzzy, determined_fingerprint, determined_fuzzy,\n",
" changed))\n",
"\n",
" if changed:\n",
" print(f'{vin=} {real_fingerprint=:<28} source={source} {determined_fingerprint=:<28} ({exact_match=})')\n",
" if determined_fingerprint != real_fingerprint:\n",
" for addr, fw in build_fw_dict(car_fw).items():\n",
" print(f' addr={hex(addr[0])} {fw=}')\n",
" print()\n",
"\n",
"df = pd.DataFrame(results, columns=['vin', 'has_radar',\n",
" 'real_fingerprint', 'real_fuzzy', 'determined_fingerprint', 'determined_fuzzy',\n",
" 'changed'])\n",
"print(df.to_string())"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Loading…
Cancel
Save