fix startup

add ResourceCreateFromOuter.action
This commit is contained in:
wznln
2025-05-06 10:39:54 +08:00
parent d6b8104824
commit 3c98c77cab
6 changed files with 48 additions and 47 deletions

View File

@@ -1,30 +1,24 @@
import argparse import argparse
import asyncio import asyncio
import json
import os import os
import signal import signal
import sys import sys
import json import threading
import time import time
from copy import deepcopy
import yaml import yaml
from copy import deepcopy
import threading
import rclpy
from unilabos.ros.nodes.resource_tracker import DeviceNodeResourceTracker
# 首先添加项目根目录到路径 # 首先添加项目根目录到路径
current_dir = os.path.dirname(os.path.abspath(__file__)) current_dir = os.path.dirname(os.path.abspath(__file__))
ilabos_dir = os.path.dirname(os.path.dirname(current_dir)) unilabos_dir = os.path.dirname(os.path.dirname(current_dir))
if ilabos_dir not in sys.path: if unilabos_dir not in sys.path:
sys.path.append(ilabos_dir) sys.path.append(unilabos_dir)
from unilabos.config.config import load_config, BasicConfig, _update_config_from_env from unilabos.config.config import load_config, BasicConfig
from unilabos.utils.banner_print import print_status, print_unilab_banner from unilabos.utils.banner_print import print_status, print_unilab_banner
from unilabos.device_mesh.resource_visalization import ResourceVisualization from unilabos.device_mesh.resource_visalization import ResourceVisualization
from unilabos.ros.nodes.presets.joint_republisher import JointRepublisher
from unilabos.ros.nodes.presets.resource_mesh_manager import ResourceMeshManager
from rclpy.executors import MultiThreadedExecutor
def parse_args(): def parse_args():
@@ -83,9 +77,9 @@ def parse_args():
) )
parser.add_argument( parser.add_argument(
"--visual", "--visual",
choices=["rviz", "web","None"], choices=["rviz", "web", "disable"],
default="rviz", default="disable",
help="选择可视化工具: 'rviz''web''None',默认'rviz'", help="选择可视化工具: rviz, web",
) )
return parser.parse_args() return parser.parse_args()
@@ -137,7 +131,7 @@ def main():
# 注册表 # 注册表
build_registry(args_dict["registry_path"]) build_registry(args_dict["registry_path"])
devices_and_resources = None
if args_dict["graph"] is not None: if args_dict["graph"] is not None:
import unilabos.resources.graphio as graph_res import unilabos.resources.graphio as graph_res
graph_res.physical_setup_graph = ( graph_res.physical_setup_graph = (
@@ -186,23 +180,21 @@ def main():
mqtt_client.start() mqtt_client.start()
args_dict["resources_mesh_config"] = {} args_dict["resources_mesh_config"] = {}
if args_dict["visual"] != "None": if args_dict["visual"] != "disable":
if args_dict["visual"] == "rviz": enable_rviz = args_dict["visual"] == "rviz"
enable_rviz=True if devices_and_resources is not None:
elif args_dict["visual"] == "web": resource_visualization = ResourceVisualization(devices_and_resources, args_dict["resources_config"] ,enable_rviz=enable_rviz)
enable_rviz=False args_dict["resources_mesh_config"] = resource_visualization.resource_model
resource_visualization = ResourceVisualization(devices_and_resources, args_dict["resources_config"] ,enable_rviz=enable_rviz) start_backend(**args_dict)
server_thread = threading.Thread(target=start_server)
args_dict["resources_mesh_config"] = resource_visualization.resource_model server_thread.start()
# 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 asyncio.set_event_loop(asyncio.new_event_loop())
resource_visualization.start()
start_backend(**args_dict) while True:
server_thread = threading.Thread(target=start_server) time.sleep(1)
server_thread.start() else:
asyncio.set_event_loop(asyncio.new_event_loop()) start_backend(**args_dict)
resource_visualization.start() start_server()
while True:
time.sleep(1)
else: else:
start_backend(**args_dict) start_backend(**args_dict)
start_server() start_server()

View File

@@ -19,9 +19,6 @@ gripper.mock:
result: result:
position: position position: position
effort: torque effort: torque
model:
type: device
mesh: opentrons_liquid_handler
gripper.misumi_rz: gripper.misumi_rz:
description: Misumi RZ gripper description: Misumi RZ gripper

View File

@@ -48,14 +48,14 @@ def main(
graph: Optional[Dict[str, Any]] = None, graph: Optional[Dict[str, Any]] = None,
controllers_config: Dict[str, Any] = {}, controllers_config: Dict[str, Any] = {},
bridges: List[Any] = [], bridges: List[Any] = [],
visual: str = "None", visual: str = "disable",
resources_mesh_config: dict = {}, resources_mesh_config: dict = {},
args: List[str] = ["--log-level", "debug"], rclpy_init_args: List[str] = ["--log-level", "debug"],
discovery_interval: float = 5.0, discovery_interval: float = 5.0,
) -> None: ) -> None:
"""主函数""" """主函数"""
rclpy.init(args=args) rclpy.init(args=rclpy_init_args)
executor = rclpy.__executor = MultiThreadedExecutor() executor = rclpy.__executor = MultiThreadedExecutor()
# 创建主机节点 # 创建主机节点
host_node = HostNode( host_node = HostNode(
@@ -96,11 +96,13 @@ def slave(
graph: Optional[Dict[str, Any]] = None, graph: Optional[Dict[str, Any]] = None,
controllers_config: Dict[str, Any] = {}, controllers_config: Dict[str, Any] = {},
bridges: List[Any] = [], bridges: List[Any] = [],
args: List[str] = ["--log-level", "debug"], visual: str = "disable",
resources_mesh_config: dict = {},
rclpy_init_args: List[str] = ["--log-level", "debug"],
) -> None: ) -> None:
"""从节点函数""" """从节点函数"""
if not rclpy.ok(): if not rclpy.ok():
rclpy.init(args=args) rclpy.init(args=rclpy_init_args)
executor = rclpy.__executor executor = rclpy.__executor
if not executor: if not executor:
executor = rclpy.__executor = MultiThreadedExecutor() executor = rclpy.__executor = MultiThreadedExecutor()
@@ -136,7 +138,7 @@ def slave(
logger.info(f"Slave node info updated.") logger.info(f"Slave node info updated.")
rclient = n.create_client(ResourceAdd, "/resources/add") rclient = n.create_client(ResourceAdd, "/resources/add")
rclient.wait_for_service() # FIXME 可能一直等待,加一个参数 rclient.wait_for_service()
request = ResourceAdd.Request() request = ResourceAdd.Request()
request.resources = [convert_to_ros_msg(Resource, resource) for resource in resources_config] request.resources = [convert_to_ros_msg(Resource, resource) for resource in resources_config]

View File

@@ -438,7 +438,7 @@ class BaseROS2DeviceNode(Node, Generic[T]):
action_kwargs = convert_from_ros_msg_with_mapping(goal, action_value_mapping["goal"]) action_kwargs = convert_from_ros_msg_with_mapping(goal, action_value_mapping["goal"])
self.lab_logger().debug(f"接收到原始目标: {action_kwargs}") self.lab_logger().debug(f"接收到原始目标: {action_kwargs}")
# 向Host查询物料当前状态 # 向Host查询物料当前状态如果是host本身的增加物料的请求则直接跳过
for k, v in goal.get_fields_and_field_types().items(): for k, v in goal.get_fields_and_field_types().items():
if v in ["unilabos_msgs/Resource", "sequence<unilabos_msgs/Resource>"]: if v in ["unilabos_msgs/Resource", "sequence<unilabos_msgs/Resource>"]:
self.lab_logger().info(f"查询资源状态: Key: {k} Type: {v}") self.lab_logger().info(f"查询资源状态: Key: {k} Type: {v}")

View File

@@ -101,9 +101,14 @@ class HostNode(BaseROS2DeviceNode):
self.devices_instances: Dict[str, ROS2DeviceNode] = {} # 存储设备实例 self.devices_instances: Dict[str, ROS2DeviceNode] = {} # 存储设备实例
self.device_machine_names: Dict[str, str] = {device_id: "本地", } # 存储设备ID到机器名称的映射 self.device_machine_names: Dict[str, str] = {device_id: "本地", } # 存储设备ID到机器名称的映射
self._action_clients: Dict[str, ActionClient] = {} # 用来存储多个ActionClient实例 self._action_clients: Dict[str, ActionClient] = {} # 用来存储多个ActionClient实例
self._action_value_mappings: Dict[str, Dict] = ( self._action_value_mappings: Dict[str, Dict] = {
{} "add_resrouce": {
) # 用来存储多个ActionClient的type, goal, feedback, result的变量名映射关系 "type": ResourceCreateFromOuter,
"goal": {
}
}
} # 用来存储多个ActionClient的type, goal, feedback, result的变量名映射关系
self._goals: Dict[str, Any] = {} # 用来存储多个目标的状态 self._goals: Dict[str, Any] = {} # 用来存储多个目标的状态
self._online_devices: Set[str] = set() # 用于跟踪在线设备 self._online_devices: Set[str] = set() # 用于跟踪在线设备
self._last_discovery_time = 0.0 # 上次设备发现的时间 self._last_discovery_time = 0.0 # 上次设备发现的时间

View File

@@ -0,0 +1,5 @@
Resource[] resources
string[] device_ids
---
bool success
---