고급 응용
고급 사용 예제이며, 세 예제 모두 7000 포트(서보 추적 데이터 채널) 로 포인트를 전송합니다. 세 예제는 "상위 컴퓨터가 실시간으로 포인트를 주고 컨트롤러가 따라가는" 동일한 문제를 다루며, 차이는 포인트를 어떤 형태로 컨트롤러에 전달하는지, 그리고 보간·평활을 누가 담당하는지입니다.
⚠️ 안전 안내: 이 섹션의 운동 예제는 로봇을 실제로 움직입니다. 실행 전 각 페이지 상단의 안전 경고를 반드시 읽고, 작업 공간이 안전한지와 비상 정지가 손 닿는 곳에 있는지 확인하십시오.
예제 목록
| # | 예제 | 설명 |
|---|---|---|
| 1 | servo_move()를 사용한 추적 운동 | timeStamp가 포함된 궤적 포인트를 한 번에 전달하고, 컨트롤러가 타임스탬프에 따라 평활 |
| 2 | servo_point_position_motion_control()을 사용한 서보 제어 운동 | 통신 주기마다 포인트를 서보로 직접 전송, 12차원(로봇 7 + 외부 축 5) |
| 3 | servoJ를 사용한 관절 제어 | 주기마다 7차원 목표 관절 각도를 전송하고, 컨트롤러가 v/a/j 제약으로 평활 추종 |
세 예제의 차이점
| 비교 항목 | 1. servo_move() | 2. servo_point_position_motion_control() | 3. servoJ |
|---|---|---|---|
| 포인트 전달 방식 | 한 번에 한 그룹의 포인트(부분 전송으로 나눌 수 있음) | 프레임마다 여러 포인트, sum / count가 맞아야 운동 시작 | 호출마다 7차원 목표 관절 위치 하나 |
| 데이터 차원 | 7 (관절 각도 또는 직교 좌표, coord로 결정) | 12 (로봇 7 + 외부 축 5) | 7 (관절 각도, 로봇 1에 고정) |
| 타임스탬프 | 필수, 포인트별 도달 시간(ms) | 없음 | 없음, 전송 주기에 의존 |
| 평활 담당 | 컨트롤러가 timeStamp에 따라 평활 | 평활 없음, 포인트를 서보로 그대로 전송 | 컨트롤러가 vmax / amax / jmax 제약으로 평활 |
| 외부 축 | 미지원 | 지원(뒤 5차원) | 미지원 |
| 진입 / 종료 | 모드 전환 없음, servo_move 직접 호출 | 먼저 enable_servo_position_motion_control(fd7000, 1) 호출 | 먼저 open_servoJ, 종료 시 반드시 close_servoJ |
| 추가 전제 조건 | 티칭 펜던트에서 외부 포인트 명령이 있는 작업 파일이 실행 중이어야 함 | 서보 포인트 위치 제어가 켜져 있어야 함 | 알람 해제 → 서보 준비 → 전원 투입, get_servo_state = 3 |
| 포트 | 7000 | 7000 | 7000(데이터) + 6001(전원/좌표 조회) |
| 타이밍 기준 | timeStamp가 결정(예제는 포인트당 5 ms) | 상위 컴퓨터 통신 주기가 결정(예제는 프레임당 최대 600 포인트) | 공식 예제는 포인트당 10 ms |
한 줄 요약
- servo_move: 시간 정보가 있는 궤적을 넘기면 컨트롤러가 시간에 맞춰 보간·평활합니다.
- servo_point_position_motion_control: 주기마다 포인트를 그대로 서보로 전달합니다. 외부 축 포함, 평활 없음.
- servoJ: 관절 공간에서 주기마다 포인트를 주면 컨트롤러가 속도·가속도·저크 제약으로 따라갑니다.
각각 어떤 상황에 사용하는가
servo_move(): 고정 공정 작업 파일에 실시간 생성 궤적을 삽입
사용하는 경우:
- 현장에 하나의 고정 공정 흐름(원점 복귀, 픽업, 배치, IO 시퀀스 등)이 있고, 그중 한 구간의 궤적을 실시간으로 생성해야 할 때(센서, 비전, 상위 컴퓨터 알고리즘이 포인트 제공): 작업 파일이 흐름의 골격을 담당하고, 실시간 궤적 구간은 상위 컴퓨터가
servo_move()로 전송합니다 - 도달 시간(
timeStamp, ms)을 가진 포인트 세트가 이미 있고, 컨트롤러가 보간·평활을 담당하길 원할 때 — 상위 컴퓨터가 경성 실시간 주기로 포인트를 계속 줄 필요가 없습니다(한 번에 전송하거나 부분 전송 가능) - 관절 공간(
coord = 0) 또는 직교 공간(coord = 1) 모두 가능
사용하지 말아야 할 때: 로봇 본체와 외부 축을 함께 움직여야 할 때, 포인트가 컨트롤러 보간 없이 서보로 그대로 가야 할 때, 또는 실행 중인 작업 파일이 허용되지 않는 현장(이 인터페이스는 작업 파일의 외부 포인트 명령이 있어야만 로봇이 움직입니다).
주요 매개변수(ServoMovePara, 값은 헤더 주석 기준):
| 매개변수 | 값 | 의미 |
|---|---|---|
targetMode | 0 / 1 | 0-독립 포인트, 1-연속 궤적 |
sendMode | 0 / 1 | 0-전체 궤적 포인트를 한 번에 전송, 1-포인트 일부를 나눠서 전송 |
runMode | 0 / 1 | 0-모두 수신 후 운동, 1-수신하면서 운동 |
clearBuffer | true / false | 이전에 전송했지만 보간 계산을 시작하지 않은 포인트를 삭제할지 여부 |
sum / count | 총 전송 횟수 / 현재 횟수 | 부분 전송 시의 프레임 카운터 |
coord | 0 / 1 | 0-관절, 1-직교 |
size | 이번 전송의 포인트 수 | pos, axisvel, axisacc, timeStamp의 길이와 대응 |
주의: 작업 파일과 함께 사용해야 합니다. 티칭 펜던트에서 외부 포인트 명령이 포함된 작업을 실행한 상태여야 상위 컴퓨터가 전송한 포인트가 실행됩니다. 따라서 "궤적만 단독으로 실행"하는 인터페이스가 아니라, 고정 공정 작업 안에 삽입되는 실시간 궤적 구간으로 보는 것이 일반적입니다.
servo_point_position_motion_control(): 주기마다 그대로 전송, 외부 축 필요
사용하는 경우:
- 상위 컴퓨터가 통신 주기마다 한 프레임의 포인트를 계산하고, 이를 그대로 서보로 보내야 할 때(컨트롤러 쪽에서 추가 보간·평활을 하지 않음)
- 로봇 본체와 외부 축(포지셔너, 레일 등) 을 함께 움직여야 하므로 포인트를 12차원으로 한 번에 전송해야 할 때
- 한 프레임에 포인트가 많을 때 유리(예제는 프레임당 최대 600 포인트 구성),
sum = 1이면 한 포인트씩 전송
주의:
- 먼저
enable_servo_position_motion_control(fd7000, 1)로 서보 포인트 위치 제어를 켠 뒤 포인트를 전송합니다 sum은 총 프레임 수,count는 1부터 누적되며sum == count일 때만 전송한 포인트가 운동을 시작합니다. 즉sum = 1이 "하나 보내면 한 번 움직임" 모드입니다- 포인트를 보냈는데 로봇이 움직이지 않거나 버퍼가 가득 찬 경우
end = 1로 한 프레임을 보내 보간 전 포인트를 정리합니다
servoJ: 주기마다 관절 공간 추종, 평활 필요
사용하는 경우:
- 비전 서보, 힘 제어, 센서 유도, 원격 조작, 온라인 보정처럼 "외부에서 실시간으로 포인트를 주는" 관절 공간 추종
- 포인트에 노이즈가 있거나 주기가 흔들릴 때: 컨트롤러가
vmax/amax/jmax제약으로 평활하므로 실제 운동이 목표 포인트보다 연속적입니다
주의:
- 전송 값은 목표 절대 관절 각도이며, 증분은 로컬에서 누적한 뒤 전송합니다
- 주기당 증분은 제약과 맞춰야 합니다(
vmax = 10°/s, 주기 10 ms이면 주기당 최대 0.1°) - 별도 스레드에서 고정 주기로 포인트를 전송하고, 반드시
close_servoJ로 마무리해야 합니다. 그렇지 않으면 로봇이 추적 모드에 남습니다 - 이 계열 인터페이스는 로봇 1에 고정 적용되며
_robot변형이 없습니다
선택 가이드
| 상황 | 사용 |
|---|---|
| 고정 공정 작업 안에 실시간 생성 궤적 구간을 삽입(포인트에 타임스탬프 포함) | servo_move() |
| 주기마다 포인트 전송, 외부 축 동기화 또는 그대로 전송이 필요 | servo_point_position_motion_control() |
| 주기마다 관절 각도 전송, 평활 추종 필요(비전, 힘 제어, 원격 조작, 보정) | servoJ |
| 일반 점대점 / 직선 운동, 주기적 포인트 전송이 필요 없음 | robot_movj / robot_movel 등, "기본 응용" 참조 |
servoJ에는 큐 모드(open_servoJ_queue_mode/append_servoJ_pos_to_queue)도 있어open_servoJ이후 한 그룹의 포인트를 한 번에 전송할 수 있습니다. 이 페이지의 예제에서는 다루지 않습니다.