ros2_medkit_sovd_service_interface

Overview

The ros2_medkit_sovd_service_interface package implements a gateway plugin that exposes the medkit entity tree and fault data via standard ROS 2 services. This enables other ROS 2 nodes to query gateway entities and faults without going through the HTTP API.

The plugin creates four ROS 2 services:

  • ~/list_entities - lists entities by type (areas, components, apps, functions)

  • ~/get_entity_data - returns data items for a specific entity

  • ~/get_capabilities - returns the capability set for a specific entity

  • ~/list_entity_faults - lists faults for a specific entity

Architecture

The plugin runs as a gateway MODULE (loaded via dlopen) and uses PluginContext to access the entity cache and fault manager. It does not implement any provider interfaces (DataProvider, OperationProvider, etc.) - instead it reads data from the gateway’s existing managers and exposes it via ROS 2 service interfaces.

Gateway Process
+------------------------------------------------------+
| GatewayNode                                          |
|   +-- PluginManager                                  |
|   |     +-- SovdServiceInterface (MODULE .so)        |
|   |           |-- ~/list_entities service             |
|   |           |-- ~/get_entity_data service           |
|   |           |-- ~/get_capabilities service          |
|   |           |-- ~/list_entity_faults service        |
|   |           +-- PluginContext (read-only access)     |
|   +-- EntityCache <---+                               |
|   +-- FaultManager <--+                               |
+------------------------------------------------------+

Key Components

SovdServiceInterface (src/sovd_service_interface.cpp)

Main plugin class inheriting GatewayPlugin. Creates ROS 2 services during configure() and destroys them during shutdown(). Service callbacks query the PluginContext entity cache for data.

Service Exports (src/service_exports.cpp)

Standard plugin C API: plugin_api_version(), create_plugin().

Message Types

The plugin uses custom message types from ros2_medkit_msgs:

  • EntityInfo.msg - entity representation with ID, type, name, capabilities

  • ListEntities.srv - request/response for entity listing with type filter

  • GetEntityData.srv - request/response for entity data retrieval

  • GetCapabilities.srv - request/response for entity capability queries

  • ListFaultsForEntity.srv - request/response for entity fault listing

Design Decisions

ROS 2 Services over Topics

Services were chosen over topics because entity queries are inherently request-response. Topics would require a pub/sub pattern that adds complexity without benefit for point-in-time queries.

No Provider Interfaces

This plugin reads from the gateway’s entity cache rather than implementing DataProvider or OperationProvider. It is a consumer of gateway data, not a provider of new data sources. This keeps it simple and avoids circular dependencies.

PluginContext Read-Only Access

The plugin only uses read-only PluginContext methods (get_entity_snapshot(), get_entity(), list_entity_faults(), get_entity_capabilities(), get_type_capabilities()). It never mutates gateway state.