diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/joint_config.json b/unilabos/device_mesh/device/opentrons_liquid_handler/joint_config.json
new file mode 100644
index 00000000..e40339da
--- /dev/null
+++ b/unilabos/device_mesh/device/opentrons_liquid_handler/joint_config.json
@@ -0,0 +1,18 @@
+{
+ "first_joint": {
+ "child":"first_link",
+ "axis" : "-y"
+ },
+ "second_joint": {
+ "child":"second_link",
+ "axis" : "-x"
+ },
+ "third_joint": {
+ "child":"third_link",
+ "axis" : "-z"
+ },
+ "fourth_joint": {
+ "child":"fourth_link",
+ "axis" : "-z"
+ }
+}
\ No newline at end of file
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/macro_device.xacro b/unilabos/device_mesh/device/opentrons_liquid_handler/macro_device.xacro
new file mode 100644
index 00000000..7431c20b
--- /dev/null
+++ b/unilabos/device_mesh/device/opentrons_liquid_handler/macro_device.xacro
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-0.fbx b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-0.fbx
new file mode 100644
index 00000000..5687a596
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-0.fbx differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-0.stl b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-0.stl
new file mode 100644
index 00000000..5a2f71e8
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-0.stl differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-1.fbx b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-1.fbx
new file mode 100644
index 00000000..201167d1
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-1.fbx differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-1.stl b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-1.stl
new file mode 100644
index 00000000..a47b9020
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-1.stl differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-2.fbx b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-2.fbx
new file mode 100644
index 00000000..4e716336
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-2.fbx differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-2.stl b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-2.stl
new file mode 100644
index 00000000..a1d118ff
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-2.stl differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3a.fbx b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3a.fbx
new file mode 100644
index 00000000..32234365
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3a.fbx differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3a.stl b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3a.stl
new file mode 100644
index 00000000..7d31a8d6
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3a.stl differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3b.fbx b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3b.fbx
new file mode 100644
index 00000000..8f5fd4ff
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3b.fbx differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3b.stl b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3b.stl
new file mode 100644
index 00000000..fa674839
Binary files /dev/null and b/unilabos/device_mesh/device/opentrons_liquid_handler/meshes/ot2-3b.stl differ
diff --git a/unilabos/device_mesh/device/opentrons_liquid_handler/param_config.json b/unilabos/device_mesh/device/opentrons_liquid_handler/param_config.json
new file mode 100644
index 00000000..749feb47
--- /dev/null
+++ b/unilabos/device_mesh/device/opentrons_liquid_handler/param_config.json
@@ -0,0 +1,10 @@
+{
+ "private_param":
+ {
+
+ },
+ "public_param":
+ {
+
+ }
+}
diff --git a/unilabos/device_mesh/device/slide_w140/joint_config.json b/unilabos/device_mesh/device/slide_w140/joint_config.json
new file mode 100644
index 00000000..168bb0d4
--- /dev/null
+++ b/unilabos/device_mesh/device/slide_w140/joint_config.json
@@ -0,0 +1,6 @@
+{
+ "slider_joint": {
+ "child":"slider",
+ "axis" : "x"
+ }
+}
\ No newline at end of file
diff --git a/unilabos/device_mesh/device/slide_w140/macro_device.xacro b/unilabos/device_mesh/device/slide_w140/macro_device.xacro
new file mode 100644
index 00000000..ffbc6f79
--- /dev/null
+++ b/unilabos/device_mesh/device/slide_w140/macro_device.xacro
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/base_link.STL b/unilabos/device_mesh/device/slide_w140/meshes/base_link.STL
new file mode 100755
index 00000000..f2ae347c
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/base_link.STL differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/base_link.fbx b/unilabos/device_mesh/device/slide_w140/meshes/base_link.fbx
new file mode 100644
index 00000000..8439d485
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/base_link.fbx differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/length.STL b/unilabos/device_mesh/device/slide_w140/meshes/length.STL
new file mode 100755
index 00000000..df420447
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/length.STL differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/length.fbx b/unilabos/device_mesh/device/slide_w140/meshes/length.fbx
new file mode 100644
index 00000000..b46c2c1e
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/length.fbx differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/slide_end.STL b/unilabos/device_mesh/device/slide_w140/meshes/slide_end.STL
new file mode 100755
index 00000000..3eaf9e01
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/slide_end.STL differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/slide_end.fbx b/unilabos/device_mesh/device/slide_w140/meshes/slide_end.fbx
new file mode 100644
index 00000000..de0331ba
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/slide_end.fbx differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/slider.STL b/unilabos/device_mesh/device/slide_w140/meshes/slider.STL
new file mode 100755
index 00000000..d4b74347
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/slider.STL differ
diff --git a/unilabos/device_mesh/device/slide_w140/meshes/slider.fbx b/unilabos/device_mesh/device/slide_w140/meshes/slider.fbx
new file mode 100644
index 00000000..38b9814b
Binary files /dev/null and b/unilabos/device_mesh/device/slide_w140/meshes/slider.fbx differ
diff --git a/unilabos/device_mesh/device/slide_w140/param_config.json b/unilabos/device_mesh/device/slide_w140/param_config.json
new file mode 100644
index 00000000..d1c9213b
--- /dev/null
+++ b/unilabos/device_mesh/device/slide_w140/param_config.json
@@ -0,0 +1,12 @@
+{
+ "private_param":
+ {
+ "min_d": 0.1 ,
+ "max_d": 0.1 ,
+ "slider_d": 0.14
+ },
+ "public_param":
+ {
+ "length" :0.1
+ }
+}
\ No newline at end of file
diff --git a/unilabos/device_mesh/resource/generic_labware_tube_10_75/0_base.png b/unilabos/device_mesh/resource/generic_labware_tube_10_75/0_base.png
new file mode 100644
index 00000000..d9de252f
Binary files /dev/null and b/unilabos/device_mesh/resource/generic_labware_tube_10_75/0_base.png differ
diff --git a/unilabos/device_mesh/resource/generic_labware_tube_10_75/meshes/0_base.glb b/unilabos/device_mesh/resource/generic_labware_tube_10_75/meshes/0_base.glb
new file mode 100644
index 00000000..1c64cc4e
Binary files /dev/null and b/unilabos/device_mesh/resource/generic_labware_tube_10_75/meshes/0_base.glb differ
diff --git a/unilabos/device_mesh/resource/generic_labware_tube_10_75/meshes/0_base.stl b/unilabos/device_mesh/resource/generic_labware_tube_10_75/meshes/0_base.stl
new file mode 100644
index 00000000..023cf1a2
Binary files /dev/null and b/unilabos/device_mesh/resource/generic_labware_tube_10_75/meshes/0_base.stl differ
diff --git a/unilabos/device_mesh/resource/generic_labware_tube_10_75/meta.json b/unilabos/device_mesh/resource/generic_labware_tube_10_75/meta.json
new file mode 100644
index 00000000..84f4657b
--- /dev/null
+++ b/unilabos/device_mesh/resource/generic_labware_tube_10_75/meta.json
@@ -0,0 +1,22 @@
+{
+ "fileName": "generic_labware_tube_10_75",
+ "related": [
+ "generic_labware_0.5ml_screw_cap_tube",
+ "generic_labware_0.5ml_tube_rack",
+ "generic_labware_12_well_plate",
+ "sarstedt_14x200mm_tube",
+ "sarstedt_18x200mm_tube",
+ "generic_labware_1ml_tube_rack",
+ "generic_labware_24_well_plate",
+ "generic_labware_2ml_screw_cap_tube",
+ "generic_labware_5ml_screw_cap_tube",
+ "generic_labware_6_well_plate",
+ "generic_labware_96_well_square",
+ "generic_labware_96_well_pcr_plate_round",
+ "generic_labware_framedtiprack",
+ "generic_labware_plate_lid",
+ "generic_labware_reservoir",
+ "generic_labware_tip_box",
+ "generic_labware_tube_10_75"
+ ]
+}
diff --git a/unilabos/device_mesh/resource/generic_labware_tube_10_75/modal.xacro b/unilabos/device_mesh/resource/generic_labware_tube_10_75/modal.xacro
new file mode 100644
index 00000000..65711112
--- /dev/null
+++ b/unilabos/device_mesh/resource/generic_labware_tube_10_75/modal.xacro
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/unilabos/device_mesh/resource/tecan_nested_tip_rack/meshes/plate.glb b/unilabos/device_mesh/resource/tecan_nested_tip_rack/meshes/plate.glb
new file mode 100644
index 00000000..afb6c99b
Binary files /dev/null and b/unilabos/device_mesh/resource/tecan_nested_tip_rack/meshes/plate.glb differ
diff --git a/unilabos/device_mesh/resource/tecan_nested_tip_rack/meshes/plate.stl b/unilabos/device_mesh/resource/tecan_nested_tip_rack/meshes/plate.stl
new file mode 100644
index 00000000..2655ff94
Binary files /dev/null and b/unilabos/device_mesh/resource/tecan_nested_tip_rack/meshes/plate.stl differ
diff --git a/unilabos/device_mesh/resource/tecan_nested_tip_rack/meta.json b/unilabos/device_mesh/resource/tecan_nested_tip_rack/meta.json
new file mode 100644
index 00000000..1b437d1f
--- /dev/null
+++ b/unilabos/device_mesh/resource/tecan_nested_tip_rack/meta.json
@@ -0,0 +1,86 @@
+{
+ "fileName": "tecan_nested_tip_rack",
+ "related": [
+ "tecan_techrom",
+ "tecan_holder_transfer_tool",
+ "tecan_fluent_9_grid_segment_cutout",
+ "tecan_fluent_centric_gripper",
+ "tecan_fluent_eccentric_gripper",
+ "tecan_evo100",
+ "tecan_fluent_mp_diti_nest_segment",
+ "tecan_fluent_4x100_trough",
+ "tecan_fluent_1080_extended",
+ "tecan_fluent_1_1_1000_trough",
+ "tecan_fluent_50ml_tube_runner_10_v2",
+ "tecan_fluent_15ml_tube_runner_16_v2",
+ "tecan_fluent_1_16_16_tube_runner",
+ "tecan_fluent_1.5ml_tube_runner_v2",
+ "tecan_fluent_1_24_10_tube_runner",
+ "tecan_fluent_1_24_13_tube_runner",
+ "tecan_fluent_3x320_reagent_trough_v2",
+ "tecan_fluent_32_tube_runner_v2",
+ "tecan_fluent_1_4_100_trough",
+ "tecan_fluent_2_grid_segment",
+ "tecan_fluent_2_4_100_trough_waste",
+ "tecan_fluent_3_grid_segment",
+ "tecan_fluent_nest_waste_segment_v2",
+ "tecan_fluent_320ml_reagent_trough",
+ "tecan_fluent_4_landscape_61mm_nest_segment",
+ "tecan_fluent_4_landscape_61mm_nest_segment_waste",
+ "tecan_fluent_4_landscape_7mm_nest_segment",
+ "tecan_fluent_4_landscape_7mm_nest_segment_waste",
+ "tecan_fluent_hotel_deck_4",
+ "tecan_fluent_480_extended",
+ "tecan_fluent_4x100_reagent_trough_v2",
+ "tecan_fluent_5_landscape_61mm_nest_segment",
+ "tecan_fluent_5_landscape_7mm_nest_segment",
+ "tecan_fluent_hotel_deck_5",
+ "tecan_fluent_6_grid_segment",
+ "tecan_fluent_nest_landscape_segment_v2",
+ "tecan_fluent_6_landscape_7mm_nest_segment",
+ "tecan_fluent_deck_segment_6_v2",
+ "tecan_fluent_fca_diti_segment_v2",
+ "tecan_fluent_6_nest_incubator",
+ "tecan_fluent_plate_nest",
+ "tecan_fluent_780_extended",
+ "tecan_fluent_plate_holder",
+ "tecan_fluent_8_grid_segment",
+ "tecan_fluent_8_grid_segment_evo",
+ "tecan_fluent_hotel_deck_9",
+ "tecan_carousel",
+ "tecan_carousel_stacker_10",
+ "tecan_carousel_stacker_25",
+ "tecan_carousel_stacker_6",
+ "tecan_fluent_coolheat_microplate_segment_v2",
+ "tecan_fluent_fca_diti_tray",
+ "tecan_fluent_trough_waste",
+ "tecan_fluent_id_left",
+ "tecan_fluent_id_middle",
+ "tecan_fluent_lower_6_grid_v2",
+ "tecan_fluent_mc384_nest",
+ "tecan_fluent_mca_44mm_nest",
+ "tecan_fluent_deck_segment_4_v2",
+ "tecan_fluent_mca_base_segment_384_v2",
+ "tecan_fluent_waste_module",
+ "tecan_fluent_reagent_block",
+ "tecan_fluent_tube_grippers",
+ "tecan_fluent_washstation_waste_v2",
+ "tecan_carrier_additive_trough_3_pce_max_100ml",
+ "tecan_carrier_384_well_mp_3_pos_accessible_roma",
+ "tecan_carrier_rack_3_diti_width_6",
+ "tecan_transport_box_diti_tray_1000ul",
+ "tecan_transport_box_diti_tray_200ul",
+ "tecan_magicprep_ngs_sample_deck",
+ "tecan_fluent_shelf_large",
+ "tecan_fluent_shelf_small",
+ "tecan_spacer_29_9_te_chrom",
+ "tecan_teshake_adapter_2",
+ "tecan_teshake_base",
+ "tecan_tevacs_base",
+ "tecan_tevacs_plate_park",
+ "tecan_tevacs_spacer",
+ "tecan_tevacs_vacuum",
+ "tecan_tip_box",
+ "tecan_nested_tip_rack"
+ ]
+}
diff --git a/unilabos/device_mesh/resource/tecan_nested_tip_rack/modal.xacro b/unilabos/device_mesh/resource/tecan_nested_tip_rack/modal.xacro
new file mode 100644
index 00000000..e29617fa
--- /dev/null
+++ b/unilabos/device_mesh/resource/tecan_nested_tip_rack/modal.xacro
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/unilabos/device_mesh/resource/tecan_nested_tip_rack/plate.png b/unilabos/device_mesh/resource/tecan_nested_tip_rack/plate.png
new file mode 100644
index 00000000..34d7ac68
Binary files /dev/null and b/unilabos/device_mesh/resource/tecan_nested_tip_rack/plate.png differ
diff --git a/unilabos/device_mesh/resource_visalization.py b/unilabos/device_mesh/resource_visalization.py
new file mode 100644
index 00000000..d4a1a712
--- /dev/null
+++ b/unilabos/device_mesh/resource_visalization.py
@@ -0,0 +1,132 @@
+from launch import LaunchService
+from launch import LaunchDescription
+from launch_ros.actions import Node as nd
+import xacro
+from lxml import etree
+
+
+class ResourceVisualization:
+ def __init__(self, device: dict, registry: dict, resource: dict, enable_rviz: bool = False):
+
+ """初始化资源可视化类
+
+ Args:
+ device: 设备配置字典
+ registry: 注册表字典
+ """
+ self.launch_service = LaunchService()
+ self.launch_description = LaunchDescription()
+ self.resource_dict = resource
+ self.resource_model = {}
+ self.resource_type = ['plate', 'container']
+
+ self.robot_state_str= '''
+
+
+
+ '''
+ self.root = etree.fromstring(self.robot_state_str)
+
+ xacro_uri = self.root.nsmap["xacro"]
+ # 遍历设备节点
+ for node in device['nodes']:
+ if node['type'] == 'device':
+ device_class = node['class']
+
+ # 检查设备类型是否在注册表中
+ if device_class not in registry.device_type_registry.keys():
+ raise ValueError(f"设备类型 {device_class} 未在注册表中注册")
+
+ elif "model" in device_class.keys():
+ model_config = registry.device_type_registry[device_class]['model']
+
+ if model_config['type'] == 'device':
+ new_include = etree.SubElement(self.root, f"{{{xacro_uri}}}include")
+ new_include.set("filename", f"{model_config['mesh']}/macro_device.xacro")
+ new_dev = etree.SubElement(self.root, f"{{{xacro_uri}}}{model_config['mesh']}")
+ new_dev.set("parent_link", "world")
+
+ elif node['type'] in self.resource_type:
+ resource_class = node['class']
+ if resource_class not in registry.resource_type_registry.keys():
+ raise ValueError(f"资源类型 {resource_class} 未在注册表中注册")
+ if model_config['type'] == 'resource':
+ model_config = registry.resource_type_registry[resource_class]['model']
+ self.resource_model[node['id']] = model_config['mesh']
+ if model_config['children_mesh'] is not None:
+ self.resource_model[f"{node['id']}_"] = model_config['children_mesh']
+
+ re = etree.tostring(self.root, encoding="unicode")
+ doc = xacro.parse(re)
+ xacro.process_doc(doc)
+
+
+ def create_launch_description(self, urdf_str: str, enable_rviz: bool = False) -> LaunchDescription:
+ """
+ 创建launch描述,包含robot_state_publisher和move_group节点
+
+ Args:
+ urdf_str: URDF文本
+ enable_rviz: 是否启用RViz可视化
+
+ Returns:
+ LaunchDescription: launch描述对象
+ """
+
+
+ # 解析URDF文件
+ robot_description = urdf_str
+
+ # 创建robot_state_publisher节点
+ robot_state_publisher = nd(
+ package='robot_state_publisher',
+ executable='robot_state_publisher',
+ name='robot_state_publisher',
+ output='screen',
+ parameters=[{
+ 'robot_description': robot_description,
+ 'use_sim_time': False
+ }]
+ )
+
+ # 创建move_group节点
+ move_group = nd(
+ package='moveit_ros_move_group',
+ executable='move_group',
+ output='screen',
+ parameters=[{
+ 'robot_description': robot_description,
+ 'allow_trajectory_execution': True,
+ 'capabilities': '',
+ 'disable_capabilities': '',
+ 'monitor_dynamics': False,
+ 'publish_monitored_planning_scene': True
+ }]
+ )
+
+ # 将节点添加到launch描述中
+ self.launch_description.add_action(robot_state_publisher)
+ self.launch_description.add_action(move_group)
+
+ # 如果启用RViz,添加RViz节点
+ if enable_rviz:
+ rviz_node = nd(
+ package='rviz2',
+ executable='rviz2',
+ name='rviz2',
+ output='screen'
+ )
+ self.launch_description.add_action(rviz_node)
+
+ return self.launch_description
+
+ def start(self, urdf_str: str) -> None:
+ """
+ 启动可视化服务
+
+ Args:
+ urdf_str: URDF文件路径
+ """
+ launch_description = self.create_launch_description(urdf_str)
+ self.launch_service.include_launch_description(launch_description)
+ self.launch_service.run()
\ No newline at end of file
diff --git a/unilabos/devices/agv/ur_arm_task.py b/unilabos/devices/agv/ur_arm_task.py
index 8c84c855..47a7c931 100644
--- a/unilabos/devices/agv/ur_arm_task.py
+++ b/unilabos/devices/agv/ur_arm_task.py
@@ -77,9 +77,6 @@ class UrArmTask():
if n > retry:
raise Exception('Can not connect to the arm info server!')
- self.pose_data = {}
- self.pose_file = 'C:\\auto\\unilabos\\unilabos\\devices\\agv\\pose.json'
- self.reload_pose()
self.dash_c.stop()
def arm_init(self):
diff --git a/unilabos/devices/ros_dev/__init__.py b/unilabos/devices/ros_dev/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/unilabos/devices/ros_dev/joint_republisher.py b/unilabos/devices/ros_dev/joint_republisher.py
new file mode 100644
index 00000000..f9797ea9
--- /dev/null
+++ b/unilabos/devices/ros_dev/joint_republisher.py
@@ -0,0 +1,51 @@
+import rclpy,json
+from rclpy.node import Node
+from sensor_msgs.msg import JointState
+from std_msgs.msg import String
+from rclpy.callback_groups import ReentrantCallbackGroup
+
+class JointRepublisher(Node):
+ def __init__(self,device_id):
+ super().__init__(device_id)
+
+ # print('-'*20,device_id)
+ self.joint_repub = self.create_publisher(String,f'/devices/{device_id}/joint_state_repub',10)
+ # 创建订阅者
+ self.create_subscription(
+ JointState,
+ '/joint_states',
+ self.listener_callback,
+ 10,
+ callback_group=ReentrantCallbackGroup()
+ )
+ self.msg = String()
+
+ def listener_callback(self, msg:JointState):
+
+ try:
+ json_dict = {}
+ json_dict["name"] = list(msg.name)
+ json_dict["position"] = list(msg.position)
+ json_dict["velocity"] = list(msg.velocity)
+ json_dict["effort"] = list(msg.effort)
+
+ self.msg.data = str(json_dict)
+ self.joint_repub.publish(self.msg)
+ # print('-'*20)
+ # print(self.msg.data)
+
+ except Exception as e:
+ print(e)
+
+
+def main():
+
+ rclpy.init()
+ subscriber = JointRepublisher()
+ rclpy.spin(subscriber)
+ subscriber.destroy_node()
+ rclpy.shutdown()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml
index 04ea338b..15881df1 100644
--- a/unilabos/registry/devices/robot_gripper.yaml
+++ b/unilabos/registry/devices/robot_gripper.yaml
@@ -19,7 +19,9 @@ gripper.mock:
result:
position: position
effort: torque
-
+ model:
+ tpye: device
+ mesh: slide_w140
gripper.misumi_rz:
description: Misumi RZ gripper
@@ -35,4 +37,4 @@ gripper.misumi_rz:
command: command
feedback: {}
result:
- success: success
\ No newline at end of file
+ success: success
diff --git a/unilabos/registry/resources/opentrons/plates.yaml b/unilabos/registry/resources/opentrons/plates.yaml
index f15da8ed..efc65650 100644
--- a/unilabos/registry/resources/opentrons/plates.yaml
+++ b/unilabos/registry/resources/opentrons/plates.yaml
@@ -51,7 +51,11 @@ nest_96_wellplate_100ul_pcr_full_skirt:
class:
module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_100ul_pcr_full_skirt
type: pylabrobot
-
+ model:
+ type: resource
+ mesh: /home/z43/git_pj/uni-lab-assets/device_models/tecan_nested_tip_rack/meshes/plate.stl
+ children_mesh: /home/z43/git_pj/uni-lab-assets/device_models/generic_labware_tube_10_75/meshes/0_base.stl
+
appliedbiosystemsmicroamp_384_wellplate_40ul:
description: Applied Biosystems microamp 384 wellplate 40ul
class: