更新schema的title字段

This commit is contained in:
Xuwznln
2025-09-07 00:43:23 +08:00
parent 55165024dd
commit 961752fb0d
10 changed files with 572 additions and 529 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -336,7 +336,7 @@ separator.homemade:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -350,12 +350,12 @@ separator.homemade:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -372,7 +372,7 @@ separator.homemade:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel

View File

@@ -533,7 +533,7 @@ gripper.mock:
required: required:
- position - position
- max_effort - max_effort
title: GripperCommand title: command
type: object type: object
required: required:
- command - command

View File

@@ -139,12 +139,12 @@ linear_motion.grbl:
required: required:
- sec - sec
- nanosec - nanosec
title: Time title: stamp
type: object type: object
required: required:
- stamp - stamp
- frame_id - frame_id
title: Header title: header
type: object type: object
pose: pose:
properties: properties:
@@ -163,7 +163,7 @@ linear_motion.grbl:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -177,17 +177,17 @@ linear_motion.grbl:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
required: required:
- header - header
- pose - pose
title: PoseStamped title: current_pose
type: object type: object
distance_remaining: distance_remaining:
type: number type: number
@@ -204,7 +204,7 @@ linear_motion.grbl:
required: required:
- sec - sec
- nanosec - nanosec
title: Duration title: estimated_time_remaining
type: object type: object
navigation_time: navigation_time:
properties: properties:
@@ -219,7 +219,7 @@ linear_motion.grbl:
required: required:
- sec - sec
- nanosec - nanosec
title: Duration title: navigation_time
type: object type: object
number_of_poses_remaining: number_of_poses_remaining:
maximum: 32767 maximum: 32767
@@ -262,12 +262,12 @@ linear_motion.grbl:
required: required:
- sec - sec
- nanosec - nanosec
title: Time title: stamp
type: object type: object
required: required:
- stamp - stamp
- frame_id - frame_id
title: Header title: header
type: object type: object
pose: pose:
properties: properties:
@@ -286,7 +286,7 @@ linear_motion.grbl:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -300,17 +300,17 @@ linear_motion.grbl:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
required: required:
- header - header
- pose - pose
title: PoseStamped title: poses
type: object type: object
type: array type: array
required: required:
@@ -323,7 +323,7 @@ linear_motion.grbl:
result: result:
properties: {} properties: {}
required: [] required: []
title: Empty title: result
type: object type: object
required: required:
- result - result
@@ -371,12 +371,12 @@ linear_motion.grbl:
required: required:
- sec - sec
- nanosec - nanosec
title: Time title: stamp
type: object type: object
required: required:
- stamp - stamp
- frame_id - frame_id
title: Header title: header
type: object type: object
position: position:
type: number type: number
@@ -406,7 +406,7 @@ linear_motion.grbl:
required: required:
- sec - sec
- nanosec - nanosec
title: Duration title: min_duration
type: object type: object
position: position:
type: number type: number

View File

@@ -362,7 +362,7 @@ heaterstirrer.dalong:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -376,12 +376,12 @@ heaterstirrer.dalong:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -398,7 +398,7 @@ heaterstirrer.dalong:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel

View File

