Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion unilabos/app/web/utils/host_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +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
Expand Down
2 changes: 1 addition & 1 deletion unilabos/registry/devices/organic_miscellaneous.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ separator.homemade:
goal:
stir_time: stir_time,
stir_speed: stir_speed
settling_time": settling_time
settling_time: settling_time
feedback:
status: status
result:
Expand Down
19 changes: 19 additions & 0 deletions unilabos/registry/devices/vacuum_and_purge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,25 @@ vacuum_pump.mock:
class:
module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock
type: python
status_types:
status: String
action_value_mappings:
open:
type: EmptyIn
goal: {}
feedback: {}
result: {}
close:
type: EmptyIn
goal: {}
feedback: {}
result: {}
set_status:
type: StrSingleInput
goal:
string: string
feedback: {}
result: {}

gas_source.mock:
description: Mock gas source
Expand Down
9 changes: 7 additions & 2 deletions unilabos/registry/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,13 @@ def load_device_types(self, path: os.PathLike):
action_config["type"] = self._replace_type_with_class(
action_config["type"], device_id, f"动作 {action_name}"
)
action_config["goal_default"] = yaml.safe_load(io.StringIO(get_yaml_from_goal_type(action_config["type"].Goal)))
action_config["schema"] = ros_action_to_json_schema(action_config["type"])
if action_config["type"] is not None:
action_config["goal_default"] = yaml.safe_load(io.StringIO(get_yaml_from_goal_type(action_config["type"].Goal)))
action_config["schema"] = ros_action_to_json_schema(action_config["type"])
else:
logger.warning(
f"[UniLab Registry] 设备 {device_id} 的动作 {action_name} 类型为空,跳过替换"
)

self.device_type_registry.update(data)

Expand Down
5 changes: 5 additions & 0 deletions unilabos/ros/nodes/base_device_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ def register_device(self):
# 加入全局注册表
registered_devices[self.device_id] = device_info
from unilabos.config.config import BasicConfig
from unilabos.ros.nodes.presets.host_node import HostNode
if not BasicConfig.is_host_mode:
sclient = self.create_client(SerialCommand, "/node_info_update")
# 启动线程执行发送任务
Expand All @@ -413,6 +414,10 @@ def register_device(self):
daemon=True,
name=f"ROSDevice{self.device_id}_send_slave_node_info"
).start()
else:
host_node = HostNode.get_instance(0)
if host_node is not None:
host_node.device_machine_names[self.device_id] = "本地"

def send_slave_node_info(self, sclient):
sclient.wait_for_service()
Expand Down
16 changes: 13 additions & 3 deletions unilabos/ros/nodes/presets/host_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,22 @@ def __init__(
].items():
controller_config["update_rate"] = update_rate
self.initialize_controller(controller_id, controller_config)

resource_with_parent_name = []
resource_ids_to_instance = {i["id"]: i for i in resources_config}
for res in resources_config:
if res.get("parent") and res.get("type") == "device" and res.get("class"):
parent_id = res.get("parent")
parent_res = resource_ids_to_instance[parent_id]
if parent_res.get("type") == "device" and parent_res.get("class"):
resource_with_parent_name.append(copy.deepcopy(res))
resource_with_parent_name[-1]["id"] = f"{parent_res['id']}/{res['id']}"
continue
resource_with_parent_name.append(copy.deepcopy(res))
try:
for bridge in self.bridges:
if hasattr(bridge, "resource_add"):
self.lab_logger().info("[Host Node-Resource] Adding resources to bridge.")
bridge.resource_add(add_schema(resources_config))
resource_add_res = bridge.resource_add(add_schema(resource_with_parent_name))
except Exception as ex:
self.lab_logger().error("[Host Node-Resource] 添加物料出错!")
self.lab_logger().error(traceback.format_exc())
Expand Down Expand Up @@ -191,7 +201,7 @@ def _discover_devices(self) -> None:

# 如果是新设备,记录并创建ActionClient
if edge_device_id not in self.devices_names:
self.lab_logger().info(f"[Host Node] Discovered new device: {device_key}")
self.lab_logger().info(f"[Host Node] Discovered new device: {edge_device_id}")
self.devices_names[edge_device_id] = namespace
self._create_action_clients_for_device(device_id, namespace)
self._online_devices.add(device_key)
Expand Down