导航

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

    gs3f

    @gs3f

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

    gs3f 关注

    gs3f 发布的帖子

    • OverflowError: buffer too small 遇到图片情况就会报错

      主要是说缓冲区太小的问题,目前找不到解决办法,使用的是例程视频里面的循迹小车部分,就是主函数里面多加了一个串口发送的,发送出去输出的output的有符号的值,每当一遇到跳变很大的或者如遇到图片情况就会报错:
      Traceback (most recent call last):
      File "", line 39, in :第39行是sending_data(int(output))
      File "", line 9, in sending_data:第9行是byte_value = data1.to_bytes(1, 'big', True)
      OverflowError: buffer too small
      OpenMV v4.6.20; MicroPython v1.24.62; OPENMV4P with STM32H743
      Type "help()" for more information.

      main.py

      THRESHOLD = (1, 28, -21, 5, -20, 35)
      import sensor,image,time,gc
      from pyb import LED
      from pid import PID
      from pyb import UART
      uart = UART(3,115200,bits=8, parity=None, stop=1,  timeout_char=2000, read_buf_len=1024)
      def sending_data(data1):
          global uart
          byte_value = data1.to_bytes(1, 'big', True)
          data = bytearray([0x23, byte_value[0], 0x40])
          uart.write(data);
      rho_pid = PID(p=0.6, i=0, d=0.15)
      theta_pid = PID(p=0.003, i=0, d=0.002)
      LED(1).on()
      LED(2).on()
      LED(3).on()
      sensor.reset()
      sensor.set_vflip(True)
      sensor.set_hmirror(True)
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QQQVGA)
      sensor.skip_frames(time = 2000)
      clock = time.clock()
      while(True):
          clock.tick()
          img = sensor.snapshot().binary([THRESHOLD])
          line = img.get_regression([(100,100)], robust = True)
          if (line):
              rho_err = abs(line.rho())-img.width()/2
              if line.theta()>90:
                  theta_err = line.theta()-180
              else:
                  theta_err = line.theta()
              img.draw_line(line.line(), color = 127)
              if line.magnitude()>8:
                  rho_output = rho_pid.get_pid(rho_err,1)
                  theta_output = theta_pid.get_pid(theta_err,1)
                  output = rho_output+theta_output
                  sending_data(int(output))
                  print(int(output))
              pass
          gc.collect()
      

      pid.py

      from pyb import millis
      from math import pi, isnan
      class PID:
      	_kp = _ki = _kd = _integrator = _imax = 0
      	_last_error = _last_derivative = _last_t = 0
      	_RC = 1/(2 * pi * 20)
      	def __init__(self, p=0, i=0, d=0, imax=0):
      		self._kp = float(p)
      		self._ki = float(i)
      		self._kd = float(d)
      		self._imax = abs(imax)
      		self._last_derivative = float('nan')
      	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')
      ``![0_1747998392094_屏幕截图 2025-05-23 190501.png](https://fcdn.singtown.com/4bb1afed-7417-4a7d-84aa-16d37f5cb692.png) `
      :crying_face: 
      
      
      
      求大佬帮帮忙
      发布在 OpenMV Cam
      G
      gs3f