👨🎓个人主页:研学社的博客
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
在轨迹跟踪应用领域,通常 MPC 建模可根据机器人的控制方式选择基于运动学运动状态方程建模或者基于动力学运动状态方程建模。前者是根据车辆转向的几何学角度关系和速度位置关系来建立描述车辆的运动的预测模型,一般只适用于低速运动场景;后者是对被控对象进行综合受力分析,从受力平衡的角度建模,一般应用在高速运动场景,如汽车无人驾驶。
基于模型预测控制(Model Predictive Control, MPC)的四轮转向车辆轨迹规划研究,是一项旨在提高汽车操纵性能、行驶安全性和乘坐舒适性的先进控制策略。四轮转向(4WS,4 Wheel Steering)系统允许车辆的前轮和后轮根据行驶状况协同转向,相比传统两轮转向(前轮转向),在低速行驶时可以减小转弯半径,提高车辆的灵活性;在高速行驶时则能增强车辆的稳定性和响应性。下面是对这一研究主题的概述:
1. 研究背景与意义
随着自动驾驶技术的发展,车辆的轨迹控制成为了决定行车安全与效率的关键因素之一。四轮转向技术的引入,使车辆能够以更精细的方式调整行驶方向,这对于应对复杂道路环境、执行精确车道保持、自动泊车等任务尤为重要。基于模型预测控制的四轮转向轨迹规划,通过提前预测并优化车辆未来状态,能够在保证车辆动态性能的同时,实现更平滑、更准确的轨迹跟踪。
2. 系统模型
-
车辆动力学模型:建立包含四轮转向效应的车辆动力学模型是基础。这通常涉及车辆质心运动学方程、轮胎侧偏力模型以及前后轮转向角对车辆路径跟随性能的影响模型。模型需要足够精确以反映车辆动态行为,又不能过于复杂以利于实时计算。
-
环境约束:考虑车辆周围的静态和动态障碍物、道路边界和速度限制等约束条件,将其纳入模型预测控制的优化目标或约束条件中。
3. MPC算法设计
-
预测模型:利用上述车辆动力学模型对未来一段时间内的车辆状态进行预测,考虑车辆的位置、速度、航向角以及前后轮转角等因素。
-
目标函数:定义一个优化目标,通常包括减少轨迹跟踪误差、平滑控制输入(如前后轮转角的变化率)以提高乘客舒适度、以及遵守物理和道路约束。
-
滚动优化:在每个控制周期内,基于当前车辆状态和环境信息,优化未来一系列控制动作(通常是前后轮转角),然后只执行第一个(或前几个)控制动作,随后再次进行预测和优化,以此循环进行。
4. 实现与挑战
-
实时计算:MPC的实时实现是一大挑战,尤其是在考虑复杂的车辆模型和环境约束时。高效优化算法(如序列二次规划SSQP、内点法等)的应用是关键。
-
模型准确性:车辆动力学模型的准确性和复杂度之间的权衡,以及模型与实际情况之间的匹配,直接影响控制效果。
-
不确定性处理:外界干扰(如风、路面不平等)和传感器测量噪声需通过鲁棒控制方法或集成滤波器(如卡尔曼滤波器)来处理。
5. 结论
基于模型预测控制的四轮转向车辆轨迹规划,通过综合考虑车辆动力学特性、行驶环境约束以及控制目标,实现了对车辆轨迹的精确控制和动态优化,有助于提升自动驾驶车辆的行驶安全性和乘客舒适度。未来研究方向包括更高效的优化算法开发、模型不确定性管理以及在更复杂、动态环境中的应用验证。
📚2 运行结果
主函数部分代码:
addpath(genpath('YALMIP-master')); clear; close all;clc; % constraints that is representing a car or a thiner road % final state with a higher weight to track the fianl state reference %% Parameters definition % model parametersparams.a_acc = 1; % acceleration limit params.a_dec = 2; % decelerationlimit params.delta_max = 0.4; % maximum steering angle params.beta_max = pi; % crabbing slip angle limit params.beta_dot_max = (pi/180)*(100); % crabbing slip angle rate limit params.l_f = 2; % distance between center of gravity and front axle params.l_r = 2; % distance between center of gravity and rear axle params.vehicle_width = 2; % vehicle width params.Ts = 0.1; % sampling time (both of MPC and simulated vehicle) params.nstates = 4; % number of states params.ninputs = 3; % number of inputs % environment parameters params.road = 'DLC'; params.activate_obstacles = 0; params.obstacle_centers = [10 -2; 20 0; 30 -2; 40 6]; % x and y coordinate of the 4 obstacles params.obstacle_size = [2 6]; % size of the obstacles switch params.road case 'real' [X,Y,X_park,Y_park] = data_generate(params.road); case 'DLC' [X,Y,X2,Y2] = data_generate(params.road); otherwise [X,Y] = data_generate(params.road); end params.X = X; params.Y = Y; params.lane_semiwidth = 4; % semi-width of the lane params.track_end_x = X(end); % Tracking end X coordinate of the planner params.track_end_y = Y(end); % Tracking end Y coordinate of the planner params.xlim = max(X); % x limit in the plot params.ylim = max(Y); % y limit in the plot % simulation parameters in frenet coord params.s0 = 0; % initial s coordinate params.y0 = params.lane_semiwidth/2; % initial y coordinate params.theta0 = pi/2; % initial relative heading angle params.v0 = 5; % initial speed params.theta_c0 = pi/2; % initial heading angle of the curve params.N_max = 1000; % maximum number of simulation steps params.vn = params.v0/2; % average speed during braking params.vs = 1; % Stopping speed during the last stop %%% in this case, theta = theta_m (angle of the velocity vector)- theta_c (angle of the tangent vector of the curve) % simulation parameters in cartesian coord %%%%% change according to % different roadparams.x_c0 = X(1)-params.y0; %initial x coordinate params.y_c0 = 0; % initial y coordinate % plotting parameters params.window_size = 10; % plot window size for the %during simulation, centered at the %current position (x,y) of the vehicle params.plot_full = 1; % 0 for plotting only the window size, % 1 for plotting from 0 to track_end %% Simulation environment % initializationsref = zeros(params.N_max,1); z = zeros(params.N_max,params.nstates); % z(k,j) denotes state j at step k-1(s and y) z_cart = zeros(params.N_max,3); % x,y coordinate in cartesian system and the heading angle theta_c = zeros(params.N_max,1); % initial value of theta_c u = zeros(params.N_max,params.ninputs); % z(k,j) denotes input j at step k-1 z(1,:) = [params.s0,params.y0,params.theta0,params.v0]; % definition of the intial state z_cart(1,:) = [params.x_c0,params.y_c0,params.theta0]; %theta_c(1) = pi/2; %%%%%% This value is changable according to different roads comp_times = zeros(params.N_max); % total computation time each sample solve_times = zeros(params.N_max); % optimization solver time each sample i = 0; N = 10; %predicted horizon length m = params.N_max; % formulating the reference of the system switch params.road case 'real' path1 = [X;Y]'; path2 = [X_park;Y_park]' ; [S1, ~, ~, ~, ~] = getPathProperties(path1); num = S1(end)/(params.v0*params.Ts); n_step1 = round(num); [S2, ~, ~, ~, ~] = getPathProperties(path2); num = S2(end)/(params.vn*params.Ts); n_step2 = round(num); n_steps = n_step1+n_step2; vq1 = linspace(Y(1),Y(end),n_step1); % this need to be the 'variable' of the path function centerX1 = interp1(Y,X,vq1,'pchip'); % initialize the centerline y coordinate centerY1 = vq1; path_new_1 = [centerX1;centerY1]'; vq2 = linspace(X_park(1),X_park(end),n_step2); centerY2 = interp1(X_park,Y_park,vq2,' pchip '); % initialize the centerline y coordinate centerX2 = vq2; path_new_2 = [centerX2;centerY2]' ; path_new = [path_new_1;path_new_2]; [S, dX, dY, theta_c, C_c] = getPathProperties(path_new); theta_c_ref = zeros(n_steps+N,1); C_c_ref = zeros(n_steps+N,1); v_ref = zeros(n_steps+N,1); for ii = 1:length(theta_c_ref) if ii<n_steps theta_c_ref(ii) = theta_c(ii); C_c_ref(ii) = C_c(ii); else theta_c_ref(ii) = theta_c(end); C_c_ref(ii) = C_c(end); end end
🎉3 参考文献
[1]张鑫,吴伊凡,崔永琪.基于改进MPC算法的四旋翼无人机轨迹跟踪控制[J].电子技术与软件工程,2023,No.245(03):148-153.
部分理论引用网络文献,若有侵权联系博主删除。