Skip to content

Commit 4d1c086

Browse files
committed
small fixes and added test client
1 parent 5e6f2d5 commit 4d1c086

File tree

3 files changed

+152
-22
lines changed

3 files changed

+152
-22
lines changed
Lines changed: 88 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3-
# Test client for DesignatorResolveStart action
3+
# Full client for all KnowRob designator actions
44

55
import rospy
66
import actionlib
7-
from knowrob_designator.msg import DesignatorResolutionStartAction, DesignatorResolutionStartGoal
8-
from time import time
7+
import uuid
8+
from time import sleep
9+
from knowrob_designator.msg import (
10+
DesignatorInitAction, DesignatorInitGoal,
11+
DesignatorResolutionStartAction, DesignatorResolutionStartGoal,
12+
DesignatorResolutionFinishedAction, DesignatorResolutionFinishedGoal,
13+
DesignatorExecutionStartAction, DesignatorExecutionStartGoal,
14+
DesignatorExecutionFinishedAction, DesignatorExecutionFinishedGoal
15+
)
916

10-
def main():
11-
rospy.init_node('designator_resolve_test_client')
12-
13-
client = actionlib.SimpleActionClient('/knowrob/designator/resolving_started', DesignatorResolutionStartAction)
14-
rospy.loginfo("Waiting for action server...")
17+
def send_action(client, goal, label):
18+
rospy.loginfo(f"[{label}] Waiting for action server...")
1519
client.wait_for_server()
20+
rospy.loginfo(f"[{label}] Sending goal...")
21+
client.send_goal(goal)
22+
client.wait_for_result()
23+
result = client.get_result()
24+
rospy.loginfo(f"[{label}] Result: success={result.success}, message='{result.message}''")
25+
26+
def main():
27+
rospy.init_node('knowrob_designator_full_test_client')
1628