@@ -145,7 +145,7 @@ virtual_centrifuge:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -159,12 +159,12 @@ virtual_centrifuge:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -181,7 +181,7 @@ virtual_centrifuge:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -446,7 +446,7 @@ virtual_column:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -460,12 +460,12 @@ virtual_column:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -482,7 +482,7 @@ virtual_column:
- pose - pose
- config - config
- data - data
title: Resource title: from_vessel
type: object type: object
pct1: pct1:
type: string type: string
@@ -531,7 +531,7 @@ virtual_column:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -545,12 +545,12 @@ virtual_column:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -567,7 +567,7 @@ virtual_column:
- pose - pose
- config - config
- data - data
title: Resource title: to_vessel
type: object type: object
required: required:
- from_vessel - from_vessel
@@ -850,7 +850,7 @@ virtual_filter:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -864,12 +864,12 @@ virtual_filter:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -886,7 +886,7 @@ virtual_filter:
- pose - pose
- config - config
- data - data
title: Resource title: filtrate_vessel
type: object type: object
stir: stir:
type: boolean type: boolean
@@ -929,7 +929,7 @@ virtual_filter:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -943,12 +943,12 @@ virtual_filter:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -965,7 +965,7 @@ virtual_filter:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
volume: volume:
type: number type: number
@@ -1071,8 +1071,8 @@ virtual_filter:
- status - status
- progress - progress
- current_temp - current_temp
- filtered_volume
- current_status - current_status
- filtered_volume
- message - message
- max_temp - max_temp
- max_stir_speed - max_stir_speed
@@ -1455,7 +1455,7 @@ virtual_heatchill:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -1469,12 +1469,12 @@ virtual_heatchill:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -1491,7 +1491,7 @@ virtual_heatchill:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -1610,7 +1610,7 @@ virtual_heatchill:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -1624,12 +1624,12 @@ virtual_heatchill:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -1646,7 +1646,7 @@ virtual_heatchill:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -1747,7 +1747,7 @@ virtual_heatchill:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -1761,12 +1761,12 @@ virtual_heatchill:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -1783,7 +1783,7 @@ virtual_heatchill:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -2397,7 +2397,7 @@ virtual_rotavap:
required: required:
- sec - sec
- nanosec - nanosec
title: Duration title: time_remaining
type: object type: object
time_spent: time_spent:
properties: properties:
@@ -2412,7 +2412,7 @@ virtual_rotavap:
required: required:
- sec - sec
- nanosec - nanosec
title: Duration title: time_spent
type: object type: object
required: required:
- status - status
@@ -2468,7 +2468,7 @@ virtual_rotavap:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -2482,12 +2482,12 @@ virtual_rotavap:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -2504,7 +2504,7 @@ virtual_rotavap:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -2889,7 +2889,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -2903,12 +2903,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -2925,7 +2925,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: from_vessel
type: object type: object
product_phase: product_phase:
type: string type: string
@@ -2964,7 +2964,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -2978,12 +2978,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3000,7 +3000,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: product_vessel
type: object type: object
purpose: purpose:
type: string type: string
@@ -3043,7 +3043,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -3057,12 +3057,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3079,7 +3079,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: separation_vessel
type: object type: object
settling_time: settling_time:
type: number type: number
@@ -3128,7 +3128,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -3142,12 +3142,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3164,7 +3164,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: to_vessel
type: object type: object
vessel: vessel:
properties: properties:
@@ -3201,7 +3201,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -3215,12 +3215,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3237,7 +3237,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
volume: volume:
type: string type: string
@@ -3276,7 +3276,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -3290,12 +3290,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3312,7 +3312,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: waste_phase_to_vessel
type: object type: object
waste_vessel: waste_vessel:
properties: properties:
@@ -3349,7 +3349,7 @@ virtual_separator:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -3363,12 +3363,12 @@ virtual_separator:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3385,7 +3385,7 @@ virtual_separator:
- pose - pose
- config - config
- data - data
title: Resource title: waste_vessel
type: object type: object
required: required:
- vessel - vessel
@@ -3951,7 +3951,7 @@ virtual_solid_dispenser:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -3965,12 +3965,12 @@ virtual_solid_dispenser:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -3987,7 +3987,7 @@ virtual_solid_dispenser:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
viscous: viscous:
type: boolean type: boolean
@@ -4332,7 +4332,7 @@ virtual_stirrer:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -4346,12 +4346,12 @@ virtual_stirrer:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -4368,7 +4368,7 @@ virtual_stirrer:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -4492,7 +4492,7 @@ virtual_stirrer:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -4506,12 +4506,12 @@ virtual_stirrer:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -4528,7 +4528,7 @@ virtual_stirrer:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -4639,7 +4639,7 @@ virtual_stirrer:
- y - y
- z - z
- w - w
title: Quaternion title: orientation
type: object type: object
position: position:
properties: properties:
@@ -4653,12 +4653,12 @@ virtual_stirrer:
- x - x
- y - y
- z - z
title: Point title: position
type: object type: object
required: required:
- position - position
- orientation - orientation
title: Pose title: pose
type: object type: object
sample_id: sample_id:
type: string type: string
@@ -4675,7 +4675,7 @@ virtual_stirrer:
- pose - pose
- config - config
- data - data
title: Resource title: vessel
type: object type: object
required: required:
- vessel - vessel
@@ -4704,6 +4704,7 @@ virtual_stirrer:
status_types: status_types:
current_speed: float current_speed: float
current_vessel: str current_vessel: str
device_info: dict
is_stirring: bool is_stirring: bool
max_speed: float max_speed: float
min_speed: float min_speed: float
@@ -4738,6 +4739,8 @@ virtual_stirrer:
type: number type: number
current_vessel: current_vessel:
type: string type: string
device_info:
type: object
is_stirring: is_stirring:
type: boolean type: boolean
max_speed: max_speed:
@@ -4759,6 +4762,7 @@ virtual_stirrer:
- remaining_time - remaining_time
- max_speed - max_speed
- min_speed - min_speed
- device_info
type: object type: object
version: 1.0.0 version: 1.0.0
virtual_transfer_pump: virtual_transfer_pump:

