-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpick-and-place.behavior.json
More file actions
128 lines (128 loc) · 4.06 KB
/
Copy pathpick-and-place.behavior.json
File metadata and controls
128 lines (128 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
{
"protocol": "oebp",
"version": "0.1.0",
"kind": "BehaviorSpec",
"metadata": {
"id": "org.oebp.examples.pick-and-place",
"revision": "1.0.0",
"created_at": "2026-06-16T09:00:00Z",
"license": "CC-BY-4.0",
"tags": ["manipulation", "example"]
},
"spec": {
"summary": "Pick an object from its current support surface and place it on a target surface.",
"parameters": {
"object": {"type": "EntityRef", "required": true},
"target": {"type": "EntityRef", "required": true},
"effector": {"type": "EffectorRef", "required": true}
},
"requirements": {
"capabilities": [
{"id": "oebp.capability.perception.object_pose"},
{"id": "oebp.capability.manipulation.grasp"},
{"id": "oebp.capability.manipulation.place"}
],
"resources": ["$effector"],
"risk_class": "R2"
},
"contract": {
"preconditions": [
{"op": "exists", "path": "$object"},
{"op": "exists", "path": "$target"},
{"op": "predicate", "name": "oebp.relation.visible_to", "subject": "$object", "object": "$robot"}
],
"invariants": [
{"op": "predicate", "name": "oebp.state.safety_envelope_ok", "subject": "$robot"}
],
"success_conditions": [
{"op": "predicate", "name": "oebp.relation.on", "subject": "$object", "object": "$target"}
],
"failure_conditions": [
{
"when": {"op": "predicate", "name": "oebp.event.emergency_stop", "subject": "$robot"},
"error_code": "oebp.error.safety.emergency_stop@1",
"recoverable": false
}
],
"timeout_ms": 30000,
"cancel_policy": "reach_safe_state"
},
"root": {
"type": "sequence",
"node_id": "pick-place-sequence",
"children": [
{
"type": "invoke",
"node_id": "estimate-object-pose",
"skill": "oebp.skill.perception.estimate_pose@1",
"args": {"entity": "$object"}
},
{
"type": "invoke",
"node_id": "reach-object",
"skill": "oebp.skill.manipulation.reach@1",
"args": {"target": "$object", "effector": "$effector"},
"resources": ["$effector"]
},
{
"type": "retry",
"node_id": "retry-grasp",
"max_attempts": 2,
"backoff_ms": 250,
"child": {
"type": "invoke",
"node_id": "grasp-object",
"skill": "oebp.skill.manipulation.grasp@1",
"args": {"object": "$object", "effector": "$effector"},
"resources": ["$effector"]
}
},
{
"type": "invoke",
"node_id": "lift-object",
"skill": "oebp.skill.manipulation.lift@1",
"args": {"object": "$object", "effector": "$effector", "distance_m": 0.12},
"resources": ["$effector"]
},
{
"type": "invoke",
"node_id": "place-object",
"skill": "oebp.skill.manipulation.place@1",
"args": {"object": "$object", "target": "$target", "effector": "$effector"},
"resources": ["$effector"]
},
{
"type": "invoke",
"node_id": "verify-result",
"skill": "oebp.skill.meta.verify@1",
"args": {"predicate": "object_on_target", "object": "$object", "target": "$target"}
}
]
},
"recoveries": [
{
"on": ["oebp.error.manipulation.object_slipped@1"],
"max_activations": 1,
"behavior": {
"type": "sequence",
"node_id": "slip-recovery",
"children": [
{
"type": "invoke",
"node_id": "safe-release",
"skill": "oebp.skill.manipulation.release@1",
"args": {"effector": "$effector"},
"resources": ["$effector"]
},
{
"type": "invoke",
"node_id": "re-estimate-object",
"skill": "oebp.skill.perception.estimate_pose@1",
"args": {"entity": "$object"}
}
]
}
}
]
}
}