CI: power draw test (#24292)

* CI: power draw test

* initialize hardware

* try this

* fix that

* happy linter

* actually happy

Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 37dbc7be0c
taco
Adeeb Shihadeh 3 years ago committed by GitHub
parent 942c9345f5
commit 16c40a5f7c
  1. 1
      Jenkinsfile
  2. 21
      selfdrive/hardware/tici/power_monitor.py
  3. 14
      selfdrive/hardware/tici/precise_power_measure.py
  4. 61
      selfdrive/hardware/tici/test_power_draw.py

1
Jenkinsfile vendored

@ -120,6 +120,7 @@ pipeline {
steps { steps {
phone_steps("tici2", [ phone_steps("tici2", [
["build", "cd selfdrive/manager && ./build.py"], ["build", "cd selfdrive/manager && ./build.py"],
["test power draw", "python selfdrive/hardware/tici/test_power_draw.py"],
["test boardd loopback", "python selfdrive/boardd/tests/test_boardd_loopback.py"], ["test boardd loopback", "python selfdrive/boardd/tests/test_boardd_loopback.py"],
["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"], ["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
["test encoder", "LD_LIBRARY_PATH=/usr/local/lib python selfdrive/loggerd/tests/test_encoder.py"], ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib python selfdrive/loggerd/tests/test_encoder.py"],

@ -1,11 +1,32 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import sys
import time import time
import numpy as np
from typing import List
from common.realtime import Ratekeeper
def average(avg, sample): def average(avg, sample):
# Weighted avg between existing value and new sample # Weighted avg between existing value and new sample
return ((avg[0] * avg[1] + sample) / (avg[1] + 1), avg[1] + 1) return ((avg[0] * avg[1] + sample) / (avg[1] + 1), avg[1] + 1)
def sample_power(seconds=5) -> List[float]:
rate = 123
rk = Ratekeeper(rate, print_delay_threshold=None)
pwrs = []
for _ in range(rate*seconds):
with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/power1_input") as f:
pwrs.append(int(f.read()) / 1e6)
rk.keep_time()
return pwrs
def get_power(seconds=5):
pwrs = sample_power(seconds)
return np.mean(pwrs)
if __name__ == '__main__': if __name__ == '__main__':
sample_time = None sample_time = None

@ -1,17 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import numpy as np import numpy as np
from common.realtime import Ratekeeper from selfdrive.hardware.tici.power_monitor import sample_power
if __name__ == '__main__': if __name__ == '__main__':
RATE = 123 print("measuring for 5 seconds")
print("measuring for 5 seconds at %dhz 3 times" % RATE)
rk = Ratekeeper(RATE, print_delay_threshold=None)
for _ in range(3): for _ in range(3):
pwrs = [] pwrs = sample_power()
for _ in range(RATE*5):
with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/power1_input") as f:
pwrs.append(int(f.read()) / 1000.)
rk.keep_time()
print("mean %.2f std %.2f" % (np.mean(pwrs), np.std(pwrs))) print("mean %.2f std %.2f" % (np.mean(pwrs), np.std(pwrs)))

@ -0,0 +1,61 @@
#!/usr/bin/env python3
import unittest
import time
import math
from collections import OrderedDict
from selfdrive.hardware import HARDWARE, TICI
from selfdrive.hardware.tici.power_monitor import get_power
from selfdrive.manager.process_config import managed_processes
from selfdrive.manager.manager import manager_cleanup
POWER = OrderedDict(
camerad=2.65,
modeld=1.15,
dmonitoringmodeld=0.25,
loggerd=0.45,
)
class TestPowerDraw(unittest.TestCase):
@classmethod
def setUpClass(cls):
if not TICI:
raise unittest.SkipTest
def setUp(self):
HARDWARE.initialize_hardware()
HARDWARE.set_power_save(False)
def tearDown(self):
manager_cleanup()
def test_camera_procs(self):
baseline = get_power()
prev = baseline
used = {}
for proc in POWER.keys():
managed_processes[proc].start()
time.sleep(6)
now = get_power(8)
used[proc] = now - prev
prev = now
manager_cleanup()
print("-"*35)
print(f"Baseline {baseline:.2f}W\n")
for proc in POWER.keys():
cur = used[proc]
expected = POWER[proc]
print(f"{proc.ljust(20)} {expected:.2f}W {cur:.2f}W")
with self.subTest(proc=proc):
self.assertTrue(math.isclose(cur, expected, rel_tol=0.10, abs_tol=0.1))
print("-"*35)
if __name__ == "__main__":
unittest.main()
Loading…
Cancel
Save