17-
goal = DesignatorResolutionStartGoal()
18-
goal.designator_id = "desig_001"
19-
goal.json_designator = """
29+
json_designator = """
2030
{
2131
"anAction": {
2232
"type": "Transporting",
@@ -37,14 +47,75 @@ def main():
3747
}
3848
}
3949
"""
40-
goal.stamp = rospy.Time.now()
4150

42-
rospy.loginfo("Sending goal...")
43-
client.send_goal(goal)
44-
client.wait_for_result()
51+
designator_id = f"desig_{uuid.uuid4()}"
52+
resolved_id = f"desig_{uuid.uuid4()}"
53+
now = rospy.Time.now()
4554

46-
result = client.get_result()
47-
rospy.loginfo(f"Result: success={result.success}, message='{result.message}'")
55+
# 1. DesignatorInit
56+
init_client = actionlib.SimpleActionClient('/knowrob/designator/init', DesignatorInitAction)
57+
init_goal = DesignatorInitGoal()
58+
init_goal.designator_id = designator_id
59+
init_goal.parent_id = "" # root designator
60+
init_goal.json_designator = json_designator
61+
init_goal.stamp = now
62+
send_action(init_client, init_goal, "Init")
63+
64+
# 2. DesignatorResolvingStarted
65+
resolving_client = actionlib.SimpleActionClient('/knowrob/designator/resolving_started', DesignatorResolutionStartAction)
66+
resolving_goal = DesignatorResolutionStartGoal()
67+
resolving_goal.designator_id = designator_id
68+
resolving_goal.json_designator = json_designator
69+
resolving_goal.stamp = now
70+
send_action(resolving_client, resolving_goal, "ResolveStart")
71+
72+
# 3. DesignatorResolutionFinished with resolved target
73+
resolved_client = actionlib.SimpleActionClient('/knowrob/designator/resolving_finished', DesignatorResolutionFinishedAction)
74+
75+
resolved_designator = """
76+
{
77+
"anAction": {
78+
"type": "Transporting",
79+
"objectActedOn": {
80+
"anObject": {
81+
"type": "Milk"
82+
}
83+
},
84+
"target": {
85+
"pose": {
86+
"x": 1.2,
87+
"y": 0.8,
88+
"z": 0.75,
89+
"frame": "map"
90+
}
91+
}
92+
}
93+
}
94+
"""
95+
96+
resolved_goal = DesignatorResolutionFinishedGoal()
97+
resolved_goal.designator_id = resolved_id
98+
resolved_goal.resolved_from_id = designator_id
99+
resolved_goal.json_designator = resolved_designator
100+
resolved_goal.stamp = rospy.Time.now()
101+
send_action(resolved_client, resolved_goal, "ResolveFinished")
102+
103+
104+
# 4. DesignatorExecutionStart
105+
exec_start_client = actionlib.SimpleActionClient('/knowrob/designator/execution_start', DesignatorExecutionStartAction)
106+
exec_start_goal = DesignatorExecutionStartGoal()
107+
exec_start_goal.designator_id = resolved_id
108+
exec_start_goal.json_designator = resolved_designator
109+
exec_start_goal.stamp = now
110+
send_action(exec_start_client, exec_start_goal, "ExecutionStart")
111+
112+
# 5. DesignatorExecutionFinished
113+
exec_finished_client = actionlib.SimpleActionClient('/knowrob/designator/execution_finished', DesignatorExecutionFinishedAction)
114+
exec_finished_goal = DesignatorExecutionFinishedGoal()
115+
exec_finished_goal.designator_id = resolved_id
116+
exec_finished_goal.json_designator = resolved_designator
117+
exec_finished_goal.stamp = now
118+
send_action(exec_finished_client, exec_finished_goal, "ExecutionFinished")
48119

49120
if __name__ == '__main__':
50121
main()

scripts/knowrob_designator_service.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def __init__(self):
3535
auto_start=False
3636
)
3737
self.resolve_finished_server = actionlib.SimpleActionServer(
38-
'knowrob/designator_resolving_finished',
38+
'knowrob/designator/resolving_finished',
3939
DesignatorResolutionFinishedAction,
4040
execute_cb=self.handle_resolve_finished,
4141
auto_start=False
@@ -72,7 +72,7 @@ def __init__(self):
7272
def handle_init(self, goal):
7373
rospy.loginfo(f"Init Designator: {goal.designator_id}")
7474
rospy.logdebug(f"Full JSON:\n{goal.json_designator}")
75-
result = DesignatorInitResult(success=True, message="Designator init logged.", status="done")
75+
result = DesignatorInitResult(success=True, message="Designator init logged.")
7676
self.init_server.set_succeeded(result)
7777

7878
def handle_resolve_start(self, goal):
@@ -117,17 +117,17 @@ def handle_resolve_start(self, goal):
117117

118118
def handle_resolve_finished(self, goal):
119119
rospy.loginfo(f"Finished Resolving Designator: {goal.designator_id} from {goal.resolved_from_id}")
120-
result = DesignatorResolutionFinishedResult(success=True, message="Resolution finished logged.", status="done")
120+
result = DesignatorResolutionFinishedResult(success=True, message="Resolution finished logged.")
121121
self.resolve_finished_server.set_succeeded(result)
122122

123123
def handle_exec_start(self, goal):
124124
rospy.loginfo(f"Execution Started: {goal.designator_id}")
125-
result = DesignatorExecutionStartResult(success=True, message="Execution started logged.", status="done")
125+
result = DesignatorExecutionStartResult(success=True, message="Execution started logged.")
126126
self.exec_start_server.set_succeeded(result)
127127

128128
def handle_exec_finished(self, goal):
129129
rospy.loginfo(f"Execution Finished: {goal.designator_id}")
130-
result = DesignatorExecutionFinishedResult(success=True, message="Execution finished logged.", status="done")
130+
result = DesignatorExecutionFinishedResult(success=True, message="Execution finished logged.")
131131
self.exec_finished_server.set_succeeded(result)
132132

133133
if __name__ == '__main__':

src/knowrob_designator/designator_parser.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1+
import uuid
2+
13
class DesignatorParser:
4+
def __init__(self):
5+
self.triples = []
6+
7+
# Mockup for the parse method
28
def parse(self, designator):
39
"""
410
Parse a designator dictionary into RDF-style triples.
@@ -23,3 +29,56 @@ def parse(self, designator):
2329
("e", "name", "Table1")
2430
]
2531
return triples
32+
33+
def parse(self, designator_json, root=None):
34+
"""
35+
Iteratively convert a nested designator JSON into RDF-style triples.
36+
37+
:param designator_json: dict (parsed JSON structure)
38+
:param root: optional root URI
39+
:return: list of (subject, predicate, object) triples
40+
"""
41+
self.triples.clear()
42+
root_id = root or self._new_designator_id()
43+
44+
# Stack of (current_subject, current_object)
45+
stack = [(root_id, designator_json)]
46+
47+
while stack:
48+
subject, current = stack.pop()
49+
50+
if not isinstance(current, dict):
51+
continue
52+
53+
for key, value in current.items():
54+
predicate = self._predicate(key)
55+
56+
if isinstance(value, dict):
57+
sub_id = self._new_designator_id()
58+
self.triples.append((subject, predicate, sub_id))
59+
stack.append((sub_id, value))
60+
61+
elif isinstance(value, list):
62+
for v in value:
63+
if isinstance(v, dict):
64+
sub_id = self._new_designator_id()
65+
self.triples.append((subject, predicate, sub_id))
66+
stack.append((sub_id, v))
67+
else:
68+
self.triples.append((subject, predicate, self._literal(v)))
69+
70+
else:
71+
self.triples.append((subject, predicate, self._literal(value)))
72+
73+
return self.triples
74+
75+
def _new_designator_id(self):
76+
return f"desig:{uuid.uuid4()}"
77+
78+
def _predicate(self, key):
79+
return f"knowrob:{key}"
80+
81+
def _literal(self, value):
82+
if isinstance(value, str):
83+
return f"\"{value}\""
84+
return str(value)

0 commit comments

Comments
 (0)