Merge remote-tracking branch 'origin/master' into retry-clone

pull/30628/head
Justin Newberry 1 year ago
commit c222a48aa1
  1. 6
      Jenkinsfile
  2. 3
      RELEASES.md
  3. 5
      conftest.py
  4. 1
      pyproject.toml
  5. 2
      selfdrive/car/tests/test_models.py
  6. 14
      selfdrive/ui/soundd.py
  7. 6
      system/micd.py

6
Jenkinsfile vendored

@ -15,7 +15,7 @@ export GIT_COMMIT=${env.GIT_COMMIT}
export AZURE_TOKEN='${env.AZURE_TOKEN}' export AZURE_TOKEN='${env.AZURE_TOKEN}'
export MAPBOX_TOKEN='${env.MAPBOX_TOKEN}' export MAPBOX_TOKEN='${env.MAPBOX_TOKEN}'
# only use 1 thread for tici tests since most require HIL # only use 1 thread for tici tests since most require HIL
export PYTEST_ADDOPTS="-n 1" export PYTEST_ADDOPTS="-n 0"
export GIT_SSH_COMMAND="ssh -i /data/gitkey" export GIT_SSH_COMMAND="ssh -i /data/gitkey"
@ -235,8 +235,8 @@ node {
pcStage("car tests") { pcStage("car tests") {
sh label: "build", script: "selfdrive/manager/build.py" sh label: "build", script: "selfdrive/manager/build.py"
sh label: "test_models.py", script: "INTERNAL_SEG_CNT=250 INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt FILEREADER_CACHE=1 \ sh label: "test_models.py", script: "INTERNAL_SEG_CNT=250 INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt FILEREADER_CACHE=1 \
pytest -n auto --dist=loadscope selfdrive/car/tests/test_models.py" pytest selfdrive/car/tests/test_models.py"
sh label: "test_car_interfaces.py", script: "MAX_EXAMPLES=100 pytest -n auto --dist=load selfdrive/car/tests/test_car_interfaces.py" sh label: "test_car_interfaces.py", script: "MAX_EXAMPLES=100 pytest selfdrive/car/tests/test_car_interfaces.py"
} }
}, },

@ -1,6 +1,7 @@
Version 0.9.6 (2023-XX-XX) Version 0.9.6 (2023-12-14)
======================== ========================
* AGNOS 9 * AGNOS 9
* comma body streaming and controls over WebRTC
Version 0.9.5 (2023-11-17) Version 0.9.5 (2023-11-17)
======================== ========================

@ -45,8 +45,9 @@ def pytest_collection_modifyitems(config, items):
item.add_marker(skipper) item.add_marker(skipper)
if "xdist_group_class_property" in item.keywords: if "xdist_group_class_property" in item.keywords:
class_property = item.get_closest_marker('xdist_group_class_property').args[0] class_property_name = item.get_closest_marker('xdist_group_class_property').args[0]
item.add_marker(pytest.mark.xdist_group(getattr(item.cls, class_property))) class_property_value = getattr(item.cls, class_property_name)
item.add_marker(pytest.mark.xdist_group(class_property_value))
@pytest.hookimpl(trylast=True) @pytest.hookimpl(trylast=True)

@ -190,6 +190,7 @@ exclude = [
"rednose_repo", "rednose_repo",
"tinygrad_repo", "tinygrad_repo",
"teleoprtc", "teleoprtc",
"teleoprtc_repo",
"third_party", "third_party",
] ]
flake8-implicit-str-concat.allow-multiline=false flake8-implicit-str-concat.allow-multiline=false

@ -382,7 +382,7 @@ class TestCarModelBase(unittest.TestCase):
@parameterized_class(('car_model', 'test_route'), get_test_cases()) @parameterized_class(('car_model', 'test_route'), get_test_cases())
@pytest.mark.xdist_group_class_property('car_model') @pytest.mark.xdist_group_class_property('test_route')
class TestCarModel(TestCarModelBase): class TestCarModel(TestCarModelBase):
pass pass

