mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2025-12-17 04:51:10 +00:00
add 3d visualization
This commit is contained in:
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
|
||||||
|
<robot xmlns:xacro="http://ros.org/wiki/xacro">
|
||||||
|
|
||||||
|
<xacro:macro name="opentrons_liquid_handler"
|
||||||
|
params="parent_link:='' station_name:='' device_name:='' x:=0 y:=0 z:=0 r:=0 mesh_path:=''">
|
||||||
|
|
||||||
|
|
||||||
|
<joint name="${station_name}${device_name}base_link_joint" type="fixed">
|
||||||
|
<origin xyz="${x} ${y} ${z}" rpy="0 0 ${r}" />
|
||||||
|
<parent link="${station_name}${device_name}${parent_link}"/>
|
||||||
|
<child link="${station_name}${device_name}device_link"/>
|
||||||
|
<axis xyz="0 0 0"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<link name="${station_name}${device_name}device_link"/>
|
||||||
|
<joint name="${station_name}${device_name}device_link_joint" type="fixed">
|
||||||
|
<origin xyz="-0.31 0.28 0" rpy="0 0 0" />
|
||||||
|
<parent link="${station_name}${device_name}device_link"/>
|
||||||
|
<child link="${station_name}${device_name}main_link"/>
|
||||||
|
<axis xyz="0 0 0"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}main_link'>
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-0.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="0.756862745098039 0.768627450980392 0.752941176470588 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-0.stl"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}first_link'>
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-1.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="0.756862745098039 0.768627450980392 0.752941176470588 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-1.stl"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}second_link'>
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-2.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="0.756862745098039 0.768627450980392 0.752941176470588 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-2.stl"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}third_link'>
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-3a.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="0.756862745098039 0.768627450980392 0.752941176470588 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-3a.stl"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}fourth_link'>
|
||||||
|
<visual>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-3b.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="0.756862745098039 0.768627450980392 0.752941176470588 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/opentrons_liquid_handler/meshes/ot2-3b.stl"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<joint name='${station_name}${device_name}first_joint' type='prismatic'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}first_link"/>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<axis xyz="0 -1 0"/>
|
||||||
|
<limit effort="-1" lower="-0.2" upper="0.13" velocity="-1"/>
|
||||||
|
<dynamics damping="0.1"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}second_joint' type='prismatic'>
|
||||||
|
<parent link="${station_name}${device_name}first_link"/>
|
||||||
|
<child link="${station_name}${device_name}second_link"/>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<axis xyz="-1 0 0"/>
|
||||||
|
<limit effort="-1" lower="-0.15" upper="0.15" velocity="-1"/>
|
||||||
|
<dynamics damping="0.1"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}third_joint' type='prismatic'>
|
||||||
|
<parent link="${station_name}${device_name}second_link"/>
|
||||||
|
<child link="${station_name}${device_name}third_link"/>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<axis xyz="0 0 -1"/>
|
||||||
|
<limit effort="-1" lower="0" upper="0.22" velocity="-1"/>
|
||||||
|
<dynamics damping="0.1"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}fourth_joint' type='prismatic'>
|
||||||
|
<parent link="${station_name}${device_name}second_link"/>
|
||||||
|
<child link="${station_name}${device_name}fourth_link"/>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<axis xyz="0 0 -1"/>
|
||||||
|
<limit effort="-1" lower="0" upper="0.22" velocity="-1"/>
|
||||||
|
<dynamics damping="0.1"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}socketTypeGenericSbsFootprint'/>
|
||||||
|
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_10_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.1795 -0.1825 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_7_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.1795 -0.273 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_4_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.1795 -0.3635 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_1_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.1795 -0.454 0.07"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_11_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.312 -0.1825 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_8_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.312 -0.273 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_5_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.312 -0.3635 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_2_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.312 -0.454 0.07"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_9_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.4445 -0.273 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_6_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.4445 -0.3635 0.07"/>
|
||||||
|
</joint>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeGenericSbsFootprint_3_60_1' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeGenericSbsFootprint"/>
|
||||||
|
<origin rpy="0 0 -1.57" xyz="0.4445 -0.454 0.07"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
|
||||||
|
<link name='${station_name}${device_name}socketTypeHEPAModule'/>
|
||||||
|
<joint name='${station_name}${device_name}socketTypeHEPAModule' type='fixed'>
|
||||||
|
<parent link="${station_name}${device_name}main_link"/>
|
||||||
|
<child link="${station_name}${device_name}socketTypeHEPAModule"/>
|
||||||
|
<origin rpy="0 0 0" xyz="0.31 -0.26 0.66"/>
|
||||||
|
</joint>
|
||||||
|
</xacro:macro>
|
||||||
|
</robot>
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"private_param":
|
||||||
|
{
|
||||||
|
|
||||||
|
},
|
||||||
|
"public_param":
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
6
unilabos/device_mesh/device/slide_w140/joint_config.json
Normal file
6
unilabos/device_mesh/device/slide_w140/joint_config.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"slider_joint": {
|
||||||
|
"child":"slider",
|
||||||
|
"axis" : "x"
|
||||||
|
}
|
||||||
|
}
|
||||||
136
unilabos/device_mesh/device/slide_w140/macro_device.xacro
Normal file
136
unilabos/device_mesh/device/slide_w140/macro_device.xacro
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!-- =================================================================================== -->
|
||||||
|
<!-- | This document was autogenerated by xacro from slide.urdf | -->
|
||||||
|
<!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
|
||||||
|
<!-- =================================================================================== -->
|
||||||
|
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com)
|
||||||
|
Commit Version: 1.6.0-4-g7f85cfe Build Version: 1.6.7995.38578
|
||||||
|
For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
|
||||||
|
<robot xmlns:xacro="http://ros.org/wiki/xacro">
|
||||||
|
|
||||||
|
<xacro:macro name="slide_w140" params="mesh_path:='' length:=0.1 min_d:=0.1 max_d:=0.1 slider_d:=0.14 parent_link:='' station_name:='' device_name:='' x:=0 y:=0 z:=0 r:=0" >
|
||||||
|
|
||||||
|
|
||||||
|
<joint name="${station_name}${device_name}base_link_joint" type="fixed">
|
||||||
|
<origin xyz="${x} ${y} ${z}" rpy="0 0 ${r}" />
|
||||||
|
<parent link="${parent_link}"/>
|
||||||
|
<child link="${station_name}${device_name}device_link"/>
|
||||||
|
<axis xyz="0 0 0"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<link name="${station_name}${device_name}device_link"/>
|
||||||
|
<joint name="${station_name}${device_name}device_link_joint" type="fixed">
|
||||||
|
<origin xyz="${-min_d} 0 0" rpy="0 0 0" />
|
||||||
|
<parent link="${station_name}${device_name}device_link"/>
|
||||||
|
<child link="${station_name}${device_name}base_link"/>
|
||||||
|
<axis xyz="0 0 0"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
<link name="${station_name}${device_name}base_link">
|
||||||
|
<inertial>
|
||||||
|
<origin rpy="0 0 0" xyz="-0.00073944 -0.070732 0.035966"/>
|
||||||
|
<mass value="0.88697"/>
|
||||||
|
<inertia ixx="0.0019162" ixy="-2.5282E-11" ixz="6.1083E-07" iyy="0.00066605" iyz="1.4627E-08" izz="0.0019573"/>
|
||||||
|
</inertial>
|
||||||
|
<visual>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/base_link.STL"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="1 1 1 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/base_link.STL"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
<link name="${station_name}${device_name}slider">
|
||||||
|
<inertial>
|
||||||
|
<origin rpy="0 0 0" xyz="0 -4.7184E-16 0.0095496"/>
|
||||||
|
<mass value="0.27913"/>
|
||||||
|
<inertia ixx="0.00048249" ixy="2.0866E-19" ixz="2.788E-21" iyy="0.00047014" iyz="1.1542E-17" izz="0.0009242"/>
|
||||||
|
</inertial>
|
||||||
|
<visual>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/slider.STL" />
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="1 1 1 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/slider.STL" />
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
<joint name="${station_name}${device_name}slider_joint" type="prismatic">
|
||||||
|
<origin rpy="0 0 0" xyz="${min_d + slider_d/2} 0 0.0475"/>
|
||||||
|
<parent link="${station_name}${device_name}base_link"/>
|
||||||
|
<child link="${station_name}${device_name}slider"/>
|
||||||
|
<axis xyz="1 0 0"/>
|
||||||
|
<limit effort="100" lower="0" upper="${length}" velocity="1"/>
|
||||||
|
</joint>
|
||||||
|
<link name="${station_name}${device_name}length">
|
||||||
|
<inertial>
|
||||||
|
<origin rpy="0 0 0" xyz="0.005 -9.3044E-10 0.02803"/>
|
||||||
|
<mass value="0.050532"/>
|
||||||
|
<inertia ixx="8.098E-05" ixy="-1.2574E-19" ixz="3.1207E-20" iyy="4.4152E-06" iyz="-3.1294E-13" izz="7.7407E-05"/>
|
||||||
|
</inertial>
|
||||||
|
<visual>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/length.STL" scale="${(length + min_d + max_d + slider_d)} 1 1"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="1 1 1 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/length.STL" scale="${(length + min_d + max_d + slider_d)} 1 1"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
<joint name="${station_name}${device_name}length_joint" type="fixed">
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<parent link="${station_name}${device_name}base_link"/>
|
||||||
|
<child link="${station_name}${device_name}length"/>
|
||||||
|
</joint>
|
||||||
|
<link name="${station_name}${device_name}slide_end">
|
||||||
|
<inertial>
|
||||||
|
<origin rpy="0 0 0" xyz="0.003 8.6044E-06 0.035593"/>
|
||||||
|
<mass value="0.055452"/>
|
||||||
|
<inertia ixx="9.9729E-05" ixy="-1.0228E-21" ixz="3.8344E-22" iyy="2.3158E-05" iyz="1.5613E-08" izz="7.6904E-05"/>
|
||||||
|
</inertial>
|
||||||
|
<visual>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/slide_end.STL"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="">
|
||||||
|
<color rgba="1 1 1 1"/>
|
||||||
|
</material>
|
||||||
|
</visual>
|
||||||
|
<collision>
|
||||||
|
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="file://${mesh_path}/device/slide_w140/meshes/slide_end.STL"/>
|
||||||
|
</geometry>
|
||||||
|
</collision>
|
||||||
|
</link>
|
||||||
|
<joint name="${station_name}${device_name}slide_end_joint" type="fixed">
|
||||||
|
<origin rpy="0 0 0" xyz="${length + max_d +min_d + slider_d} 0 0"/>
|
||||||
|
<parent link="${station_name}${device_name}base_link"/>
|
||||||
|
<child link="${station_name}${device_name}slide_end"/>
|
||||||
|
</joint>
|
||||||
|
|
||||||
|
</xacro:macro>
|
||||||
|
</robot>
|
||||||
BIN
unilabos/device_mesh/device/slide_w140/meshes/base_link.STL
Executable file
BIN
unilabos/device_mesh/device/slide_w140/meshes/base_link.STL
Executable file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/base_link.fbx
Normal file
BIN
unilabos/device_mesh/device/slide_w140/meshes/base_link.fbx
Normal file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/length.STL
Executable file
BIN
unilabos/device_mesh/device/slide_w140/meshes/length.STL
Executable file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/length.fbx
Normal file
BIN
unilabos/device_mesh/device/slide_w140/meshes/length.fbx
Normal file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/slide_end.STL
Executable file
BIN
unilabos/device_mesh/device/slide_w140/meshes/slide_end.STL
Executable file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/slide_end.fbx
Normal file
BIN
unilabos/device_mesh/device/slide_w140/meshes/slide_end.fbx
Normal file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/slider.STL
Executable file
BIN
unilabos/device_mesh/device/slide_w140/meshes/slider.STL
Executable file
Binary file not shown.
BIN
unilabos/device_mesh/device/slide_w140/meshes/slider.fbx
Normal file
BIN
unilabos/device_mesh/device/slide_w140/meshes/slider.fbx
Normal file
Binary file not shown.
12
unilabos/device_mesh/device/slide_w140/param_config.json
Normal file
12
unilabos/device_mesh/device/slide_w140/param_config.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"private_param":
|
||||||
|
{
|
||||||
|
"min_d": 0.1 ,
|
||||||
|
"max_d": 0.1 ,
|
||||||
|
"slider_d": 0.14
|
||||||
|
},
|
||||||
|
"public_param":
|
||||||
|
{
|
||||||
|
"length" :0.1
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
Binary file not shown.
Binary file not shown.
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="generic_labware_tube_10_75">
|
||||||
|
<link name='0_base_link'>
|
||||||
|
<visual name='visual'>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="meshes/0_base.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="clay" />
|
||||||
|
</visual>
|
||||||
|
</link>
|
||||||
|
</robot>
|
||||||
Binary file not shown.
Binary file not shown.
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="tecan_nested_tip_rack">
|
||||||
|
<link name='plate_link'>
|
||||||
|
<visual name='visual'>
|
||||||
|
<geometry>
|
||||||
|
<mesh filename="meshes/plate.stl"/>
|
||||||
|
</geometry>
|
||||||
|
<material name="clay" />
|
||||||
|
</visual>
|
||||||
|
</link>
|
||||||
|
</robot>
|
||||||
BIN
unilabos/device_mesh/resource/tecan_nested_tip_rack/plate.png
Normal file
BIN
unilabos/device_mesh/resource/tecan_nested_tip_rack/plate.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 128 KiB |
132
unilabos/device_mesh/resource_visalization.py
Normal file
132
unilabos/device_mesh/resource_visalization.py
Normal file
@@ -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= '''<?xml version="1.0" ?>
|
||||||
|
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="full_dev">
|
||||||
|
<link name="world"/>
|
||||||
|
</robot>
|
||||||
|
'''
|
||||||
|
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()
|
||||||
@@ -77,9 +77,6 @@ class UrArmTask():
|
|||||||
if n > retry:
|
if n > retry:
|
||||||
raise Exception('Can not connect to the arm info server!')
|
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()
|
self.dash_c.stop()
|
||||||
|
|
||||||
def arm_init(self):
|
def arm_init(self):
|
||||||
|
|||||||
0
unilabos/devices/ros_dev/__init__.py
Normal file
0
unilabos/devices/ros_dev/__init__.py
Normal file
51
unilabos/devices/ros_dev/joint_republisher.py
Normal file
51
unilabos/devices/ros_dev/joint_republisher.py
Normal file
@@ -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()
|
||||||
@@ -19,7 +19,9 @@ gripper.mock:
|
|||||||
result:
|
result:
|
||||||
position: position
|
position: position
|
||||||
effort: torque
|
effort: torque
|
||||||
|
model:
|
||||||
|
tpye: device
|
||||||
|
mesh: slide_w140
|
||||||
|
|
||||||
gripper.misumi_rz:
|
gripper.misumi_rz:
|
||||||
description: Misumi RZ gripper
|
description: Misumi RZ gripper
|
||||||
|
|||||||
@@ -51,6 +51,10 @@ nest_96_wellplate_100ul_pcr_full_skirt:
|
|||||||
class:
|
class:
|
||||||
module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_100ul_pcr_full_skirt
|
module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_100ul_pcr_full_skirt
|
||||||
type: pylabrobot
|
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:
|
appliedbiosystemsmicroamp_384_wellplate_40ul:
|
||||||
description: Applied Biosystems microamp 384 wellplate 40ul
|
description: Applied Biosystems microamp 384 wellplate 40ul
|
||||||
|
|||||||
Reference in New Issue
Block a user