串级PID
如果说前一次的衍生PID,是在基础PID算法的横向上变形的话,那本片的串级PID就是在基础PID的算法上,做纵向的嵌套。
与单级PID的不同
与单级PID不同的是,串级PID,需要两个实际值输入,其中内层的变量,是外层变量的一次导数,比如,外层是角速度,内层就是角加速度。而且外层的输出,将作为内层的目标值输入。
现在我对于串级PID的一点浅显的理解是,就相当于知道了误差的变化,对我们的控制变量进行更加精细的调节。
举个例子,我们需要控制小车的位置,我们通过控制速度,对速度进行一个时间的积分,我们可以得到我们要的位移。可是这时候,小车的速度和我们的目标速度拟合的不是很好,这时候我们如果知道加速度,让加速度在时间上做一个积分,我们是不是可以对速度做一个更好的控制呢?
代码
pid_param_t * pid;
const float pid_core_input[3] = {0,0,0}, pid_shell_input[3] = {0,0,0};//这是要调到的的三参数
float now_shell, float target_shell,float output_shell;//外层 实际值,外层目标值,外层输出值
float now_core, float target_core,float output_core;//内层实际值,内层目标值,内层输出值
{
pid_init(pid, PID_POSITION, pid_core_input, 10000, 10000);//内层PID初始化
pid_init(pid, PID_POSITION, pid_shell_input, 10000, 10000);//外层PID初始化
output_shell = pid_Calc(pid, now_shell, target_shell);
target_core = output_shell;
output_core = pid_Calc(pid, now_core, target_core);//内层误差=output_shell-now_core;//将外层输出当作内层的目标值
}
串级之后,我们的内环输出与我们的控制量还是线性的吗
比如使用串级PID,输出 为速度的调节与电机的压差还是线性关系吗?
刚开始问,这个问题,我还自己想了一下,后来想想,不就是相当于求导吗?求导之后,怎么就不线性啦?
这只是个人暂时的粗浅的理解,如有错误,欢迎指正。