[$100 bounty] mapsd: switch to static render mode (#32118)

* staticrender

* modify static_render_sig_rec name + use back setStyleJson

* better name

---------

Co-authored-by: ksfi <ethos.bulbes_0g@icloud.com>
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
old-commit-hash: 3c69fcddc8
pull/32199/head
ksfi 1 year ago committed by GitHub
parent c741dca04c
commit 5f9c00fd55
  1. 40
      selfdrive/navd/map_renderer.cc
  2. 2
      selfdrive/navd/map_renderer.h
  3. 2
      selfdrive/navd/tests/test_map_renderer.py

@ -41,6 +41,8 @@ MapRenderer::MapRenderer(const QMapLibre::Settings &settings, bool online) : m_s
QSurfaceFormat fmt; QSurfaceFormat fmt;
fmt.setRenderableType(QSurfaceFormat::OpenGLES); fmt.setRenderableType(QSurfaceFormat::OpenGLES);
m_settings.setMapMode(QMapLibre::Settings::MapMode::Static);
ctx = std::make_unique<QOpenGLContext>(); ctx = std::make_unique<QOpenGLContext>();
ctx->setFormat(fmt); ctx->setFormat(fmt);
ctx->create(); ctx->create();
@ -87,6 +89,18 @@ MapRenderer::MapRenderer(const QMapLibre::Settings &settings, bool online) : m_s
LOGE("Map loading failed with %d: '%s'\n", err_code, reason.toStdString().c_str()); LOGE("Map loading failed with %d: '%s'\n", err_code, reason.toStdString().c_str());
}); });
QObject::connect(m_map.data(), &QMapLibre::Map::staticRenderFinished, [=](const QString &error) {
rendering = false;
if (!error.isEmpty()) {
LOGE("Static map rendering failed with error: '%s'\n", error.toStdString().c_str());
} else if (vipc_server != nullptr) {
double end_render_t = millis_since_boot();
publish((end_render_t - start_render_t) / 1000.0, true);
last_llk_rendered = (*sm)["liveLocationKalman"].getLogMonoTime();
}
});
if (online) { if (online) {
vipc_server.reset(new VisionIpcServer("navd")); vipc_server.reset(new VisionIpcServer("navd"));
vipc_server->create_buffers(VisionStreamType::VISION_STREAM_MAP, NUM_VIPC_BUFFERS, false, WIDTH, HEIGHT); vipc_server->create_buffers(VisionStreamType::VISION_STREAM_MAP, NUM_VIPC_BUFFERS, false, WIDTH, HEIGHT);
@ -114,22 +128,16 @@ void MapRenderer::msgUpdate() {
float bearing = RAD2DEG(orientation.getValue()[2]); float bearing = RAD2DEG(orientation.getValue()[2]);
updatePosition(get_point_along_line(pos.getValue()[0], pos.getValue()[1], bearing, MAP_OFFSET), bearing); updatePosition(get_point_along_line(pos.getValue()[0], pos.getValue()[1], bearing, MAP_OFFSET), bearing);
// TODO: use the static rendering mode instead if (!rendering) {
// retry render a few times
for (int i = 0; i < 5 && !rendered(); i++) {
QApplication::processEvents(QEventLoop::AllEvents, 100);
update(); update();
if (rendered()) {
LOGW("rendered after %d retries", i+1);
break;
}
} }
// fallback to sending a blank frame
if (!rendered()) { if (!rendered()) {
publish(0, false); publish(0, false);
} }
} }
} }
if (sm->updated("navRoute")) { if (sm->updated("navRoute")) {
@ -157,7 +165,9 @@ void MapRenderer::updatePosition(QMapLibre::Coordinate position, float bearing)
m_map->setCoordinate(position); m_map->setCoordinate(position);
m_map->setBearing(bearing); m_map->setBearing(bearing);
m_map->setZoom(zoom); m_map->setZoom(zoom);
if (!rendering) {
update(); update();
}
} }
bool MapRenderer::loaded() { bool MapRenderer::loaded() {
@ -165,16 +175,10 @@ bool MapRenderer::loaded() {
} }
void MapRenderer::update() { void MapRenderer::update() {
double start_t = millis_since_boot(); rendering = true;
gl_functions->glClear(GL_COLOR_BUFFER_BIT); gl_functions->glClear(GL_COLOR_BUFFER_BIT);
m_map->render(); start_render_t = millis_since_boot();
gl_functions->glFlush(); m_map->startStaticRender();
double end_t = millis_since_boot();
if ((vipc_server != nullptr) && loaded()) {
publish((end_t - start_t) / 1000.0, true);
last_llk_rendered = (*sm)["liveLocationKalman"].getLogMonoTime();
}
} }
void MapRenderer::sendThumbnail(const uint64_t ts, const kj::Array<capnp::byte> &buf) { void MapRenderer::sendThumbnail(const uint64_t ts, const kj::Array<capnp::byte> &buf) {

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

@ -136,7 +136,7 @@ class TestMapRenderer(unittest.TestCase):
invalid_and_not_previously_valid = (expect_valid and not self.sm.valid['mapRenderState'] and not prev_valid) invalid_and_not_previously_valid = (expect_valid and not self.sm.valid['mapRenderState'] and not prev_valid)
valid_and_not_previously_invalid = (not expect_valid and self.sm.valid['mapRenderState'] and prev_valid) valid_and_not_previously_invalid = (not expect_valid and self.sm.valid['mapRenderState'] and prev_valid)
if (invalid_and_not_previously_valid or valid_and_not_previously_invalid) and frames_since_test_start < 5: if (invalid_and_not_previously_valid or valid_and_not_previously_invalid) and frames_since_test_start < 20:
continue continue
# check output # check output

Loading…
Cancel
Save