• PID代码


    PID运算过程中出现的问题:

    ①6拨叉的拨弹电机旋转时,前5次顺时针转,第6次快速逆时针旋转

    假设:fed = 0.9pi, set = rad_format(fed + pi/6) = rad_format(1.066666pi) = -0.93333pi,此时pid会计算出负值,反方向旋转

    解决方法:    pid->error[0] = rad_format(set - ref);

          将err限制在-pi~pi,可避免第6次快速逆时针旋转的情况。

    ②robomaster的C板例程里面云台pid计算代码就是这样的逻辑,此时即可实现yaw轴360°旋转。

    static fp32 gimbal_PID_calc(gimbal_PID_t *pid, fp32 get, fp32 set, fp32 error_delta)
    {
        fp32 err;
        if (pid == NULL)
        {
            return 0.0f;
        }
        pid->get = get;
        pid->set = set;
    
        err = set - get;
        pid->err = rad_format(err);//此处将err限制在-pi~pi
        pid->Pout = pid->kp * pid->err;
        pid->Iout += pid->ki * pid->err;
        pid->Dout = pid->kd * error_delta;
        abs_limit(&pid->Iout, pid->max_iout);
        pid->out = pid->Pout + pid->Iout + pid->Dout;
        abs_limit(&pid->out, pid->max_out);
        return pid->out;
    }

    感触:①在完成shoot.c文件时,想出来将err限制的想法。

        ②在调试gimbal时,将max_relative_angle设置得很大,此时可以实现yaw轴360°旋转,且remote操纵下,正常运行。但没有注意是为什么

        ③而在寒假回家后看代码,发现如果set值++,会使set超出pi,而feedback一直在-pi~pi,此时应该会暴走。

         ④和刘老板讨论后,打算设置一个新变量 delta_angle,为实现一直旋转,让delta_angle作为pid计算的输入值,delta_angle=0.2,则每运行一次,即可增加0.2rad,避免了set值不停变大的情况。

         如何改变代码:设置一个新变量 delta_angle;初始化该变量;设置控制值delta_angle=0.2;修改pid计算的代码。

    唉,这个问题困扰了我好久啊!一直让我不想去调试。自己看代码不够仔细,当时没想明白为什么遥控器可以正常控制,导致之后走了这么多弯路,纠结了这么久。

    都忘记当时shoot里面解决的经验了,还是对这个不敏感。

    因为想不出来怎么解决,一直没有去解决,甚至没有去debug,今晚上看了一下,才发现问题这么简单,下次不能这么拖延症了!

     

  • 相关阅读:
    Golang的select多路复用以及channel使用实践
    golang-goroutine和channel
    golang类型转换小总结
    golang之终端操作,文件操作
    golang之结构体和方法
    golang基础之三-字符串,时间,流程控制,函数
    Linux Keepliaved安装
    Git打标签、还原到具体标签版本代码
    Git复制已有分支到新分支开发
    记一次内存分析
  • 原文地址:https://www.cnblogs.com/YiDongZhao/p/14488395.html
Copyright © 2020-2023  润新知