add ford_fuzzy_fingerprint.ipynb notebook

pull/31124/head
Cameron Clough 2 years ago
parent 772e31208e
commit 5b1660eae6
  1. 153
      selfdrive/car/ford/tests/ford_fuzzy_fingerprint.ipynb

@ -0,0 +1,153 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\"\"\"In this example, we use the public comma car segments database to check if vin fingerprinting is feasible for ford.\"\"\"\n",
"\n",
"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",
"\n",
"platforms = [c.value for c in CAR]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Skipping platform: FORD F-150 14TH GEN, no data available\n"
]
}
],
"source": [
"from openpilot.tools.lib.logreader import get_first_message, LogReader\n",
"\n",
"\n",
"FW_TO_CHECK = set()\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",
" for segment in database[platform]:\n",
" lr = LogReader(segment)\n",
" CP = get_first_message(lr, \"carParams\").carParams\n",
" FW_TO_CHECK.add((CP.carVin, CP.carFw, CP.carFingerprint, CP.fuzzyFingerprint, CP.fingerprintSource))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"vin: 3FTTW8E31PRXXXXXX expected: FORD MAVERICK 1ST GEN fuzzy: FORD MAVERICK 1ST GEN correct: True\n",
"vin: 3FMTK3SU0MMXXXXXX expected: FORD MUSTANG MACH-E 1ST GEN fuzzy: FORD MUSTANG MACH-E 1ST GEN correct: True\n",
"vin: 3FMCR9B69NRXXXXXX expected: FORD BRONCO SPORT 1ST GEN fuzzy: FORD BRONCO SPORT 1ST GEN correct: True\n",
"vin: 3FTTW8F98NRXXXXXX expected: FORD MAVERICK 1ST GEN fuzzy: FORD MAVERICK 1ST GEN correct: True\n",
"vin: WF0NXXGCHNJXXXXXX expected: FORD FOCUS 4TH GEN fuzzy: FORD FOCUS 4TH GEN correct: True\n",
"vin: 3FTTW8E31PRXXXXXX expected: FORD MAVERICK 1ST GEN fuzzy: FORD MAVERICK 1ST GEN correct: True\n",
"vin: WF0NXXGCHNJXXXXXX expected: FORD FOCUS 4TH GEN fuzzy: FORD FOCUS 4TH GEN correct: True\n",
"vin: 3FMCR9B69NRXXXXXX expected: FORD BRONCO SPORT 1ST GEN fuzzy: FORD BRONCO SPORT 1ST GEN correct: True\n",
"vin: 1FM5K7LC0MGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 5LM5J7XC9LGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 00000000000XXXXXX expected: FORD ESCAPE 4TH GEN fuzzy: FORD ESCAPE 4TH GEN correct: True\n",
"vin: 1FTVW1EL4NWXXXXXX expected: FORD F-150 LIGHTNING 1ST GEN fuzzy: FORD F-150 LIGHTNING 1ST GEN correct: True\n",
"vin: 1FM5K7LC0MGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 1FMCU9J94MUXXXXXX expected: FORD ESCAPE 4TH GEN fuzzy: FORD ESCAPE 4TH GEN correct: True\n",
"vin: 3FMCR9B69NRXXXXXX expected: FORD BRONCO SPORT 1ST GEN fuzzy: FORD BRONCO SPORT 1ST GEN correct: True\n",
"vin: 00000000000XXXXXX expected: FORD ESCAPE 4TH GEN fuzzy: FORD ESCAPE 4TH GEN correct: True\n",
"vin: 3FTTW8E99NRXXXXXX expected: FORD MAVERICK 1ST GEN fuzzy: FORD MAVERICK 1ST GEN correct: True\n",
"vin: 3FMTK3SU0MMXXXXXX expected: FORD MUSTANG MACH-E 1ST GEN fuzzy: FORD MUSTANG MACH-E 1ST GEN correct: True\n",
"vin: 1FTVW1EL4NWXXXXXX expected: FORD F-150 LIGHTNING 1ST GEN fuzzy: FORD F-150 LIGHTNING 1ST GEN correct: True\n",
"vin: 00000000000XXXXXX expected: FORD ESCAPE 4TH GEN fuzzy: FORD ESCAPE 4TH GEN correct: True\n",
"vin: 1FM5K8GC7LGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 1FM5K7LC0MGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 3FMCR9B69NRXXXXXX expected: FORD BRONCO SPORT 1ST GEN fuzzy: FORD BRONCO SPORT 1ST GEN correct: True\n",
"vin: 1FM5K8HC7MGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: WF0NXXGCHNJXXXXXX expected: FORD FOCUS 4TH GEN fuzzy: FORD FOCUS 4TH GEN correct: True\n",
"vin: 3FTTW8E31PRXXXXXX expected: FORD MAVERICK 1ST GEN fuzzy: FORD MAVERICK 1ST GEN correct: True\n",
"vin: 5LM5J7XC8MGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 1FTVW1EL4NWXXXXXX expected: FORD F-150 LIGHTNING 1ST GEN fuzzy: FORD F-150 LIGHTNING 1ST GEN correct: True\n",
"vin: 1FM5K8GC7NGXXXXXX expected: FORD EXPLORER 6TH GEN fuzzy: FORD EXPLORER 6TH GEN correct: True\n",
"vin: 3FMTK3SU0MMXXXXXX expected: FORD MUSTANG MACH-E 1ST GEN fuzzy: FORD MUSTANG MACH-E 1ST GEN correct: True\n",
"Success rate: 100.00%\n"
]
}
],
"source": [
"from openpilot.selfdrive.car.fw_versions import build_fw_dict\n",
"from openpilot.selfdrive.car.ford.values import match_fw_to_car_fuzzy\n",
"from openpilot.selfdrive.car.ford.fingerprints import FW_VERSIONS\n",
"\n",
"success, count = 0, 0\n",
"for vin, car_fw, expected_platform, fuzzy, surce in FW_TO_CHECK:\n",
" if len(car_fw) == 0:\n",
" print(f\"Skipping vin: {vin} platform: {expected_platform}, no car fw\")\n",
" continue\n",
" car_fw = build_fw_dict(car_fw)\n",
" fuzzy_fingerprint = match_fw_to_car_fuzzy(car_fw, FW_VERSIONS)\n",
" if len(fuzzy_fingerprint) == 0:\n",
" fuzzy_fingerprint = \"mock\"\n",
" elif len(fuzzy_fingerprint) > 1:\n",
" fuzzy_fingerprint = \"multiple\"\n",
" else:\n",
" fuzzy_fingerprint = list(fuzzy_fingerprint)[0]\n",
"\n",
" correct = fuzzy_fingerprint == expected_platform\n",
" print(f\"vin: {vin} expected: {expected_platform: <30} fuzzy: {fuzzy_fingerprint: <30} correct: {correct}\")\n",
" if not correct:\n",
" print(f\" source: {surce}\")\n",
" print(f\" fuzzy: {fuzzy}\")\n",
" print(\" car_fw:\")\n",
" fws = set()\n",
" for fw in car_fw:\n",
" if fw.brand != \"ford\" or fw.logging:\n",
" continue\n",
" fw_version = fw.fwVersion.rstrip(b\"\\0\")\n",
" fws.add(f\"{fw.ecu} {fw_version}\")\n",
" for fw in sorted(fws):\n",
" print(f\" {fw}\")\n",
" success += correct\n",
" count += 1\n",
"\n",
"print(f\"Success rate: {success / count * 100:.2f}%\")"
]
}
],
"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