Skip to content

Commit fde7509

Browse files
davidferlopdavidfernandez
andauthored
Add services to return Action interface details (#1021)
Co-authored-by: davidfernandez <david.fernandez@pal-robotics.com>
1 parent 23888e2 commit fde7509

File tree

6 files changed

+88
-2
lines changed

6 files changed

+88
-2
lines changed

rosapi/scripts/rosapi_node

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ from rclpy.qos import qos_profile_parameters
4444
from rosapi import glob_helper, objectutils, params, proxy
4545
from rosapi_msgs.msg import TypeDef
4646
from rosapi_msgs.srv import (
47+
ActionFeedbackDetails,
48+
ActionGoalDetails,
49+
ActionResultDetails,
4750
DeleteParam,
4851
GetActionServers,
4952
GetParam,
@@ -130,6 +133,21 @@ class Rosapi(Node):
130133
"~/service_response_details",
131134
self.get_service_response_details,
132135
)
136+
self.create_service(
137+
ActionGoalDetails,
138+
"~/action_goal_details",
139+
self.get_action_goal_details,
140+
)
141+
self.create_service(
142+
ActionResultDetails,
143+
"~/action_result_details",
144+
self.get_action_result_details,
145+
)
146+
self.create_service(
147+
ActionFeedbackDetails,
148+
"~/action_feedback_details",
149+
self.get_action_feedback_details,
150+
)
133151
self.create_service(
134152
SetParam,
135153
"~/set_param",
@@ -283,14 +301,40 @@ class Rosapi(Node):
283301
return response
284302

285303
def get_service_response_details(self, request, response):
286-
"""Called by the rosapi/ServiceResponseDetails service. Given the name of a service type, returns the TypeDef
287-
for the response message of that service type."""
304+
"""Called by the rosapi/ServiceResponseDetails service. Given the name of a service type,
305+
returns the TypeDef for the response message of that service type."""
288306
response.typedefs = [
289307
dict_to_typedef(d)
290308
for d in objectutils.get_service_response_typedef_recursive(request.type)
291309
]
292310
return response
293311

312+
def get_action_goal_details(self, request, response):
313+
"""Called by the rosapi/ActionGoalDetails service. Given the name of an action type,
314+
returns the TypeDef for the goal message of that action type."""
315+
response.typedefs = [
316+
dict_to_typedef(d) for d in objectutils.get_action_goal_typedef_recursive(request.type)
317+
]
318+
return response
319+
320+
def get_action_result_details(self, request, response):
321+
"""Called by the rosapi/ActionResultDetails service. Given the name of an action type,
322+
returns the TypeDef for the result message of that action type."""
323+
response.typedefs = [
324+
dict_to_typedef(d)
325+
for d in objectutils.get_action_result_typedef_recursive(request.type)
326+
]
327+
return response
328+
329+
def get_action_feedback_details(self, request, response):
330+
"""Called by the rosapi/ActionFeedbackDetails service. Given the name of an action type,
331+
returns the TypeDef for the feedback message of that action type."""
332+
response.typedefs = [
333+
dict_to_typedef(d)
334+
for d in objectutils.get_action_feedback_typedef_recursive(request.type)
335+
]
336+
return response
337+
294338
async def set_param(self, request, response):
295339
try:
296340
node_name, param_name = self._get_node_and_param_name(request.name)

rosapi/src/rosapi/objectutils.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,36 @@ def get_service_response_typedef_recursive(servicetype):
135135
return _get_subtypedefs_recursive(typedef, [])
136136

137137

138+
def get_action_goal_typedef_recursive(actiontype):
139+
"""Returns a list of typedef dicts for this type and all contained type fields"""
140+
# Get an instance of the action goal class and get its typedef
141+
instance = ros_loader.get_action_goal_instance(actiontype)
142+
typedef = _get_typedef(instance)
143+
144+
# Return the list of sub-typedefs
145+
return _get_subtypedefs_recursive(typedef, [])
146+
147+
148+
def get_action_result_typedef_recursive(actiontype):
149+
"""Returns a list of typedef dicts for this type and all contained type fields"""
150+
# Get an instance of the action result class and get its typedef
151+
instance = ros_loader.get_action_result_instance(actiontype)
152+
typedef = _get_typedef(instance)
153+
154+
# Return the list of sub-typedefs
155+
return _get_subtypedefs_recursive(typedef, [])
156+
157+
158+
def get_action_feedback_typedef_recursive(actiontype):
159+
"""Returns a list of typedef dicts for this type and all contained type fields"""
160+
# Get an instance of the action feedback class and get its typedef
161+
instance = ros_loader.get_action_feedback_instance(actiontype)
162+
typedef = _get_typedef(instance)
163+
164+
# Return the list of sub-typedefs
165+
return _get_subtypedefs_recursive(typedef, [])
166+
167+
138168
def get_typedef_full_text(ty):
139169
"""Returns the full text (similar to `gendeps --cat`) for the specified message type"""
140170
try:

rosapi_msgs/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ rosidl_generate_interfaces(${PROJECT_NAME}
2323
srv/ServiceProviders.srv
2424
srv/ServiceRequestDetails.srv
2525
srv/ServiceResponseDetails.srv
26+
srv/ActionGoalDetails.srv
27+
srv/ActionResultDetails.srv
28+
srv/ActionFeedbackDetails.srv
2629
srv/Services.srv
2730
srv/ServicesForType.srv
2831
srv/ServiceType.srv
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
string type
2+
---
3+
TypeDef[] typedefs
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
string type
2+
---
3+
TypeDef[] typedefs
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
string type
2+
---
3+
TypeDef[] typedefs

0 commit comments

Comments
 (0)