导航

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

    hxcb 发布的帖子

    • RE: 追小球小车关于识别问题

      @kidswong999

      import sensor, image, time
      import car
      from pid import PID
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QQVGA)
      sensor.skip_frames(10)
      sensor.set_auto_whitebal(False)
      clock = time.clock() # Tracks FPS.
      green_threshold   = (76, 96, -110, -30, 8, 66)  
      size_threshold = 2000  
      x_pid = PID(p=0.5, i=1, imax=100)   
      h_pid = PID(p=0.005, i=0.1, imax=50) 
      
      def find_max(blobs):
          max_size=0
          for blob in blobs:
              if blob[2]*blob[3] > max_size:
                  max_blob=blob
                  max_size = blob[2]*blob[3]
          return max_blob
      
      while(True):
          clock.tick()
          img = sensor.snapshot()
          blobs = img.find_blobs([green_threshold])
          if blobs:
              max_blob = find_max(blobs)
              x_error = max_blob[5]-img.width()/2
              h_error = max_blob[2]*max_blob[3]-size_threshold
              print("x error: ", x_error)
              '''
              for b in blobs:
                  # Draw a rect around the blob.
                  img.draw_rectangle(b[0:4]) # rect
                  img.draw_cross(b[5], b[6]) # cx, cy
              '''
              img.draw_rectangle(max_blob[0:4])
              img.draw_cross(max_blob[5], max_blob[6])
              x_output=x_pid.get_pid(x_error,1)
              h_output=h_pid.get_pid(h_error,1)
              print("h_output",h_output)
              car.run(-h_output-x_output,-h_output+x_output)
          else:
              car.run(10,-10)
      
      

      这是main.py

      from pyb import Pin, Timer
      inverse_left=False
      inverse_right=False
      ain1 =  Pin('P0', Pin.OUT_PP)
      ain2 =  Pin('P1', Pin.OUT_PP)
      bin1 =  Pin('P2', Pin.OUT_PP)
      bin2 =  Pin('P3', Pin.OUT_PP)
      ain1.low()
      ain2.low()
      bin1.low()
      bin2.low()
      pwma = Pin('P7')
      pwmb = Pin('P8')
      tim = Timer(4, freq=1000)
      ch1 = tim.channel(1, Timer.PWM, pin=pwma)
      ch2 = tim.channel(2, Timer.PWM, pin=pwmb)
      ch1.pulse_width_percent(0)
      ch2.pulse_width_percent(0)
      def run(left_speed, right_speed):
          #if inverse_left==True:
          #	left_speed=(-left_speed)
          #if inverse_right==True:
          #	right_speed=(-right_speed)
          if left_speed < 0:
              ain1.low()
              ain2.high()
          else:
              ain1.high()
              ain2.low()
          ch1.pulse_width_percent(int(abs(left_speed)))
          if right_speed < 0:
              bin1.low()
              bin2.high()
          else:
              bin1.high()
              bin2.low()
          ch2.pulse_width_percent(int(abs(right_speed)))
      
      

      这是car.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')
      
      

      这是pid.py

      感觉都是用的原来的 不知道为啥,前进还有原地旋转都没有问题 就是这个左右反了 小球在左边向右转,小球在右边向左转

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 追小球小车关于识别问题

      @kidswong999 在 追小球小车关于识别问题 中说:

      左轮子转,右轮子不转。

      对的呀 老师 这些都是对的

      发布在 OpenMV Cam
      H
      hxcb
    • 追小球小车关于识别问题

      老师我想请问一下为啥我按照历程上传程序,追小球的时候,小球在左边它向右转呢 左右方向相反咋回事,但是如果换了电机接线的话 那就前后相反了

      发布在 OpenMV Cam
      H
      hxcb
    • 关于电机驱动板的问题

      因为说到电机驱动板智能控制两个电机,能否把电机并联给驱动板,也就是两个电机接受一个信号会不会i有什么影响

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv和arduino串口通信

      @kidswong999 两个板子是共地的,摄像头也检测到了

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv和arduino串口通信

      @kidswong999

      #include <SoftwareSerial.h>
      SoftwareSerial softSerial(10, 11); // RX, TX
      void setup() 
      {
        softSerial.begin(9600);
        Serial.begin(9600);
      }
      void Openmv(String s)
      {
          if(s[1]=='0')
           {
           Serial.print('0');
           Serial.print('\n');
           }
          if(s[1]=='1')
           {    
           Serial.print('1');
           Serial.print('\n');
           }
          if(s[1]=='2')
           {     
           Serial.print('2');
           Serial.print('\n');
           }
      }
      void loop() 
      {
        if(softSerial.available())
       {
          String s = detectString();
           Openmv(s);
        }
      }
      String detectString()
      {
        while(softSerial.read() != '{');
        return(softSerial.readStringUntil('}'));
      }
      
      

      这个是arduino的

      import sensor, image, time
      import json
      from pyb import UART
      blue_threshold   = (22, 67, 9, 127, -128, -54)
      red_threshold   = (41, 61, 42, 127, -128, 127)
      yellow_threshold   = ( 60 ,10,-15,20,30,80)
      sensor.set_hmirror(True)
      sensor.set_vflip(True)
      sensor.reset() 
      sensor.set_pixformat(sensor.RGB565) 
      sensor.set_framesize(sensor.QQVGA) 
      sensor.skip_frames(10) 
      sensor.set_auto_whitebal(False) 
      clock = time.clock()
      uart = UART(3, 9600)
      def find_max(blobs):
          max_size=0
          for blob in blobs:
             if blob.pixels() > max_size:
                  max_blob=blob
                  max_size = blob.pixels()
          return max_blob 
      while(True):
          clock.tick() 
          img = sensor.snapshot() 
          blobs0 = img.find_blobs([blue_threshold])
          blobs1 = img.find_blobs([red_threshold])
          blobs2 = img.find_blobs([yellow_threshold])
          if blobs0:
           max_blob=find_max(blobs0)
           img.draw_rectangle(max_blob.rect())
           img.draw_cross(max_blob.cx(), max_blob.cy())
           data="0"
           data_out = json.dumps(set(data))
           uart.write(data_out +'\n')
           print('you send:',data_out)
          elif blobs1:
           max_blob=find_max(blobs1)
           img.draw_rectangle(max_blob.rect())
           img.draw_cross(max_blob.cx(), max_blob.cy())
           data="1"
           data_out = json.dumps(set(data))
           uart.write(data_out +'\n')
           print('you send:',data_out)
          elif blobs2:
           max_blob=find_max(blobs2)
           img.draw_rectangle(max_blob.rect())
           img.draw_cross(max_blob.cx(), max_blob.cy())
           data="2"
           data_out = json.dumps(set(data))
           uart.write(data_out +'\n')
           print('you send:',data_out)
          else:
              print('not found')
      
      

      这个是openmv的

      这两个程序更直观点,但是就是没有数据,用程序看openmv应该是发送成功了,但是arduino接收不到,串口监视器一个数据没有

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv和arduino串口通信

      @kidswong999 我就是引用官方的例程.寻找黄色色块,openmv发现以后arduino的串口还是一个数据都没有

      #include <SoftwareSerial.h>
      
      SoftwareSerial softSerial(10, 11); // RX, TX
      typedef struct
      {
        int data[50][2] = {{0,0}};
        int len = 0;
      }List;
      List list;
      
      void setup() {
        // put your setup code here, to run once:
        softSerial.begin(115200);
        Serial.begin(115200);
      }
      
      void loop() {
        if(softSerial.available())
        {
          getList();
          for (int i=0; i<list.len; i++)
          {
            Serial.print(list.data[i][0]);
            Serial.print('\t');
            Serial.println(list.data[i][1]);
          }
          Serial.println("============");
          clearList();
        }
      
      }
      
      
      String detectString()
      {
        while(softSerial.read() != '{');
        return(softSerial.readStringUntil('}'));
      }
      void clearList()
      {
        memset(list.data, sizeof(list.data),0);
        list.len = 0;
      }
      void getList()
      {
        String s = detectString();
        String numStr = "";
        for(int i = 0; i<s.length(); i++)
        {
          if(s[i]=='('){
            numStr = "";
          }
          else if(s[i] == ','){
            list.data[list.len][0] = numStr.toInt();
            numStr = "";
          }
          else if(s[i]==')'){
            list.data[list.len][1] = numStr.toInt();
            numStr = "";
            list.len++;
          }
          else{
            numStr += s[i];
          }
        }
      }
      
      
      import sensor, image, time
      import json
      from machine import UART
      yellow_threshold   = ( 46,  100,  -68,   72,   58,   92)
      sensor.reset() # Initialize the camera sensor.
      sensor.set_pixformat(sensor.RGB565) # use RGB565.
      sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
      sensor.skip_frames(10) # Let new settings take affect.
      sensor.set_auto_whitebal(False) # turn this off.
      clock = time.clock() # Tracks FPS.
      uart = UART(3, 115200)  
      while(True):
          clock.tick() # Track elapsed milliseconds between snapshots().
          img = sensor.snapshot() # Take a picture and return the image.
          blobs = img.find_blobs([yellow_threshold])
          if blobs:
              #print('sum : %d'% len(blobs))
              data=[]
              for b in blobs:
                  # Draw a rect around the blob.
                  img.draw_rectangle(b.rect()) # rect
                  img.draw_cross(b.cx(), b.cy()) # cx, cy
                  data.append((b.cx(),b.cy()))
      
              #{(1,22),(-3,33),(22222,0),(9999,12),(0,0)}
              data_out = json.dumps(set(data))
              uart.write(data_out +'\n')
              print('you send:',data_out)
          else:
              print("not found!")
      
      
      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv和arduino串口通信

      就是arduino的串口监视器一直输出-1不知道咋回事,也用了Serial.readString()也没用

      发布在 OpenMV Cam
      H
      hxcb
    • 关于openmv和arduino串口通信
      char str;
      void setup(){
        Serial.begin(9600);
      }
       
      void loop(){
          if(Serial.available()>0)
          {
            str=Serial.read();
            Serial.println(str);
          }
          delay(1000);
      }
      
      import time, pyb
      from machine import UART
      led = pyb.LED(3)
      #from pyb import UART
      uart = UART(3, 9600)   
      
      while(True):
          uart.write("1")
          time.sleep_ms(5000)
          led.on()
         
      
      

      openmv显示灯亮了应该发送成功了 可是arduino串口没接收到是怎么回事 老师

      发布在 OpenMV Cam
      H
      hxcb
    • 关于openmv分屏使用问题

      老师我想请问一下,openmv摄像头 可不可以把识别区与平均分成6个区域,然后依次进行识别,每个区域看到相应的目标然后反馈结果 可以吗?

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于串口通信问题???大佬帮忙解决一下

      arduino的10 11 软串口接的p4 p5 然后gnd相连 那两个通信线对调了还是没反应

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于数据接收问题?arduino给openmv发送数据 没有反应

      删掉了还是一样 没反应啊

      发布在 OpenMV Cam
      H
      hxcb
    • 关于串口通信问题???大佬帮忙解决一下
      import sensor, image, time,pyb,math
      from pyb import UART
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QVGA)
      sensor.skip_frames(time = 2000)
      uart = UART(3,9600,timeout=1000)
      
      
      clock = time.clock()
      
      while(True):
          clock.tick()
          img = sensor.snapshot()    
          if uart.any():
              print('OK')
              d=uart.readchar()
              print(d)
              if(d=='A'):
                  pyb.LED(2).on()
      

      arduino代码

      void setup()
      {
      Serial.begin(9600);
      }
      void loop()
      {  
           Serial.write('A');
           delay(5000);
       
           Serial.write('B');
           delay(5000);   
      }
      

      在电脑上arduino串口可以看到发送数据,但是openmv接收不到没有信息发过来

      发布在 OpenMV Cam
      H
      hxcb
    • 关于数据接收问题?arduino给openmv发送数据 没有反应
      import time
      from pyb import UART
      uart = UART(1,9600)
      uart.init(9600,bits=8,parity=None,stop=1)
      while True:
          if uart.any():
              a=uart.read().decode()
              print(a)
              time.sleep(1000)
      
      
      int a=10;
      void setup()
      {
      Serial.begin(9600);
      }
      void loop()
      {
        while(a)
          { Serial.print('1');
           delay(1000);
           a--;
           } 
      }
      

      怎么串口没有信息呀 老师帮忙检查一下怎么回事?

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv跳出循环的问题?

      @kidswong999 啊哈 那老师您说 我该怎么写才能回到主循环函数嘞

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv跳出循环的问题?

      @kidswong999 老师还请问一下你,就我上边的代码,就您说的跳出去for的语句,如果我想跳到while那么break应该改成goto while么?还是?

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv跳出循环的问题?

      @kidswong999 ok谢谢老师 我试试

      发布在 OpenMV Cam
      H
      hxcb
    • RE: 关于openmv跳出循环的问题?

      @kidswong999 请问一下老师,后边的如何才能跳出while呀

      发布在 OpenMV Cam
      H
      hxcb
    • 关于openmv接收字符的问题,请问一下如何接收arduino发送的单个字符?

      关于openmv接收字符的问题,请问一下如何接收arduino发送的单个字符?

      发布在 OpenMV Cam
      H
      hxcb