DEVLOG – 직선으로 직진하는 방법?
Source: Dev.to
문제 설명
어떤 문제든 해결하려면 먼저 명확하고 이해하기 쉬운 문제 진술로 바꿔야 합니다. 우리의 문제 진술은 다음과 같습니다:
“SPIKE Prime 로봇을 외부 하중을 끌면서 직선으로 X 거리만큼 이동시키려면 어떻게 해야 할까?”
무게 중심
당연하게 들릴 수도 있습니다: “그냥 0도에서 움직이면 돼!” 라고 생각할 수도 있죠. 하지만 무게 중심(전체 질량이 집중된 점)은 항상 기하학적 중심에 있는 것은 아닙니다. 규칙적인 형태의 물체만이 무게 중심과 기하학적 중심이 일치하고, 그 외의 모든 물체는 일치하지 않습니다.
따라서 로봇에게 각도 0°로 움직이라고 명령하면 시간이 지나면서 기울어질 수 있습니다.
제안 #1: MOVE(0 – YAW)
처음 아이디어는 로봇이 (0 – yaw)도 각도로 움직이게 해서, 로봇이 내부 자이로스코프가 감지하는 기울임을 언제든지 보정하도록 하는 것이었습니다.
로봇 프로그래밍 환경에서는 루프 안에서 “MOVE UNTIL X DISTANCE”를 지원하지 않기 때문에 시간을 이용해야 했습니다. 아이디어는 다음과 같습니다:
- 타이머(T)를 시작한다.
- 로봇을 0°에서 X cm 이동시킨다.
speed = X ÷ T를 계산한다.
트랙에는 두 가지 작업이 있습니다:
- 작업 1: 짧은 거리이며 외부 하중이 없는 상태에서 A 지점에서 B 지점까지 직선으로 이동.
- 작업 2: 하중을 실은 상태에서 B 지점에서 C 지점까지 이동.
- 작업 1에서는 거리와 하중이 짧고 없기 때문에 로봇이 직선으로 이동할 수 있어 속도를 계산할 수 있습니다.
- 작업 2에서는 MOVE(0 – YAW) 방식을 루프 안에서 실행합니다. 거리 X를 이동하는 데 필요한 시간을 구하려면
time = d / v를 사용합니다. 여기서 거리d와 속도v는 이미 알고 있습니다.
제안 #2: 변위 기반 이동
첫 번째 제안은 시간을 기반으로 했지만, 로봇이 움직이는 동안 기울어지면 실제 이동 거리가 늘어나고 시간이 신뢰할 수 없게 됩니다.
시간에 의존하는 대신, 시작점으로부터 로봇이 실제로 직선으로 이동한 거리(즉, “새가 날아다니는 것처럼” 직선 거리)를 추적합니다. 전체 경로 길이가 아니라 직선 거리입니다.
작동 방식
-
위치 벡터
(Rx, Ry)를(0, 0)으로 초기화한다. -
매 작은 시간 간격(틱)마다:
- 로봇이 마지막 틱 이후 얼마나 이동했는지(휠 인코더를 통해) 측정한다.
- 현재 요(yaw) 각도를 자이로스코프에서 읽는다.
- 이동 방향에 따라 벡터 위치를 업데이트한다:
Rx = Rx + A × cos(yaw) Ry = Ry + A × sin(yaw)여기서
A는 이번 틱에서 이동한 거리(휠 회전으로 계산하거나A = v × t로 구함)이다. -
직선 변위를 계산한다:
R = sqrt(Rx² + Ry²) -
R ≥ X가 되면 로봇을 멈춘다. 여기서X는 원하는 직선 거리이다.
이론적으로는 올바른 방법이지만, 로봇의 제한 때문에 실제로는 작동하지 않았습니다. 다시 PID로 돌아갑니다! 😊