Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -196,19 +196,33 @@ jobs:
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))
&& fromJSON('["namespace-profile-amd64-8x16"]')
|| fromJSON('["ubuntu-24.04"]') }}
if: false # FIXME: Started to timeout recently
env:
ONNXCPU: 1
SIM_LOGS: 1
CI: 1
steps:
- uses: actions/checkout@v6
with:
submodules: true
- run: ./tools/op.sh setup
- name: Build openpilot
run: scons
- name: Install MetaDrive
run: uv pip install "metadrive-simulator @ git+https://github.com/commaai/metadrive.git@minimal"
- name: Driving test
timeout-minutes: 2
timeout-minutes: 10
run: |
source openpilot/selfdrive/test/setup_xvfb.sh
pytest -s openpilot/tools/sim/tests/test_metadrive_bridge.py
- name: Upload simulator logs
uses: actions/upload-artifact@v6
if: always()
with:
name: simulator-logs-${{ github.run_id }}
path: |
/tmp/comma_download/**/*.bz2
/tmp/comma_download/**/*.hevc
/tmp/comma_download/**/*.zst

create_ui_report:
name: Create UI Report
Expand Down
7 changes: 6 additions & 1 deletion openpilot/tools/sim/bridge/common.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import os
import signal
import time
import threading
import functools
import numpy as np
Expand Down Expand Up @@ -41,7 +43,8 @@ def __init__(self, dual_camera, high_quality):
self.params = Params()
self.params.put_bool("AlphaLongitudinalEnabled", True, block=True)

self.rk = Ratekeeper(100, None)
self._ci = os.getenv("CI") is not None
self.rk = Ratekeeper(20 if self._ci else 100, None)

self.dual_camera = dual_camera
self.high_quality = high_quality
Expand Down Expand Up @@ -203,3 +206,5 @@ def _run(self, q: Queue):
self.started.value = True

self.rk.keep_time()
if self._ci:
time.sleep(0.01)
4 changes: 3 additions & 1 deletion openpilot/tools/sim/bridge/metadrive/metadrive_process.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import math
import os
import time
import numpy as np

Expand Down Expand Up @@ -93,7 +94,8 @@ def get_cam_as_rgb(cam):
img = img.get() # convert cupy array to numpy
return img

rk = Ratekeeper(100, None)
_ci = os.getenv("CI") is not None
rk = Ratekeeper(20 if _ci else 100, None)

steer_ratio = 8
vc = [0,0]
Expand Down
7 changes: 6 additions & 1 deletion openpilot/tools/sim/launch_openpilot.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ export SIMULATION="1"
export SKIP_FW_QUERY="1"
export FINGERPRINT="HONDA_CIVIC_2022"

export BLOCK="${BLOCK},camerad,loggerd,encoderd,micd,logmessaged,manage_athenad"
# keep camera process blocked (simulator publishes frames), but optionally allow logging
block_list="camerad,micd,logmessaged,manage_athenad"
if [[ -z "$SIM_LOGS" ]]; then
block_list="$block_list,loggerd,encoderd"
fi
export BLOCK="${BLOCK},${block_list}"
if [[ "$CI" ]]; then
# TODO: offscreen UI should work
export BLOCK="${BLOCK},ui"
Expand Down
15 changes: 11 additions & 4 deletions openpilot/tools/sim/tests/test_sim_bridge.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import signal
import subprocess
import time
import pytest
Expand All @@ -22,7 +23,7 @@ def setup_method(self):

def test_driving(self):
# Startup manager and bridge.py. Check processes are running, then engage and verify.
p_manager = subprocess.Popen("./launch_openpilot.sh", cwd=SIM_DIR)
p_manager = subprocess.Popen("./launch_openpilot.sh", cwd=SIM_DIR, start_new_session=True)
self.processes.append(p_manager)

sm = messaging.SubMaster(['selfdriveState', 'onroadEvents', 'managerState'])
Expand All @@ -31,7 +32,7 @@ def test_driving(self):
p_bridge = bridge.run(q, retries=10)
self.processes.append(p_bridge)

max_time_per_step = 60
max_time_per_step = 180 if os.getenv("CI") else 60

# Wait for bridge to startup
start_waiting = time.monotonic()
Expand Down Expand Up @@ -86,7 +87,13 @@ def test_driving(self):
def teardown_method(self):
print("Test shutting down. CommIssues are acceptable")
for p in reversed(self.processes):
p.terminate()
try:
os.killpg(os.getpgid(p.pid), signal.SIGKILL)
except (ProcessLookupError, PermissionError, OSError):
pass

for p in reversed(self.processes):
p.kill()
try:
p.kill()
except (ProcessLookupError, OSError):
pass
Loading