import numpy as np from openpilot.selfdrive.controls.radard import RADAR_TO_CAMERA # Color palette used for rerun AnnotationContext rerunColorPalette = [(96, "red", (255, 0, 0)), (100, "pink", (255, 36, 0)), (124, "yellow", (255, 255, 0)), (230, "vibrantpink", (255, 36, 170)), (240, "orange", (255, 146, 0)), (255, "white", (255, 255, 255)), (110, "carColor", (255,0,127)), (0, "background", (0, 0, 0))] class UIParams: lidar_x, lidar_y, lidar_zoom = 384, 960, 6 lidar_car_x, lidar_car_y = lidar_x / 2., lidar_y / 1.1 car_hwidth = 1.7272 / 2 * lidar_zoom car_front = 2.6924 * lidar_zoom car_back = 1.8796 * lidar_zoom car_color = rerunColorPalette[6][0] UP = UIParams def to_topdown_pt(y, x): px, py = x * UP.lidar_zoom + UP.lidar_car_x, -y * UP.lidar_zoom + UP.lidar_car_y if px > 0 and py > 0 and px < UP.lidar_x and py < UP.lidar_y: return int(px), int(py) return -1, -1 def draw_path(path, lid_overlay, lid_color=None): x, y = np.asarray(path.x), np.asarray(path.y) # draw lidar path point on lidar if lid_color is not None and lid_overlay is not None: for i in range(len(x)): px, py = to_topdown_pt(x[i], y[i]) if px != -1: lid_overlay[px, py] = lid_color def plot_model(m, lid_overlay): if lid_overlay is None: return for lead in m.leadsV3: if lead.prob < 0.5: continue x, y = lead.x[0], lead.y[0] x_std = lead.xStd[0] x -= RADAR_TO_CAMERA _, py_top = to_topdown_pt(x + x_std, y) px, py_bottom = to_topdown_pt(x - x_std, y) lid_overlay[int(round(px - 4)):int(round(px + 4)), py_top:py_bottom] = rerunColorPalette[2][0] for path in m.laneLines: draw_path(path, lid_overlay, rerunColorPalette[2][0]) for edge in m.roadEdges: draw_path(edge, lid_overlay, rerunColorPalette[0][0]) draw_path(m.position, lid_overlay, rerunColorPalette[0][0]) def plot_lead(rs, lid_overlay): for lead in [rs.leadOne, rs.leadTwo]: if not lead.status: continue x = lead.dRel px_left, py = to_topdown_pt(x, -10) px_right, _ = to_topdown_pt(x, 10) lid_overlay[px_left:px_right, py] = rerunColorPalette[0][0] def update_radar_points(lt, lid_overlay): ar_pts = [] if lt is not None: ar_pts = {} for track in lt: ar_pts[track.trackId] = [track.dRel, track.yRel, track.vRel, track.aRel, track.oncoming, track.stationary] for ids, pt in ar_pts.items(): # negative here since radar is left positive px, py = to_topdown_pt(pt[0], -pt[1]) if px != -1: if pt[-1]: color = rerunColorPalette[4][0] elif pt[-2]: color = rerunColorPalette[3][0] else: color = rerunColorPalette[5][0] if int(ids) == 1: lid_overlay[px - 2:px + 2, py - 10:py + 10] = rerunColorPalette[1][0] else: lid_overlay[px - 2:px + 2, py - 2:py + 2] = color def get_blank_lid_overlay(UP): lid_overlay = np.zeros((UP.lidar_x, UP.lidar_y), 'uint8') # Draw the car. lid_overlay[int(round(UP.lidar_car_x - UP.car_hwidth)):int( round(UP.lidar_car_x + UP.car_hwidth)), int(round(UP.lidar_car_y - UP.car_front))] = UP.car_color lid_overlay[int(round(UP.lidar_car_x - UP.car_hwidth)):int( round(UP.lidar_car_x + UP.car_hwidth)), int(round(UP.lidar_car_y + UP.car_back))] = UP.car_color lid_overlay[int(round(UP.lidar_car_x - UP.car_hwidth)), int( round(UP.lidar_car_y - UP.car_front)):int(round( UP.lidar_car_y + UP.car_back))] = UP.car_color lid_overlay[int(round(UP.lidar_car_x + UP.car_hwidth)), int( round(UP.lidar_car_y - UP.car_front)):int(round( UP.lidar_car_y + UP.car_back))] = UP.car_color return lid_overlay