mirror of
https://github.com/deepmodeling/Uni-Lab-OS
synced 2026-04-25 19:59:54 +00:00
Fix skills exec error with action type
This commit is contained in:
@@ -152,6 +152,7 @@ class HTTPClient:
|
|||||||
logger.error(f"查询物料失败: {response.text}")
|
logger.error(f"查询物料失败: {response.text}")
|
||||||
else:
|
else:
|
||||||
data = res["data"]["nodes"]
|
data = res["data"]["nodes"]
|
||||||
|
logger.trace(f"resource_tree_get查询到物料: {data}")
|
||||||
return data
|
return data
|
||||||
else:
|
else:
|
||||||
logger.error(f"查询物料失败: {response.text}")
|
logger.error(f"查询物料失败: {response.text}")
|
||||||
|
|||||||
@@ -1712,7 +1712,10 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
if future is not None:
|
if future is not None:
|
||||||
if isinstance(future, Task):
|
if isinstance(future, Task):
|
||||||
# rclpy Task:直接 await,完成瞬间唤醒
|
# rclpy Task:直接 await,完成瞬间唤醒
|
||||||
_raw_result = await future
|
try:
|
||||||
|
_raw_result = await future
|
||||||
|
except Exception as e:
|
||||||
|
_raw_result = e
|
||||||
else:
|
else:
|
||||||
# concurrent.futures.Future(同步 action):用 rclpy 兼容的轮询
|
# concurrent.futures.Future(同步 action):用 rclpy 兼容的轮询
|
||||||
_poll_future = Future()
|
_poll_future = Future()
|
||||||
@@ -1723,7 +1726,10 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
|
|
||||||
future.add_done_callback(_on_sync_done)
|
future.add_done_callback(_on_sync_done)
|
||||||
await _poll_future
|
await _poll_future
|
||||||
_raw_result = future.result()
|
try:
|
||||||
|
_raw_result = future.result()
|
||||||
|
except Exception as e:
|
||||||
|
_raw_result = e
|
||||||
|
|
||||||
# 确保 execution_error/success 被正确设置(不依赖 done callback 时序)
|
# 确保 execution_error/success 被正确设置(不依赖 done callback 时序)
|
||||||
if isinstance(_raw_result, BaseException):
|
if isinstance(_raw_result, BaseException):
|
||||||
@@ -1749,8 +1755,12 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
# self.lab_logger().info(f"动作执行完成: {action_name}")
|
# self.lab_logger().info(f"动作执行完成: {action_name}")
|
||||||
del future
|
del future
|
||||||
|
|
||||||
|
# 执行失败时跳过物料状态更新
|
||||||
|
if execution_error:
|
||||||
|
execution_success = False
|
||||||
|
|
||||||
# 向Host更新物料当前状态
|
# 向Host更新物料当前状态
|
||||||
if action_name not in ["create_resource_detailed", "create_resource"]:
|
if not execution_error and action_name not in ["create_resource_detailed", "create_resource"]:
|
||||||
for k, v in goal.get_fields_and_field_types().items():
|
for k, v in goal.get_fields_and_field_types().items():
|
||||||
if v not in ["unilabos_msgs/Resource", "sequence<unilabos_msgs/Resource>"]:
|
if v not in ["unilabos_msgs/Resource", "sequence<unilabos_msgs/Resource>"]:
|
||||||
continue
|
continue
|
||||||
@@ -1806,7 +1816,7 @@ class BaseROS2DeviceNode(Node, Generic[T]):
|
|||||||
|
|
||||||
for attr_name in result_msg_types.keys():
|
for attr_name in result_msg_types.keys():
|
||||||
if attr_name in ["success", "reached_goal"]:
|
if attr_name in ["success", "reached_goal"]:
|
||||||
setattr(result_msg, attr_name, True)
|
setattr(result_msg, attr_name, execution_success)
|
||||||
elif attr_name == "return_info":
|
elif attr_name == "return_info":
|
||||||
setattr(
|
setattr(
|
||||||
result_msg,
|
result_msg,
|
||||||
|
|||||||
@@ -1175,6 +1175,7 @@ class HostNode(BaseROS2DeviceNode):
|
|||||||
|
|
||||||
resource_response = http_client.resource_tree_get(uuid_list, with_children)
|
resource_response = http_client.resource_tree_get(uuid_list, with_children)
|
||||||
response.response = json.dumps(resource_response)
|
response.response = json.dumps(resource_response)
|
||||||
|
self.lab_logger().trace(f"[Host Node-Resource] Resource tree get request callback {response.response}")
|
||||||
|
|
||||||
async def _resource_tree_action_remove_callback(self, data: dict, response: SerialCommand_Response):
|
async def _resource_tree_action_remove_callback(self, data: dict, response: SerialCommand_Response):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user