map_renderer.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env python3
  2. # You might need to uninstall the PyQt5 pip package to avoid conflicts
  3. import os
  4. import time
  5. import numpy as np
  6. from cffi import FFI
  7. from common.ffi_wrapper import suffix
  8. from common.basedir import BASEDIR
  9. HEIGHT = WIDTH = SIZE = 512
  10. METERS_PER_PIXEL = 2
  11. def get_ffi():
  12. lib = os.path.join(BASEDIR, "selfdrive", "navd", "libmap_renderer" + suffix())
  13. ffi = FFI()
  14. ffi.cdef("""
  15. void* map_renderer_init(char *maps_host, char *token);
  16. void map_renderer_update_position(void *inst, float lat, float lon, float bearing);
  17. void map_renderer_update_route(void *inst, char *polyline);
  18. void map_renderer_update(void *inst);
  19. void map_renderer_process(void *inst);
  20. bool map_renderer_loaded(void *inst);
  21. uint8_t* map_renderer_get_image(void *inst);
  22. void map_renderer_free_image(void *inst, uint8_t *buf);
  23. """)
  24. return ffi, ffi.dlopen(lib)
  25. def wait_ready(lib, renderer):
  26. while not lib.map_renderer_loaded(renderer):
  27. lib.map_renderer_update(renderer)
  28. # The main qt app is not execed, so we need to periodically process events for e.g. network requests
  29. lib.map_renderer_process(renderer)
  30. time.sleep(0.01)
  31. def get_image(lib, renderer):
  32. buf = lib.map_renderer_get_image(renderer)
  33. r = list(buf[0:WIDTH * HEIGHT])
  34. lib.map_renderer_free_image(renderer, buf)
  35. # Convert to numpy
  36. r = np.asarray(r)
  37. return r.reshape((WIDTH, HEIGHT))
  38. if __name__ == "__main__":
  39. import matplotlib.pyplot as plt
  40. ffi, lib = get_ffi()
  41. renderer = lib.map_renderer_init(ffi.NULL, ffi.NULL)
  42. wait_ready(lib, renderer)
  43. geometry = r"{yxk}@|obn~Eg@@eCFqc@J{RFw@?kA@gA?q|@Riu@NuJBgi@ZqVNcRBaPBkG@iSD{I@_H@cH?gG@mG@gG?aD@{LDgDDkVVyQLiGDgX@q_@@qI@qKhS{R~[}NtYaDbGoIvLwNfP_b@|f@oFnF_JxHel@bf@{JlIuxAlpAkNnLmZrWqFhFoh@jd@kX|TkJxH_RnPy^|[uKtHoZ~Um`DlkCorC``CuShQogCtwB_ThQcr@fk@sVrWgRhVmSb\\oj@jxA{Qvg@u]tbAyHzSos@xjBeKbWszAbgEc~@~jCuTrl@cYfo@mRn\\_m@v}@ij@jp@om@lk@y|A`pAiXbVmWzUod@xj@wNlTw}@|uAwSn\\kRfYqOdS_IdJuK`KmKvJoOhLuLbHaMzGwO~GoOzFiSrEsOhD}PhCqw@vJmnAxSczA`Vyb@bHk[fFgl@pJeoDdl@}}@zIyr@hG}X`BmUdBcM^aRR}Oe@iZc@mR_@{FScHxAn_@vz@zCzH~GjPxAhDlB~DhEdJlIbMhFfG|F~GlHrGjNjItLnGvQ~EhLnBfOn@p`@AzAAvn@CfC?fc@`@lUrArStCfSxEtSzGxM|ElFlBrOzJlEbDnC~BfDtCnHjHlLvMdTnZzHpObOf^pKla@~G|a@dErg@rCbj@zArYlj@ttJ~AfZh@r]LzYg@`TkDbj@gIdv@oE|i@kKzhA{CdNsEfOiGlPsEvMiDpLgBpHyB`MkB|MmArPg@|N?|P^rUvFz~AWpOCdAkB|PuB`KeFfHkCfGy@tAqC~AsBPkDs@uAiAcJwMe@s@eKkPMoXQux@EuuCoH?eI?Kas@}Dy@wAUkMOgDL"
  44. lib.map_renderer_update_route(renderer, geometry.encode())
  45. POSITIONS = [
  46. (32.71569271952601, -117.16384270868463, 0), (32.71569271952601, -117.16384270868463, 45), # San Diego
  47. (52.378641991483136, 4.902623379456488, 0), (52.378641991483136, 4.902623379456488, 45), # Amsterdam
  48. ]
  49. plt.figure()
  50. for i, pos in enumerate(POSITIONS):
  51. t = time.time()
  52. lib.map_renderer_update_position(renderer, *pos)
  53. wait_ready(lib, renderer)
  54. print(f"{pos} took {time.time() - t:.2f} s")
  55. plt.subplot(2, 2, i + 1)
  56. plt.imshow(get_image(lib, renderer), cmap='gray')
  57. plt.show()