File diff suppressed because it is too large Load Diff

View File

@@ -24,12 +24,11 @@ DEFAULT_PATHS = [Path(__file__).absolute().parent]
class Registry: class Registry:
def __init__(self, registry_paths=None): def __init__(self, registry_paths=None):
import ctypes import ctypes
try: try:
import unilabos_msgs import unilabos_msgs
except ImportError: except ImportError:
logger.error( logger.error("[UniLab Registry] unilabos_msgs模块未找到请确保已根据官方文档安装unilabos_msgs包。")
"[UniLab Registry] unilabos_msgs模块未找到请确保已根据官方文档安装unilabos_msgs包。"
)
sys.exit(1) sys.exit(1)
try: try:
ctypes.CDLL(str(Path(unilabos_msgs.__file__).parent / "unilabos_msgs_s__rosidl_typesupport_c.pyd")) ctypes.CDLL(str(Path(unilabos_msgs.__file__).parent / "unilabos_msgs_s__rosidl_typesupport_c.pyd"))
@@ -219,7 +218,7 @@ class Registry:
yaml.dump(complete_data, f, allow_unicode=True, default_flow_style=False, Dumper=NoAliasDumper) yaml.dump(complete_data, f, allow_unicode=True, default_flow_style=False, Dumper=NoAliasDumper)
self.resource_type_registry.update(data) self.resource_type_registry.update(data)
logger.trace( logger.trace( # type: ignore
f"[UniLab Registry] Resource-{current_resource_number} File-{i+1}/{len(files)} " f"[UniLab Registry] Resource-{current_resource_number} File-{i+1}/{len(files)} "
+ f"Add {list(data.keys())}" + f"Add {list(data.keys())}"
) )
@@ -406,7 +405,7 @@ class Registry:
devices_path = abs_path / "devices" devices_path = abs_path / "devices"
device_comms_path = abs_path / "device_comms" device_comms_path = abs_path / "device_comms"
files = list(devices_path.glob("*.yaml")) + list(device_comms_path.glob("*.yaml")) files = list(devices_path.glob("*.yaml")) + list(device_comms_path.glob("*.yaml"))
logger.trace( logger.trace( # type: ignore
f"[UniLab Registry] devices: {devices_path.exists()}, device_comms: {device_comms_path.exists()}, " f"[UniLab Registry] devices: {devices_path.exists()}, device_comms: {device_comms_path.exists()}, "
+ f"total: {len(files)}" + f"total: {len(files)}"
) )

View File

@@ -1,12 +1,12 @@
get_workstation_plate_resource: #get_workstation_plate_resource:
category: # category:
- workstation # - workstation
class: # class:
module: unilabos.ros.nodes.presets.workstation:get_workstation_plate_resource # module: unilabos.devices.workstation.workstation_base:get_workstation_plate_resource
type: pylabrobot # type: pylabrobot
description: workstation example resource # description: workstation example resource
handles: [] # handles: []
icon: '' # icon: ''
init_param_schema: {} # init_param_schema: {}
registry_type: resource # registry_type: resource
version: 1.0.0 # version: 1.0.0

View File

