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(
"--port",
type=int,
default=None,
default=8002,
help="信息页web服务的启动端口",
)
parser.add_argument(

View File

@@ -92,7 +92,7 @@ def setup_web_pages(router: APIRouter) -> None:
# 获取已加载的设备
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():
resources.append(

View File

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

View File

@@ -7,7 +7,7 @@ from typing import Any
import yaml
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.type_check import TypeEncoder
@@ -131,6 +131,7 @@ class Registry:
action_config["type"] = self._replace_type_with_class(
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)
@@ -150,11 +151,7 @@ class Registry:
for device_id, device_info in self.device_type_registry.items():
msg = {
"id": device_id,
"name": device_info.get("name", "未命名"),
"file_path": device_info.get("file_path", ""),
"class_json": json.dumps(
device_info.get("class", {}), indent=4, ensure_ascii=False, cls=TypeEncoder
),
**device_info
}
devices.append(msg)
return devices

View File

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