커스텀 토크 컨트롤러
기본 제공 컨트롤러(ADRC·PID) 대신 자기 제어 법칙을 쓰시려면 플러그인으로 만들어 올리시면 됩니다. 전체 흐름은 이렇습니다.
1. 스캐폴드 만들기
plem init my_controller
./my_controller_ws/ 에 골격 패키지 하나가 만들어집니다. 이름을 생략하면 물어봅니다. 클래스 이름은 패키지 이름에서 정해지며(my_controller → MyController) --class 로, 워크스페이스 위치는 --dir 로 바꿀 수 있습니다. 골격의 compute() 는 토크 0 을 내고, 중력·코리올리를 계산하는 ManipulatorDynamics 와 F/T 값에서 공구 무게를 빼는 ToolLoad 가 함께 들어 있습니다. 쓰지 않는 쪽은 실행에 비용이 들지 않습니다. 빌드에 쓰는 KDL 패키지는 표준 설치에 함께 들어 있습니다. 생성된 워크스페이스에 작성 가이드(CONTROLLER_PLUGIN_GUIDE.md)와 README.md 가 함께 들어옵니다. PLEM 환경이 잡혀 있지 않으면 그 자리에서 멈추고 무엇을 하셔야 하는지 알려 드립니다.
2. 제어 법칙 작성하기
생성된 소스의 compute() 에 알고리즘을 넣으세요. 측정값은 measured(measured.position(j)·measured.velocity(j) 등), 목표값은 target(target.position(j) 등)으로 읽고, 관절 토크를 output_torque 에 씁니다. 이 코드는 설정된 제어 주기(200–1000 µs, 즉 1–5 kHz)의 실시간 루프 안에서 관절 토크를 직접 만들어 냅니다. 그 루프 안에서는 동적 할당·파일 입출력·락·대기·예외를 쓰지 마세요. 상세 규약은 스캐폴드에 함께 생성된 가이드에 있습니다.
예전 SDK 로 calculate_torque() 를 override 한 소스는 다시 빌드하면 overriding final function 오류로 컴파일되지 않습니다. 본문을 compute() 로 옮기고 인자를 접근자로 바꾸세요 — joint_angles[j] → measured.position(j), joint_velocities[j] → measured.velocity(j), target_positions[j] → target.position(j), dof → measured.dof(). 자세한 방법은 생성된 작성 가이드(CONTROLLER_PLUGIN_GUIDE.md) 2.1절에 있습니다. 부모의 calculate_torque(...) 로 위임하던 코드도 그 절을 따라 고치세요 — 그대로 두거나 한정자 없는 compute(...) 로 바꾸면 무한 재귀입니다. 이미 빌드한 .so 는 다시 빌드하지 않으면 그대로 동작합니다.
작성 가이드에 실린 PD 예시는 헬퍼 사용법을 보여 주는 코드입니다. 게인을 튜닝하지 않고 강성을 크게 잡아 두었고 마찰 보상도 없어 실제 작업에 그대로 쓸 수 없습니다. 본인 제어기는 로봇에 맞게 설계·튜닝한 뒤, 무부하·저속에서 시작해 토크 제한을 걸고 단계적으로 확인하신 뒤에 정상 운전에 쓰세요.
툴 F/T 센서 값 읽기 (선택)
로봇에 F/T 센서가 있으면 compute() 안에서 measured.wrench() 로 힘·토크를 읽습니다. 펜던트에서 잡은 영점은 이미 빠져 있습니다. 값이 없는 주기(센서 없음·무효)에는 비어 있으니 힘 항 없이 제어하세요.
if (auto w = measured.wrench()) {
const double fz = w->force.z; // [N]
}
플러그인 예제 전체, 영점이 바뀐 순간 알아채기, 공구 무게 빼기(ToolLoad)는 F/T 센서 §3·§4에 있습니다.
3. 빌드하기
스캐폴드가 끝나면 생성된 워크스페이스의 README.md 위치를 알려 드립니다. 빌드 명령은 그 문서에 있습니다.
4. 워크스페이스 등록하기
빌드한 디렉터리에서 plem 을 실행하시면 이 워크스페이스를 쓸지 물어봅니다. 승인하시면 이후 기동에 오버레이로 얹힙니다. 등록 상태는 plem workspace 로 확인하고 plem workspace clear 로 해제합니다.
5. 로봇 프로필에서 고르기
등록만으로는 활성화되지 않습니다. plem 의 설정(,)에서 로봇 프로필을 열고 Torque Controller 를 Plugin 으로 바꾼 뒤, 목록에서 빌드된 .so 를 고르세요. 목록에는 등록한 워크스페이스에서 찾은 플러그인이 나옵니다(등록이 없으면 PLEM 소스 체크아웃의 빌드 결과를 대신 찾습니다). 찾은 것이 없으면 목록이 비니 .so 의 절대경로를 직접 입력하세요. 프로필의 다른 항목은 건드리지 마세요.
6. 재기동하기
프로필은 다음 기동부터 반영됩니다. 스택을 정지했다가 다시 띄우세요. TUI 의 키 안내 줄 오른쪽 Controller Plugin <파일명> 으로 어느 컨트롤러가 떴는지 확인할 수 있습니다.
7. Lab 에서 튜닝·관측하기
Tuning 탭에 직접 선언하신 파라미터가, 신호 트리에 직접 선언하신 신호가 나타납니다. 튜닝 상태 조건은 그대로 적용되며, 플러그인 컨트롤러는 빌드에 따른 잠금이 없습니다.