Skip to content

확장된 전용통신 (Extended IndyDCP)

확장 전용통신은 데이터의 양이 크거나 포맷이 복잡하여 일반 전용통신 (IndyDCP)에서 사용하기 어려울 때 사용할 수 있습니다.

확장 전용통신을 쓰기 위해서는 아래의 요청프레임 예시와 같이 800번 명령어 ID를 사용합니다. 데이터영역은 2개의 4-byte 데이터가 들어가게 되는데, 첫번째 값은 확장 전용통신 전용 명령어 ID (확장 명령어 ID) 값이며, 두번째 값은 확장 전용통신 전체 프레임 크기 값이 들어가게 됩니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 20 8 - 800
Data
Extended Command ID
(4 byte)
Extended IndyDCP Frame Length
(4byte Integer)
1 8724

확장 전용통신에서는 위와 같은 요청 프레임을 보낸 후 추가적으로 확장 명령어 ID에 맞는 요청프레임을 구성하여 해당 프레임 크기만큼의 데이터를 전송합니다.

클라이언트에서 추가 데이터까지 전송하여 요청을 끝내면, 전용통신 서버에서는 이를 처리 후 응답 프레임을 전송합니다. 응답 프레임의 구조는 요청프레임 구조와 동일합니다. 데이터영역 8 byte 중 처음 4 byte은 확장 명령어 ID이며, 뒤의 4 byte는 수신한 확장 전용통신 응답프레임의 크기가 됩니다.

확장 명령어 리스트

전용 통신에서 사용되는 명령들은 아래 표와 같습니다.

ID 확장 명령어
(Extended Command)
확장 명령어 내용 요청 데이터 크기 응답 데이터 크기
1 External Trajectory Move with Binary Data 텍스트 형태의 외부 Trajectory 데이터를 통한 무브 모션 실행 가변
(Data length)
0
2 External Trajectory Move with Formatted Text Data 바이너리 형태의 외부 Trajectory 데이터를 통한 무브 모션 실행 가변
(Data length)
0
3 External Trajectory Move with Binary File 바이너리 형태의 외부 Trajectory 데이터를 저장하고 있는 파일을 통한 무브 모션 실행 가변
(File path)
0
4 External Trajectory Move with Formatted Text File 텍스트 형태의 외부 Trajectory 데이터를 저장하고 있는 파일을 통한 무브 모션 실행 가변
(File path)
0
11 Joint Move To WaypointSet WaypointSet을 통한 절대위치 조인트무브 모션 실행 가변
(DOF*8*len)
0
12 Task Move To WaypointSet WaypointSet을 통한 절대위치 태스크무브 모션 실행 가변
(6*8*len)
0

외부 Trajectory 데이터를 통한 무브 모션 명령

확장 명령어 ID 1-4는 외부 Trajectory 데이터를 로봇에게 제공하고, 로봇은 이를 트래킹하도록 하는 명령입니다.

외부 Trajectory 데이터 포맷

Indy 로봇 모션 제어에 외부 Trajectory를 사용하기 위해서는 Indy Framework가 요구하는 Trajectory Data 포맷에 맞추어야 합니다. 데이터는 텍스트 또는 바이너리 형태로 표현되며, 이 데이터를 담은 파일을 읽거나 메모리 상의 데이터를 전송하여 해당 Trajectory를 Indy 로봇 모션에 사용할 수 있습니다.

이러한 Trajectory 데이터 형식은 아래와 같습니다.

Header
Trajectory Type Frequency DataSet Num [n] DataSet Size [j] Trajectory Length [i]
Data
DataSet[i][n][0] DataSet[i][n][1] DataSet[i][n][2] ...

각 헤더 내 속성의 자료형은 모두 integer 입니다.

  • Trajectory Type : Trajectory Data의 타입이며 1일 경우 조인트무브, 2일 경우 태스크무브 Trajectory 데이터

  • Frequency : 현재 연결된 로봇의 실시간 Task Frequency이며, STEP2 기준으로 IndyRP2를 제외하고 기본적으로 4000Hz

  • DataSet Num : Trajectory의 Data Set 개수, Trajectory Type 1인 조인트 데이터의 경우 qd (desired position), qdotd (desired velocity), qddotd (desired accelerationd) 로 총 3개

  • DataSet Size : 각 DataSet의 길이로 DOF를 나타냄

  • Trajectory Length : 데이터의 trajectory 총 길이, 예) 8000일 경우 4000Hz에서 2초동안 움직이는 모션에 대한 Trajectory 데이터. Trajectory Length의 최대값은 480,000

