• OpenMV VSCode 扩展发布了,在插件市场直接搜索OpenMV就可以安装
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 跳转到子程序digit里面的语句template=image.Image(t)报错,程序已经复制到openmv内



    • os error 是什么错误该怎么改
      0_10.png

      请在这里粘贴代码
      #main
      #   Main Controller of UAV
      #   2021.Nov
      ######
      
      from utime import sleep
      import trace
      import digit
      import car
      from pyb import Pin
      from pyb import LED
      
      
      stand_speed = 40
      
      def test_left():
          while True:
              car.run(50,0)
      
      def test_right():
          while True:
              car.run(0,50)
      
      def test_forword():
          while True:
              car.run(50,50)
      
      def wait_load_signal():
          p = Pin("P4", Pin.IN, Pin.PULL_DOWN)
          while True:
              if p.value() == 1:
                  return
              sleep(0.1)
      
      def wait_unload_signal():
          p = Pin("P4", Pin.IN, Pin.PULL_DOWN)
          while True:
              if p.value() == 0:
                  return
              sleep(0.1)
      
      def work_mode():  # binary [00] Task1 ; [01] Task2; [10] Task3
          p5 = Pin("P5", Pin.IN, Pin.PULL_DOWN)
          p6 = Pin("P6", Pin.IN, Pin.PULL_DOWN)
      
          if (p5.value() == 0) and (p6.value() == 0):
              return 1
          elif (p5.value() == 1) and (p6.value() == 0):
              return 2
          elif (p5.value() == 0) and (p6.value() == 1):
              return 3
          else:
              return 0
      
      def cross(move_type: int):  # 0 for straight, 1 for left , 2 for right, 3 for 180 rotation
          print("Debug: cross")
          if move_type == 0:
              car.run(100,100)
              sleep(1)
      
          elif move_type == 2: # 右
              car.run(50,50)
              sleep(1)
              car.run(40,-40)
              sleep(1)
              car.run(50,50)
              sleep(1)
          elif move_type == 1: # 左
              car.run(50,50)
              sleep(1)
              car.run(-44,44)
              sleep(1)
              car.run(50,50)
              sleep(1)
          elif move_type == 3: # 掉头
              car.run(-44,44)
              sleep(1)
              car.run(0,0)
              sleep(1)
              car.run(-44,44)
              sleep(1)
      
      
          if (trace.foward_backward_state == 0) and (trace.cross_cnt < 2):
              trace.cross_cnt = trace.cross_cnt + 1
              if move_type == 0:
                  trace.traj = trace.traj + "C"
              elif move_type == 1:
                  trace.traj = trace.traj + "L"
              elif move_type == 2:
                  trace.traj = trace.traj + "R"
          elif (trace.foward_backward_state == 0):
              trace.cross_cnt = trace.cross_cnt + 1
              if move_type == 0:
                  raise
              elif move_type == 1:
                  trace.traj = trace.traj + "l"
              elif move_type == 2:
                  trace.traj = trace.traj + "r"
      
          return 0
      
      
      def stop():
          print("Debug: stop")
          car.run(0,0)
      
      
      ######
      #   Task 1
      ##
      def task01(room_id:int):
          print("Debug: task01")
      
          trace.trace_line(1000,stand_speed)
          if room_id == 1:
              cross(1)
          elif room_id == 2:
              cross(2)
          stop()
          trace.trace_line(200,stand_speed)
          stop()
          trace.foward_backward_state = 1
          print(trace.traj)
          wait_unload_signal()
          cross(3)
          stop()
          go_back()
      
      ######
      #   Task 2
      ##
      def task02(room_id:int):
          print("Debug: task02")
      
          trace.trace_line(1000,stand_speed)
          cross(0)
          stop()
          trace.trace_line(1000,stand_speed)
          stop()
          if digit.search_digit(room_id, 2) == 1:
              cross(1)
          elif digit.search_digit(room_id, 2) == 2:
              cross(2)
          stop()
          trace.trace_line(150,stand_speed)
          stop()
          trace.foward_backward_state = 1
          print(trace.traj)
          wait_unload_signal()
          cross(3)
          stop()
          sleep(1)
          go_back()
      
      ######
      #   Task 3
      ##
      def task03(room_id:int):
          print("Debug: task03")
      
          trace.trace_line(1000,stand_speed)
          cross(0)
          stop()
          trace.trace_line(1000,stand_speed)
          cross(0)
          stop()
          trace.trace_line(1000,stand_speed)
          stop()
          if digit.search_digit(room_id,3) == 1:
              cross(1)
          elif digit.search_digit(room_id,3) == 2:
              cross(2)
          stop()
          trace.trace_line(1000,stand_speed)
          stop()
          if digit.search_digit(room_id,3) == 1:
              cross(1)
          elif digit.search_digit(room_id,3) == 2:
              cross(2)
          stop()
          trace.trace_line(200,stand_speed)
          trace.foward_backward_state = 1
          print(trace.traj)
          wait_unload_signal()
          cross(3)
          go_back()
      
      ######
      #   GoBack
      ##
      def go_back():
      
          idx=len(trace.traj)-1
          while(idx>=0):
              s = trace.traj[idx]
              print(s)
              if s == "C":
                  trace.trace_line(1000,stand_speed)
                  cross(0)
                  stop()
              elif s == "l":
                  trace.trace_line(1000,stand_speed,True)
                  cross(2)
                  stop()
              elif s == "r":
                  trace.trace_line(1000,stand_speed,True)
                  cross(1)
                  stop()
              elif s == "L":
                  trace.trace_line(1000,stand_speed)
                  cross(2)
                  stop()
              elif s == "R":
                  trace.trace_line(1000,stand_speed)
                  cross(1)
                  stop()
              elif s == "I":
                  trace.trace_line(150,stand_speed)
                  cross(0)
                  stop()
              idx -= 1
      
      
      ##
      #   Main
      ##
      def main():
          print("Debug main")
          task_id = work_mode()
          print("Choose Task :", task_id)
      
          # recognize target digit
          if task_id == 1 :
              room_id = digit.wait_target_number()
              print("Choose room :", room_id)
              task01(room_id)
          elif task_id == 2 :
              room_id = digit.wait_target_number()
              print("Choose room :", room_id)
              task02(room_id)
          elif task_id == 3 :
              room_id = digit.wait_target_number()
              print("Choose room :", room_id)
              task03(room_id)
      
          print("Done.")
      
      
      
      if __name__ == '__main__':
          LED(1).on()
          LED(2).on()
          LED(3).on()
      
          #while True:
              #print(work_mode())
              #sleep(0.1)
      
          #traj = traj + "C"
          #print(traj)
          #print(digit.digit_position)
          #wait_load_signal()
          #wait_unload_signal()
          # go_back()
          main()
          #car.run(30,30)
          #sleep(50)
          #trace.trace_line(1000,stand_speed)
          #stop()
          #cross(3)
          #test_left()
          #test_right()
          #test_forword()
          #trace.test_trace_line()
      
          #trace.trace_line(1000,100)
          #cross(0)
          #stop()
          #trace.trace_line(1000,100)
          #stop()
          #if digit.search_digit(3) == 1:
              #cross(1)
          #elif digit.search_digit(3) == 2:
              #cross(2)
          #stop()
          #trace.trace_line(200,50)
      
      #digit
      digit_position = [0, 0, 0, 0, 0, 0]
      def search_digit(match_num: int, level: int):
      	import time, sensor, image
      	from image import SEARCH_EX, SEARCH_DS
      	sensor.reset()
      	sensor.set_contrast(1)
      	sensor.set_gainceiling(16)
      	sensor.set_framesize(sensor.QQVGA)
      	sensor.set_pixformat(sensor.GRAYSCALE)
      	templates = ["b3_1.pgm"]
      	clock = time.clock()
      	ret = 0
      	score_str = ""
      	clock.tick()
      	img = sensor.snapshot()
      	statistics=img.get_statistics()
      	thr = (statistics.max()-statistics.min())/2
      	img2 = img.copy()
      	img2.binary([(int(thr), 255)], invert=False)
      	img.binary([(int(thr), 255)], invert=False)
      	for t in templates:
      		template = image.Image(t)
      		r = img2.find_template(template, 0.60, step=1, search=SEARCH_EX)
      		if r:
      			img.draw_rectangle(r, color =(128,128,128))
      			n = ord(t[1]) - 48
      			print(n)
      			print(match_num)
      			if n == match_num and r[0] < 60:
      				ret = 1
      			elif n == match_num and r[0] > 60:
      				ret = 2
      			if level == 2 and r[0] < 60:
      				digit_position[0] = n
      			elif level == 2 and r[0] > 60:
      				digit_position[1] = n
      			elif level == 3 and r[0] < 60:
      				if digit_position[2] <= 0:
      					digit_position[2] = n
      				else :
      					digit_position[3] = n
      			elif level == 3 and r[0] > 60:
      				if digit_position[4] <= 0:
      					digit_position[4] = n
      				else :
      					digit_position[5] = n
      	return ret
      def wait_target_number():
      	import time, sensor, image
      	from image import SEARCH_EX, SEARCH_DS
      	sensor.reset()
      	sensor.set_contrast(1)
      	sensor.set_gainceiling(16)
      	sensor.set_framesize(sensor.QQVGA)
      	sensor.set_pixformat(sensor.GRAYSCALE)
      	templates = ["b3_1.pgm"]
      	clock = time.clock()
      	while (True):
      		score_str = ""
      		clock.tick()
      		img = sensor.snapshot()
      		statistics=img.get_statistics()
      		thr = (statistics.max()-statistics.min())/2
      		img2 = img.copy()
      		img2.binary([(int(thr), 255)], invert=False)
      		img.binary([(int(thr), 255)], invert=False)
      		for t in templates:
      			print(t)
      			template = image.Image(t)
      			r = img2.find_template(template, 0.60, step=1, search=SEARCH_EX)
      			if r:
      				img.draw_rectangle(r, color =(128,128,128))
      				score_str = score_str +" " + t
      				n = ord(t[1]) - 48
      				return n
      		img.draw_string(0, 0, score_str)
      
      #car
      from pyb import Pin, Timer
      inverse_left=False  #change it to True to inverse left wheel
      inverse_right=False #change it to True to inverse right wheel
      
      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)))
      
      
      #pid
      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')
      
      
      #trace
      cross_cnt = 0
      foward_backward_state = 0
      traj = "I"
      def trace_line(delay_time = 1000, std_speed = 50, long_end = False):
      	THRESHOLD = (10, 60, 20, 70, 10, 50)
      	import sensor, image, time
      	from pyb import LED
      	import car
      	from pid import PID
      	rho_pid = PID(p=0.4, i=0)
      	theta_pid = PID(p=0.001, i=0)
      	roi1a=(0,0,40,3)
      	roi1b=(0,3,40,3)
      	roi1c=(0,6,40,3)
      	roi2a=(40,0,40,3)
      	roi2b=(40,3,40,3)
      	roi2c=(40,6,40,3)
      	roi_trace = (23,10,39,50)
      	sensor.reset()
      	sensor.set_pixformat(sensor.RGB565)
      	sensor.set_framesize(sensor.QQQVGA)
      	sensor.skip_frames(time = 2000)
      	clock = time.clock()
      	while(True):
      		if delay_time <= 0:
      			car.run(0,0)
      			return
      		delay_time = delay_time -1
      		clock.tick()
      		img = sensor.snapshot().binary([THRESHOLD], invert = True)
      		line = img.get_regression([(0,1)],roi = roi_trace, 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
      				car.run(std_speed+output, std_speed-output)
      			else:
      				car.run(std_speed,std_speed)
      		else:
      			car.run(50,-50)
      			pass
      		statistics1=img.get_statistics(roi=roi1a)
      		color_l1a=statistics1.mode()
      		statistics1=img.get_statistics(roi=roi1b)
      		color_l1b=statistics1.mode()
      		statistics1=img.get_statistics(roi=roi1c)
      		color_l1c=statistics1.mode()
      		statistics2=img.get_statistics(roi=roi2a)
      		color_l2a=statistics2.mode()
      		statistics2=img.get_statistics(roi=roi2b)
      		color_l2b=statistics2.mode()
      		statistics2=img.get_statistics(roi=roi2c)
      		color_l2c=statistics2.mode()
      		print("color_l1:",(color_l1a==0 or color_l1b==0 or color_l1c==0))
      		print("color_l2:",(color_l2a==0 or color_l2b==0 or color_l2c==0))
      		print(delay_time)
      		if long_end == False:
      			if (color_l1a==0 or color_l1b==0 or color_l1c==0) and (color_l2a==0 or color_l2b==0 or color_l2c==0):
      				return 0
      		else:
      			if (color_l1a==0 or color_l1b==0 or color_l1c==0):
      				return 1
      			if (color_l2a==0 or color_l2b==0 or color_l2c==0):
      				return 2
      def test_trace_line():
      	THRESHOLD = (5, 70, -23, 15, -57, 0)
      	import sensor, image, time
      	from pyb import LED
      	import car
      	from pid import PID
      	rho_pid = PID(p=0.4, i=0)
      	theta_pid = PID(p=0.001, i=0)
      	roi1=(0,0,40,16)
      	roi2=(40,0,40,16)
      	sensor.reset()
      	sensor.set_pixformat(sensor.GRAYSCALE)
      	sensor.set_framesize(sensor.QQQVGA)
      	sensor.skip_frames(time = 2000)
      	clock = time.clock()
      	while(True):
      		clock.tick()
      		img = sensor.snapshot()
      		statistics=img.get_statistics()
      		thr = (statistics.max()-statistics.min())/1.3
      		img.binary([(int(thr), 255)], invert = False)
      		line = img.get_regression([(0,1)],roi = (23,0,39,43), 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
      				car.run(40+output, 40-output)
      				print(output)
      			else:
      				car.run(50,50)
      		else:
      			car.run(50,-50)
      


    • https://book.openmv.cc/image/mulity-template-match.html

      单独测试模板匹配的程序。