From 5b1660eae642ff17302a01f81cbd044d901be307 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Wed, 24 Jan 2024 14:29:21 +0000 Subject: [PATCH] add ford_fuzzy_fingerprint.ipynb notebook --- .../ford/tests/ford_fuzzy_fingerprint.ipynb | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 selfdrive/car/ford/tests/ford_fuzzy_fingerprint.ipynb diff --git a/selfdrive/car/ford/tests/ford_fuzzy_fingerprint.ipynb b/selfdrive/car/ford/tests/ford_fuzzy_fingerprint.ipynb new file mode 100644 index 0000000000..26145ec90c --- /dev/null +++ b/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 +}