车辆纵向mpc控制器

MPC控制器:https://blog.csdn.net/qq_42258099/article/details/95353986?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
内点法:https://zhuanlan.zhihu.com/p/96981554
运动学模型:https://www.cnblogs.com/yrm1160029237/p/10087315.html
基于python的mpc实现:https://blog.csdn.net/u013468614/article/details/103519721
mpc控制器:首先构建一个物理模型,将当前的信息和要输出的量放入其中可以预测之后一段时间的情况,用预测和期望做代价函数,找出可以使得代价函数最小的输出,就是当前的最佳输出。

内点法:要求某个函数值最小,并且有约束函数。通过构建惩罚函数绕过约束。

·本人刚开始学习mpc控制器的内容,想从一个简单易懂的角度阐述一下对mpc控制器的理解,本博客仅供参考

首先参考资料中的第一个连接,得到如下思路:
想做MPC控制器需要做三件事:
1、给物理模型建模
·这部分需要汽车动力学的知识,具体介绍在第三个链接中。这里只取结果
在这里插入图片描述
·车辆运动的状态主要有六个值表示:x轴和y轴的位置、速度、偏离中心的角度、横向偏移量、角度变化量。
·而我们能控制的就是在绝对坐标中的加速度(油门)和转向角度(方向盘)
·因为是基于现实的,所以还要对加速度和转向角度进行约束。
在这里插入图片描述
·也就是说当我们获得当前时刻的运动状态的六个量,我们再设置两个加速度和转向角度两个输出,我们就可以通过上面的物理模型预测之后数个时刻的六个状态量

2、以理想路线为期望和预测的结果一起为建立代价函数
在这里插入图片描述
·这个代价函数代表的是理想路线(通过路径规划的方法得出)和当前预测的结果的差距量。
·带ref的量就是期望量是通过路径规划获得的理想理想路线上的点得到的
·给出一组加速度和转向角度就可以获得一组模型预测而来的未来数个点的六个状态值。不同的状态量可能重要性不同,所以可能要设计一个权重系数。
·那么现在要做的就是找到一组加速度和转向角度使得和理想路径误差最小,也就是这个代价函数最小。

3、求得输出量的最佳值
·这里涉及一个最优化的问题,要在对加速度和转向角的约束下,找到使得代价函数最小的加速度和转向角。为了解决这个问题使用了内点法。
·内点法具体内容参考第二个链接,以下是对内点法的个人理解:
(1)这个问题的难点就在于存在一个不等式的约束,其实如果只是一个二元二次等式可以通过微积分的求导得出最优值。
(2)所以构造一个障碍函数,通过等式的方式代替不等式代表的意义。在这里插入图片描述

·这个f(x)就是那个代价函数,这样在约束下的条件下,求代价函数的最小值的问题就转换成了求一个函数最小值的问题。
(3)这个函数的最小值就可以通过求偏导的方式进行求解了,求得的结果是包含r的。r越小,结果越好。通过r的极限过程,求得加速度和转角的不带r的结果。

以下是一个简单的车辆纵向控制offset-free MPC的MATLAB代码示例: ```matlab % 车辆纵向控制offset-free MPC代码示例 % 初始化车辆模型参数 m = 1000; % 质量 g = 9.81; % 重力加速度 c = 10000; % 阻尼系数 k = 50000; % 弹簧刚度 L = 3; % 轴距 I = 1500; % 转动惯量 % 初始化MPC参数 N = 10; % 控制时域 Ts = 0.1; % 采样时间 % 初始化MPC模型 A = [0 1 0 0;... -(2*k+2*c)/m 0 (2*k*L-2*c*L)/m 0;... 0 0 0 1;... k*L/I 0 -k*L^2/I 0]; B = [0; 2/m; 0; -L/I]; C = [1 0 0 0]; D = 0; sys = ss(A,B,C,D); sys_d = c2d(sys, Ts, 'zoh'); [A_d,B_d,C_d,D_d] = ssdata(sys_d); % 初始化MPC控制器参数 Q = diag([10 1 10 1]); R = 1; % 定义MPC控制器 mpc_obj = mpc(A_d, B_d, C_d, D_d, Ts, N); mpc_obj.Weights.OutputVariables = Q; mpc_obj.Weights.ManipulatedVariables = R; % 初始化状态估计器 C_obs = [1 0 0 0; 0 0 1 0]; D_obs = 0; L_obs = place(A', C_obs', [0.1 0.2 0.3 0.4])'; % 状态估计器增益 obs_obj = ss(A-L_obs*C_obs, [B L_obs], eye(4), 0*[D D_obs], Ts); % 初始化参考信号和干扰量 r = [ones(1, 20) zeros(1, 40)]; d = [zeros(1, 20) ones(1, 40)]; % 初始化仿真参数 T_sim = length(r)*Ts; x0 = [0; 0; 0; 0]; % 初始化状态 % 运行MPC控制器 u_offset_free = zeros(1, length(r)); x_offset_free = zeros(4, length(r)); x_obs = x0; for i = 1:length(r) % 获取当前状态估计值 y_obs = C_obs*x_obs; % 计算当前偏差 r_i = r(i); d_i = d(i); y_i = C*x_obs; delta_y_i = y_i - r_i; delta_d_i = d_i - D*x_obs; % 运行offset-free MPC控制器 u_i = mpcmove(mpc_obj, x_obs, delta_y_i, delta_d_i); u_offset_free(i) = u_i(1); % 更新状态估计器 x_obs = obs_obj.A*x_obs + obs_obj.B*[u_i; y_obs]; x_offset_free(:, i) = x_obs; end % 绘制结果 t = 0:Ts:T_sim-Ts; subplot(211) plot(t, r, 'k--', 'linewidth', 2) hold on plot(t, C*x_offset_free, 'b', 'linewidth', 2) ylabel('Output') legend('Reference', 'Output') subplot(212) plot(t, u_offset_free, 'r', 'linewidth', 2) xlabel('Time (s)') ylabel('Input') ``` 请注意,这只是一个简单的示例,可能需要根据您的具体问题进行修改和适应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值