본문으로 건너뛰기

아키텍처

통합에 필요한 만큼만 다룹니다. 무엇이 어디서 돌고, 명령이 어떤 경로로 드라이브까지 가며, 무엇이 선택 사항인지입니다.

로봇 한 대의 구성

구성 요소역할통합 시
ros2_control_node (로봇당 1개 프로세스)controller_manager · 하드웨어 인터페이스 · PLEM 실시간 스레드를 한 프로세스에 담음필수 — 제어·상태 표면 대부분이 여기서 나옴
robot_state_publisherURDF 를 TF 로 발행필수
move_group + plan_trajectory_serverplem/plan_trajectory 요청을 MoveIt 계획으로 중계선택
그리퍼 드라이버gripper_action_server/gripper_command 제공그리퍼 장착 시
카메라·nvblox 등 지각 노드실제 환경 기반 충돌 회피선택
plem-server + rosbridgeTeaching Pendant·Plem Lab 웹 UI 브릿지ROS 2 통합에는 불필요하나 기본 기동에 포함

계층과 주기

계층주기
EtherCAT 버스 · 토크 계산 (실시간 스레드)기본 1 kHz
controller_manager — 궤적 샘플링1 kHz
joint_states100 Hz
robot_mode · safety_mode50 Hz

controller_manager 의 주기는 실시간 버스 주기와 독립입니다. 버스를 올리셔도 이 값은 그대로 두세요. 클라이언트가 이 주기에 맞춰 명령을 보낼 필요는 없습니다. 궤적은 goal 하나로 전달되고, 그 뒤의 매 사이클 샘플링은 기기 안에서 일어납니다.

명령이 드라이브까지 가는 길

  1. 클라이언트가 궤적 goal 을 보냅니다 (직접 작성했거나 plem/plan_trajectory 결과).
  2. 궤적 컨트롤러가 controller_manager 스레드에서 매 사이클 궤적을 샘플해 관절 명령을 만듭니다.
  3. 하드웨어 인터페이스가 그 명령을 PLEM 드라이버로 넘깁니다. 같은 프로세스 안의 락 없는 공유 버퍼입니다.
  4. 토크 계산 스레드가 목표를 읽어 관절 토크를 만듭니다.
  5. 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 브릿지만 첫 로봇 기준으로 한 번 뜹니다).

한 대의 보호정지는 다른 로봇으로 전파되지 않으므로, 협조 정지가 필요하면 애플리케이션이 구현하셔야 합니다 — 정지·안전 참조.