아두이노 코딩-176: OpenCV 청색공 인식 Tracking 밸런싱 로봇 알고리듬 테스트

in kr •  6 years ago  (edited)

noname01.png

청색 공을 인식하여 Tracking 하는 밸런싱 로봇이나 이번에 NASA 친구들이 화성에 Insight 호 착륙 시킨 것이나 원리 상 별 차이가 없습니다. Insight는 주로 Backward 후방 추진이 거의 다일 것이고 부스터 로켓을 사용하여 좌우앞뒤로 조금씩 왔다 갔다 하는 정도 일 듯. 아울러 고도를 정확히 측정해서 지면에 닻기 전에 추진력을 줄여 중립적인 상태로 만들어 꽝하고 부드럽게 착륙했을 것이라 생각되네요.

PiCamera 와 OpenCV 색상 인식 코드 및 블루투스 코드를 믹스하여 밸런싱 로봇으로 하여금 머신 러닝 방식으로 주행하기 위한 코드를 작성해 보기로 한다.

PiCamera를 장착한 밸런싱 로봇이 색 공의 hue 값을 인식할 수 있도록 OpenCV를 사용하여 코딩해보자.

청색 공의 반경 값은 자로 30mm로 측정 값이 얻어진다. 이때 PiCamera 로부터 청색 공의 중심까지의 거리는 270mm 이다.

PiCamera의 해상도는 (320,256) 으로 설정되어 있으며 화면의 중앙은 (160, 128)이 된다.

청색 공을 PiCamera로 부터 480mm 인 곳까지 멀어지게 했을 때 즉 210mm 더 멀어졌을 때 OpenCV 코드에서 인식한 청색 공의 반경 크기는 20mm 로 축소 된다.

즉 청색 공이 기준 거리 270mm에서 멀어진다면 즉 30mm 의 반경 값이 줄어든다면 OpenCV 코드에서 블루투스를 통해 전진 명령 즉 ‘F’를 출력하자.

270mm 떨어져 있는 청색 공을 밸런싱 로봇 기준으로 오른 쪽으로 이동시켜 보자. 거리가 가깝기 때문에 PiCamera에서 청색 공의 반경 값 변화를 느끼기 힘들 정도이며 X 좌표 값이 160에서 290(320-30=290)까지 증가할 수 있다.
이때는 OpenCV 코드에서 블루투스를 통해 우 명령 즉 ‘R’을 출력하자.

noname02.png

문제는 청색 공이 대각선 방향으로 멀어질 때인데 일단은 청색 공을 먼저 가까이 따라 잡은 후 즉 ‘F’ 명령을 우선 주고 거리가 어느 정도 범위 내에 들어오면 그때에 ‘R’ 이나 ‘L’ 명령을 주도록 한다.

한편 청색 공과 PiCamera 와의 거리가 270mm 이내에 들어오게 되면 즉 PiCamera에서 반경 값이 30 보다 작아지면 후진 즉 ‘B’을 출력하도록 하자.

이 내용을 if 문을 사용하여 코딩해보자. 청색 공의 높이 방향 변화는 고려하지 않는 방향으로 코딩해보자. 일단 블루투스는 터미널에서 Pairing 준비를 미리 해두기로 한다.

import serial
from time import sleep
bluetoothSerial =serial.Serial(“/dev/rfcomm0”, baudrate =9600)

헤더 영역에 위의 코드를 추가하도록 하고 아울러 OpenCV 코드의 for loop 문 내 후반에 다음의 제어 코드를 넣도록 하자.
⦁⦁⦁
refcenter = 160
refradius = 30
dist = radius - refradius

if dist > 20:
dist = 19
if dist > 0 && dist < 5:
for i in range(30):
bluetoothSerial.write(str.encode(‘S’))
print(‘S’)

if dist < 0 :
for i in range(30):
bluetoothSerial.write(str.encode(‘B’))
print(‘B’)
if dist < 20 && dist > 5:
for i in range(30):
bluetoothSerial.write(str.encode(‘F’))
print(‘F’)
if x > 280 :
x = 279
if x <40 :
x = 41
if x > 200 && x < 280 :
for i in range(30):
bluetoothSerial.write(str.encode(‘R’))
print(‘R’)
if x < 120 && x > 40 :
for i in range(30):
bluetoothSerial.write(str.encode(‘L’))
print(‘L’)

동영상을 통해서 청색 공을 움직이면 중심 궤적이 나타나지요. 지금 화면 세팅을 너무 근접해서 그런지 라즈베리 셸 화면이 잘렸네요. 어쨋든 아두이노 시리얼 모니터 화면에서 대단히 빨리 스크롤 되고 있는데요 그 원인은 4msec 에 loop를 한번씩 돌게 끔 코딩이 되어 있어 그런 겁니다. 물론 실제 밸런싱 로봇에 동일한 코드가 들어가 있습니다. 이미 여러 가지 방식으로 컴퓨터 제어를 해봐서 경험 상 제대로 PiCamera가 본 데이터로부터 그렇게 빠르지 않은 속도로 블루투스를 통해서 명령을 전달해 주는군요. 좀 엉성하기 한데 실제 밸런싱 로봇에 적용하게 되면 밸런싱 로봇이 움직이는 장면을 찍어 볼 계획입니다.

밸런싱 로봇 조종이 곧 완료되면 코드도 함께 올릴 계획임.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

짱짱맨 호출에 응답하여 보팅하였습니다.

오늘 독자가 만드는 베스트셀러, 스팀달러 에어드랍 프로모션의 첫번째 도서 판매가 시작되었습니다. 북이오(@bukio)의 [스팀달러 에어드랍] 스팀잇 프리세일 「영어 잘하고 싶니?」를 확인하여, 여러분이 베스트셀러를 만들고 수익을 같이 누리세요.

「영어 잘하고 싶니?」 판매페이지

글 잘보고 가요 꾸욱~

Posted using Partiko iOS

Congratulations @codingart! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You made more than 700 comments. Your next target is to reach 800 comments.

Click here to view your Board of Honor
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Support SteemitBoard's project! Vote for its witness and get one more award!

로봇이라니.... 파이팅입니다!!