Skip to main content

경쟁 연결: 전환점 - C++

터닝 포인트 VEX 로봇 경쟁 경기장에는 경기 시작 위치에 게임 요소와 득점 구역이 마련되어 있습니다. 뒷벽에는 그물이 있고, 그물 앞에는 뒤집을 수 있는 깃발이 여러 개 꽂혀 있습니다.
VRC 2018-2019 터닝 포인트 필드

로봇 기능

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

학습 확장 아이콘 학습을 확장하세요

이 활동을 확장하려면 학생들에게 로봇이 이 경쟁 게임에 사용할 수 있는 감지된 노란색 물체를 향해 이동하는 프로젝트를 설계하고 구성해 보라고 하세요!
학생들에게 다음을 하도록 하세요.

  • Clawbot(구동계, 2모터, 자이로 없음) 예제 프로젝트를 엽니다.

    템플릿 프로젝트 아이콘 하단에는 Clawbot Drivetrain, No Gyro가 표시되고, 위에는 로봇의 회색 다이어그램이 표시되어 어떤 프로젝트를 선택해야 하는지 알려줍니다.

     

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

    VEXcode V5 장치 창이 열려 있고 장치 추가를 선택하면 왼쪽에 빨간색 상자로 강조 표시된 비전 센서가 표시됩니다. 다른 옵션으로는 컨트롤러, 구동계, 모터 및 3선 등이 있습니다.

  • 감지된 물체를 향해 클로봇을 이동하도록 프로그래밍합니다. 클로봇은 마치 깃발을 흔들듯이 팔을 들어올리도록 프로그래밍할 수도 있습니다!
  • 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);
  }
}