데이터 영역은 각 DataSet을 순서대로 저장하고 있습니다. Data의 각 값들의 자료형은 double 입니다. Data영역의 값들은 순서대로 [i]번째 trajectory 데이터의 [n]번째 DataSet의 [j]번 데이터를 차례대로 쭉 나열합니다. 순서는 j \rightarrow n \rightarrow i 입니다. 조인트무브를 예시로 들면 관절순서 (0-5) \rightarrow 데이터 종류 (qd, qdotd, qddotd) \rightarrow 데이터 개수 라고 이해할 수 있습니다.

예를 들어 Type 1인 Joint Trajectory Data (6DOF 로봇인 Indy7, 4000Hz 실시간 태스크 기준으로)에 대한 데이터 형식은 아래와 같이 표현될 수 있습니다.

Header
Trajectory Type Frequency DataSet Num [n] DataSet Size [j] Trajectory Length [i]
1 4000 3 6 8000
Data
DataSet
[0][0][0]
DataSet
[0][0][1]
DataSet
[0][0][2]
DataSet
[0][0][3]
DataSet
[0][0][4]
DataSet
[0][0][5]
qd[0][0] qd[0][1] qd[0][2] qd[0][3] qd[0][4] qd[0][5]
DataSet
[0][1][0]
DataSet
[0][1][1]
DataSet
[0][1][2]
DataSet
[0][1][3]
DataSet
[0][1][4]
DataSet
[0][1][5]
qdotd[0][0] qdotd[0][1] qdotd[0][2] qdotd[0][3] qdotd[0][4] qdotd[0][5]
DataSet
[0][2][0]
DataSet
[0][2][1]
DataSet
[0][2][2]
DataSet
[0][2][3]
DataSet
[0][2][4]
DataSet
[0][2][5]
qddotd[0][0] qddotd[0][1] qddotd[0][2] qddotd[0][3] qddotd[0][4] qddotd[0][5]
DataSet
[1][0][0]
DataSet
[1][0][1]
DataSet
[1][0][2]
DataSet
[1][0][3]
DataSet
[1][0][4]
DataSet
[1][0][5]
qd[1][0] qd[1][1] qd[1][2] qd[1][3] qd[1][4] qd[1][5]
DataSet
[1][1][0]
DataSet
[1][1][1]
DataSet
[1][1][2]
DataSet
[1][1][3]
DataSet
[1][1][4]
...
qdotd[1][0] qdotd[1][1] qdotd[1][2] qdotd[1][3] qdotd[1][4] ...

앞서 언급한 바와 같이 Trajectory Data는 바이너리 형태와 텍스트 형태 두 가지로 표현될 수 있습니다. 바이너리 형태의 데이터의 경우 헤더 영역의 값은 모두 4-byte integer, 데이터 영역의 값은 모두 Double (8-byte floating point)입니다. 각 데이터들에 대하여 따로 구분 없이 연속적으로 binary 값을 나열하면 됩니다 (예제 파일 참조).

텍스트 형태의 경우 각 데이터 값들은 띄어쓰기를 통해 구분합니다. 위 예와 비슷한 경우로 Type 2인 Task Trajectory Data에 대하여 텍스트 형식의 데이터 표현은 아래와 같이 저장될 수 있습니다.


텍스트 형태의 데이터는 사람이 보기엔 친숙하지만 바이너리 데이터보다 용량도 클 뿐더러 텍스트 형식은 읽으면서 값을 변환해야 하기 때문에 Trajectory 설정 시간이 더 오래 걸립니다. 게다가 Trajectory Length가 길수록 데이터를 읽고 Trjaectory 설정하는 시간은 훨씬 더 오래 걸리게 됩니다.

