TurtleSim을 이용한 PID 제어
초록
Move Turtle은 ROS의 TurtleSim에서 거북이를 지정된 좌표(점)로 이동시키는 간단한 ROS 파이썬 스크립트입니다. 이 프로젝트는 Colorado School of Mines(CSOM)의 CSCI473 수업 프로젝트로 시작되었고, 이후 폐회로 시스템이 어떻게 생성될 수 있는지를 배우기 위해 사용한 프로젝트로 발전했으며, 그 지식은 CSOM의 Human Centered Robotics(HCR) 연구실에서의 작업에 도움이 되었습니다.
배경
약간의 배경을 위해, ROS는 Robot Operating Systems를 의미합니다. ROS는 보통 Ubuntu 운영체제와 함께 사용되는 오픈소스 로보틱스 미들웨어로, 로봇 시스템의 소프트웨어 구성요소/클러스터를 더 잘 관리하는 데 사용됩니다. ROS 사용에 관해서는 ROS의 공식 위키를 통해 더 배울 수 있습니다. ROS에서 작성하는 코드는 C++ 또는 Python 중 하나입니다.
TurtleSim은 ROS와 ROS 패키지에 익숙하지 않은 신규 사용자들을 위해 소개용으로 사용되는 간단한 2D 로봇 시뮬레이터입니다. TurtleSim이 하는 일은 단순히 거북이가 있는 간단한 2D 디스플레이를 여는 것입니다. 그 거북이는 “로봇"으로 작동하며 그 “로봇"에게 이동 및/또는 회전하도록 메시지를 보낼 수 있습니다. 실제로 이동할 때 TurtleSim은 단순한 방식으로 실제 물리학을 시뮬레이션하기 위해 일부 무작위 오차를 생성합니다.
ROS와 TurtleSim이 무엇인지 알게 되었으니, 왜 내가 그것들을 사용했는가? 음, 2020년 봄에 나는 Colorado School of Mines에서 학부 컴퓨터 과학 수업의 일환으로 “Human Centered Robotics"라는 수업을 수강하고 있었습니다. 수업은 Dr. Hao Zhang이 가르쳤습니다. 수업은 세 개의 과제로 구성되었고 첫 번째 과제는 ROS를 설치하고 ROS 사용법을 배우며, TurtleSim의 거북이가 M자를 그리도록 오픈루프 또는 폐회로 알고리즘 중 하나를 구현하는 것이었습니다. 원래 과제 설명은 여기에서 볼 수 있습니다.
수업을 들을 때, 나는 오픈루프 알고리즘을 구현하여 이 과제를 완료했습니다. 이 해법은 작동했지만 정말 끔찍했고 “충분히 괜찮은” A자를 그렸을 뿐 결코 “훌륭한” 것은 아니었습니다. 2020년 2월 중순쯤 프로젝트를 제출한 후, 나는 1년 후인 2021년 2월경까지 이 일을 잊고 있었습니다.
도전 과제
2021년 2월, 나는 Colorado School of Mines의 Human Centered Robotics(HCR) 연구실에서 연구 조교로 고용되어 Dr. Hao Zhang 아래에서 일하게 되었습니다. 연구실의 목표는 “로봇이 장기간 동안 작동하고 적응할 수 있도록 하는 것을 목표로 하는 평생 협업 자율성(lifelong collaborative autonomy)“에 관한 연구를 수행하는 것입니다. 2022년 9월 1일 기준으로 연구실은 Colorado School of Mines에서 University of Massachusetts Amherst로 이전했습니다. 그러나 내가 거기서 일할 때는 여전히 콜로라도에 있었습니다.
HCR 연구실에서 나는 Triton 프로젝트에서 작업하도록 지시받았습니다. Triton 프로젝트는 Triton이라고 불리는 수십 대의 로봇들로 구성되어 있었습니다. Triton은 다음과 같이 생긴 삼각형 형태의 omni wheel 지상 로봇이었습니다:
Triton들과 함께, 지면에서 몇 피트 위에 “팔각형 배열"로 배치된 OptiTrack의 IR 카메라 여덟 대가 있었습니다. 그 카메라들과 OptiTrack의 Motive 소프트웨어, Windows 10을 실행하는 PC, 그리고 ROS를 사용하여 2미터 x 2미터 x 2미터(x, y, z) 공간이 생성되며, 모션 캡처 마커가 부착된 물체의 정확한 실제 위치를 결정할 수 있습니다.
Triton 프로젝트에서 나의 첫 번째 임무는 Triton 로봇이 특정 실제 세계 위치로 이동하도록 하는 스크립트를 만드는 것이었습니다. 당시에는 이것을 어떻게 달성할지 확신이 없었지만, CSCI473의 첫 번째 프로젝트에서 폐회로 시스템의 아이디어를 배운 것을 기억했기 때문에 폐회로 시스템과 피드백 시스템에 대해 본격적으로 조사하기 시작했습니다.
연구
조사하는 동안, 나는 AerospaceControlsLab의 훌륭한 비디오를 발견했습니다:
이 비디오에서 PID 시스템의 개념이 제시되고 설명되었습니다. PID 시스템은 실제 세계의 데이터에 기반하여 특정 출력(들)을 생성하는 폐회로(제어 루프) 시스템입니다. 기본적으로 원하는 값과 측정된 값의 차이에 따라 출력을 조정하는 피드백 시스템입니다. 이것이 PID 제어기의 수식입니다:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$는 제어 신호입니다.
- $K_p$, $K_i$, $K_d$는 각각 비례, 적분, 미분 이득입니다.
- $e(t)$는 오차 신호입니다(원하는 출력과 실제 출력의 차이).
- $\int e(t) dt$는 시간에 대한 오차의 적분입니다.
- $\frac{de(t)}{dt}$는 오차의 미분입니다.
더 배우고 싶다면 AerospaceControlsLab의 비디오 또는 이 놀라운 위키피디아 문서를 확인하세요. 이 수식은 위키피디아에서 가져온 것입니다.
조사와 동시에 똑똑한 친구들과 교수님들의 도움을 받은 후, 나는 Proportional Controller, 즉 P 제어기를 사용하는 것이 Triton이 특정 좌표에 도달하는 데 가장 적합하다고 판단했습니다.
Triton은 지상 로봇이므로 X 및 Y 좌표만 걱정하면 됩니다. 이를 알게 된 후 나는 목표 좌표와 Triton의 현재 좌표를 기준으로 P 제어기들 내에서 어떤 원하는 값과 측정된 값을 측정하고 처리해야 하는지를 결정해야 했습니다. 조사 중에 나는 ROS 위키에 있는 훌륭한 게시물 Go to Goal를 발견했는데, 그곳에서는 다음의 오차에 중점을 두었습니다:
- 거리 오차: 원하는 위치(X, Y)와 현재 위치(X, Y) 사이의 거리 차이.
- 세타(Theta) 오차: 원하는 방향과 현재 방향 사이의 차이.
제안된 해결책
이 모든 것을 알게 된 후, Triton을 특정 실제 좌표로 이동시키는 해결책은 목표 좌표와 Triton의 현재 좌표에 관해 Triton의 거리 오차와 세타 오차에 대해 비례 제어기(Proportional Controller)를 사용하는 것입니다. 하지만 이를 물리적 시스템에 구현하기 전에, 나는 아이디어를 시뮬레이션에서 테스트하고 싶었고 당시에는 TurtleSim을 시뮬레이션으로 사용하는 것이 최선의 선택이라고 생각했습니다.
시뮬레이션에서의 테스트
이론적 해결책을 개략적으로 정리한 후, 나는 실제 시나리오보다 시뮬레이션을 통해 우선 검증하기로 결정했습니다. 실제 세계는 종종 솔루션의 유효성을 흐릴 수 있는 잡음으로 어수선하기 때문에 관련 없는 문제들을 다루게 될 수 있습니다. 이를 인지하고 나는 CSCI473의 프로젝트를 다시 살펴보고 이 이론적 해결책을 테스트하기 위한 장으로 적응시켰습니다.
오래된 코드를 ROS Melodic에서 ROS Noetic으로 업데이트하고 몇 차례 반복적 정제를 거친 후, 나는 제안한 해결책을 TurtleSim에서 작동시키는 데 성공했습니다. 멋진 목표 좌표 경로들과 함께한 기능 시연은 이 블로그 게시물의 끝에서 확인할 수 있습니다. 이 모든 코드들은 여기에서 볼 수 있습니다.
결론
요약하면, 이 프로젝트를 통해 TurtleSim의 거북이는 폐회로 시스템을 사용하여 설정된 좌표로 효과적으로 내비게이션할 수 있게 되었고, 이는 2020년의 초기 오픈루프 시스템보다 훨씬 우수했습니다. 성공적으로 테스트한 후, 나는 이 해결책을 Triton 로봇들에 구현했습니다. 그러나 실제 세계의 잡음은 예기치 않은 문제를 일으켜 몇 주간의 디버깅과 실제 환경 테스트가 필요했습니다. 그 몇 주 후, 궁극적으로 나는 TurtleSim에서 테스트한 해결책을 사용하여 Triton이 특정 실제 좌표에 도달하도록 만드는 데 성공했습니다. TurtleSim에서 테스트한 방법을 사용하여 Triton이 특정 실제 좌표로 이동하는 데모는 다음과 같습니다:
되돌아보면, 나는 실제 세계 물리학을 더 잘 시뮬레이션하는 시뮬레이터를 사용했어야 했다고 생각합니다. TurtleSim은 학습용으로는 훌륭하지만 실제 로봇 공학 아이디어를 테스트하기에는 적합하지 않습니다. 당시에는 내 간단한 사용 사례에 충분할 것이라고 생각했지만, 나중에 그것은 사실이 아님이 증명되었습니다.
이 블로그 게시물의 주요 목적은 TurtleSim의 거북이와 이후 Triton 로봇들이 지정된 목표 위치(X, Y)로 정확히 이동할 수 있도록 하는 폐회로 시스템의 생성 과정을 개략적으로 설명하는 것이었습니다. 나는 이 목적이 달성되었다고 믿으며, 이것은 HCR 연구실에서의 내 작업에 대한 관심을 불러일으켰을지도 모릅니다. 이를 알고 나는 HCR 연구실에서의 내 근무 경험에 대해 더 많은 블로그 게시물을 작성할 계획이 있습니다…
Moving Turtle (TurtleSim) 데모
이 비디오는 다음 데모들을 포함합니다:
- Cayley Nodal: 단순한 Cayley Nodal 디자인
- Circles: 거미줄 같은 디자인
- Inner Circles: “원 안의 원” 디자인
- M: 매우 단순한 M 디자인