mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-10-01 03:43:46 +08:00
@@ -2,12 +2,13 @@ import os
|
||||
import math
|
||||
import numpy as np
|
||||
|
||||
# from common.numpy_fast import clip
|
||||
from common.realtime import sec_since_boot
|
||||
from selfdrive.services import service_list
|
||||
from selfdrive.swaglog import cloudlog
|
||||
from selfdrive.controls.lib.lateral_mpc import libmpc_py
|
||||
from selfdrive.controls.lib.drive_helpers import MPC_COST_LAT
|
||||
from selfdrive.controls.lib.model_parser import ModelParser
|
||||
from selfdrive.controls.lib.lane_planner import LanePlanner
|
||||
import selfdrive.messaging as messaging
|
||||
|
||||
LOG_MPC = os.environ.get('LOG_MPC', False)
|
||||
@@ -21,10 +22,7 @@ def calc_states_after_delay(states, v_ego, steer_angle, curvature_factor, steer_
|
||||
|
||||
class PathPlanner(object):
|
||||
def __init__(self, CP):
|
||||
self.MP = ModelParser()
|
||||
|
||||
self.l_poly = [0., 0., 0., 0.]
|
||||
self.r_poly = [0., 0., 0., 0.]
|
||||
self.LP = LanePlanner()
|
||||
|
||||
self.last_cloudlog_t = 0
|
||||
|
||||
@@ -33,6 +31,7 @@ class PathPlanner(object):
|
||||
|
||||
self.setup_mpc(CP.steerRateCost)
|
||||
self.solution_invalid_cnt = 0
|
||||
self.path_offset_i = 0.0
|
||||
|
||||
def setup_mpc(self, steer_rate_cost):
|
||||
self.libmpc = libmpc_py.libmpc
|
||||
@@ -50,10 +49,6 @@ class PathPlanner(object):
|
||||
self.angle_steers_des_prev = 0.0
|
||||
self.angle_steers_des_time = 0.0
|
||||
|
||||
self.l_poly = libmpc_py.ffi.new("double[4]")
|
||||
self.r_poly = libmpc_py.ffi.new("double[4]")
|
||||
self.p_poly = libmpc_py.ffi.new("double[4]")
|
||||
|
||||
def update(self, sm, CP, VM):
|
||||
v_ego = sm['carState'].vEgo
|
||||
angle_steers = sm['carState'].steeringAngle
|
||||
@@ -62,23 +57,28 @@ class PathPlanner(object):
|
||||
angle_offset_average = sm['liveParameters'].angleOffsetAverage
|
||||
angle_offset_bias = sm['controlsState'].angleModelBias + angle_offset_average
|
||||
|
||||
self.MP.update(v_ego, sm['model'])
|
||||
self.LP.update(v_ego, sm['model'])
|
||||
|
||||
# Run MPC
|
||||
self.angle_steers_des_prev = self.angle_steers_des_mpc
|
||||
VM.update_params(sm['liveParameters'].stiffnessFactor, sm['liveParameters'].steerRatio)
|
||||
curvature_factor = VM.curvature_factor(v_ego)
|
||||
self.l_poly = list(self.MP.l_poly)
|
||||
self.r_poly = list(self.MP.r_poly)
|
||||
self.p_poly = list(self.MP.p_poly)
|
||||
|
||||
# TODO: Check for active, override, and saturation
|
||||
# if active:
|
||||
# self.path_offset_i += self.LP.d_poly[3] / (60.0 * 20.0)
|
||||
# self.path_offset_i = clip(self.path_offset_i, -0.5, 0.5)
|
||||
# self.LP.d_poly[3] += self.path_offset_i
|
||||
# else:
|
||||
# self.path_offset_i = 0.0
|
||||
|
||||
# account for actuation delay
|
||||
self.cur_state = calc_states_after_delay(self.cur_state, v_ego, angle_steers - angle_offset_average, curvature_factor, VM.sR, CP.steerActuatorDelay)
|
||||
|
||||
v_ego_mpc = max(v_ego, 5.0) # avoid mpc roughness due to low speed
|
||||
self.libmpc.run_mpc(self.cur_state, self.mpc_solution,
|
||||
self.l_poly, self.r_poly, self.p_poly,
|
||||
self.MP.l_prob, self.MP.r_prob, self.MP.p_prob, curvature_factor, v_ego_mpc, self.MP.lane_width)
|
||||
list(self.LP.l_poly), list(self.LP.r_poly), list(self.LP.d_poly),
|
||||
self.LP.l_prob, self.LP.r_prob, curvature_factor, v_ego_mpc, self.LP.lane_width)
|
||||
|
||||
# reset to current steer angle if not active or overriding
|
||||
if active:
|
||||
@@ -112,17 +112,16 @@ class PathPlanner(object):
|
||||
plan_send = messaging.new_message()
|
||||
plan_send.init('pathPlan')
|
||||
plan_send.valid = sm.all_alive_and_valid(service_list=['carState', 'controlsState', 'liveParameters', 'model'])
|
||||
plan_send.pathPlan.laneWidth = float(self.MP.lane_width)
|
||||
plan_send.pathPlan.dPoly = [float(x) for x in self.MP.d_poly]
|
||||
plan_send.pathPlan.cPoly = [float(x) for x in self.MP.c_poly]
|
||||
plan_send.pathPlan.cProb = float(self.MP.c_prob)
|
||||
plan_send.pathPlan.lPoly = [float(x) for x in self.l_poly]
|
||||
plan_send.pathPlan.lProb = float(self.MP.l_prob)
|
||||
plan_send.pathPlan.rPoly = [float(x) for x in self.r_poly]
|
||||
plan_send.pathPlan.rProb = float(self.MP.r_prob)
|
||||
plan_send.pathPlan.laneWidth = float(self.LP.lane_width)
|
||||
plan_send.pathPlan.dPoly = [float(x) for x in self.LP.d_poly]
|
||||
plan_send.pathPlan.lPoly = [float(x) for x in self.LP.l_poly]
|
||||
plan_send.pathPlan.lProb = float(self.LP.l_prob)
|
||||
plan_send.pathPlan.rPoly = [float(x) for x in self.LP.r_poly]
|
||||
plan_send.pathPlan.rProb = float(self.LP.r_prob)
|
||||
|
||||
plan_send.pathPlan.angleSteers = float(self.angle_steers_des_mpc)
|
||||
plan_send.pathPlan.rateSteers = float(rate_desired)
|
||||
plan_send.pathPlan.angleOffset = float(angle_offset_average)
|
||||
plan_send.pathPlan.angleOffset = float(self.path_offset_i)
|
||||
plan_send.pathPlan.mpcSolutionValid = bool(plan_solution_valid)
|
||||
plan_send.pathPlan.paramsValid = bool(sm['liveParameters'].valid)
|
||||
plan_send.pathPlan.sensorValid = bool(sm['liveParameters'].sensorValid)
|
||||
|
||||
Reference in New Issue
Block a user