이처럼 데이터 형태로 파일로 저장하거나 IndyDCP를 통하여 데이터를 전송하여 외부 Trajectory 데이터로 해당 무브 모션을 수행할 수 있습니다. 만약 데이터 포맷에 오류가 있거나, 포맷은 정상이더라도 헤더의 Trajectory 정보들이 실행되고 있는 Indy 로봇 Controller 정보와 다르면 해당 Trajectory 모션이 실패하게 됩니다.

주의

Trajectory 데이터의 첫번째 값은 현재 로봇의 위치와 동일하거나 최대한 가까워야 한다. 조인트무브를 예로 들었을 때, 현재 각도가 (0, 15, 90, 0, 90, 0)인 상태에서 조인트 Trajectory 의 qd가 (0, 0, 0, 0, 0, 0) 시작된다면, 로봇의 입장에서는 0초 만에 2번 관절을 15도, 3번 관절을 90도, 5번 관절을 90도 움직여야 하는 것이기 때문에 물리적으로 불가능하여 로봇이 비상정지 하게 된다.

Trajectory 데이터를 전송하여 로봇 무브 모션 진행

Extended Command ID 1, 2

본 명령은 확장 전용통신을 통하여 확장프레임에 외부 Trajectory 데이터를 담아 전송하여 해당 Trajectory에 따라 로봇 무브 모션을 실행하도록 합니다. 확장 명령어 ID 1의 경우 바이너리 데이터를 그대로 확장 프레임에 담아 전송하는 방법이고, 2의 경우 텍스트 형식의 데이터를 확장 프레임에 담아 전송하는 방식입니다. 아래 프레임 예는 확장 커맨드 1에 대한 요청 프레임 예시를 보여줍니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Extended Command ID Extended IndyDCP Frame Length
"NRMK-Indy7" "" 0x00 0x34 21 8 - 800 1 5760020
Extended Frame Data
Binary Type Trajectory Data (5760020-bytes)

위 요청 프레임에 대한 ACK 응답 프레임은 아래와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Extended Command ID Extended IndyDCP Frame Length
"NRMK-Indy7" "v2.2.3" 0x02 0x12 21 8 - 800 1 0
Extended Frame Data
None (0 byte); No write

NAK 프레임은 아래와 같이 확장 전용통신이 아닌 일반 전용통신과 동일합니다. 명령에 실패했기 때문에 추가 데이터가 없고 에러코드가 전달됩니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Error Code (4-byte)
"NRMK-Indy7" "v2.2.3" 0x02 0x12 21 4 - 9999 9

Trajectory 데이터를 저장하고 있는 파일 위치(Path)를 전송하여 로봇 무브 모션 진행

Extended Command ID 3, 4

본 명령은 확장 전용통신을 통하여 확장 프레임에 Trajectory 데이터가 저장된 파일 위치를 전송하여 해당 파일로부터 Trajectory를 읽어 로봇 무브 모션을 실행하도록 합니다. 확장 명령어 ID 3은 바이너리 파일을 읽도록 하며 4는 텍스트 파일을 읽도록 합니다. 아래 프레임 예는 확장 커맨드 4에 대한 요청 프레임 예시를 보여줍니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Extended Command ID Extended IndyDCP Frame Length
"NRMK-Indy7" "" 0x00 0x34 21 8 - 800 4 35
Extended Frame Data
"/home/user/Downloads/test_long.txt\0" (35-byte including NULL characters)

위 예시처럼 경로를 나타내는 string 맨 뒤에는 NULL string ("\0")이 와야 합니다. 이에 대한 ACK응답 프레임은 아래와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Extended Command ID Extended IndyDCP Frame Length
"NRMK-Indy7" "v2.2.3" 0x02 0x12 21 8 - 800 4 0
Extended Frame Data
None (0 byte); No write

외부 Trajectory 데이터를 통한 무브 모션 명령

확장 명령어 ID 11-12는 외부 웨이포인트 집합을 전달하여 조인트 또는 태스크 무브를 실행하도록 하는 명령입니다. 예를 들어 확장 명령어 11번을 이용하여 7개의 웨이포인트에 대한 JointMove WaypointSet을 요청하는 예시는 아래와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Extended Command ID Extended IndyDCP Frame Length
"NRMK-Indy7" "" 0x00 0x34 22 8 - 800 1 336
Extended Frame Data
JointMove Waypoint Set (DOF*8*Waypoint length[7])