@@ -646,25 +646,28 @@ basic_type_map = {
} }
def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str = None) -> Dict[str, Any]: def ros_field_type_to_json_schema(
type_info: Type | str, field_name: str
) -> Dict[str, Any]:
""" """
将 ROS 字段类型转换为 JSON Schema 类型定义 将 ROS 字段类型转换为 JSON Schema 类型定义
Args: Args:
type_info: ROS 类型 type_info: ROS 类型
slot_type: ROS 类型 slot_type: ROS 类型
field_name: 字段名用于设置复杂类型的title
Returns: Returns:
对应的 JSON Schema 类型定义 对应的 JSON Schema 类型定义
""" """
if isinstance(type_info, UnboundedSequence): if isinstance(type_info, UnboundedSequence):
return {"type": "array", "items": ros_field_type_to_json_schema(type_info.value_type)} return {"type": "array", "items": ros_field_type_to_json_schema(type_info.value_type, field_name)} # type: ignore
if isinstance(type_info, NamespacedType): if isinstance(type_info, NamespacedType):
cls_name = ".".join(type_info.namespaces) + ":" + type_info.name cls_name = ".".join(type_info.namespaces) + ":" + type_info.name
type_class = msg_converter_manager.get_class(cls_name) type_class = msg_converter_manager.get_class(cls_name)
return ros_field_type_to_json_schema(type_class) return ros_field_type_to_json_schema(type_class, field_name)
elif isinstance(type_info, BasicType): elif isinstance(type_info, BasicType):
return ros_field_type_to_json_schema(type_info.typename) return ros_field_type_to_json_schema(type_info.typename, field_name)
elif isinstance(type_info, UnboundedString): elif isinstance(type_info, UnboundedString):
return basic_type_map["string"] return basic_type_map["string"]
elif isinstance(type_info, str): elif isinstance(type_info, str):
@@ -681,8 +684,9 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str = None)
}, },
"required": ["sec", "nanosec"], "required": ["sec", "nanosec"],
} }
return {}
else: else:
return ros_message_to_json_schema(type_info) return ros_message_to_json_schema(type_info, field_name)
# # 处理数组类型 # # 处理数组类型
# if field_type.endswith('[]'): # if field_type.endswith('[]'):
# item_type = field_type[:-2] # item_type = field_type[:-2]
@@ -706,28 +710,28 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str = None)
# return {'type': 'object', 'description': f'未知类型: {field_type}'} # return {'type': 'object', 'description': f'未知类型: {field_type}'}
def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: def ros_message_to_json_schema(msg_class: Any, field_name: str) -> Dict[str, Any]:
""" """
将 ROS 消息类转换为 JSON Schema 将 ROS 消息类转换为 JSON Schema
Args: Args:
msg_class: ROS 消息类 msg_class: ROS 消息类
field_name: 字段名用于设置schema的title如果为None则使用类名
Returns: Returns:
对应的 JSON Schema 定义 对应的 JSON Schema 定义
""" """
schema = {"type": "object", "properties": {}, "required": []} schema = {"type": "object", "properties": {}, "required": []}
# 获取类名作为标题 # 优先使用字段名作为标题,否则使用类名
if hasattr(msg_class, "__name__"): schema["title"] = field_name
schema["title"] = msg_class.__name__
# 获取消息的字段和字段类型 # 获取消息的字段和字段类型
try: try:
for ind, slot_info in enumerate(msg_class._fields_and_field_types.items()): for ind, slot_info in enumerate(msg_class._fields_and_field_types.items()):
slot_name, slot_type = slot_info slot_name, slot_type = slot_info
type_info = msg_class.SLOT_TYPES[ind] type_info = msg_class.SLOT_TYPES[ind]
field_schema = ros_field_type_to_json_schema(type_info, slot_type) field_schema = ros_field_type_to_json_schema(type_info, slot_name)
schema["properties"][slot_name] = field_schema schema["properties"][slot_name] = field_schema
schema["required"].append(slot_name) schema["required"].append(slot_name)
# if hasattr(msg_class, 'get_fields_and_field_types'): # if hasattr(msg_class, 'get_fields_and_field_types'):
@@ -786,15 +790,15 @@ def ros_action_to_json_schema(action_class: Any, description="") -> Dict[str, An
"properties": { "properties": {
"goal": { "goal": {
# 'description': 'Action 目标 - 从客户端发送到服务器', # 'description': 'Action 目标 - 从客户端发送到服务器',
**ros_message_to_json_schema(action_class.Goal) **ros_message_to_json_schema(action_class.Goal, action_class.Goal.__name__)
}, },
"feedback": { "feedback": {
# 'description': 'Action 反馈 - 执行过程中从服务器发送到客户端', # 'description': 'Action 反馈 - 执行过程中从服务器发送到客户端',
**ros_message_to_json_schema(action_class.Feedback) **ros_message_to_json_schema(action_class.Feedback, action_class.Feedback.__name__)
}, },
"result": { "result": {
# 'description': 'Action 结果 - 完成后从服务器发送到客户端', # 'description': 'Action 结果 - 完成后从服务器发送到客户端',
**ros_message_to_json_schema(action_class.Result) **ros_message_to_json_schema(action_class.Result, action_class.Result.__name__)
}, },
}, },
"required": ["goal"], "required": ["goal"],