nav: always publish map and run model (#28924)

* always render

* more test

* test case

* update test

* vipc checks

* clear cache

---------

Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 5b86268635
beeps
Adeeb Shihadeh 2 years ago committed by GitHub
parent 30a6fa35aa
commit 99945aded5
  1. 2
      cereal
  2. 17
      selfdrive/navd/map_renderer.cc
  3. 4
      selfdrive/navd/map_renderer.h
  4. 30
      selfdrive/navd/tests/test_map_renderer.py

@ -1 +1 @@
Subproject commit a2f1f0cb8dd45ea4265255855da7de8fd89156ed
Subproject commit 5a822f43cae3ee77eea6ecb8c63c398da82142b0

@ -105,21 +105,23 @@ void MapRenderer::msgUpdate() {
float bearing = RAD2DEG(orientation.getValue()[2]);
updatePosition(get_point_along_line(pos.getValue()[0], pos.getValue()[1], bearing, MAP_OFFSET), bearing);
// TODO: use the static rendering mode
if (!loaded() && frame_id > 0) {
for (int i = 0; i < 5 && !loaded(); i++) {
LOGW("map render retry #%d, %d", i+1, m_map.isNull());
// TODO: use the static rendering mode instead
// retry render a few times
for (int i = 0; i < 5 && !rendered(); i++) {
QApplication::processEvents(QEventLoop::AllEvents, 100);
update();
if (rendered()) {
LOGW("rendered after %d retries", i+1);
break;
}
}
if (!loaded()) {
LOGE("failed to render map after retry");
// fallback to sending a blank frame
if (!rendered()) {
publish(0, false);
}
}
}
}
if (sm->updated("navRoute")) {
QList<QGeoCoordinate> route;
@ -162,6 +164,7 @@ void MapRenderer::update() {
if ((vipc_server != nullptr) && loaded()) {
publish((end_t - start_t) / 1000.0, true);
last_llk_rendered = (*sm)["liveLocationKalman"].getLogMonoTime();
}
}

@ -43,6 +43,10 @@ private:
void initLayers();
uint32_t frame_id = 0;
uint64_t last_llk_rendered = 0;
bool rendered() {
return last_llk_rendered == (*sm)["liveLocationKalman"].getLogMonoTime();
}
QTimer* timer;

@ -3,10 +3,11 @@ import os
import unittest
import cereal.messaging as messaging
from cereal.visionipc import VisionIpcClient, VisionStreamType
from selfdrive.manager.process_config import managed_processes
LLK_DECIMATION = 10
CACHE_PATH = "/data/mbgl-cache-navd.db"
def gen_llk():
msg = messaging.new_message('liveLocationKalman')
@ -24,6 +25,10 @@ class TestMapRenderer(unittest.TestCase):
def setUp(self):
self.sm = messaging.SubMaster(['mapRenderState'])
self.pm = messaging.PubMaster(['liveLocationKalman'])
self.vipc = VisionIpcClient("navd", VisionStreamType.VISION_STREAM_MAP, True)
if os.path.exists(CACHE_PATH):
os.remove(CACHE_PATH)
def tearDown(self):
managed_processes['mapsd'].stop()
@ -37,6 +42,11 @@ class TestMapRenderer(unittest.TestCase):
if self.sm.updated['mapRenderState']:
break
assert self.sm.updated['mapRenderState'], "renderer didn't start"
assert VisionIpcClient.available_streams("navd", False) == {VisionStreamType.VISION_STREAM_MAP, }
# connect to vipc
assert self.vipc.connect(False)
self.vipc.recv()
# run test
for i in range(20*LLK_DECIMATION):
@ -53,13 +63,29 @@ class TestMapRenderer(unittest.TestCase):
# check output
assert self.sm.valid['mapRenderState'] == valid
assert 0. < self.sm['mapRenderState'].renderTime < 0.1
assert self.sm['mapRenderState'].frameId == (prev_frame_id + 1)
assert self.sm['mapRenderState'].locationMonoTime == llk.logMonoTime
if not valid:
assert self.sm['mapRenderState'].renderTime == 0.
else:
assert 0. < self.sm['mapRenderState'].renderTime < 0.1
# check vision ipc output
assert self.vipc.recv() is not None
assert self.vipc.valid == valid
assert self.vipc.timestamp_sof == llk.logMonoTime
assert self.vipc.frame_id == self.sm['mapRenderState'].frameId
def test_with_internet(self):
self._run_test(True)
def test_with_no_internet(self):
token = os.environ['MAPBOX_TOKEN']
try:
os.environ['MAPBOX_TOKEN'] = 'invalid_token'
self._run_test(False)
finally:
os.environ['MAPBOX_TOKEN'] = token
if __name__ == "__main__":
unittest.main()

Loading…
Cancel
Save