아키텍처
통합에 필요한 만큼만 다룹니다. 무엇이 어디서 돌고, 명령이 어떤 경로로 드라이브까지 가며, 무엇이 선택 사항인지입니다.
로봇 한 대의 구성
| 구성 요소 | 역할 | 통합 시 |
|---|---|---|
ros2_control_node (로봇당 1개 프로세스) | controller_manager · 하드웨어 인터페이스 · PLEM 실시간 스레드를 한 프로세스에 담음 | 필수 — 제어·상태 표면 대부분이 여기서 나옴 |
robot_state_publisher | URDF 를 TF 로 발행 | 필수 |
move_group + plan_trajectory_server | plem/plan_trajectory 요청을 MoveIt 계획으로 중계 | 선택 |
| 그리퍼 드라이버 | gripper_action_server/gripper_command 제공 | 그리퍼 장착 시 |
| 카메라·nvblox 등 지각 노드 | 실제 환경 기반 충돌 회피 | 선택 |
plem-server + rosbridge | Teaching Pendant·Plem Lab 웹 UI 브릿지 | ROS 2 통합에는 불필요하나 기본 기동에 포함 |
계층과 주기
| 계층 | 주기 |
|---|---|
| EtherCAT 버스 · 토크 계산 (실시간 스레드) | 기본 1 kHz |
| controller_manager — 궤적 샘플링 | 1 kHz |
joint_states | 100 Hz |
robot_mode · safety_mode | 50 Hz |
controller_manager 의 주기는 실시간 버스 주기와 독립입니다. 버스를 올리셔도 이 값은 그대로 두세요. 클라이언트가 이 주기에 맞춰 명령을 보낼 필요는 없습니다. 궤적은 goal 하나로 전달되고, 그 뒤의 매 사이클 샘플링은 기기 안에서 일어납니다.
명령이 드라이브까지 가는 길
- 클라이언트가 궤적 goal 을 보냅니다 (직접 작성했거나
plem/plan_trajectory결과). - 궤적 컨트롤러가 controller_manager 스레드에서 매 사이클 궤적을 샘플해 관절 명령을 만듭니다.
- 하드웨어 인터페이스가 그 명령을 PLEM 드라이버로 넘깁니다. 같은 프로세스 안의 락 없는 공유 버퍼입니다.
- 토크 계산 스레드가 목표를 읽어 관절 토크를 만듭니다.
- EtherCAT 스레드가 토크를 드라이브로 전송합니다.
goal 수신과 계획은 이 주기 경로 밖입니다. 2단계부터는 기기 안에서 도는 제어 경로이며, 토크와 EtherCAT 스레드는 실시간 스케줄링을 시도하되 확보하지 못하면 best-effort 로 계속 돕니다.
그래서 goal 이 수락된 뒤의 실행 타이밍에는 네트워크가 개입하지 않습니다. 궤적이 goal 하나로 넘어가 기기 안에서 재생되기 때문입니다. 반대로 goal 전달과 수락, 시작과 취소는 네트워크 지연을 그대로 받습니다.
무엇이 선택인가
표준 ROS 2 액션(follow_joint_trajectory)과 plem/set_mode 만으로 모션 제어가 완결됩니다. 그 위의 계층은 필요할 때만 얹으시면 됩니다.
| 하고 싶은 것 | 필요한 것 |
|---|---|
| 궤적 실행·그리퍼 제어 | 기본 구성만 |
| 목표 자세·직선 이동을 계획해서 실행 | MoveIt (plem/plan_trajectory) |
| 자기 충돌·정적 장면 회피 | MoveIt + cuMotion — 로봇 모델이 지원 목록에 있어야 함. ROS 2 Humble(JetPack 6) 트레인 한정: Jazzy(JetPack 7) 장비에는 cuMotion 이 아직 프로비저닝되지 않았습니다 — 지원 모델에서 이 조합을 켜고 기동하면 cuMotion 플러그인을 찾지 못해 fail-closed 로 로봇 스택 기동이 실패합니다 |
| 실제 환경(놓인 물체) 회피 | 위 + 카메라·지각 스택 + 캘리브레이션 |
두 가지 제약이 있습니다. 모델이 충돌 회피 지원 목록에 없으면 COLLISION_AWARE 요청이 goal 수락 뒤에 사유와 함께 abort 되고, 충돌 회피는 직선 이동(MOVEL_LIN)과 함께 요청하실 수 없습니다.
지각 스택은 카메라 외부 파라미터 캘리브레이션이 끝난 기기에서만 활성화됩니다. 캘리브레이션 기록이 없으면 카메라 토픽만 뜨고 환경 회피 노드는 기동하지 않습니다.
여러 대 운용
로봇마다 독립 프로세스와 독립 네임스페이스를 씁니다. 제어와 상태 인터페이스는 로봇별로 분리되고, 기동은 1초 간격으로 엇갈려 진행됩니다(웹 UI 브릿지만 첫 로봇 기준으로 한 번 뜹니다).
한 대의 보호정지는 다른 로봇으로 전파되지 않으므로, 협조 정지가 필요하면 애플리케이션이 구현하셔야 합니다 — 정지·안전 참조.