车辆纵向控制

博客围绕自动驾驶车辆纵向控制展开,先搭建电车电机模型,制作油门刹车标定表以保证控制连续性,接着进行simulink模型搭建,采用双PID进行纵向控制,最后给出仿真结果,包括位移和速度跟踪情况,并对PID参数调节进行了分析。

1、电机模型搭建(参考B站老王)

目前智能车辆大都采用电动车,汽车电动化也是大势所趋,因此这里采用电车模型来进行车辆的纵向控制。电机参数为:最大扭矩为380N\cdot m,最大功率为180kw,转速w如下:

转速的单位为:转/每分钟。

 

上面两图就是建立的电机模型。

2、油门刹车标定表的制作

这里我们把油门标定表和刹车标定表,做到一张表里面,这样当控制车辆到达一个目标速度时,就会根据表中数据自动插值,使控制具有连续性。当分成两张表时,当目标速度是10km/h时,可能出现在目标速度附近来回跳动,控制连续性不好。

标定表制作如下:

当标定油门时,这里速度为0,标定刹车时速度为180。

输入、输出为:

                             

注意一点,设置的道路长一点,否则程序运行可能报错。

3、simulink模型搭建

代码分别为:

function [thr,brake] = fcn(x)
    if x>= 0
        thr = x;
        brake = 0;
    else
        brake = -x;
        thr = 0;
    end
  
end



function torque = fcn(thr,rpm)
    Tmax = 380*thr;
    if rpm <= 4523
       torque = Tmax;
    else
        torque = Tmax *4523/rpm; 
    end
end

标定代码为:

clc;clear;
x = 0;
for i = 1:101
    sim('longitudinal_control');
    vx_tmp(:,i) = ans.vx.data;
    ax_tmp(:,i) = ans.ax.data;
    thr_tmp(:,i) = ones(length(ans.vx.data),1)*x;
    x = x + 0.02;
