From ea6f25d1ce0d7613c784dc7e95fd3f5abcc5c79a Mon Sep 17 00:00:00 2001
From: wznln <18435084+Xuwznln@users.noreply.github.com>
Date: Tue, 29 Apr 2025 14:39:14 +0800
Subject: [PATCH] feat: show machine name fix: host node registry not uploaded
---
unilabos/app/web/templates/status.html | 6 +++++-
unilabos/app/web/utils/host_utils.py | 5 ++---
unilabos/app/web/utils/ros_utils.py | 14 ++++++++++----
unilabos/ros/nodes/presets/host_node.py | 14 ++++++++++++++
4 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/unilabos/app/web/templates/status.html b/unilabos/app/web/templates/status.html
index 9217691c..f4ef011a 100644
--- a/unilabos/app/web/templates/status.html
+++ b/unilabos/app/web/templates/status.html
@@ -96,17 +96,19 @@
| 设备ID |
命名空间 |
+ 机器名称 |
状态 |
{% for device_id, device_info in host_node_info.devices.items() %}
| {{ device_id }} |
{{ device_info.namespace }} |
+ {{ device_info.machine_name }} |
{{ "在线" if device_info.is_online else "离线" }} |
{% else %}
- | 没有发现已管理的设备 |
+ 没有发现已管理的设备 |
{% endfor %}
@@ -218,6 +220,7 @@
Device ID |
节点名称 |
命名空间 |
+ 机器名称 |
状态项 |
动作数 |
@@ -227,6 +230,7 @@
{{ device_id }} |
{{ device_info.node_name }} |
{{ device_info.namespace }} |
+ {{ device_info.machine_name|default("本地") }} |
{{ ros_node_info.device_topics.get(device_id, {})|length }} |
{{ ros_node_info.device_actions.get(device_id, {})|length }} ▼ |
diff --git a/unilabos/app/web/utils/host_utils.py b/unilabos/app/web/utils/host_utils.py
index 0df5e816..6ceb068a 100644
--- a/unilabos/app/web/utils/host_utils.py
+++ b/unilabos/app/web/utils/host_utils.py
@@ -34,6 +34,7 @@ def get_host_node_info() -> Dict[str, Any]:
"namespace": namespace,
"is_online": f"{namespace}/{device_id}" in host_node._online_devices,
"key": f"{namespace}/{device_id}" if namespace.startswith("/") else f"/{namespace}/{device_id}",
+ "machine_name": host_node.device_machine_names.get(device_id, "未知"),
}
for device_id, namespace in host_node.devices_names.items()
}
@@ -41,9 +42,7 @@ def get_host_node_info() -> Dict[str, Any]:
host_info["subscribed_topics"] = sorted(list(host_node._subscribed_topics))
# 获取动作客户端信息
for action_id, client in host_node._action_clients.items():
- host_info["action_clients"] = {
- action_id: get_action_info(client, full_name=action_id)
- }
+ host_info["action_clients"] = {action_id: get_action_info(client, full_name=action_id)}
# 获取设备状态
host_info["device_status"] = host_node.device_status
diff --git a/unilabos/app/web/utils/ros_utils.py b/unilabos/app/web/utils/ros_utils.py
index 01733510..8e1c767c 100644
--- a/unilabos/app/web/utils/ros_utils.py
+++ b/unilabos/app/web/utils/ros_utils.py
@@ -12,6 +12,7 @@ from unilabos.app.web.utils.action_utils import get_action_info
# 存储 ROS 节点信息的全局变量
ros_node_info = {"online_devices": {}, "device_topics": {}, "device_actions": {}}
+
def get_ros_node_info() -> Dict[str, Any]:
"""获取 ROS 节点信息,包括设备节点、发布的状态和动作
@@ -35,6 +36,13 @@ def update_ros_node_info() -> Dict[str, Any]:
try:
from unilabos.ros.nodes.base_device_node import registered_devices
+ from unilabos.ros.nodes.presets.host_node import HostNode
+
+ # 尝试获取主机节点实例
+ host_node = HostNode.get_instance(0)
+ device_machine_names = {}
+ if host_node:
+ device_machine_names = host_node.device_machine_names
for device_id, device_info in registered_devices.items():
# 设备基本信息
@@ -42,6 +50,7 @@ def update_ros_node_info() -> Dict[str, Any]:
"node_name": device_info["node_name"],
"namespace": device_info["namespace"],
"uuid": device_info["uuid"],
+ "machine_name": device_machine_names.get(device_id, "本地"),
}
# 设备话题(状态)信息
@@ -55,10 +64,7 @@ def update_ros_node_info() -> Dict[str, Any]:
}
# 设备动作信息
- result["device_actions"][device_id] = {
- k: get_action_info(v, k)
- for k, v in device_info["actions"].items()
- }
+ result["device_actions"][device_id] = {k: get_action_info(v, k) for k, v in device_info["actions"].items()}
# 更新全局变量
ros_node_info = result
except Exception as e:
diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py
index e8d43b35..2c114412 100644
--- a/unilabos/ros/nodes/presets/host_node.py
+++ b/unilabos/ros/nodes/presets/host_node.py
@@ -14,6 +14,7 @@ from rclpy.callback_groups import ReentrantCallbackGroup
from rclpy.service import Service
from unique_identifier_msgs.msg import UUID
+from unilabos.registry.registry import lab_registry
from unilabos.resources.registry import add_schema
from unilabos.ros.initialize_device import initialize_device_from_dict
from unilabos.ros.msgs.message_converter import (
@@ -97,6 +98,7 @@ class HostNode(BaseROS2DeviceNode):
# 创建设备、动作客户端和目标存储
self.devices_names: Dict[str, str] = {} # 存储设备名称和命名空间的映射
self.devices_instances: Dict[str, ROS2DeviceNode] = {} # 存储设备实例
+ self.device_machine_names: Dict[str, str] = {} # 存储设备ID到机器名称的映射
self._action_clients: Dict[str, ActionClient] = {} # 用来存储多个ActionClient实例
self._action_value_mappings: Dict[str, Dict] = (
{}
@@ -113,6 +115,10 @@ class HostNode(BaseROS2DeviceNode):
self.device_status = {} # 用来存储设备状态
self.device_status_timestamps = {} # 用来存储设备状态最后更新时间
+ from unilabos.app.mq import mqtt_client
+ for device_config in lab_registry.obtain_registry_device_info():
+ mqtt_client.publish_registry(device_config["id"], device_config)
+
# 首次发现网络中的设备
self._discover_devices()
@@ -255,6 +261,7 @@ class HostNode(BaseROS2DeviceNode):
return
# noinspection PyProtectedMember
self.devices_names[device_id] = d._ros_node.namespace
+ self.device_machine_names[device_id] = "本地"
self.devices_instances[device_id] = d
# noinspection PyProtectedMember
for action_name, action_value_mapping in d._ros_node._action_value_mappings.items():
@@ -517,10 +524,17 @@ 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_id in devices_config.keys():
+ self.device_machine_names[device_id] = machine_name
+ self.lab_logger().debug(f"[Host Node] Updated machine name for device {device_id}: {machine_name}")
+
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}")