CommaCarSegments: BIG Database! (#31169)

* sanetized selector

* god damn

* add to re

* slog branch

* slog

* source

* big

* not slog

* cleanup

* no space

* works!

* trigger

* main!
old-commit-hash: 824ddffec8
chrysler-long2
Justin Newberry 1 year ago committed by GitHub
parent 048629564e
commit abfa8fcda9
  1. 65
      tools/car_porting/examples/ford_vin_fingerprint.ipynb
  2. 2
      tools/lib/helpers.py
  3. 24
      tools/lib/logreader.py

@ -2,17 +2,9 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"kj/filesystem-disk-unix.c++:1703: warning: PWD environment variable doesn't match current directory; pwd = /home/batman\n"
]
}
],
"source": [ "source": [
"\"\"\"In this example, we use the public comma car segments database to check if vin fingerprinting is feasible for ford.\"\"\"\n", "\"\"\"In this example, we use the public comma car segments database to check if vin fingerprinting is feasible for ford.\"\"\"\n",
"\n", "\n",
@ -27,7 +19,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -62,55 +54,74 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Skipping platform: FORD F-150 14TH GEN, no data available\n" "Got 287 segments for platform FORD BRONCO SPORT 1ST GEN, sampling 5 segments\n",
"Got 137 segments for platform FORD ESCAPE 4TH GEN, sampling 5 segments\n",
"Got 1041 segments for platform FORD EXPLORER 6TH GEN, sampling 5 segments\n",
"Got 5 segments for platform FORD F-150 14TH GEN, sampling 5 segments\n",
"Got 56 segments for platform FORD FOCUS 4TH GEN, sampling 5 segments\n",
"Got 637 segments for platform FORD MAVERICK 1ST GEN, sampling 5 segments\n",
"Got 3 segments for platform FORD F-150 LIGHTNING 1ST GEN, sampling 3 segments\n",
"Got 3 segments for platform FORD MUSTANG MACH-E 1ST GEN, sampling 3 segments\n"
] ]
} }
], ],
"source": [ "source": [
"import random\n",
"\n",
"MAX_SEGS_PER_PLATFORM = 5\n",
"\n",
"VINS_TO_CHECK = set()\n", "VINS_TO_CHECK = set()\n",
"\n", "\n",
"for platform in platforms:\n", "for platform in platforms:\n",
" if platform not in database:\n", " if platform not in database:\n",
" print(f\"Skipping platform: {platform}, no data available\")\n", " print(f\"Skipping platform: {platform}, no data available\")\n",
" continue\n", " continue\n",
" \n",
" all_segments = database[platform]\n",
"\n", "\n",
" for segment in database[platform]:\n", " NUM_SEGMENTS = min(len(all_segments), MAX_SEGS_PER_PLATFORM)\n",
"\n",
" print(f\"Got {len(all_segments)} segments for platform {platform}, sampling {NUM_SEGMENTS} segments\")\n",
"\n",
" segments = random.sample(all_segments, NUM_SEGMENTS)\n",
"\n",
" for segment in segments:\n",
" lr = LogReader(segment)\n", " lr = LogReader(segment)\n",
" CP = lr.first(\"carParams\")\n", " CP = lr.first(\"carParams\")\n",
" if \"FORD\" not in CP.carFingerprint:\n",
" print(segment, CP.carFingerprint)\n",
" VINS_TO_CHECK.add((CP.carVin, CP.carFingerprint))" " VINS_TO_CHECK.add((CP.carVin, CP.carFingerprint))"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"vin: 3FTTW8E31PRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n", "vin: 3FTTW8E34PRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n",
"vin: 1FM5K8GC7LGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n", "vin: 00000000000XXXXXX real platform: FORD F-150 14TH GEN determined platform: mock correct: False\n",
"vin: 3FTTW8E99NRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n",
"vin: 1FM5K8GC7NGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 1FM5K7LC0MGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 1FM5K8HC7MGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 3FMTK3SU0MMXXXXXX real platform: FORD MUSTANG MACH-E 1ST GEN determined platform: FORD MUSTANG MACH-E 1ST GEN correct: True\n", "vin: 3FMTK3SU0MMXXXXXX real platform: FORD MUSTANG MACH-E 1ST GEN determined platform: FORD MUSTANG MACH-E 1ST GEN correct: True\n",
"vin: WF0NXXGCHNJXXXXXX real platform: FORD FOCUS 4TH GEN determined platform: mock correct: False\n",
"vin: 1FTVW1EL4NWXXXXXX real platform: FORD F-150 LIGHTNING 1ST GEN determined platform: FORD F-150 LIGHTNING 1ST GEN correct: True\n", "vin: 1FTVW1EL4NWXXXXXX real platform: FORD F-150 LIGHTNING 1ST GEN determined platform: FORD F-150 LIGHTNING 1ST GEN correct: True\n",
"vin: 00000000000XXXXXX real platform: FORD ESCAPE 4TH GEN determined platform: mock correct: False\n", "vin: WF0NXXGCHNJXXXXXX real platform: FORD FOCUS 4TH GEN determined platform: mock correct: False\n",
"vin: 3FTTW8F98NRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n", "vin: 1FMCU9J94MUXXXXXX real platform: FORD ESCAPE 4TH GEN determined platform: mock correct: False\n",
"vin: 5LM5J7XC9LGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n", "vin: 3FTTW8E33NRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n",
"vin: 5LM5J7XC8MGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 3FMCR9B69NRXXXXXX real platform: FORD BRONCO SPORT 1ST GEN determined platform: mock correct: False\n", "vin: 3FMCR9B69NRXXXXXX real platform: FORD BRONCO SPORT 1ST GEN determined platform: mock correct: False\n",
"vin: 1FMCU9J94MUXXXXXX real platform: FORD ESCAPE 4TH GEN determined platform: mock correct: False\n" "vin: 1FM5K8GC7LGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 5LM5J7XC9LGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 5LM5J7XC1LGXXXXXX real platform: FORD EXPLORER 6TH GEN determined platform: mock correct: False\n",
"vin: 3FTTW8F97NRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n",
"vin: 3FTTW8E99NRXXXXXX real platform: FORD MAVERICK 1ST GEN determined platform: mock correct: False\n"
] ]
} }
], ],

