안녕하세요! 충남대학교 컴퓨터공학과 김진섭 학생입니다.
지난 포스팅에서는 OpenMV의 예제를 적용해보고, uArm을 이용하여 빨간색 물체를 찾고 옮기는 작업을 수행하였는데요.
이번 포스팅에서는 지난번에 사용한 OpenMV 예제를 바탕으로 바둑돌을 찾는 코드를 작성해 보도록 하겠습니다.
만약 OpenMV에 대하여 궁금하신 점이 있으시면 OpenMV 홈페이지에서 확인해 주시길 바랍니다!
코드 구현 설명
OpenMV에서 제가 바둑돌을 찾기 위한 코드를 설명하기에 앞서, 이 전 포스팅에서 사용한 예제 코드를 모방하여 구현하였음을 미리 알려드립니다.
import sensor, image, time, pyb
우선, OpenMV의 LED나 uArt 통신을 하기 위해서는 pyb라고 하는 모듈을 import해 주어야합니다.
#rgb LED의 객체 생성
red_led = pyb.LED(1)
green_led = pyb.LED(2)
blue_led = pyb.LED(3)
OpenMV의 LED를 간단히 설명 드리면, RGB LED와 IR LED 2개를 가지고 있습니다. 저는 RGB LED를 사용해 현재 OpenMV의 상황을 표시하기 위해서 LED(1) : red와 LED(2) : Green 그리고 LED(3) : Blue에 대한 객체를 생성하여주었습니다.
#uart 사용
uart = pyb.UART(3, 115200, timeout_char = 1000)
그리고 uart 통신을 하기 위해서 위처럼 설정해 주었습니다.
blue_led.on()
thresholds = [(100, 94, -23, 27, 0, 31), #1#백
(14, 0, -5, 30, -10, 4)] #2#흑돌
#센서 설정
sensor.reset() #카메라 센서 초기화
sensor.set_pixformat(sensor.RGB565) #카메라 모듈을 위해서 픽셀 설정 16bits per pixel
sensor.set_framesize(sensor.QVGA) #frame size 설정 (320*240)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
clock = time.clock()
blue_led.off()
green_led.off()
red_led.off()
우선, 파란색 LED를 켜 주고 설정을 수행합니다.
threshold 값을 이용해서, 흑색과 백색에 대하여 찾을 수 있도록 설정해 줍니다.
threshold 값을 계산하는 방법은 OpenMV IDE에서 [Tools -> Machine Vision -> Threshold Editor]에 들어가서 수행할 수 있습니다.
(바둑돌이 없어서.. 직접 위 코드를 실행해 보지는 못하고, 흰색과 검은색을 잘 잡는지 확인한 상태로 오류가 발생한다면, 위 thresholds의 값을 변경해 주어야합니다.)
이 후 아래의 카메라센서와 clock을 설정하여주고, led를 모두 꺼 줍니다.
object_x_old = 0
object_y_old = 0
FindColor = 2 # 돌 : 1 흑돌 : 2
buf = "00"
현재 물체의 위치를 정확히 모르기 때문에 0으로 초기화 시켜줍니다.
FindColor는 바둑돌을 흑 or 백돌을 선택하여 찾는 과정입니다.
만약, 백돌을 찾는 일을 수행하고 싶다면 FindColor를 1로 흑돌을 찾는 일을 수행하고 싶다면 2로 설정하여줍니다.
while(True):
clock.tick()
blue_led.off()
green_led.off()
red_led.off()
img = sensor.snapshot() #카메라 센서를 활용해 사진 찍고, image object return
LED를 모두 꺼주고, sensor를 이용해 사진을 촬영합니다.
for blob in img.find_blobs(thresholds, pixels_threshold=100, area_threshold=100, merge=False):
if blob.code() == FindColor:
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
if blob.cx()!=None and (
abs(object_x_old - int(blob.cx())) < 8 and
abs(object_y_old - int(blob.cy())) < 8) and (
blob.w()>35 and
blob.h()>35):
#Object를 찾았다면, blue를 on
blue_led.on()
red_led.off()
green_led.off()
if uart.any()>0 :
buf=uart.read()
if buf[1]==ord('S') :
blue_led.off()
red_led.on()
green_led.off()
uart.write('x'+str(blob.cx())+'y'+str(blob.cy())+'\n')
#모두 보낸 후 green led를 on하여 확인한다.
blue_led.off()
red_led.off()
green_led.on()
#buf를 초기화시킨다.
buf = "00"
object_x_old = int(blob.cx())
object_y_old = int(blob.cy())
해당 사진에 대하여 find_blobs()를 수행하여주고 blob에 해당 값을하나씩 넣어주며 수행합니다.
blob.code()는 위에서 선언한 thresholds의 순서에 따라서, 만약 백색이면 1 흑색이면 2의 return값을 갖습니다.
만약 찾고자하는 값이 백색인데, 백색에 대한 정보가 주어졌다면, 이전에, 빨간 물체를 들어올린것과 동일한 작업을 수행하여주고, x와 y의 경로를 줍니다.
위 코드를 이용하면, 검은색 돌 or 흰색돌을 찾을 수 있고, 해당 돌에 대한 z값만 아두이노에서 다시 계산하여주면 그 돌을 들어올려서 다른 위치에 옮겨둘 수 있습니다.
이상으로 포스팅을 마치도록하겠습니다.
감사합니다.
'Etc > odds and ends' 카테고리의 다른 글
Git Blog에 이미지 업로드 Tip (1) | 2021.07.15 |
---|---|
uArm 예제를 응용해 바둑돌 두는 동작 구현 (2) | 2019.01.10 |
uArmSwiftPro Open MV사용해보기 (2) | 2019.01.02 |
Python으로 uArm 제어하기 (4) | 2018.12.28 |
uArm을 아두이노 제어 (0) | 2018.12.27 |