end
ax_tmp(1,:) = ax_tmp(2,:);
%拟合
vv = vx_tmp(:,1)';
aa = ax_tmp(:,1)';
thr_thr = thr_tmp(:,1)';
for i = 2 :length(vx_tmp(1,:))
   vv =[vv,vx_tmp(:,i)'];
   aa = [aa,ax_tmp(:,i)'];
   thr_thr = [thr_thr,thr_tmp(:,i)'];
end

%% 刹车
x= 0;
for i = 1:81
    sim('longitudinal_control');
    vvx_tmp(:,i) = ans.vx.data;
    aax_tmp(:,i) = ans.ax.data;
    brake_tmp(:,i) = ones(length(ans.vx.data),1)*x;
    for j = 1:length(vvx_tmp(:,i))
       if vvx_tmp(j,i) <= 0.01
       brake_tmp(j,i) = 0;
       end
    end
    x = x - 0.1;
end
%%
%将v_tmp 、a_tmp 、brake_tmp合并
aax_tmp(1,:) = aax_tmp(2,:);
vvv = vvx_tmp(:,1)';
aaa = aax_tmp(:,1)';
brake_bra = brake_tmp(:,1)';
for i = 2 :length(vvx_tmp(2,:))
   vvv =[vvv,vvx_tmp(:,i)'];
   aaa = [aaa,aax_tmp(:,i)'];
   brake_bra = [brake_bra,brake_tmp(:,i)'];
end
%%
%% 拟合
v1 = [vv,vvv];
a1 = [aa,aaa];
thr_bra = [thr_thr,brake_bra];

F = scatteredInterpolant(v1',a1',thr_bra');
vu = 0:0.05:50;
au = -8:0.05:5;
tabler = zeros(length(vu),length(au));
for i = 1:length(vu)
    for j = 1:length(au)
        tabler(i,j) = F(vu(i),au(j));
    end
end

 这里记得油门刹车分开标定,最后完成一张总表

如图:

 里面填写对应的数据

4、双PID的纵向控制

这里输出增了位移输出;

参考加速度、速度、位移代码和图像如下:

function [s,v,a] = fcn(t)
if t<10
    s=0.1*t^3/3;
    v=0.1*t^2;
    a=0.2*t;
else
    a=2-0.1*(t-10);
    v=2*t-0.05*(t-10)^2-10;
    s=t^2-0.05*(t-10)^3/3-10*t+100/3;
end

模型搭建如下:

位移PID和速度PID的参数为:

                                

5、仿真结果

位移跟踪结果:

位移基本满足要求

速度跟踪 

速度 7-15之间波动明显,这里可以试着调节PID这三个参数,其中kp可以加快收敛,且对于画龙时,调节kp小点,可以明显改善。ki可以消除稳态误差,但是可能引起超调,对于这个超调,通过微分还不容易消除,只能通过降低比例项,但是会使系统响应变慢,所以一般ki,最后调节,先p,后d,最后i。kd的作用是抑制超调,比如上图有超调,就可以增加kd,但是kd会放大高频噪声。

### 车辆纵向控制模型的实现方法 车辆纵向控制主要涉及加、减以及保持恒定度等功能,通常用于自适应巡航控制系统(ACC)、自动紧急制动(AEB)等场景。以下是关于如何构建和实现车辆纵向控制模型的相关内容。 #### 1. 动力学基础 车辆纵向运动可以简化为一维加度问题。假设车辆的质量 \( m \),受到驱动力 \( F_d \) 和阻力 \( F_r \),则牛顿第二定律可表示为: \[ m \cdot a = F_d - F_r \] 其中: - 驱动力 \( F_d \) 可由发动机扭矩和传动效率计算得出; - 阻力 \( F_r \) 包括空气阻力、滚动阻力和其他损耗[^2]。 ```python def longitudinal_acceleration(mass, drive_force, resistance_force): """ 计算车辆纵向度。 参数: mass (float): 车辆质量 (kg) drive_force (float): 驱动力 (N) resistance_force (float): 总阻力 (N) 返回: float: 加度 (m/s²) """ acceleration = (drive_force - resistance_force) / mass return max(acceleration, 0) # 确保不出现负值 ``` --- #### 2. 控制器设计 控制器的设计通常是基于经典控制理论中的比例积分微分(PID)控制器或现代控制理论中的状态空间方法。 ##### PID 控制器 对于简单的 ACC 或 AEB 应用,PID 控制器是一种常用的选择。目标是使当前车接近设定的目标车 \( v_{target} \)。 误差定义为: \[ e(t) = v_{target}(t) - v_{current}(t) \] PID 输出为: \[ u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de}{dt} \] 参数优可以通过 Ziegler-Nichols 法或其他经验法则完成[^3]。 ```python class PIDController: def __init__(self, kp, ki, kd, dt): self.kp = kp self.ki = ki self.kd = kd self.dt = dt self.prev_error = 0 self.integral = 0 def compute(self, error): """计算控制量""" derivative = (error - self.prev_error) / self.dt self.integral += error * self.dt output = self.kp * error + self.ki * self.integral + self.kd * derivative self.prev_error = error return output ``` --- #### 3. 模型集成与仿真 为了验证控制策略的效果,可以在 MATLAB/Simulink 或 Python 的 SciPy 工具包中搭建动态仿真环境。 以下是一个简单的 Python 仿真实例,展示如何结合 PID 控制节车: ```python import numpy as np from scipy.integrate import solve_ivp # 定义车辆动力学方程 def vehicle_dynamics(t, state, controller_output, params): velocity, position = state mass, drag_coefficient = params air_resistance = drag_coefficient * velocity**2 net_force = controller_output - air_resistance dv_dt = net_force / mass dx_dt = velocity return [dv_dt, dx_dt] # 初始化参数 mass = 1500 # kg drag_coefficient = 0.33 # Ns²/m² params = [mass, drag_coefficient] initial_state = [0, 0] # 初始度和位置 time_span = (0, 10) # 秒 controller = PIDController(kp=1.0, ki=0.1, kd=0.05, dt=0.1) # 设定目标度并运行仿真 v_target = 20 # m/s results = [] times = np.arange(time_span[0], time_span[1], controller.dt) for t in times: current_velocity = initial_state[0] error = v_target - current_velocity control_signal = controller.compute(error) sol = solve_ivp(vehicle_dynamics, [t, t + controller.dt], initial_state, args=(control_signal, params), dense_output=True) initial_state = sol.y[:, -1].tolist() results.append(initial_state) velocities = [r[0] for r in results] positions = [r[1] for r in results] print(f"最终度: {velocities[-1]} m/s") ``` --- #### 4. 实车验证 在实车上部署前,需考虑更多实际因素,如传感器噪声、执行机构延迟等。这些可通过硬件在环(HIL)测试平台进一步完善[^4]。 --- ### 结论 通过上述步骤,可以从理论上建立车辆纵向控制模型,并利用仿真工具对其进行验证。最后,在实车环境中应用时应充分考虑外部干扰的影响。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值