μμ±: μ μ°μ°¬. κ³΅ν΅ κ·μ½μ MQTT_SCHEMA λ₯Ό λ°λ₯Έλ€
(CloudEvents 1.0 envelope, robot/{robot_id}/* ν ν½ β ꡬλ
μΈ‘μ data.* λ‘ ν κ²Ή λ²κ²¨ μ½λλ€).
sequence μ "SPOT μ΄λ β λ‘λ΄ν μμ
β SPOT 볡κ·" νλ¦μμ 6Β·7Β·8λ² λ¨κ³λ₯Ό λ΄λΉνλ€.
ꡬν: UF850/test/mqtt_listener.py
| νλͺ© |
λ΄μ© |
| robot_id |
arm-01 |
| λ‘λ΄ |
UFACTORY UF850 + xArm Gripper G1 + RealSense D435i (컨νΈλ‘€λ°μ€ μ§κ²° λ
ΈνΈλΆμμ 리μ€λ μμ ꡬλ) |
| λμ |
μ§μ λ°κ΅¬λ(1/2)λ₯Ό κ³ μ μ’νμμ pick β μΉ΄λ©λΌλ‘ κ²μΆν μ μ¬ μΌμ΄μ§(SPOT λ±μ§) μμ drop β ν λ³΅κ· |
| μ κ³΅κ° |
session_id (μ€μΌμ€νΈλ μ΄μ
μλ² λ°κΈ) β REQUEST λ‘ λ°μΌλ©΄ RESPONSE μ κ·Έλλ‘ echo |
| μμ± μ£Όμ²΄ |
μ μ°μ°¬ |
| μ΅μ’
μμ μΌ |
2026-09-04 |
| κ΅¬λΆ |
Topic |
λ°©ν₯ |
μ€λͺ
|
| REQUEST |
robot/arm-01/command |
μλ² β λ‘λ΄ν |
λ‘λ΄ν μ μ΄ λͺ
λ Ή μ μ‘ (sequence 6Β·7λ²) |
| RESPONSE |
robot/arm-01/ack |
λ‘λ΄ν β μλ² |
λ‘λ΄ν μ μ΄ κ²°κ³Ό μμ (sequence 8λ²) β ACCEPTED ν μ’
κ²° 1ν, μ΄ 2ν |
| STATE |
robot/arm-01/state |
λ‘λ΄ν β μλ² |
μμ μν 1Hz retained + LWT (availability) |
μλ£λ³΄κ³ λ₯Ό REQUEST ν ν½μ΄ μλ ack λ‘ λΆλ¦¬νλ μ΄μ λ SPOT κ³Ό λμΌ β 리μ€λκ° command λ₯Ό
ꡬλ
μ€μ΄λΌ κ°μ ν ν½μ λ°ννλ©΄ μκΈ° λ°νμ μκΈ°κ° λλ°λλ€ (MQTT_SCHEMA-SPOT μ°Έκ³ ).
Topic: robot/arm-01/command
{
"session_id": "abc123",
"command_id": "cmd-0101",
"action": "pick_basket",
"params": { "basket": 1 }
}
| νλ |
νμ
|
νμ |
μ€λͺ
|
session_id |
string |
N |
μ€μΌμ€νΈλ μ΄μ
μλ² λ°κΈ μΈμ
μλ³μ β RESPONSE μ echo |
command_id |
string |
Y |
λͺ
λ Ή μλ³μ (μλ² λΆμ¬) β RESPONSE λ§€μΉ ν€. μμΌλ©΄ νμ΄ λ°κΈ |
action |
string |
Y |
pick_basket (νμ¬ μ μΌ) |
params.basket |
int |
Y |
μ§μ λ°κ΅¬λ λ²νΈ: 1 | 2
|
{
"specversion": "1.0",
"type": "robot.command",
"source": "/services/orchestrator",
"id": "01HW9XJ1A2B3C4D5E6F7G8H9JK",
"time": "2026-09-04T10:00:00.000Z",
"datacontenttype": "application/json",
"data": {
"session_id": "abc123",
"command_id": "cmd-0101",
"action": "pick_basket",
"params": { "basket": 1 }
}
}
λ©±λ±μ±: envelope id λ‘ dedup νλ€ (QoS 1 μ¬μ μ‘ μ€λ³΅ λ°©μ§). μ¬μλλ κ°μ envelope κ·Έλλ‘ μ¬λ°νν κ².
command_id(μ session_id)λ₯Ό echo νλ©° 2λ¨κ³λ‘ μ¨λ€: μ μ μ ACCEPTED,
μμ
μ’
λ£ μ SUCCESS λλ FAULT. μ μκ° μ λλ©΄ REJECTED/BUSY 1νλ‘ λλλ€
(μ΄ν μλ£λ³΄κ³ μμ β μλ²λ ACCEPTED λ₯Ό λ°μ λͺ
λ Ήλ§ μ’
κ²° ack λ₯Ό κΈ°λ€λ¦΄ κ²).
{
"robot_id": "arm-01",
"session_id": "abc123",
"command_id": "cmd-0101",
"status": "SUCCESS",
"result": "ok",
"timestamp": "2026-09-04T10:00:41.000Z"
}
| νλ |
νμ
|
νμ |
μ€λͺ
|
robot_id |
string |
Y |
arm-01 |
session_id |
string |
N |
REQUEST κ° echo |
command_id |
string |
Y |
REQUEST κ° echo β λ§€μΉ ν€ |
status |
string |
Y |
ACCEPTED | SUCCESS | FAULT | REJECTED | BUSY
|
result |
string |
N |
μ’
κ²° ack μ μ€ν κ²°κ³Ό μ½λ (μλ ν) |
fault_detail |
object |
N |
{code, message} β status κ° enum μ μ μ§νλλ‘ μΈλΆλ μ¬κΈ°λ‘ |
timestamp |
string |
Y |
RFC3339 UTC |
status / result / fault_detail.code
| status |
result |
fault_detail.code |
μλ―Έ Β· μλ²κ° ν μΌ |
ACCEPTED |
β |
β |
μ μ, μ€ν μμ (μ½ 30~60μ΄ μμ) |
SUCCESS |
ok |
β |
pick & place μλ£, ν λ³΅κ· β SPOT λ€μ μ΄λ κ°λ₯ (sequence 8λ² = {status:"complete"}) |
FAULT |
returned |
STOPPED_RETURNED |
λμ€ μ μ§(μΆ©λ λ±) β 물체λ₯Ό pick μ§μ μ λλλ €λκ³ ν 볡κ·. μ¬μλ κ°λ₯
|
FAULT |
homed |
STOPPED_HOMED |
λμ€ μ μ§ β (물체 μμ΄) ν 볡κ·. μ¬μλ κ°λ₯ |
FAULT |
unreachable |
UNREACHABLE |
pick/place μ§μ μ΄ λλ¬ λ²μ λ° β μ§κΈ° μ μ μ€λ¨. SPOT μ¬μ λ ¬ ν μ¬μ μ‘ |
FAULT |
need_human |
NEED_HUMAN |
볡ꡬ μ€ν¨ β νμ΄ μ κΈ΄ μ± μ μ§. μ¬λ νμΈ μ μ¬μλ κΈμ§
|
FAULT |
β |
CRASHED |
μ€ν μ€ν¬λ¦½νΈ λΉμ μ μ’
λ£ |
REJECTED |
β |
UNKNOWN_ACTION / BAD_PARAM
|
action/params μ€λ₯ β μλ£λ³΄κ³ μμ |
BUSY |
β |
BUSY |
μ΄μ λͺ
λ Ή μ€ν μ€ (λμ 1κ°) β μλ£ ack ν μ¬μ μ‘ |
Topic: robot/arm-01/state β 1Hz, retained, LWT
{
"robot_id": "arm-01",
"connection": "online",
"timestamp": "2026-09-04T10:00:00.000Z",
"fsm_state": "IDLE",
"command_id": null
}
| νλ |
μ€λͺ
|
connection |
online β 리μ€λ death μ LWT κ° offline μ retain λ°ν (λ³λ availability ν ν½ μμ) |
fsm_state |
IDLE | EXECUTING | UNKNOWN(offline) |
command_id |
EXECUTING μ€μ΄λ©΄ μ€ν μ€ λͺ
λ Ή id |
timestamp κ° 10μ΄ μ΄μ μ€λλλ©΄ 리μ€λ/λΈλ‘컀 μ°κ²° μ΄μμΌλ‘ κ°μ£Ό.
| νλͺ© |
λ΄μ© |
| QoS |
μ ν ν½ 1
|
| Retain |
state λ§ β
(command/ack β) |
| LWT |
state μ connection:"offline" retain |
| envelope |
CloudEvents 1.0, id=dedup ν€ (uuid4 hex) |
| λμμ± |
λͺ
λ Ή 1κ°μ© μ§λ ¬ μ²λ¦¬ β μ€ν μ€ μμ μ BUSY
|
-
sequence μ ν©: 6λ²(μλ² λ°ν) = REQUEST, 7λ²(ν μμ Β·μ€ν) = 리μ€λ,
8λ²(μμ
μλ£
{status:"complete"}) = μ’
κ²° ack (SUCCESS/FAULT). μ μ±
2Β·3(λμ°© μλ£ νμλ§ μ§μ,
μ΄λ μ€ν¨ μ λ―Έμ§μ)κ³Ό μ μ±
5(μ μ¬ μ€ SPOT μ μ§ μ μ§)λ μλ²/SPOT μΈ‘ μ±
μμ΄λ©° νμ μ΄λ₯Ό μ μ νλ€ β
μΊ‘μ²Β·μ μ¬ μκ° SPOT μ΄ μ μ¬ μ§μ μ μ μ§ν΄ μμ΄μΌ νλ€.
-
μ λ ¬ νμ© μ€μ°¨: μ μ¬(place) μμΉλ κ³ μ μ’νκ° μλλΌ λ§€ λͺ
λ Ήλ§λ€ RealSense λ‘ μΌμ΄μ§λ₯Ό
κ²μΆνλ―λ‘, SPOT μ μ°¨ μ€μ°¨λ "μΉ΄λ©λΌ μμΌ(β€1.2m) + ν λλ¬ λ²μ(λ² μ΄μ€μμ μν β€750mm)" μμ΄λ©΄
ν‘μλλ€. κ·Έ λ°μ΄λ©΄ μ§κΈ° μ μ
UNREACHABLE λ‘ μλ΅νλ SPOT μ¬μ λ ¬ ν μ¬μ μ‘νλ©΄ λλ€
(sequence μ μ±
4μ AprilTag μ λ ¬μ μ΄ λ²μ μμ λ€μ΄μ€κ² νλ μ©λλ‘ μ ν¨).
- pick μ’ν(λ°κ΅¬λ 1Β·2)λ νμ₯μμ νλμ½λ©Β·μΊλ¦¬λΈλ μ΄μ
λ κ°μ΄λ€. μ
μ
μ μ°¨λ
UF850 README μ°Έκ³ .
- λ°ν ν
μ€νΈ:
mosquitto_pub -h <broker> -t robot/arm-01/command -q 1 -m '{
"specversion":"1.0","type":"robot.command","source":"/test","id":"t-001",
"time":"2026-09-04T10:00:00Z","data":{"command_id":"cmd-t1","action":"pick_basket","params":{"basket":1}}}'
mosquitto_sub -h <broker> -t 'robot/arm-01/#' -q 1 -v