feat: slave node registry
This commit is contained in:
wznln
2025-04-29 13:42:30 +08:00
parent 09fc17429e
commit e5749a8058
6 changed files with 19 additions and 16 deletions

View File

@@ -61,7 +61,7 @@ def parse_args():
parser.add_argument( parser.add_argument(
"--port", "--port",
type=int, type=int,
default=None, default=8002,
help="信息页web服务的启动端口", help="信息页web服务的启动端口",
) )
parser.add_argument( parser.add_argument(

View File

@@ -92,7 +92,7 @@ def setup_web_pages(router: APIRouter) -> None:
# 获取已加载的设备 # 获取已加载的设备
if lab_registry: if lab_registry:
devices = lab_registry.obtain_registry_device_info() devices = json.loads(json.dumps(lab_registry.obtain_registry_device_info(), ensure_ascii=False, cls=TypeEncoder))
# 资源类型 # 资源类型
for resource_id, resource_info in lab_registry.resource_type_registry.items(): for resource_id, resource_info in lab_registry.resource_type_registry.items():
resources.append( resources.append(

View File

@@ -329,7 +329,7 @@
<tr id="device-info-{{ loop.index }}" class="detail-row" style="display: none;"> <tr id="device-info-{{ loop.index }}" class="detail-row" style="display: none;">
<td colspan="5"> <td colspan="5">
<div class="content-full"> <div class="content-full">
<pre>{{ device.class_json }}</pre> <pre>{{ device.class|tojson(indent=4) }}</pre>
{% if device.is_online %} {% if device.is_online %}
<div class="status-badge"><span class="online-status">在线</span></div> <div class="status-badge"><span class="online-status">在线</span></div>

View File

@@ -7,7 +7,7 @@ from typing import Any
import yaml import yaml
from unilabos.utils import logger from unilabos.utils import logger
from unilabos.ros.msgs.message_converter import msg_converter_manager from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema
from unilabos.utils.decorator import singleton from unilabos.utils.decorator import singleton
from unilabos.utils.type_check import TypeEncoder from unilabos.utils.type_check import TypeEncoder
@@ -131,6 +131,7 @@ class Registry:
action_config["type"] = self._replace_type_with_class( action_config["type"] = self._replace_type_with_class(
action_config["type"], device_id, f"动作 {action_name}" action_config["type"], device_id, f"动作 {action_name}"
) )
action_config["schema"] = ros_action_to_json_schema(action_config["type"])
self.device_type_registry.update(data) self.device_type_registry.update(data)
@@ -150,11 +151,7 @@ class Registry:
for device_id, device_info in self.device_type_registry.items(): for device_id, device_info in self.device_type_registry.items():
msg = { msg = {
"id": device_id, "id": device_id,
"name": device_info.get("name", "未命名"), **device_info
"file_path": device_info.get("file_path", ""),
"class_json": json.dumps(
device_info.get("class", {}), indent=4, ensure_ascii=False, cls=TypeEncoder
),
} }
devices.append(msg) devices.append(msg)
return devices return devices

View File

@@ -1,3 +1,4 @@
import copy
import json import json
import os import os
import traceback import traceback
@@ -85,7 +86,7 @@ def slave(
"""从节点函数""" """从节点函数"""
rclpy.init(args=args) rclpy.init(args=args)
rclpy.__executor = executor = MultiThreadedExecutor() rclpy.__executor = executor = MultiThreadedExecutor()
devices_config_copy = copy.deepcopy(devices_config)
for device_id, device_config in devices_config.items(): for device_id, device_config in devices_config.items():
d = initialize_device_from_dict(device_id, device_config) d = initialize_device_from_dict(device_id, device_config)
if d is None: if d is None:
@@ -109,20 +110,19 @@ def slave(
request.command = json.dumps({ request.command = json.dumps({
"machine_name": machine_name, "machine_name": machine_name,
"type": "slave", "type": "slave",
"devices_config": devices_config, "devices_config": devices_config_copy,
"registry_config": lab_registry.obtain_registry_device_info() "registry_config": lab_registry.obtain_registry_device_info()
}, ensure_ascii=False, cls=TypeEncoder) }, ensure_ascii=False, cls=TypeEncoder)
response = sclient.call_async(request) response = sclient.call_async(request).result()
logger.info(f"Slave node info update response: {response}") logger.info(f"Slave node info updated.")
rclient = n.create_client(ResourceAdd, "/resources/add") rclient = n.create_client(ResourceAdd, "/resources/add")
rclient.wait_for_service() # FIXME 可能一直等待,加一个参数 rclient.wait_for_service() # FIXME 可能一直等待,加一个参数
request = ResourceAdd.Request() request = ResourceAdd.Request()
request.resources = [convert_to_ros_msg(Resource, resource) for resource in resources_config] request.resources = [convert_to_ros_msg(Resource, resource) for resource in resources_config]
response = rclient.call_async(request) response = rclient.call_async(request).result()
logger.info(f"Slave resource add response: {response}") logger.info(f"Slave resource added.")
run_event_loop_in_thread() run_event_loop_in_thread()

View File

@@ -516,7 +516,13 @@ class HostNode(BaseROS2DeviceNode):
""" """
self.lab_logger().info(f"[Host Node] Node info update request received: {request}") self.lab_logger().info(f"[Host Node] Node info update request received: {request}")
try: try:
from unilabos.app.mq import mqtt_client
info = json.loads(request.command) info = json.loads(request.command)
machine_name = info["machine_name"]
devices_config = info["devices_config"]
registry_config = info["registry_config"]
for device_config in registry_config:
mqtt_client.publish_registry(device_config["id"], device_config)
self.lab_logger().info(f"[Host Node] Node info update: {info}") self.lab_logger().info(f"[Host Node] Node info update: {info}")
response.response = "OK" response.response = "OK"
except Exception as e: except Exception as e: