在 Python 中设计 MPC 控制器
Designing an MPC controller in Python
我正在尝试在 Python 中设计 MPC 控制器,但我真的不知道从哪里开始。我在 YouTube 上观看了视频,但我更加困惑。基本上,这是针对模拟自动驾驶汽车的。我已经为它完成了 PID 控制器,但我还没有 运行 在模拟器上完成它:
def PID(self, Kp, Ki, Kd, reference_velocity, vehicle_velocity, current_time, last_update_time):
errors = []
Kp = 0
Ki = 0
Kd = 0
error = reference_velocity - vehicle_velocity
delta_time = current_time - last_update_time
last_error = errors[-1]
proportional = Kp * error
integral = Ki * error
derivative = Kd * ((error - last_error) / (delta_time))
errors.append(error)
return proportional + integral + derivative
但我不知道如何开始使用 MPC。在我的初始化函数中,我有以下值:
def __init__(self, waypoints):
self.vars = cutils.CUtils()
self._current_x = 0
self._current_y = 0
self._current_yaw = 0
self._current_speed = 0
self._desired_speed = 0
self._current_frame = 0
self._current_timestamp = 0
self._start_control_loop = False
self._set_throttle = 0
self._set_brake = 0
self._set_steer = 0
self._waypoints = waypoints
self._conv_rad_to_steer = 180.0 / 70.0 / np.pi
self._pi = np.pi
self._2pi = 2.0 * np.pi
我还有以下函数定义。我将省略函数的主体。我知道我必须在 MPC 中使用这些,但这正是我需要指导的地方。
def update_values(self, x, y, yaw, speed, timestamp, frame):
def update_desired_speed(self):
def update_waypoints(self, new_waypoints):
def get_commands(self):
def set_throttle(self, input_throttle):
def set_steer(self, input_steer_in_rad):
def set_brake(self, input_brake):
def update_controls(self):
MPC 是一种基于优化和模型的控制算法,与 PID 控制器完全不同。模型预测控制器解决优化问题,其中用户定义的成本函数根据作为常微分方程给出的模型动力学(您需要 know/derive)最小化。这种优化可以进一步受到额外的约束(例如输入约束、状态约束、积分约束……)。由于这种方法是一种非常复杂的控制方案,因此实施起来非常困难,您应该问问自己,您的应用是否需要 MPC 的功能,或者 PID 控制是否足够。
我正在尝试在 Python 中设计 MPC 控制器,但我真的不知道从哪里开始。我在 YouTube 上观看了视频,但我更加困惑。基本上,这是针对模拟自动驾驶汽车的。我已经为它完成了 PID 控制器,但我还没有 运行 在模拟器上完成它:
def PID(self, Kp, Ki, Kd, reference_velocity, vehicle_velocity, current_time, last_update_time):
errors = []
Kp = 0
Ki = 0
Kd = 0
error = reference_velocity - vehicle_velocity
delta_time = current_time - last_update_time
last_error = errors[-1]
proportional = Kp * error
integral = Ki * error
derivative = Kd * ((error - last_error) / (delta_time))
errors.append(error)
return proportional + integral + derivative
但我不知道如何开始使用 MPC。在我的初始化函数中,我有以下值:
def __init__(self, waypoints):
self.vars = cutils.CUtils()
self._current_x = 0
self._current_y = 0
self._current_yaw = 0
self._current_speed = 0
self._desired_speed = 0
self._current_frame = 0
self._current_timestamp = 0
self._start_control_loop = False
self._set_throttle = 0
self._set_brake = 0
self._set_steer = 0
self._waypoints = waypoints
self._conv_rad_to_steer = 180.0 / 70.0 / np.pi
self._pi = np.pi
self._2pi = 2.0 * np.pi
我还有以下函数定义。我将省略函数的主体。我知道我必须在 MPC 中使用这些,但这正是我需要指导的地方。
def update_values(self, x, y, yaw, speed, timestamp, frame):
def update_desired_speed(self):
def update_waypoints(self, new_waypoints):
def get_commands(self):
def set_throttle(self, input_throttle):
def set_steer(self, input_steer_in_rad):
def set_brake(self, input_brake):
def update_controls(self):
MPC 是一种基于优化和模型的控制算法,与 PID 控制器完全不同。模型预测控制器解决优化问题,其中用户定义的成本函数根据作为常微分方程给出的模型动力学(您需要 know/derive)最小化。这种优化可以进一步受到额外的约束(例如输入约束、状态约束、积分约束……)。由于这种方法是一种非常复杂的控制方案,因此实施起来非常困难,您应该问问自己,您的应用是否需要 MPC 的功能,或者 PID 控制是否足够。