导航

    • 登录
    • 搜索
    • 版块
    • 产品
    • 教程
    • 论坛
    • 淘宝
    1. 主页
    2. l4ni
    L
    • 举报资料
    • 资料
    • 关注
    • 粉丝
    • 屏蔽
    • 帖子
    • 楼层
    • 最佳
    • 群组

    l4ni

    @l4ni

    0
    声望
    1
    楼层
    203
    资料浏览
    0
    粉丝
    0
    关注
    注册时间 最后登录

    l4ni 关注

    l4ni 发布的帖子

    • 请问例程里面的PID程序,PID的公式是怎么来的
      def get_pid(self, error, scaler):
              tnow = millis()
              dt = tnow - self._last_t
              output = 0
              if self._last_t == 0 or dt > 1000:
                  dt = 0
                  self.reset_I()
              self._last_t = tnow
              delta_time = float(dt) / float(1000)
              output += error * self._kp
              if abs(self._kd) > 0 and dt > 0:
                  if isnan(self._last_derivative):
                      derivative = 0
                      self._last_derivative = 0
                  else:
                      derivative = (error - self._last_error) / delta_time
                  derivative = self._last_derivative + \
                                           ((delta_time / (self._RC + delta_time)) * \
                                              (derivative - self._last_derivative))
                  self._last_error = error
                  self._last_derivative = derivative
                  output += self._kd * derivative
              output *= scaler
              if abs(self._ki) > 0 and dt > 0:
                  self._integrator += (error * self._ki) * scaler * delta_time
                  if self._integrator < -self._imax: self._integrator = -self._imax
                  elif self._integrator > self._imax: self._integrator = self._imax
                  output += self._integrator
              return output
          def reset_I(self):
              self._integrator = 0
              self._last_derivative = float('nan')
      

      为什么D的计算是这样来的
      if abs(self._kd) > 0 and dt > 0:
      if isnan(self._last_derivative):
      derivative = 0
      self._last_derivative = 0
      else:
      derivative = (error - self._last_error) / delta_time
      derivative = self._last_derivative +
      ((delta_time / (self._RC + delta_time)) *
      (derivative - self._last_derivative))
      I的计算是这样来的:
      if abs(self._ki) > 0 and dt > 0:
      self._integrator += (error * self._ki) * scaler * delta_time
      if self._integrator < -self._imax: self._integrator = -self._imax
      elif self._integrator > self._imax: self._integrator = self._imax
      output += self._integrator
      有人可以帮忙解答下吗?

      发布在 OpenMV Cam
      L
      l4ni