from common.numpy_fast import interp import numpy as np from selfdrive.controls.lib.latcontrol_helpers import model_polyfit, calc_desired_path, compute_path_pinv CAMERA_OFFSET = 0.06 # m from center car to camera class ModelParser(object): def __init__(self): self.d_poly = [0., 0., 0., 0.] self.c_poly = [0., 0., 0., 0.] self.c_prob = 0. self.last_model = 0. self.lead_dist, self.lead_prob, self.lead_var = 0, 0, 1 self._path_pinv = compute_path_pinv() self.lane_width_estimate = 3.7 self.lane_width_certainty = 1.0 self.lane_width = 3.7 self.l_prob = 0. self.r_prob = 0. self.x_points = np.arange(50) def update(self, v_ego, md): if len(md.leftLane.poly): l_poly = np.array(md.leftLane.poly) r_poly = np.array(md.rightLane.poly) p_poly = np.array(md.path.poly) else: l_poly = model_polyfit(md.leftLane.points, self._path_pinv) # left line r_poly = model_polyfit(md.rightLane.points, self._path_pinv) # right line p_poly = model_polyfit(md.path.points, self._path_pinv) # predicted path # only offset left and right lane lines; offsetting p_poly does not make sense l_poly[3] += CAMERA_OFFSET r_poly[3] += CAMERA_OFFSET p_prob = 1. # model does not tell this probability yet, so set to 1 for now l_prob = md.leftLane.prob # left line prob r_prob = md.rightLane.prob # right line prob # Find current lanewidth lr_prob = l_prob * r_prob self.lane_width_certainty += 0.05 * (lr_prob - self.lane_width_certainty) current_lane_width = abs(l_poly[3] - r_poly[3]) self.lane_width_estimate += 0.005 * (current_lane_width - self.lane_width_estimate) speed_lane_width = interp(v_ego, [0., 31.], [2.8, 3.5]) self.lane_width = self.lane_width_certainty * self.lane_width_estimate + \ (1 - self.lane_width_certainty) * speed_lane_width self.lead_dist = md.lead.dist self.lead_prob = md.lead.prob self.lead_var = md.lead.std**2 # compute target path self.d_poly, self.c_poly, self.c_prob = calc_desired_path( l_poly, r_poly, p_poly, l_prob, r_prob, p_prob, v_ego, self.lane_width) self.r_poly = r_poly self.r_prob = r_prob self.l_poly = l_poly self.l_prob = l_prob self.p_poly = p_poly self.p_prob = p_prob