数组索引必须为正整数或逻辑值。 出错 demo (第 27 行) derivative_error = error - y_tra(end-1)
时间: 2024-03-02 16:50:18 浏览: 68
200mm440.rar_MM440_MM440-VC-PID_PLC_PLC 200_PLC MM440
出现这个错误的原因是在第一次循环时,`y_tra`数组中只有一个元素,因此在计算微分误差时,`y_tra(end-1)`索引无法正常工作。
为了解决这个问题,我们可以在循环之前将`y_tra`数组初始化为一个长度为2的数组,其中第一个元素为1,第二个元素为机器人的初始y坐标。这样,在计算微分误差时,`y_tra(end-1)`索引就可以正常工作了。
下面是修改后的代码:
```matlab
robot = Robot(); % 设置机器人初始位置和朝向为(0,1,0°)
robot.set(0,1,0);
% 设置机器人角度漂移为10°
robot.set_steering_drift(10.0 / 180.0 * pi);
% PID控制参数
Kp = 0.2;
Ki = 0.01;
Kd = 0.02;
% 初始化误差和积分误差
error = 0;
integral_error = 0;
% 目标位置
goal = [0, 0];
y_tra = [1, robot.y]; % 初始化y_tra数组
for ith = 1:100
% 计算误差
error = goal(2) - robot.y;
% 计算积分误差
integral_error = integral_error + error;
% 计算微分误差
derivative_error = error - y_tra(end-1);
% 计算控制量
steering = Kp * error + Ki * integral_error + Kd * derivative_error;
% 修改这个
robot.move(steering, 1);
y_tra(end+1) = robot.y;
end
times=0:100;
plot(times, y_tra);
hold on;
plot(times, zeros(1, 101));
```
在上述代码中,我们将`y_tra`数组初始化为`[1, robot.y]`,这样在计算微分误差时,`y_tra(end-1)`索引就可以正常工作了。
阅读全文