轨迹跟踪PID相关及前馈引入结果对比

1、前言:

        记录下给定一段轨迹如何实现跟踪控制,主要使用几个经典的方法进行对比。一些讨论的部分在代码中的注释部分。

        前馈控制可以在没有扰动和建模误差的理想条件下很好地跟踪期望输出,但在实际系统中,由于存在建模误差、外部扰动和初始条件误差,前馈控制无法完全消除系统误差。通常,前馈控制与反馈控制结合使用,通过反馈控制来补偿和校正误差,从而实现更精确和鲁棒的控制系统。

2、代码

% 参数设置
dt = 0.01;
T = 10;
time = 0:dt:T;

% 期望轨迹
x_d = cos(time); % x轨迹
y_d = sin(time); % y轨迹
z_d = 0.5 * time; % z轨迹

% 初始化位置
x_ff = zeros(size(time));
y_ff = zeros(size(time));
z_ff = zeros(size(time));

x_fb = zeros(size(time));
y_fb = zeros(size(time));
z_fb = zeros(size(time));

x_fffb = zeros(size(time));
y_fffb = zeros(size(time));
z_fffb = zeros(size(time));

x_pid = zeros(size(time));
y_pid = zeros(size(time));
z_pid = zeros(size(time));

x_apid = zeros(size(time));
y_apid = zeros(size(time));
z_apid = zeros(size(time));

x_apid_ff = zeros(size(time));
y_apid_ff = zeros(size(time));
z_apid_ff = zeros(size(time));
% x_apid_ff(1) = 1;

% PID参数
Kp = [20, 20, 20];
Ki = [0.1, 0.1, 0.1];
Kd = [0.01, 0.01, 0.01];

% 自适应PID参数
alpha = [20, 20, 20]; % 更新系数,控制参数的调整速度

% 初始点位置,说明初始误差的情况
x_ff(1)=.5;
x_fb(1) = .5;
x_fffb(1) = .5;
x_pid(1) = .5;
x_apid(1) = .5;
x_apid_ff(1)=.5;

% 初始化PID变量
integrated_error = [0, 0, 0];
previous_error = [0, 0, 0];


% 前馈控制
x_velocity_d = gradient(x_d, dt);%输出 FX 对应于 ∂F/∂x,即 x(水平)方向上的差分--近似导数--离散数据的梯度,way2---和diff(x_d) / dt同.但有较小误差
y_velocity_d = gradient(y_d, dt);
z_velocity_d = gradient(z_d, dt);
%{
% 数据: 说明gradient与diff使用之间的差别。diff由于是前向差分所以少一个数据。
x = 0:0.1:10;
y = sin(x);

% 使用 gradient 计算梯度
dydx_gradient = gradient(y, 0.1);

% 使用 diff 计算差分
dydx_diff = diff(y) / 0.1;
x_diff = x(1:end-1);

% 绘图
figure;
plot(x, y, 'r', 'LineWidth', 2); hold on;
plot(x, dydx_gradient, 'b--', 'LineWidth', 2);
plot(x_diff, dydx_diff, 'g-.', 'LineWidth', 2);
xlabel('X');
ylabel('Y and dY/dX');
legend('y = sin(x)', 'Gradient dy/dx', 'Diff dy/dx');
title('Comparison of Gradient and Diff');
grid on;

%}

for t = 1:length(time)-1
    % 前馈控制信号: 期望轨迹求导数way1;前馈输入为位置轨迹的差分或梯度
    % control_signal_x = -sin(time(t));
    % control_signal_y = cos(time(t));
    % control_signal_z = 0.5;
    % way2
% 获取期望速度(即前馈控制输入)way2
control_signal_x = x_velocity_d(t);
control_signal_y = y_velocity_d(t); 
control_signal_z =z_velocity_d(t);

    % 更新位置
    x_ff(t+1) = x_ff(t) + control_signal_x * dt;
    y_ff(t+1) = y_ff(t) + control_signal_y * dt;
    z_ff(t+1) = z_ff(t) + control_signal_z * dt;
end

% 反馈控制
for t = 1:length(time)-1
    % 当前误差
    error_x = x_d(t) - x_fb(t);
    error_y = y_d(t) - y_fb(t);
    error_
### 使用PID控制器进行车辆轨迹跟踪的方法 在自动驾驶领域,PID控制器被广泛应用来实现精确的路径跟随。对于车辆而言,主要目的是使车辆按照预定的轨迹行驶,即保持期望的速度和方向。 #### PID控制器的工作原理 PID控制器通过比例(P)、积分(I)、微分(D)三个环节计算控制量。具体来说: - **P项**:根据当前误差(设定值与实际值之间的差异)成正比地调整输出; - **I项**:累积过去的误差,用于消除静态偏差; - **D项**:预测未来的趋势变化率,提前做出反应以减少超调[^1]。 #### 车辆轨迹跟踪的具体实施方式 为了确保车辆能稳定地沿着给定路径前进,通常会采用如下策略: ##### 速度控制 利用纵向加速度作为反馈信号,通过调节油门开度或制动压力维持恒定巡航速度\[v_d\]。此时,可将目标速度\( v_{d} \)视为参考输入,而实时测得的速度\( v(t)\)则充当过程变量。因此,可以通过下面公式得到所需的驱动力矩\( u_v \): ```matlab u_v = Kp * (vd - vt) + Ki * integral(e_v dt) + Kd * derivative(vt) ``` 其中,\( e_v=v_d-v_t\)表示速度误差;\(K_p, K_i,\text{and }K_d\)分别是比例系数、积分时间和微分时间常数。 ##### 方向控制 横向偏移角θ_e 和侧向位移e_y 是衡量车辆偏离理想轨道程度的关键指标。为此,需引入前馈补偿机制,使得转向角度δ能够及时响应上述两个状态的变化: ```matlab delta = atan((L*k*ey)/(V*(1+k*L*tan(delta)))) ``` 这里,L代表轮距长度;k为曲率增益因子;V指代瞬时线速度;atan()函数返回反正切值。值得注意的是,当|θ_e|较大时,应适当减小k以免造成过大转角引起不稳定现象[^2]。 #### 实际案例展示 考虑一辆装备有GPS定位装置的小型电动车正在执行自动泊车任务。假设已知停车位中心坐标(x_g,y_g),那么整个操作流程大致分为以下几个阶段: 1. 计算起始点到终点间的最短距离,并据此规划一条平滑曲线作为参照线路。 2. 启动发动机后,依据内置IMU惯性测量单元获取即时姿态信息,再经由卡尔曼滤波器融合处理获得更加精准的姿态估计结果。 3. 将当前位置投影至预设路线上求取局部最小垂直间距及其对应方位差额。 4. 应用前述提到的双闭环结构——内环负责调控航向角β,外环专注于修正横摆角φ,最终达成平稳入库的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JianRobSim

嘤嘤其名,求其友声!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值