DEVLOG – 직선으로 직진하는 방법?

발행: (2025년 12월 14일 오전 09:36 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

문제 설명

어떤 문제든 해결하려면 먼저 명확하고 이해하기 쉬운 문제 진술로 바꿔야 합니다. 우리의 문제 진술은 다음과 같습니다:

“SPIKE Prime 로봇을 외부 하중을 끌면서 직선으로 X 거리만큼 이동시키려면 어떻게 해야 할까?”

무게 중심

당연하게 들릴 수도 있습니다: “그냥 0도에서 움직이면 돼!” 라고 생각할 수도 있죠. 하지만 무게 중심(전체 질량이 집중된 점)은 항상 기하학적 중심에 있는 것은 아닙니다. 규칙적인 형태의 물체만이 무게 중심과 기하학적 중심이 일치하고, 그 외의 모든 물체는 일치하지 않습니다.

따라서 로봇에게 각도 0°로 움직이라고 명령하면 시간이 지나면서 기울어질 수 있습니다.

제안 #1: MOVE(0 – YAW)

처음 아이디어는 로봇이 (0 – yaw)도 각도로 움직이게 해서, 로봇이 내부 자이로스코프가 감지하는 기울임을 언제든지 보정하도록 하는 것이었습니다.

로봇 프로그래밍 환경에서는 루프 안에서 “MOVE UNTIL X DISTANCE”를 지원하지 않기 때문에 시간을 이용해야 했습니다. 아이디어는 다음과 같습니다:

  1. 타이머(T)를 시작한다.
  2. 로봇을 0°에서 X cm 이동시킨다.
  3. speed = X ÷ T 를 계산한다.

트랙에는 두 가지 작업이 있습니다:

  1. 작업 1: 짧은 거리이며 외부 하중이 없는 상태에서 A 지점에서 B 지점까지 직선으로 이동.
  2. 작업 2: 하중을 실은 상태에서 B 지점에서 C 지점까지 이동.
  • 작업 1에서는 거리와 하중이 짧고 없기 때문에 로봇이 직선으로 이동할 수 있어 속도를 계산할 수 있습니다.
  • 작업 2에서는 MOVE(0 – YAW) 방식을 루프 안에서 실행합니다. 거리 X를 이동하는 데 필요한 시간을 구하려면 time = d / v 를 사용합니다. 여기서 거리 d와 속도 v는 이미 알고 있습니다.

제안 #2: 변위 기반 이동

첫 번째 제안은 시간을 기반으로 했지만, 로봇이 움직이는 동안 기울어지면 실제 이동 거리가 늘어나고 시간이 신뢰할 수 없게 됩니다.

시간에 의존하는 대신, 시작점으로부터 로봇이 실제로 직선으로 이동한 거리(즉, “새가 날아다니는 것처럼” 직선 거리)를 추적합니다. 전체 경로 길이가 아니라 직선 거리입니다.

작동 방식

  1. 위치 벡터 (Rx, Ry)(0, 0)으로 초기화한다.

  2. 매 작은 시간 간격(틱)마다:

    • 로봇이 마지막 틱 이후 얼마나 이동했는지(휠 인코더를 통해) 측정한다.
    • 현재 요(yaw) 각도를 자이로스코프에서 읽는다.
    • 이동 방향에 따라 벡터 위치를 업데이트한다:
    Rx = Rx + A × cos(yaw)
    Ry = Ry + A × sin(yaw)

    여기서 A는 이번 틱에서 이동한 거리(휠 회전으로 계산하거나 A = v × t 로 구함)이다.

  3. 직선 변위를 계산한다:

    R = sqrt(Rx² + Ry²)
  4. R ≥ X 가 되면 로봇을 멈춘다. 여기서 X는 원하는 직선 거리이다.

이론적으로는 올바른 방법이지만, 로봇의 제한 때문에 실제로는 작동하지 않았습니다. 다시 PID로 돌아갑니다! 😊

Back to Blog

관련 글

더 보기 »