mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2025-12-17 21:11:12 +00:00
Add get_resource_with_dir & get_resource method
(cherry picked from commit 4189a2cfbe)
This commit is contained in:
@@ -588,6 +588,61 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
self.lab_logger().error(traceback.format_exc())
|
self.lab_logger().error(traceback.format_exc())
|
||||||
self.lab_logger().debug(f"资源更新结果: {response}")
|
self.lab_logger().debug(f"资源更新结果: {response}")
|
||||||
|
|
||||||
|
async def get_resource(self, resources_uuid: List[str], with_children: bool = True) -> ResourceTreeSet:
|
||||||
|
"""
|
||||||
|
根据资源UUID列表获取资源树
|
||||||
|
|
||||||
|
Args:
|
||||||
|
resources_uuid: 资源UUID列表
|
||||||
|
with_children: 是否包含子节点,默认为True
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
ResourceTreeSet: 资源树集合
|
||||||
|
"""
|
||||||
|
response: SerialCommand.Response = await self._resource_clients["c2s_update_resource_tree"].call_async(
|
||||||
|
SerialCommand.Request(
|
||||||
|
command=json.dumps(
|
||||||
|
{
|
||||||
|
"data": {"data": resources_uuid, "with_children": with_children},
|
||||||
|
"action": "get",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) # type: ignore
|
||||||
|
raw_nodes = json.loads(response.response)
|
||||||
|
tree_set = ResourceTreeSet.from_raw_list(raw_nodes)
|
||||||
|
self.lab_logger().debug(f"获取资源结果: {len(tree_set.trees)} 个资源树")
|
||||||
|
return tree_set
|
||||||
|
|
||||||
|
async def get_resource_with_dir(self, resource_id: str, with_children: bool = True) -> "ResourcePLR":
|
||||||
|
"""
|
||||||
|
根据资源ID获取单个资源实例
|
||||||
|
|
||||||
|
Args:
|
||||||
|
resource_ids: 资源ID字符串
|
||||||
|
with_children: 是否包含子节点,默认为True
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
ResourcePLR: PLR资源实例
|
||||||
|
"""
|
||||||
|
r = SerialCommand.Request()
|
||||||
|
r.command = json.dumps(
|
||||||
|
{
|
||||||
|
"id": resource_id,
|
||||||
|
"uuid": None,
|
||||||
|
"with_children": with_children,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# 发送请求并等待响应
|
||||||
|
response: SerialCommand_Response = await self._resource_clients["resource_get"].call_async(r)
|
||||||
|
raw_data = json.loads(response.response)
|
||||||
|
|
||||||
|
# 转换为 PLR 资源
|
||||||
|
tree_set = ResourceTreeSet.from_raw_list(raw_data)
|
||||||
|
plr_resource = tree_set.to_plr_resources()[0]
|
||||||
|
self.lab_logger().debug(f"获取资源 {resource_id} 成功")
|
||||||
|
return plr_resource
|
||||||
|
|
||||||
def transfer_to_new_resource(
|
def transfer_to_new_resource(
|
||||||
self, plr_resource: "ResourcePLR", tree: ResourceTreeInstance, additional_add_params: Dict[str, Any]
|
self, plr_resource: "ResourcePLR", tree: ResourceTreeInstance, additional_add_params: Dict[str, Any]
|
||||||
):
|
):
|
||||||
@@ -808,17 +863,9 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
)
|
)
|
||||||
tree_set = None
|
tree_set = None
|
||||||
if action in ["add", "update"]:
|
if action in ["add", "update"]:
|
||||||
response: SerialCommand.Response = await self._resource_clients[
|
tree_set = await self.get_resource(
|
||||||
"c2s_update_resource_tree"
|
resources_uuid=resources_uuid, with_children=True if action == "add" else False
|
||||||
].call_async(
|
)
|
||||||
SerialCommand.Request(
|
|
||||||
command=json.dumps(
|
|
||||||
{"data": {"data": resources_uuid, "with_children": True if action == "add" else False}, "action": "get"}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) # type: ignore
|
|
||||||
raw_nodes = json.loads(response.response)
|
|
||||||
tree_set = ResourceTreeSet.from_raw_list(raw_nodes)
|
|
||||||
try:
|
try:
|
||||||
if action == "add":
|
if action == "add":
|
||||||
if tree_set is None:
|
if tree_set is None:
|
||||||
@@ -1096,23 +1143,9 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
# 批量查询资源
|
# 批量查询资源
|
||||||
queried_resources = []
|
queried_resources = []
|
||||||
for resource_data in resource_inputs:
|
for resource_data in resource_inputs:
|
||||||
r = SerialCommand.Request()
|
plr_resource = await self.get_resource_with_dir(
|
||||||
r.command = json.dumps(
|
resource_ids=resource_data["id"], with_children=True
|
||||||
{
|
|
||||||
"id": resource_data["id"],
|
|
||||||
"uuid": resource_data.get("uuid", None),
|
|
||||||
"with_children": True,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
# 发送请求并等待响应
|
|
||||||
response: SerialCommand_Response = await self._resource_clients[
|
|
||||||
"resource_get"
|
|
||||||
].call_async(r)
|
|
||||||
raw_data = json.loads(response.response)
|
|
||||||
|
|
||||||
# 转换为 PLR 资源
|
|
||||||
tree_set = ResourceTreeSet.from_raw_list(raw_data)
|
|
||||||
plr_resource = tree_set.to_plr_resources()[0]
|
|
||||||
queried_resources.append(plr_resource)
|
queried_resources.append(plr_resource)
|
||||||
|
|
||||||
self.lab_logger().debug(f"资源查询结果: 共 {len(queried_resources)} 个资源")
|
self.lab_logger().debug(f"资源查询结果: 共 {len(queried_resources)} 个资源")
|
||||||
@@ -1352,12 +1385,18 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
"""同步转换资源数据为实例"""
|
"""同步转换资源数据为实例"""
|
||||||
# 创建资源查询请求
|
# 创建资源查询请求
|
||||||
r = SerialCommand.Request()
|
r = SerialCommand.Request()
|
||||||
r.command = json.dumps({"id": resource_data["id"], "with_children": True})
|
r.command = json.dumps(
|
||||||
|
{
|
||||||
|
"id": resource_data.get("id", None),
|
||||||
|
"uuid": resource_data.get("uuid", None),
|
||||||
|
"with_children": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# 同步调用资源查询服务
|
# 同步调用资源查询服务
|
||||||
future = self._resource_clients["resource_get"].call_async(r)
|
future = self._resource_clients["resource_get"].call_async(r)
|
||||||
|
|
||||||
# 等待结果(使用while循环,每次sleep 0.5秒,最多等待5秒)
|
# 等待结果(使用while循环,每次sleep 0.05秒,最多等待30秒)
|
||||||
timeout = 30.0
|
timeout = 30.0
|
||||||
elapsed = 0.0
|
elapsed = 0.0
|
||||||
while not future.done() and elapsed < timeout:
|
while not future.done() and elapsed < timeout:
|
||||||
@@ -1365,16 +1404,16 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
elapsed += 0.05
|
elapsed += 0.05
|
||||||
|
|
||||||
if not future.done():
|
if not future.done():
|
||||||
raise Exception(f"资源查询超时: {resource_data['id']}")
|
raise Exception(f"资源查询超时: {resource_data}")
|
||||||
|
|
||||||
response = future.result()
|
response = future.result()
|
||||||
if response is None:
|
if response is None:
|
||||||
raise Exception(f"资源查询返回空结果: {resource_data['id']}")
|
raise Exception(f"资源查询返回空结果: {resource_data}")
|
||||||
|
|
||||||
current_resources = json.loads(response.response)
|
raw_data = json.loads(response.response)
|
||||||
|
|
||||||
# 转换为 PLR 资源
|
# 转换为 PLR 资源
|
||||||
tree_set = ResourceTreeSet.from_raw_list(current_resources)
|
tree_set = ResourceTreeSet.from_raw_list(raw_data)
|
||||||
plr_resource = tree_set.to_plr_resources()[0]
|
plr_resource = tree_set.to_plr_resources()[0]
|
||||||
|
|
||||||
# 通过资源跟踪器获取本地实例
|
# 通过资源跟踪器获取本地实例
|
||||||
@@ -1459,17 +1498,8 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
|
|
||||||
async def _convert_resource_async(self, resource_data: Dict[str, Any]):
|
async def _convert_resource_async(self, resource_data: Dict[str, Any]):
|
||||||
"""异步转换资源数据为实例"""
|
"""异步转换资源数据为实例"""
|
||||||
# 创建资源查询请求
|
# 使用封装的get_resource_with_dir方法获取PLR资源
|
||||||
r = SerialCommand.Request()
|
plr_resource = await self.get_resource_with_dir(resource_ids=resource_data["id"], with_children=True)
|
||||||
r.command = json.dumps({"id": resource_data["id"], "with_children": True})
|
|
||||||
|
|
||||||
# 异步调用资源查询服务
|
|
||||||
response: SerialCommand_Response = await self._resource_clients["resource_get"].call_async(r)
|
|
||||||
current_resources = json.loads(response.response)
|
|
||||||
|
|
||||||
# 转换为 PLR 资源
|
|
||||||
tree_set = ResourceTreeSet.from_raw_list(current_resources)
|
|
||||||
plr_resource = tree_set.to_plr_resources()[0]
|
|
||||||
|
|
||||||
# 通过资源跟踪器获取本地实例
|
# 通过资源跟踪器获取本地实例
|
||||||
res = self.resource_tracker.figure_resource(plr_resource, try_mode=True)
|
res = self.resource_tracker.figure_resource(plr_resource, try_mode=True)
|
||||||
@@ -1532,7 +1562,9 @@ class ROS2DeviceNode:
|
|||||||
@classmethod
|
@classmethod
|
||||||
async def async_wait_for(cls, node: Node, wait_time: float, callback_group=None):
|
async def async_wait_for(cls, node: Node, wait_time: float, callback_group=None):
|
||||||
future = Future()
|
future = Future()
|
||||||
timer = node.create_timer(wait_time, lambda : future.set_result(None), callback_group=callback_group, clock=node.get_clock())
|
timer = node.create_timer(
|
||||||
|
wait_time, lambda: future.set_result(None), callback_group=callback_group, clock=node.get_clock()
|
||||||
|
)
|
||||||
await future
|
await future
|
||||||
timer.cancel()
|
timer.cancel()
|
||||||
node.destroy_timer(timer)
|
node.destroy_timer(timer)
|
||||||
|
|||||||
Reference in New Issue
Block a user