처음 설계처럼
QR코드를 좌표화 하려고 했다.
방법은 x,y가 가장 적합하다고 생각해서 좌표방식으로 결정하였다.
예를 들어, (1,2)가 그 예시이다.
이런 바둑판모양에서의 자동차는 최단거리를 고려할 필요가 없다.
원하는 목적지가 정해졌을 때, x축, y축을 행과열이라고 생각하면 행 n개, 열 m개를 가면 된다.
그래서 행렬에 따른 어떤 방향으로 이동할 지가 중요한 관건이다.
이는 로봇이 1개가 아닌 다중로봇시스템으로 구동을 해야 하기에, 충돌방지에 따른 next hop의 목적지를 robot에게 전달해야 한다.
코드는
https://goqr.me/
QR Code Generator – create QR codes for free (Logo, T-Shirt, vCard, EPS)
Information about our QR code generator You can generate free QR codes on this website. A QR code is a two dimensional barcode that stores information in black and white dots (called data pixels or “QR code modules”). Besides the black and white versio
goqr.me
사이트에서 문자열에 관한 코드를 모두 담을 수 있는 qr코드 사이트를 이용해서 만들었다.
담기 위한 정보가 매우 작기에, qr코드 말고
보스턴 다이내믹스에서 영감을 얻었는데, 이런 흔히 micro qrcode라고 되어있는 코드에 정보를 담고 싶었다.
왜냐하면 인식속도가 올라가기 때문이다.
하지만 이는 QR 코드와 호환성이 없다.
또한 MicroQR코드를 읽기 위해서는 특별한 리더기가 필요하다.
우리 팀은 파이썬 모듈인 pyzbar모듈을 사용하려 했기에 그냥 QR코드를 사용하여 좌표를 담기로 했다.
맵에 따른 좌표를 담았다. ( 총 25개의 좌표 존재) ==> 실제좌표는 디코딩하면 (0,1)이다.

아래 사진은 실제 테스트를 진행해 본모습이다.

아래는 핸드폰 카메라로 테스트해 본 이후 라즈베리파이 카메라로 실제 테스트를 해 본모습이다.

import cv2 // OPenCV 라이브러리 import
from pyzbar import pyzbar // pyzbar 라이브러리 import
cam = cv2.VideoCapture(-1) // 웹캠을 켜고, -1은 시스템에서 첫 번째 사용 가능한 웹캠을 의미
while(True): // 무한루프
ret, frame = cam.read() // 웹캠에서 영상을 읽어들임
barcodes = pyzbar.decode(frame) // pyzbar 라이브러리를 사용하여 frame에서 QR 코드를 디코딩합니다. QR코드가 인식되면 반환값으로 바코드 정보가 포함된 객체 리스트가 생성
for barcode in barcodes: // QR코드 리스트에서 각 QR코드 정보를 가져옴 (x,y,w,h) = barcode.rect // QR코드 위치 정보를 가져옴
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2) // QR코드가 인식된 영역에 빨간색으로 사각형을 그림
barcodeData = barcode.data.decode("utf-8") // QR코드 데이터를 가져와서 utf-8 형식으로 디코딩
print(barcodeData) // QR 데이터를 출력
cv2.imshow('image',frame) // 웹캠에서 읽어들인 영상에 QR코드 인식 결과를 나타냄
k = cv2.waitKey(10) & 0xFF // 10ms 동안 키 이벤트를 대기하고, ESC 키가 눌리면 무한루프를 종료
if k == 27:
break
cam.release() // 웹캠을 끄고 리소스를 해제
cv2.destroyAllWindows() // 모든 창을 닫음
Linux os에서는
일반 파일뿐만 아니라 디렉터리와 디바이스도 파일로 취급을 한다.
/dev로 접근하면 디바이스 파일들을 볼 수 있다.
따라서 raspicam이 dev장치에 연결되었는지 확인해야 한다.
2가지 명령어를 사용해서 확인하였다.
ls /dev/video*
v4l2-ctl --list-devices
ls /dev/video* 는
/dev/ 디렉토리에 있는 비디오 디바이스 파일들을 나열합니다.
를 실행하면 video 디바이스가 여러 개 보인다.
하지만 정확한 장치식별을 할 수 없어서 2번째 명령어를 사용하였다.
v4l2-ctl --list-devices 는 video for linux2 라이브러리를 사용하여 현재 시스템에서 이용 가능한 비디오 디바이스를
나열하는 명령어입니다.
그러면 platform:<platform_name> 처럼 어떤 플랫폼이 나오는지 알 수 있다.
나의 raspicam은 ls /dev/video0에 연결되어 있었다.
보통 라즈베리파이에 연결된 캠은 첫 번째 디바이스에 연결된다.
cam = cv2.VideoCapture(-1)
따라서 이 명령어의 -1 은 첫 번째로 연결된 캠을 자동으로 연결해 준다는 코드를 의미한다.
여기서는 test코드이기에 눈으로 확인하기 위해
cv2.imshow('image',frame) 명령어를 사용하여 확인했지만
우리는 한정된 ram과 미약한 h/w환경에서 제어하는 임베디드환경이므로 최대한 메모리를 아껴야 한다.
이때 우리의 카메라를 30 fps를 지원하고 이런 이미지 프로세싱과정에서 cv2.imshow('image',frame)는
단지 화면에 frame단위의 사진을 띄우는 것은 굉장히 높은 리소스를 잡아먹는다.
이를 직접 확인하기 위해 htop명령어를 이용하였다.
htop: Linux os에서 시스템 성능을 모니터링하고 문제를 해결하기 위해 사용한다.
htop은 실행 중인 프로세스의 CPU 및 메모리 사용량, 시스템 부하, 네트워크 활동 등을 확인할 수 있다.
저희가 확인한 것은 load averge, cpu core 점유율, mem정도입니다. 여기서 load averge 3개는 1분 5분 15분 부하 평균을 의미하는데 일반적으로, load average가 CPU의 코어 수보다 높으면 시스템이 과부하 상태에 있다고 판단된다.
지금 라즈베리파이 환경은 4core에 cpu환경을 사용한다.


이때 4core 환경에서 저희가 찾아본 바로는
2.0 이상의가 잡히게 되면, 시스템이 굉장히 바빠진 환경을 의미한다.
사진은 없지만
bounding box와 imshow 코드 제외 시 load average가 1 초반유지까지 내려가며 확실히 일할당량이 줄어들고
core점유율도 80% 이상을 넘지 않는 모습을 확인하였다.
따라서 실제 주행환경 시
bounding box와 imshow 코드 제외하기로 결정.
'Project > Caston Design' 카테고리의 다른 글
[순서도] 시스템 동작 (0) | 2023.09.02 |
---|---|
[MQTT] 통신선로 구축하기 (0) | 2023.09.01 |
[개발환경구축] SSH로 vscode와 연동하기 (0) | 2023.09.01 |
[초안설계] 졸업작품 system design (0) | 2023.09.01 |