车辆模型推导以及MPC控制实现

车辆预测模型(MPC)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在代码中采用如下进行实现:

def linear_mpc_control(xref, xbar, x0, dref):
    """
    linear mpc control

    xref: reference point参考点
    xbar: operational point当前点
    x0: initial state
    dref: reference steer angle
    """

    x = cvxpy.Variable((NX, T + 1))
    u = cvxpy.Variable((NU, T))

    cost = 0.0
    constraints = []

    for t in range(T):
        cost += cvxpy.quad_form(u[:, t], R)# u^T R u

        if t != 0:
            cost += cvxpy.quad_form(xref[:, t] - x[:, t], Q) # (xref-x)^T Q (xref-x)

        A, B, C = get_linear_model_matrix(
            xbar[2, t], xbar[3, t], dref[0, t])
        constraints += [x[:, t + 1] == A * x[:, t] + B * u[:, t] + C]

        if t < (T - 1):
            cost += cvxpy.quad_form(u[:, t + 1] - u[:, t], Rd) # u_{t-1}^T Rd u_{t-1}
            # 前轮方向角度小于最大角加速度×DT
            constraints += [cvxpy.abs(u[1, t + 1] - u[1, t])
                            <= MAX_DSTEER * DT]

    # 最后一个点
    cost += cvxpy.quad_form(xref[:, T] - x[:, T], Qf) # (xref-x)^T Qf (xref-x)

    constraints += [x[:, 0] == x0]
    constraints += [x[2, :] <= MAX_SPEED]
    constraints += [x[2, :] >= MIN_SPEED]
    constraints += [cvxpy.abs(u[0, :]) <= MAX_ACCEL]
    constraints += [cvxpy.abs(u[1, :]) <= MAX_STEER]
	# 构造最小二乘问题
    prob = cvxpy.Problem(cvxpy.Minimize(cost), constraints)
    # 求解最小二乘
    prob.solve(solver=cvxpy.ECOS, verbose=False)

    if prob.status == cvxpy.OPTIMAL or prob.status == cvxpy.OPTIMAL_INACCURATE:
        ox = get_nparray_from_matrix(x.value[0, :]) # 状态量x,
        oy = get_nparray_from_matrix(x.value[1, :]) # 状态量y
        ov = get_nparray_from_matrix(x.value[2, :]) # 状态量v
        oyaw = get_nparray_from_matrix(x.value[3, :]) # 状态量yaw
        oa = get_nparray_from_matrix(u.value[0, :]) # 控制量accel
        odelta = get_nparray_from_matrix(u.value[1, :]) # 控制量steer

    else:
        print("Error: Cannot solve mpc..")
        oa, odelta, ox, oy, oyaw, ov = None, None, None, None, None, None

    return oa, odelta, ox, oy, oyaw, ov
  • 16
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
阿克曼模型是一种经典的车辆动力学模型,可以用于描述车辆的运动轨迹。而MPC(Model Predictive Control,模型预测控制)是一种常用的控制策略,可以用于控制车辆的运动轨迹。在平行泊车问题中,可以使用阿克曼模型和MPC实现自动泊车。 以下是一种基于阿克曼模型和MPC的平行泊车轨迹程序Matlab代码: ```matlab % 阿克曼模型参数 L = 2.5; % 车轮间距 delta_max = 45; % 最大转角 % MPC参数 N = 10; % 预测时域 Q = diag([1, 1, 1, 1]); % 状态权重 R = diag([1, 1]); % 控制权重 % 初始状态 x0 = [0; 0; pi/4; 0]; % 目标状态 xf = [5; 0; pi/4; 0]; % 时间步长 dt = 0.1; % MPC控制循环 for i=1:100 % 计算当前状态 x = x0; % 计算理论上的最优控制 [u, ~, ~] = mpc_control(x, xf, L, delta_max, N, dt, Q, R); % 执行控制 x0 = akermann(x0, u, L, delta_max, dt); % 绘制车辆轨迹 plot(x0(1), x0(2), 'bo'); hold on; axis equal; draw_car(x0, L); drawnow; end % MPC控制函数 function [u_opt, x_opt, fval] = mpc_control(x, xf, L, delta_max, N, dt, Q, R) x_dim = size(x, 1); u_dim = 2; % 状态转移矩阵 A = [1, 0, -L*tan(x(3))/x(4), L/(x(4)^2+1); 0, 1, L/(x(4)^2+1), tan(x(3))/x(4); 0, 0, 1, 0; 0, 0, 0, 1]; % 控制矩阵 B = [0, -L/(x(4)^2+1); 0, -tan(x(3))/x(4)^2; 0, 0; 1, 0]; % 状态约束 lb = [-inf; -inf; -pi; -inf]; ub = [inf; inf; pi; inf]; % 控制约束 lb_u = [-delta_max; -inf]; ub_u = [delta_max; inf]; % 预测时域 T = dt*(0:N-1); % 初始化变量 x_opt = zeros(x_dim, N); u_opt = zeros(u_dim, N-1); fval = 0; % MPC求解 for i=1:N-1 % 目标函数 f = @(z) (z-x)'*Q*(z-x) + u'*R*u; % 约束 A_eq = [eye(x_dim), -B*R^(-1/2)]; b_eq = A*x; lb_z = [lb; lb_u]; ub_z = [ub; ub_u]; % 求解优化问题 options = optimoptions('fmincon', 'Display', 'off'); [z, fval_i] = fmincon(f, [x;u], [], [], A_eq, b_eq, lb_z, ub_z, [], options); x_opt(:,i) = z(1:x_dim); u_opt(:,i) = z(x_dim+1:end); fval = fval + fval_i; % 更新当前状态 x = akermann(x, u_opt(:,i), L, delta_max, dt); end % 计算最后一个控制输入 u = u_opt(:,end); A_eq = [eye(x_dim), -B*R^(-1/2)]; b_eq = A*x; lb_z = [lb; lb_u]; ub_z = [ub; ub_u]; f = @(z) (z-x)'*Q*(z-x) + u'*R*u; [z, fval_i] = fmincon(f, [x;u], [], [], A_eq, b_eq, lb_z, ub_z, [], options); x_opt(:,N) = z(1:x_dim); fval = fval + fval_i; end % 阿克曼模型函数 function x_next = akermann(x, u, L, delta_max, dt) delta = max(-delta_max, min(delta_max, u(1))); v = u(2); x_next = x + dt*[v*cos(x(3)); v*sin(x(3)); v*tan(delta)/L; 0]; end % 绘制车辆函数 function draw_car(x, L) plot([x(1); x(1)+L*cos(x(3))], [x(2); x(2)+L*sin(x(3))], 'b'); end ``` 该程序实现了基于阿克曼模型和MPC的自动泊车控制。其中,阿克曼模型描述了车辆的运动轨迹,MPC控制算法根据当前状态和目标状态计算出最优的控制输入,然后通过阿克曼模型计算出下一时刻的状态,并不断重复该过程以实现自动泊车控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值