车辆纵向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的结果。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于 MPC 算法实现车辆轨迹跟踪的 MATLAB 代码示例: ```matlab %% 建立车辆动力学模型和环境模型 % 定义车辆动力学参数 m = 1000; % 质量 Cf = 16000; % 前轮侧向刚度 Cr = 18000; % 后轮侧向刚度 Lf = 1.2; % 前轴到重心距离 Lr = 1.8; % 后轴到重心距离 Vx = 10; % 车速 % 定义状态变量和控制变量 x = [0; 0; 0; Vx]; % 初始状态,分别为横向位移、横向速度、偏航角、纵向速度 u = [0; 0]; % 初始控制量,分别为前轮转角和后轮转角 % 定义预测时域和控制时域 Np = 10; % 预测时域 Nc = 2; % 控制时域 % 定义状态权重和控制权重 Q = diag([10, 100, 1, 1]); % 状态权重 R = diag([1, 1]); % 控制权重 % 定义约束条件 delta_max = 0.5; % 前轮转角限制 alpha_max = deg2rad(10); % 前轮侧偏角限制 % 定义 MPC 控制器 mpc_controller = mpc(tf({Cf, Cr}, {m*Lr, m*Lf+ m*Lr, m*Vx, 0}), Vx, Np, Nc, Q, R, [], [], [delta_max; alpha_max], [], []); %% MPC 控制循环 for i = 1:100 % 从传感器获取当前状态 y = [0; 0; 0; Vx]; % 假设当前状态与初始状态相同 % 更新 MPC 控制器并生成控制命令 mpc_controller = mpc_controller.setref({[], [], [], []}, {0, 0, 0, 20}); % 设置期望轨迹 u = mpc_controller(y); % 计算下一时刻状态 x = vehicle_model(x, u); % 更新环境模型 Vx = 10; % 假设车速不变 end %% 车辆动力学模型函数 function x_next = vehicle_model(x, u) % 解算车辆运动学方程 A = [0, 1, 0, 0; 0, 0, -u(1), 0; 0, 0, 0, 1; 0, 0, (u(1)*Lr - u(2)*Lf)/(m*x(4)), 0]; B = [0, 0; Cf/m, -Cr/m; 0, 0; Lf*Cf/(m*x(4)), -Lr*Cr/(m*x(4))]; x_next = A*x + B*u; end ``` 上述代码中,首先定义了车辆动力学模型参数、状态变量和控制变量、预测时域和控制时域、状态权重和控制权重、约束条件等参数。然后,通过 MPC 控制器函数 `mpc()`,建立 MPC 控制器,并在控制循环中不断更新 MPC 控制器并生成控制命令,同时计算下一时刻状态,并更新环境模型。最后,定义了车辆动力学模型函数 `vehicle_model()`,用于解算车辆运动学方程。 需要注意的是,这只是一个简单的示例,实际应用中需要根据具体情况进行参数调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值