@ -14,7 +14,7 @@ class RE:
INDEX = r'-?[0-9]+' INDEX = r'-?[0-9]+'
SLICE = r'(?P<start>{})?:?(?P<end>{})?:?(?P<step>{})?'.format(INDEX, INDEX, INDEX) SLICE = r'(?P<start>{})?:?(?P<end>{})?:?(?P<step>{})?'.format(INDEX, INDEX, INDEX)
SEGMENT_RANGE = r'{}(?:--|/)?(?P<slice>({}))?/?(?P<selector>([qra]))?'.format(ROUTE_NAME, SLICE) SEGMENT_RANGE = r'{}(?:--|/)?(?P<slice>({}))?/?(?P<selector>([qras]))?'.format(ROUTE_NAME, SLICE)
BOOTLOG_NAME = ROUTE_NAME BOOTLOG_NAME = ROUTE_NAME

@ -72,6 +72,7 @@ class _LogFileReader:
class ReadMode(enum.StrEnum): class ReadMode(enum.StrEnum):
RLOG = "r" # only read rlogs RLOG = "r" # only read rlogs
QLOG = "q" # only read qlogs QLOG = "q" # only read qlogs
SANITIZED = "s" # read from the commaCarSegments database
AUTO = "a" # default to rlogs, fallback to qlogs AUTO = "a" # default to rlogs, fallback to qlogs
AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user
@ -169,17 +170,24 @@ def check_source(source, *args):
try: try:
files = source(*args) files = source(*args)
assert next(get_invalid_files(files), None) is None assert next(get_invalid_files(files), None) is None
return True, files return None, files
except Exception: except Exception as e:
return False, None return e, None
def auto_source(*args): def auto_source(sr: SegmentRange, mode=ReadMode.RLOG):
if mode == ReadMode.SANITIZED:
return comma_car_segments_source(sr, mode)
exceptions = []
# Automatically determine viable source # Automatically determine viable source
for source in [comma_car_segments_source, internal_source, openpilotci_source]: for source in [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source]:
valid, ret = check_source(source, *args) exception, ret = check_source(source, sr, mode)
if valid: if exception is None:
return ret return ret
return comma_api_source(*args) else:
exceptions.append(exception)
raise Exception(f"auto_source could not find any valid source, exceptions for sources: {exceptions}")
def parse_useradmin(identifier): def parse_useradmin(identifier):
if "useradmin.comma.ai" in identifier: if "useradmin.comma.ai" in identifier:

Loading…
Cancel
Save