关于
PID
,我所看到的最方便的方法。就是:
//====PID
计算
duty
= Kp_ang * angle ;
// =
比例系数
*
角度
duty += Kd_ang * angle_dot ;
// =
微分系数
*
角速度
duty += Kp_spd * speed ;
// =
比例系数
*
车速
duty += Ki_spd * position ;
// =
积分系数
*
车位移
//
说明:两个控制环
.
合并为
PWM
占空
,
驱动电机
.
//
1:
倾角控制环
(
角度
,
角速度
),
作
PD
运算
.
//
2:
车速控制环
(
车速
,
车位移
),
作
PI
运算
.
我也想这么做。不过目前暂时只做了第
1
步。
我用到了
PID
,
PWM=ut=Kp1*
角度
+Kd1*
角速度
+Kp2*
车速
+Ki2*
车位移。但是和传统的
PID
有点不太一样,一般
PID
就是单输入单输出,但这里给定为角度
0
和车位置
0
,输出为角度和车位置。其实用
PID
是最简洁、最粗
糙的方法,效果好的话都用到了现代控制,
Inputs
angle, angle_rate: the tilt angle of the scooter in radians and
its derivative in radians/sec
steer_knob: the reading from the steering knob, between -1 and +1.
Balance
balance_torque = 5.0 * (angle - rest_angle) + 0.4 * angle_rate
Limit top speed by tilting back
overspeed = max(0, cur_speed - 0.5)
if (overspeed > 0) {
overspeed_integral = min(0.4, overspeed_integral + min(0.2,
overspeed+0.05) * dt)
}
else {
overspeed_integral = max(0, overspeed_integral - 0.04*dt)
}
rest_angle = 0.4*overspeed + 0.7*overspeed_integral
Steer. Decrease steering rate at high speed
steer_cmd = 0.07/(0.3+abs(cur_speed)) * steer_knob
Track current speed
cur_speed += 1.2 * balance_torque * dt
Differential steering
left_motor_pwm = balance_torque + cur_speed + steer_cmd
right_motor_pwm = balance_torque + cur_speed - steer_cmd
Outputs