From d2363b74924f21190581c2afaae95ca227957d7c Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 28 Jan 2024 01:38:58 +0000 Subject: [PATCH] add notebook --- selfdrive/car/ford/tests/reduced_ecus.ipynb | 297 ++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 selfdrive/car/ford/tests/reduced_ecus.ipynb diff --git a/selfdrive/car/ford/tests/reduced_ecus.ipynb b/selfdrive/car/ford/tests/reduced_ecus.ipynb new file mode 100644 index 0000000000..618d13bb51 --- /dev/null +++ b/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 +}