경쟁 연결: 전환점 - C++
로봇 기능
2018~2019년 VEX 로봇 경연대회 게임 Turning Point에서는 플레이어가 다른 게임 요소 사이에서 플래그를 전환해야 했습니다. 깃발은 총 9개였습니다. 로봇이 움직일 수 있는 아래쪽 깃발 3개와 경쟁용 공놀이 조각으로 치면 움직일 수 있는 위쪽 깃발 6개였습니다. 경쟁팀은 공 발사기를 이용해 더 높은 깃발을 맞추는 방법을 생각해내야 했습니다. 상상해 보세요. 로봇이 공놀이 조각을 이용해 깃발을 치도록 프로그래밍하는 것이 항상 정확하지는 않을 수도 있습니다. 로봇이 자율 주행 중에 잘못된 방향으로 한 번만 돌면 계산이 틀어져 플래그가 하나도 맞지 않을 가능성이 있습니다. 마찬가지로, 운전 기술 챌린지의 경우, 팀이 공을 제대로 던질 수 있을 만큼 로봇을 수동으로 정렬하는 것이 어려울 수 있습니다. 따라서 숙련된 팀은 비전 센서를 사용하여 로봇을 프로그래밍하여 깃발을 감지한 다음 로봇을 올바르게 정렬하여 정확한 사격을 할 수 있도록 합니다.
학습을 확장하세요
이 활동을 확장하려면 학생들에게 로봇이 이 경쟁 게임에 사용할 수 있는 감지된 노란색 물체를 향해 이동하는 프로젝트를 설계하고 구성해 보라고 하세요!
학생들에게 다음을 하도록 하세요.
-
Clawbot(구동계, 2모터, 자이로 없음) 예제 프로젝트를 엽니다.

- 비전 센서를 프로그래밍할 때 Detecting Objects (Vision) 예제 프로젝트를 참조하세요(Google Doc / .v5cpp).
-
Clawbot(구동계, 2모터, 자이로 없음) 구성에 비전 센서를 추가한 다음 비전 센서가 빨간색과 파란색 물체를 감지하도록 구성합니다. 자세한 내용을 보려면 여기하세요.

- 감지된 물체를 향해 클로봇을 이동하도록 프로그래밍합니다. 클로봇은 마치 깃발을 흔들듯이 팔을 들어올리도록 프로그래밍할 수도 있습니다!
- VRC Turning Point 게임의 노란색 공과 같은 노란색 물체를 Vision Sensor가 감지할 수 있는지 확인하기 위해 프로젝트를 다운로드하고 실행(C++)합니다. 비전 센서가 물체를 감지할 수 있다면, 로봇은 감지된 물체에 따라 움직일까요? 도움이 필요하면 프로젝트 다운로드 및 실행 튜토리얼 비디오를 시청하세요.
- 시간이 허락한다면 Turning Point 경기장과 비슷한 게임 경기장을 마련해 보세요. 비전 센서를 사용해 로봇이 움직여 점수를 획득하는 연습을 해보세요!
아래에서 샘플 솔루션을 확인하세요.
// V5 라이브러리 포함
#include "vex.h"
// VEX 라이브러리를 더 쉽게 사용할 수 있도록 함
using namespace vex;
event checkRed = event();
event checkBlue = event();
void hasRedCallback() {
Brain.Screen.setFont(mono40);
Brain.Screen.clearLine(1);
Brain.Screen.setCursor(1, 1);
Vision5.takeSnapshot(Vision5__REDBOX);
if (Vision5.objectCount > 0) {
ArmMotor.spinFor(forward, 300, degrees);
ClawMotor.spinFor(forward, 100, degrees);
Drivetrain.driveFor(forward, 12, inches);
ArmMotor.spinFor(reverse, 300, degrees);
ClawMotor.spinFor(역방향, 100, 도);
}
else {
Brain.Screen.print("빨간색 물체 없음")
}
}
void hasBlueCallback() {
Brain.Screen.setFont(mono40);
Brain.Screen.clearLine(3);
Brain.Screen.setCursor(3, 1);
Vision5.takeSnapshot(Vision5__BLUEBOX);
if (Vision5.objectCount > 0) {
ArmMotor.spinFor(전방, 90, 도);
ClawMotor.spinFor(전방, 90, 도);
Drivetrain.driveFor(전방, 12, 인치);
ArmMotor.spinFor(역방향, 90, 도);
ClawMotor.spinFor(reverse, 90, degrees);
}
else {
Brain.Screen.print("파란색 물체 없음")
}
}
int main() {
// 로봇 구성 초기화. 제거하지 마세요!
vexcodeInit();
// 이벤트 핸들러 등록
checkRed(hasRedCallback);
checkBlue(hasBlueCallback);
// 새로운 센서 데이터를 확인하기 위해 지속적으로 실행
while (true) {
checkRed.broadcastAndWait();
checkBlue.broadcastAndWait();
wait(0.2, seconds);
}
}