@ -1,12 +1,16 @@
import math import math
import time
import numpy as np import numpy as np
import time
import wave import wave
from typing import Dict, Optional, Tuple from typing import Dict, Optional, Tuple
from cereal import car, messaging from cereal import car, messaging
from openpilot.common.basedir import BASEDIR from openpilot.common.basedir import BASEDIR
from openpilot.common.filter_simple import FirstOrderFilter
from openpilot.system import micd
from openpilot.common.realtime import Ratekeeper from openpilot.common.realtime import Ratekeeper
from openpilot.system.hardware import PC from openpilot.system.hardware import PC
from openpilot.system.swaglog import cloudlog from openpilot.system.swaglog import cloudlog
@ -15,6 +19,7 @@ SAMPLE_RATE = 48000
MAX_VOLUME = 1.0 MAX_VOLUME = 1.0
MIN_VOLUME = 0.1 MIN_VOLUME = 0.1
CONTROLS_TIMEOUT = 5 # 5 seconds CONTROLS_TIMEOUT = 5 # 5 seconds
FILTER_DT = 1. / (micd.SAMPLE_RATE / micd.FFT_SAMPLES)
AMBIENT_DB = 30 # DB where MIN_VOLUME is applied AMBIENT_DB = 30 # DB where MIN_VOLUME is applied
DB_SCALE = 30 # AMBIENT_DB + DB_SCALE is where MAX_VOLUME is applied DB_SCALE = 30 # AMBIENT_DB + DB_SCALE is where MAX_VOLUME is applied
@ -56,6 +61,8 @@ class Soundd:
self.controls_timeout_alert = False self.controls_timeout_alert = False
self.spl_filter_weighted = FirstOrderFilter(0, 2.5, FILTER_DT, initialized=False)
def load_sounds(self): def load_sounds(self):
self.loaded_sounds: Dict[int, np.ndarray] = {} self.loaded_sounds: Dict[int, np.ndarray] = {}
@ -137,8 +144,9 @@ class Soundd:
while True: while True:
sm.update(0) sm.update(0)
if sm.updated['microphone']: if sm.updated['microphone'] and self.current_alert == AudibleAlert.none: # only update volume filter when not playing alert
self.current_volume = self.calculate_volume(sm["microphone"].filteredSoundPressureWeightedDb) self.spl_filter_weighted.update(sm["microphone"].soundPressureWeightedDb)
self.current_volume = self.calculate_volume(float(self.spl_filter_weighted.x))
self.get_audible_alert(sm) self.get_audible_alert(sm)

@ -2,7 +2,6 @@
import numpy as np import numpy as np
from cereal import messaging from cereal import messaging
from openpilot.common.filter_simple import FirstOrderFilter
from openpilot.common.realtime import Ratekeeper from openpilot.common.realtime import Ratekeeper
from openpilot.system.swaglog import cloudlog from openpilot.system.swaglog import cloudlog
@ -10,7 +9,6 @@ RATE = 10
FFT_SAMPLES = 4096 FFT_SAMPLES = 4096
REFERENCE_SPL = 2e-5 # newtons/m^2 REFERENCE_SPL = 2e-5 # newtons/m^2
SAMPLE_RATE = 44100 SAMPLE_RATE = 44100
FILTER_DT = 1. / (SAMPLE_RATE / FFT_SAMPLES)
def calculate_spl(measurements): def calculate_spl(measurements):
@ -50,15 +48,12 @@ class Mic:
self.sound_pressure_weighted = 0 self.sound_pressure_weighted = 0
self.sound_pressure_level_weighted = 0 self.sound_pressure_level_weighted = 0
self.spl_filter_weighted = FirstOrderFilter(0, 2.5, FILTER_DT, initialized=False)
def update(self): def update(self):
msg = messaging.new_message('microphone', valid=True) msg = messaging.new_message('microphone', valid=True)
msg.microphone.soundPressure = float(self.sound_pressure) msg.microphone.soundPressure = float(self.sound_pressure)
msg.microphone.soundPressureWeighted = float(self.sound_pressure_weighted) msg.microphone.soundPressureWeighted = float(self.sound_pressure_weighted)
msg.microphone.soundPressureWeightedDb = float(self.sound_pressure_level_weighted) msg.microphone.soundPressureWeightedDb = float(self.sound_pressure_level_weighted)
msg.microphone.filteredSoundPressureWeightedDb = float(self.spl_filter_weighted.x)
self.pm.send('microphone', msg) self.pm.send('microphone', msg)
self.rk.keep_time() self.rk.keep_time()
@ -79,7 +74,6 @@ class Mic:
self.sound_pressure, _ = calculate_spl(measurements) self.sound_pressure, _ = calculate_spl(measurements)
measurements_weighted = apply_a_weighting(measurements) measurements_weighted = apply_a_weighting(measurements)
self.sound_pressure_weighted, self.sound_pressure_level_weighted = calculate_spl(measurements_weighted) self.sound_pressure_weighted, self.sound_pressure_level_weighted = calculate_spl(measurements_weighted)
self.spl_filter_weighted.update(self.sound_pressure_level_weighted)
self.measurements = self.measurements[FFT_SAMPLES:] self.measurements = self.measurements[FFT_SAMPLES:]

Loading…
Cancel
Save