안녕하세요! 이번 포스트에서는 자율 로봇 프로젝트에서 중요한 역할을 하는 로봇의 주행과 장애물 인식에 대해 다뤄보겠습니다. 로봇이 책을 찾기 위해 주행하며 어떻게 장애물을 피하고, 책장 앞에서 정확히 멈추는지를 자세히 설명할게요.
1. 주행 시작 (Line Following)
로봇이 바코드를 수신받으면 가장 먼저 해야 할 일은 주행을 통해 지정된 책장 위치로 이동하는 것입니다. 이 과정에서 로봇은 라인 트레이싱(Line Following) 알고리즘을 사용해 바닥에 그려진 검은 선을 따라 이동합니다.
라인 트레이싱(Line Following) 동작
로봇은 바닥의 검은 선을 감지하는 IR 센서를 이용해 좌우로 교정하며 이동합니다. 선의 위치를 감지해 좌회전 또는 우회전을 하며 바르게 움직이도록 설계되었습니다. 주행 중에 장애물이 나타나면 로봇은 자동으로 멈추고, 스캔을 시작합니다.
주행을 위한 코드
void lineFollowing() { BTSerial.println("Starting line following (주행1 구간 시작)"); while (true) { readIRsensors(); if (detectObstacle()) { stopMove(); BTSerial.println(F("Stop: 장애물1 인식 (책장 앞 도착)")); delay(1000); isScanning = true; scanForBarcode(); break; } else if (leftIRval == white && rightIRval == black) { rightTurn(); } else if (leftIRval == black && rightIRval == white) { leftTurn(); } else if (leftIRval == black && rightIRval == black) { goForward(); } delay(30); } } |
이 코드는 로봇이 바닥의 선을 따라 주행하는 모습을 구현한 것으로, 검은색 선과 흰색 바닥을 구분하여 좌우 회전 및 직진 동작을 조정합니다.
주행의 동작 과정
- 로봇이 검은색 선을 감지하며 주행을 시작합니다.
- 좌측 또는 우측 센서가 선을 감지하지 못하면 좌회전 또는 우회전을 하여 경로를 수정합니다.
- **장애물(책장)**을 인식하면 주행을 멈추고 스캔 모드로 전환됩니다.
로봇은 이 과정을 통해 책장까지 안전하게 이동합니다.
2. 장애물 인식과 바코드 스캔
로봇이 책장에 도착하면, 다음 단계로 장애물을 인식한 후, 바코드 스캔을 시작합니다. 책장 앞에서 멈추면 목을 좌우로 천천히 회전시켜 책에 부착된 바코드를 찾아냅니다.
장애물 인식
로봇은 초음파 센서를 통해 일정 거리 안에 있는 책장을 감지합니다. 책장이 감지되면 주행을 멈추고, 스캔을 준비합니다.
bool detectObstacle() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); unsigned long duration = pulseIn(echoPin, HIGH); float distance = ((float)(340 * duration) / 10000) / 2; return distance < 10; // 장애물 감지 거리 10cm로 조정 } |
이 코드는 로봇이 책장이라는 장애물을 감지할 때 사용하는 초음파 센서의 값을 처리하는 부분입니다. 10cm 이내에 물체가 감지되면 주행을 멈추고 바코드 스캔을 시작하게 됩니다.
3. 바코드 스캔과 책 위치 확인
책장을 감지한 후 로봇은 목을 좌우로 천천히 회전시키면서 책의 바코드를 스캔합니다. 스캔된 바코드가 사용자가 원하는 책의 바코드와 일치하면 로봇은 책을 찾았다는 메시지를 출력합니다.
스캔 및 레이저 포인터 사용 코드
void scanForBarcode() { BTSerial.println("Scanning for barcode (책 검색 시작)"); bool barcodeFound = false; stopMove(); delay(500); // 천천히 목을 좌측으로 45도까지 회전하며 바코드를 스캔 slowMoveNeckToPosition(45); delay(500); // 천천히 목을 좌에서 우로 회전하며 바코드를 스캔 for (int pos = 45; pos <= 135; pos += 1) { neck.write(pos); delay(30); // 각도마다 잠시 대기하여 부드럽게 회전 if (GM65.available()) { String scannedBarcode = GM65.readStringUntil('\n'); if (scannedBarcode.indexOf(receivedBarcode) >= 0) { BTSerial.println("찾는 책 발견!"); barcodeFound = true; break; } else { BTSerial.println("찾는 책 발견 실패"); } } } // 천천히 다시 정면으로 복귀 후 2초간 스캔 slowMoveNeckToPosition(90); delay(2000); // 정면에서 추가 스캔 시간 delay(500); activateLaserPointer(90); // 레이저 포인터 작동 isScanning = false; scanComplete = true; } |
이 코드는 로봇이 책장의 바코드를 스캔하고, 책을 찾은 후 레이저 포인터로 책의 위치를 가리키는 과정을 설명하고 있습니다.
책 스캔 과정
- 로봇은 목을 좌측(45도)으로 돌려 스캔을 시작합니다.
- 좌측에서 우측(135도)으로 천천히 회전하며 바코드를 스캔합니다.
- 찾는 바코드를 인식하면, 책을 찾았다는 메시지를 출력합니다.
- 마지막으로 정면(90도)을 바라보며 추가 스캔을 시도하고, 결과에 상관없이 레이저 포인터가 작동합니다.
4. 출발지로 복귀 (Return to Start)
로봇이 책을 찾고 나서 마지막으로 해야 할 일은 출발지로 돌아가는 것입니다. 이 과정에서도 라인 트레이싱을 통해 바닥의 검은 선을 따라 원래 위치로 돌아옵니다.
복귀 코드
void returnToStart() { BTSerial.println("주행2 구간 시작 (출발지로 복귀)"); while (true) { readIRsensors(); if (detectObstacle()) { // 출발지에서 장애물2 인식 stopMove(); BTSerial.println("출발지 도착 (장애물2 인식)"); resetSystem(); break; } else if (leftIRval == black && rightIRval == white) { leftTurn(); } else if (leftIRval == white && rightIRval == black) { rightTurn(); } else if (leftIRval == black && rightIRval == black) { goForward(); } delay(30); } isScanning = false; } |
이 코드는 로봇이 책장을 스캔한 후 출발지로 안전하게 돌아가는 과정을 설명합니다. 출발지에 도착하면 시스템이 리셋되고 새로운 바코드를 기다리게 됩니다.
5. 전체 시나리오 요약
로봇의 전체 동작 시나리오는 아래와 같습니다:
- 바코드 수신: 블루투스로 책의 바코드를 수신합니다.
- 라인 트레이싱을 통해 책장으로 이동: 로봇은 검은 선을 따라 책장으로 이동합니다.
- 책장 인식 후 바코드 스캔: 책장 앞에서 멈추고, 목을 좌우로 회전하며 바코드를 스캔합니다.
- 레이저 포인터로 책 가리키기: 책을 찾으면 레이저 포인터가 켜져 책의 위치를 가리킵니다.
- 출발지로 복귀: 마지막으로 로봇은 다시 출발지로 돌아갑니다.
'창의과학' 카테고리의 다른 글
비숑의 성장 과정과 주의사항 (14) | 2024.10.15 |
---|---|
비숑 입양 가이드 (5) | 2024.10.15 |
책을 찾아내다! 바코드 스캔과 레이저 포인터로 책을 정확하게 가리키는 로봇 (0) | 2024.10.14 |
자율주행 로봇이 스스로 길을 찾다! 라인 트래킹과 장애물 감지 구현 (0) | 2024.10.14 |
자율주행 로봇 프로젝트의 첫 걸음! 로봇 만들기 준비하기-1 (1) | 2024.10.14 |