写一段串级pid控制程序,控制两个动量轮旋转,要求要有角速度环,角度环,速度环,其中角速度环为最内环,速度环为最外环
时间: 2024-01-01 18:07:02 浏览: 176
下面是一段串级PID控制程序,用于控制两个动量轮旋转,其中包括了角速度环、角度环和速度环,满足角速度环为最内环,速度环为最外环的要求:
```
float target_angle = 0; // 目标角度
float target_velocity = 0; // 目标速度
float kp_a = 1.0; // 角度环比例系数
float ki_a = 0.1; // 角度环积分系数
float kd_a = 0.01; // 角度环微分系数
float kp_w = 10.0; // 角速度环比例系数
float ki_w = 1.0; // 角速度环积分系数
float kd_w = 0.1; // 角速度环微分系数
float kp_v = 0.5; // 速度环比例系数
float ki_v = 0.05; // 速度环积分系数
float kd_v = 0.005; // 速度环微分系数
float angle_error = 0; // 角度误差
float angle_error_sum = 0; // 角度误差积分
float angle_error_last = 0; // 角度误差微分
float velocity_error = 0; // 速度误差
float velocity_error_sum = 0; // 速度误差积分
float velocity_error_last = 0; // 速度误差微分
float w1_output = 0; // 动量轮1角速度环输出
float w2_output = 0; // 动量轮2角速度环输出
float a1_output = 0; // 动量轮1角度环输出
float a2_output = 0; // 动量轮2角度环输出
float v_output = 0; // 速度环输出
while (true) {
// 读取实际角度、角速度和速度
float angle1 = read_angle1();
float angle2 = read_angle2();
float w1 = read_angular_velocity1();
float w2 = read_angular_velocity2();
float v = read_velocity();
// 计算角度误差
angle_error = target_angle - (angle1 - angle2);
angle_error_sum += angle_error;
angle_error_last = angle_error - angle_error_last;
// 计算角度环输出
a1_output = kp_a * angle_error + ki_a * angle_error_sum + kd_a * angle_error_last;
a2_output = -a1_output;
// 计算角速度误差
float w1_error = a1_output - w1;
float w1_error_sum += w1_error;
float w1_error_last = w1_error - w1_error_last;
float w2_error = a2_output - w2;
float w2_error_sum += w2_error;
float w2_error_last = w2_error - w2_error_last;
// 计算角速度环输出
w1_output = kp_w * w1_error + ki_w * w1_error_sum + kd_w * w1_error_last;
w2_output = kp_w * w2_error + ki_w * w2_error_sum + kd_w * w2_error_last;
// 计算速度误差
velocity_error = target_velocity - v;
velocity_error_sum += velocity_error;
velocity_error_last = velocity_error - velocity_error_last;
// 计算速度环输出
v_output = kp_v * velocity_error + ki_v * velocity_error_sum + kd_v * velocity_error_last;
// 控制两个动量轮旋转
set_wheel_speed(w1_output + v_output / 2);
set_wheel_speed(w2_output - v_output / 2);
}
```
在这段程序中,首先定义了目标角度和目标速度,以及各个环的PID参数、误差和输出值。然后在循环中读取实际角度、角速度和速度,计算角度误差并根据角度环PID算法计算出动量轮1和动量轮2的角度环输出,接着根据角速度环PID算法计算出动量轮1和动量轮2的角速度环输出,最后根据速度环PID算法计算出速度环输出,将速度环输出平均分配给两个动量轮,将两个动量轮的角速度环输出和速度环输出相加得到动量轮的实际转速,控制两个动量轮旋转。
阅读全文