hex-zmq-servers 0.3.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. hex_zmq_servers/__init__.py +173 -0
  2. hex_zmq_servers/cam/__init__.py +52 -0
  3. hex_zmq_servers/cam/berxel/__init__.py +17 -0
  4. hex_zmq_servers/cam/berxel/cam_berxel.py +282 -0
  5. hex_zmq_servers/cam/berxel/cam_berxel_cli.py +33 -0
  6. hex_zmq_servers/cam/berxel/cam_berxel_srv.py +79 -0
  7. hex_zmq_servers/cam/cam_base.py +189 -0
  8. hex_zmq_servers/cam/dummy/__init__.py +17 -0
  9. hex_zmq_servers/cam/dummy/cam_dummy.py +69 -0
  10. hex_zmq_servers/cam/dummy/cam_dummy_cli.py +29 -0
  11. hex_zmq_servers/cam/dummy/cam_dummy_srv.py +68 -0
  12. hex_zmq_servers/cam/realsense/__init__.py +17 -0
  13. hex_zmq_servers/cam/realsense/cam_realsense.py +159 -0
  14. hex_zmq_servers/cam/realsense/cam_realsense_cli.py +33 -0
  15. hex_zmq_servers/cam/realsense/cam_realsense_srv.py +78 -0
  16. hex_zmq_servers/cam/rgb/__init__.py +17 -0
  17. hex_zmq_servers/cam/rgb/cam_rgb.py +135 -0
  18. hex_zmq_servers/cam/rgb/cam_rgb_cli.py +43 -0
  19. hex_zmq_servers/cam/rgb/cam_rgb_srv.py +78 -0
  20. hex_zmq_servers/config/cam_berxel.json +18 -0
  21. hex_zmq_servers/config/cam_dummy.json +12 -0
  22. hex_zmq_servers/config/cam_realsense.json +17 -0
  23. hex_zmq_servers/config/cam_rgb.json +28 -0
  24. hex_zmq_servers/config/mujoco_archer_y6.json +37 -0
  25. hex_zmq_servers/config/mujoco_e3_desktop.json +41 -0
  26. hex_zmq_servers/config/robot_dummy.json +153 -0
  27. hex_zmq_servers/config/robot_gello.json +66 -0
  28. hex_zmq_servers/config/robot_hexarm.json +37 -0
  29. hex_zmq_servers/config/zmq_dummy.json +12 -0
  30. hex_zmq_servers/device_base.py +44 -0
  31. hex_zmq_servers/hex_launch.py +489 -0
  32. hex_zmq_servers/mujoco/__init__.py +28 -0
  33. hex_zmq_servers/mujoco/archer_y6/__init__.py +17 -0
  34. hex_zmq_servers/mujoco/archer_y6/model/assets/arm_base_link.STL +0 -0
  35. hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_1.STL +0 -0
  36. hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_2.STL +0 -0
  37. hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_3.STL +0 -0
  38. hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_4.STL +0 -0
  39. hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_5.STL +0 -0
  40. hex_zmq_servers/mujoco/archer_y6/model/assets/assets.xml +17 -0
  41. hex_zmq_servers/mujoco/archer_y6/model/assets/camera_link.STL +0 -0
  42. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_base_link.STL +0 -0
  43. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_left_helper_link.STL +0 -0
  44. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_left_link_1.STL +0 -0
  45. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_left_link_2.STL +0 -0
  46. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_right_helper_link.STL +0 -0
  47. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_right_link_1.STL +0 -0
  48. hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_right_link_2.STL +0 -0
  49. hex_zmq_servers/mujoco/archer_y6/model/assets/table_link.STL +0 -0
  50. hex_zmq_servers/mujoco/archer_y6/model/robot.xml +95 -0
  51. hex_zmq_servers/mujoco/archer_y6/model/scene.xml +51 -0
  52. hex_zmq_servers/mujoco/archer_y6/model/setting.xml +37 -0
  53. hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6.py +325 -0
  54. hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_cli.py +71 -0
  55. hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_srv.py +148 -0
  56. hex_zmq_servers/mujoco/e3_desktop/__init__.py +17 -0
  57. hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_base_link.STL +0 -0
  58. hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_1.STL +0 -0
  59. hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_2.STL +0 -0
  60. hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_3.STL +0 -0
  61. hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_4.STL +0 -0
  62. hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_5.STL +0 -0
  63. hex_zmq_servers/mujoco/e3_desktop/model/assets/assets.xml +18 -0
  64. hex_zmq_servers/mujoco/e3_desktop/model/assets/camera_link.STL +0 -0
  65. hex_zmq_servers/mujoco/e3_desktop/model/assets/e3_desktop_base_link.STL +0 -0
  66. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_base_link.STL +0 -0
  67. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_helper_link.STL +0 -0
  68. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_link_1.STL +0 -0
  69. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_link_2.STL +0 -0
  70. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_helper_link.STL +0 -0
  71. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_link_1.STL +0 -0
  72. hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_link_2.STL +0 -0
  73. hex_zmq_servers/mujoco/e3_desktop/model/assets/table_link.STL +0 -0
  74. hex_zmq_servers/mujoco/e3_desktop/model/robot.xml +188 -0
  75. hex_zmq_servers/mujoco/e3_desktop/model/scene.xml +53 -0
  76. hex_zmq_servers/mujoco/e3_desktop/model/setting.xml +72 -0
  77. hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop.py +449 -0
  78. hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_cli.py +289 -0
  79. hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_srv.py +244 -0
  80. hex_zmq_servers/mujoco/mujoco_base.py +425 -0
  81. hex_zmq_servers/robot/__init__.py +37 -0
  82. hex_zmq_servers/robot/dummy/__init__.py +17 -0
  83. hex_zmq_servers/robot/dummy/robot_dummy.py +94 -0
  84. hex_zmq_servers/robot/dummy/robot_dummy_cli.py +29 -0
  85. hex_zmq_servers/robot/dummy/robot_dummy_srv.py +82 -0
  86. hex_zmq_servers/robot/gello/__init__.py +17 -0
  87. hex_zmq_servers/robot/gello/robot_gello.py +366 -0
  88. hex_zmq_servers/robot/gello/robot_gello_cli.py +29 -0
  89. hex_zmq_servers/robot/gello/robot_gello_srv.py +93 -0
  90. hex_zmq_servers/robot/hexarm/__init__.py +47 -0
  91. hex_zmq_servers/robot/hexarm/robot_hexarm.py +292 -0
  92. hex_zmq_servers/robot/hexarm/robot_hexarm_cli.py +37 -0
  93. hex_zmq_servers/robot/hexarm/robot_hexarm_srv.py +87 -0
  94. hex_zmq_servers/robot/hexarm/urdf/archer_l6y/empty.urdf +206 -0
  95. hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100.urdf +206 -0
  96. hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_handle.urdf +206 -0
  97. hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_p050.urdf +206 -0
  98. hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_p050_handle.urdf +206 -0
  99. hex_zmq_servers/robot/hexarm/urdf/archer_y6/empty.urdf +207 -0
  100. hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100.urdf +207 -0
  101. hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100_handle.urdf +207 -0
  102. hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100_p050.urdf +207 -0
  103. hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100_p050_handle.urdf +207 -0
  104. hex_zmq_servers/robot/robot_base.py +276 -0
  105. hex_zmq_servers/zmq_base.py +547 -0
  106. hex_zmq_servers-0.3.9.dist-info/METADATA +147 -0
  107. hex_zmq_servers-0.3.9.dist-info/RECORD +110 -0
  108. hex_zmq_servers-0.3.9.dist-info/WHEEL +5 -0
  109. hex_zmq_servers-0.3.9.dist-info/licenses/LICENSE +201 -0
  110. hex_zmq_servers-0.3.9.dist-info/top_level.txt +1 -0
@@ -0,0 +1,95 @@
1
+ <mujocoinclude>
2
+ <body name="base_link">
3
+ <inertial pos="-0.001 0.0318 0" quat="0.5 0.5 0.5 0.5" mass="0.687" diaginertia="0.0007 0.0006 0.0005"/>
4
+ <geom type="mesh" rgba="1 1 1 1" mesh="arm_base_link"/>
5
+
6
+ # link 1
7
+ <body name="link_1" pos="0 0 0.0665">
8
+ <inertial pos="0.008 -0.0023 0.0213" quat="0.707107 0.707107 0 0" mass="0.2154" diaginertia="0.0003 0.0003 0.0002"/>
9
+ <joint name="joint_1" pos="0 0 0" axis="0 0 1" range="-2.7 2.7" limited="true" armature="0.01" damping="0.1" frictionloss="0.5"/>
10
+ <geom type="mesh" rgba="0.92549 0.92549 0.92549 1" mesh="arm_link_1"/>
11
+
12
+ # link 2
13
+ <body name="link_2" pos="0.02 0 0.045">
14
+ <inertial pos="0.0001 -0.0028 0.1317" quat="0.999789 0.0205404 0 0" mass="1.3123" diaginertia="0.018 0.0177288 0.000671225"/>
15
+ <joint name="joint_2" pos="0 0 0" axis="0 1 0" range="-1.57 2.09" limited="true" armature="0.01" damping="0.1" frictionloss="0.5"/>
16
+ <geom type="mesh" rgba="1 1 1 1" mesh="arm_link_2"/>
17
+
18
+ # link 3
19
+ <body name="link_3" pos="0 0 0.264">
20
+ <inertial pos="-0.051 0.0008 0.1447" quat="0.996909 0.0323182 -0.0688403 -0.019747" mass="1.1083" diaginertia="0.0115968 0.0112369 0.00136632"/>
21
+ <joint name="joint_3" pos="0 0 0" axis="0 1 0" range="0 3.14" limited="true" armature="0.01" damping="0.1" frictionloss="0.5"/>
22
+ <geom type="mesh" rgba="1 1 1 1" mesh="arm_link_3"/>
23
+
24
+ # link 4
25
+ <body name="link_4" pos="-0.06 0 0.245">
26
+ <inertial pos="-0.0597 -0.001 0.0572" quat="0 0.92388 0 0.382683" mass="0.5398" diaginertia="0.0011 0.001 0.0005"/>
27
+ <joint name="joint_4" pos="0 0 0" axis="0 1 0" range="-1.57 1.57" limited="true" armature="0.01" damping="0.02" frictionloss="0.1"/>
28
+ <geom type="mesh" rgba="0.792157 0.792157 0.792157 1" mesh="arm_link_4"/>
29
+
30
+ # link 5
31
+ <body name="link_5" pos="-0.0553 0 0.070">
32
+ <inertial pos="0.0292 0.0001 -0.0107" quat="0.707107 0 0 0.707107" mass="0.3984" diaginertia="0.0003 0.0002 0.0002"/>
33
+ <joint name="joint_5" pos="0 0 0" axis="-1 0 0" range="-1.57 1.57" limited="true" armature="0.01" damping="0.02" frictionloss="0.1"/>
34
+ <geom type="mesh" rgba="0.898039 0.917647 0.929412 1" mesh="arm_link_5"/>
35
+
36
+ # gripper base link
37
+ <body name="gripper_base_link" pos="0.0553 0 0.029" quat="0.707107 0.0 -0.707107 0.0">
38
+ <inertial pos="-0.0139 0.0001 0.0553" quat="0.567843 0.421372 0.421372 0.567843" mass="0.7651" diaginertia="0.0021 0.00143028 0.00106972"/>
39
+ <joint name="joint_6" pos="0 0 0" axis="1 0 0" range="-1.57 1.57" limited="true" armature="0.01" damping="0.02" frictionloss="0.1"/>
40
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_base_link"/>
41
+ <geom pos="0.04 0 0.12" quat="0.6830127 0.6830127 0.1830127 -0.1830127" type="mesh" rgba="0.1 0.1 0.1 1" mesh="camera_link" />
42
+ <camera name="end_camera" pos="0.066 0 0.105" quat="0.8660254 0.0 -0.5 0.0" fovy="50"/>
43
+
44
+ # ee frame
45
+ <body name="ee_frame" pos="0.1870 0.0 0.0" quat="1 0 0 0">
46
+ <geom type="cylinder" size="0.002 0.01" pos="0.01 0.00 0.00" quat="0.7071068 0.0000000 0.7071068 0.0000000" rgba="1 0 0 1" contype="0" conaffinity="0" group="4"/>
47
+ <geom type="cylinder" size="0.002 0.01" pos="0.00 0.01 0.00" quat="0.7071068 0.7071068 0.0000000 0.0000000" rgba="0 1 0 1" contype="0" conaffinity="0" group="4"/>
48
+ <geom type="cylinder" size="0.002 0.01" pos="0.00 0.00 0.01" quat="1.0000000 0.0000000 0.0000000 0.0000000" rgba="0 0 1 1" contype="0" conaffinity="0" group="4"/>
49
+ </body>
50
+
51
+ # gripper helper
52
+ <body name="gripper_left_helper_link" pos="0.057667 0.030604 2.5e-05">
53
+ <inertial pos="0.00299357 0.0232625 -5e-05" quat="0.996724 0 0 0.0808839" mass="0.00594562" diaginertia="2.74798e-06 1.47567e-06 1.34732e-06"/>
54
+ <joint name="gripper_left_help_joint" pos="0 0 0" axis="0 0 -1" range="0 1.52" limited="true" armature="0.01" damping="1.0" frictionloss="0.1" />
55
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_left_helper_link"/>
56
+ </body>
57
+ <body name="gripper_right_helper_link" pos="0.057667 -0.030604 2.5e-05">
58
+ <inertial pos="0.00299357 -0.0232625 -5e-05" quat="0.996724 0 0 -0.0808839" mass="0.00594562" diaginertia="2.74798e-06 1.47567e-06 1.34732e-06"/>
59
+ <joint name="gripper_right_help_joint" pos="0 0 0" axis="0 0 1" range="0 1.52" limited="true" armature="0.01" damping="1.0" frictionloss="0.1" />
60
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_right_helper_link"/>
61
+ </body>
62
+
63
+ # left gripper
64
+ <body name="gripper_left_link_1" pos="0.0721 0.014 2.5e-05">
65
+ <inertial pos="0.00299357 0.0232625 -5e-05" quat="0.996724 0 0 0.0808839" mass="0.00594562" diaginertia="2.74798e-06 1.47567e-06 1.34732e-06"/>
66
+ <joint name="gripper_left_joint_1" pos="0 0 0" axis="0 0 -1" range="0 1.52" limited="true" armature="0.01" damping="1.0" frictionloss="0.1" />
67
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_left_link_1"/>
68
+
69
+ <body name="gripper_left_link_2" pos="0.0085108 0.04927 0">
70
+ <inertial pos="0.0255016 0.00914642 -0.00175617" quat="0.424541 0.412629 0.571518 0.568216" mass="0.0339319" diaginertia="1.36949e-05 1.35554e-05 3.4264e-06"/>
71
+ <joint name="gripper_left_joint_2" pos="0 0 0" axis="0 0 1" range="0 1.52" limited="true" armature="0.01" damping="1.0" frictionloss="0.1" />
72
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_left_link_2"/>
73
+ </body>
74
+ </body>
75
+
76
+ # right gripper
77
+ <body name="gripper_right_link_1" pos="0.0721 -0.014 2.5e-05">
78
+ <inertial pos="0.00299357 -0.0232625 -5e-05" quat="0.996724 0 0 -0.0808839" mass="0.00594562" diaginertia="2.74798e-06 1.47567e-06 1.34732e-06"/>
79
+ <joint name="gripper_right_joint_1" pos="0 0 0" axis="0 0 1" range="0 1.52" limited="true" armature="0.01" damping="1.0" frictionloss="0.1" />
80
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_right_link_1"/>
81
+
82
+ <body name="gripper_right_link_2" pos="0.0085108 -0.04927 0">
83
+ <inertial pos="0.0255016 -0.00914642 -0.00175616" quat="0.568212 0.571522 0.412623 0.424547" mass="0.0339319" diaginertia="1.36948e-05 1.35553e-05 3.4264e-06"/>
84
+ <joint name="gripper_right_joint_2" pos="0 0 0" axis="0 0 -1" range="0 1.52" limited="true" armature="0.01" damping="1.0" frictionloss="0.1" />
85
+ <geom type="mesh" rgba="1 1 1 1" mesh="gripper_right_link_2"/>
86
+ </body>
87
+ </body>
88
+ </body>
89
+ </body>
90
+ </body>
91
+ </body>
92
+ </body>
93
+ </body>
94
+ </body>
95
+ </mujocoinclude>
@@ -0,0 +1,51 @@
1
+ <mujoco model="archer_y6 scene">
2
+ <compiler angle="radian"/>
3
+ <option integrator="implicitfast"/>
4
+ <option timestep="1e-3"/>
5
+
6
+ <statistic center="0.3 0 0.45" extent="0.8" meansize="0.05"/>
7
+
8
+ <visual>
9
+ <headlight diffuse="0.6 0.6 0.6" ambient="0.1 0.1 0.1" specular="0 0 0"/>
10
+ <rgba haze="0.15 0.25 0.35 1"/>
11
+ <global azimuth="120" elevation="-20"/>
12
+ <map znear="0.001" zfar="50"/>
13
+ </visual>
14
+
15
+ <asset>
16
+ <texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="3072"/>
17
+ <texture type="2d" name="groundplane" builtin="checker" mark="edge" rgb1="0.2 0.3 0.4" rgb2="0.1 0.2 0.3" markrgb="0.8 0.8 0.8" width="300" height="300"/>
18
+ <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance="0.2"/>
19
+ <include file="assets/assets.xml"/>
20
+ </asset>
21
+
22
+ <worldbody>
23
+ <light pos="0.0 0.0 1.5" directional="true"/>
24
+ <geom name="floor" size="0.0 0.0 0.05" type="plane" material="groundplane"/>
25
+
26
+ <body pos="0.0 0.0 0.25">
27
+ <include file="robot.xml"/>
28
+ </body>
29
+
30
+ <body name="table" pos="0.5 0.0 0.3" quat="0.707107 0 0 0.707107">
31
+ <geom mesh="table_link" pos="0 0 0" type="mesh" name="table" rgba="0.2 0.2 0.2 1" />
32
+ </body>
33
+ <body name="box" pos="0.5 0.0 0.5">
34
+ <joint name="red_box_joint" type="free" frictionloss="0.01" />
35
+ <inertial pos="0 0 0" mass="0.05" diaginertia="0.002 0.002 0.002" />
36
+ <geom condim="4" solimp="2 1 0.01" solref="0.01 1" friction="1 0.005 0.0001" pos="0 0 0" size="0.02 0.02 0.02" type="box" name="red_box" rgba="1 0 0 1" />
37
+ </body>
38
+ <geom name="tar_plane" pos="0.6 0.0 0.301" type="box" size="0.04 0.04 0.001" rgba="0 1 0 1" />
39
+ </worldbody>
40
+
41
+ <include file="setting.xml"/>
42
+
43
+ <keyframe>
44
+ # qpos: 12 + 7
45
+ # ctrl: 7
46
+ <key name="home" qpos="
47
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
48
+ 0.5 0.0 0.5 1.0 0.0 0.0 0.0" ctrl="
49
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0"/>
50
+ </keyframe>
51
+ </mujoco>
@@ -0,0 +1,37 @@
1
+ <mujocoinclude>
2
+ <contact>
3
+ <exclude body1="base_link" body2="link_1" />
4
+ <exclude body1="link_1" body2="link_2" />
5
+ <exclude body1="link_2" body2="link_3" />
6
+ <exclude body1="link_3" body2="link_4" />
7
+ <exclude body1="link_4" body2="link_5" />
8
+ <exclude body1="link_5" body2="gripper_base_link" />
9
+ <exclude body1="gripper_base_link" body2="gripper_left_helper_link" />
10
+ <exclude body1="gripper_left_helper_link" body2="gripper_left_link_1" />
11
+ <exclude body1="gripper_left_helper_link" body2="gripper_left_link_2" />
12
+ <exclude body1="gripper_left_link_1" body2="gripper_left_link_2" />
13
+ <exclude body1="gripper_base_link" body2="gripper_right_helper_link" />
14
+ <exclude body1="gripper_right_helper_link" body2="gripper_right_link_1" />
15
+ <exclude body1="gripper_right_helper_link" body2="gripper_right_link_2" />
16
+ <exclude body1="gripper_right_link_1" body2="gripper_right_link_2" />
17
+ </contact>
18
+
19
+ <equality>
20
+ <joint joint1="gripper_left_joint_1" joint2="gripper_left_joint_2" />
21
+ <joint joint1="gripper_left_joint_1" joint2="gripper_left_help_joint" />
22
+ <joint joint1="gripper_left_joint_1" joint2="gripper_right_joint_1" />
23
+ <joint joint1="gripper_left_joint_1" joint2="gripper_right_joint_2" />
24
+ <joint joint1="gripper_left_joint_1" joint2="gripper_right_help_joint" />
25
+ </equality>
26
+
27
+ <actuator>
28
+ <motor joint="joint_1" ctrlrange="-28 28" forcerange="-28 28"/>
29
+ <motor joint="joint_2" ctrlrange="-28 28" forcerange="-28 28"/>
30
+ <motor joint="joint_3" ctrlrange="-28 28" forcerange="-28 28"/>
31
+ <motor joint="joint_4" ctrlrange="-10 10" forcerange="-10 10"/>
32
+ <motor joint="joint_5" ctrlrange="-10 10" forcerange="-10 10"/>
33
+ <motor joint="joint_6" ctrlrange="-10 10" forcerange="-10 10"/>
34
+ <motor joint="gripper_left_joint_1" ctrlrange="-10 10" forcerange="-10 10"/>
35
+ </actuator>
36
+
37
+ </mujocoinclude>
@@ -0,0 +1,325 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding:utf-8 -*-
3
+ ################################################################
4
+ # Copyright 2025 Dong Zhaorui. All rights reserved.
5
+ # Author: Dong Zhaorui 847235539@qq.com
6
+ # Date : 2025-09-17
7
+ ################################################################
8
+
9
+ import os
10
+ import copy
11
+ import threading
12
+ import cv2
13
+ import numpy as np
14
+ from collections import deque
15
+
16
+ import mujoco
17
+ from mujoco import viewer
18
+
19
+ from ..mujoco_base import HexMujocoBase
20
+ from ...zmq_base import (
21
+ hex_ns_now,
22
+ hex_zmq_ts_now,
23
+ ns_to_hex_zmq_ts,
24
+ hex_zmq_ts_delta_ms,
25
+ HexRate,
26
+ )
27
+ from ...hex_launch import hex_log, HEX_LOG_LEVEL
28
+ from hex_robo_utils import HexCtrlUtilMitJoint as CtrlUtil
29
+
30
+ MUJOCO_CONFIG = {
31
+ "states_rate": 1000,
32
+ "img_rate": 30,
33
+ "tau_ctrl": False,
34
+ "mit_kp": [200.0, 200.0, 200.0, 75.0, 15.0, 15.0, 20.0],
35
+ "mit_kd": [12.5, 12.5, 12.5, 6.0, 0.31, 0.31, 1.0],
36
+ "headless": False,
37
+ "sens_ts": True,
38
+ }
39
+ CAMERA_CONFIG = {
40
+ "empty": (False, False),
41
+ "rgb": (True, False),
42
+ "berxel": (True, True),
43
+ "realsense": (True, True),
44
+ }
45
+
46
+
47
+ class HexMujocoArcherY6(HexMujocoBase):
48
+
49
+ def __init__(
50
+ self,
51
+ mujoco_config: dict = MUJOCO_CONFIG,
52
+ realtime_mode: bool = False,
53
+ ):
54
+ HexMujocoBase.__init__(self, realtime_mode)
55
+
56
+ try:
57
+ states_rate = mujoco_config["states_rate"]
58
+ img_rate = mujoco_config["img_rate"]
59
+ self.__tau_ctrl = mujoco_config["tau_ctrl"]
60
+ self.__mit_kp = mujoco_config["mit_kp"]
61
+ self.__mit_kd = mujoco_config["mit_kd"]
62
+ self.__cam_type = mujoco_config["cam_type"]
63
+ self.__headless = mujoco_config["headless"]
64
+ self.__sens_ts = mujoco_config["sens_ts"]
65
+ except KeyError as ke:
66
+ missing_key = ke.args[0]
67
+ raise ValueError(
68
+ f"mujoco_config is not valid, missing key: {missing_key}")
69
+
70
+ # mujoco init
71
+ model_path = os.path.join(os.path.dirname(__file__), "model/scene.xml")
72
+ self.__model = mujoco.MjModel.from_xml_path(model_path)
73
+ self.__data = mujoco.MjData(self.__model)
74
+ self.__sim_rate = int(1.0 / self.__model.opt.timestep)
75
+
76
+ # state init
77
+ self.__state_robot_idx = [0, 1, 2, 3, 4, 5, 6]
78
+ self.__state_obj_idx = [12, 13, 14, 15, 16, 17, 18]
79
+ self.__ctrl_robot_idx = [0, 1, 2, 3, 4, 5, 6]
80
+ self.__ctrl_obj_idx = [0, 1, 2, 3, 4, 5, 6]
81
+ self._limits = np.stack(
82
+ [self.__model.jnt_range[self.__state_robot_idx, :]],
83
+ axis=0,
84
+ )
85
+ if not self.__tau_ctrl:
86
+ self.__mit_kp = np.ascontiguousarray(np.asarray(self.__mit_kp))
87
+ self.__mit_kd = np.ascontiguousarray(np.asarray(self.__mit_kd))
88
+ self.__mit_ctrl = CtrlUtil()
89
+ self.__gripper_ratio = 1.33 / 1.52
90
+ self._limits[0, -1] *= self.__gripper_ratio
91
+ self._dofs = np.array([len(self.__state_robot_idx)])
92
+ keyframe_id = mujoco.mj_name2id(
93
+ self.__model,
94
+ mujoco.mjtObj.mjOBJ_KEY,
95
+ "home",
96
+ )
97
+ self.__state_init = {
98
+ "qpos": self.__model.key_qpos[keyframe_id],
99
+ "qvel": np.zeros_like(self.__data.qvel),
100
+ "ctrl": np.zeros_like(self.__data.ctrl),
101
+ }
102
+ self.__data.qpos = self.__state_init["qpos"]
103
+ self.__data.qvel = self.__state_init["qvel"]
104
+ self.__data.ctrl = self.__state_init["ctrl"]
105
+ self.__states_trig_thresh = int(self.__sim_rate / states_rate)
106
+
107
+ # camera init
108
+ self.__img_trig_thresh = int(self.__sim_rate / img_rate)
109
+ self.__width, self.__height = 640, 400
110
+ fovy_rad = self.__model.cam_fovy[0] * np.pi / 180.0
111
+ focal = 0.5 * self.__height / np.tan(fovy_rad / 2.0)
112
+ self._intri = np.array(
113
+ [focal, focal, self.__height / 2, self.__height / 2])
114
+ self.__use_rgb, self.__use_depth = CAMERA_CONFIG.get(
115
+ self.__cam_type, (False, False))
116
+ self.__rgb_cam, self.__depth_cam = None, None
117
+ if self.__use_rgb:
118
+ self.__rgb_cam = mujoco.Renderer(self.__model, self.__height,
119
+ self.__width)
120
+ if self.__use_depth:
121
+ self.__depth_cam = mujoco.Renderer(self.__model, self.__height,
122
+ self.__width)
123
+ self.__depth_cam.enable_depth_rendering()
124
+
125
+ # viewer init
126
+ mujoco.mj_forward(self.__model, self.__data)
127
+ if not self.__headless:
128
+ self.__viewer = viewer.launch_passive(self.__model, self.__data)
129
+
130
+ # start work loop
131
+ self._working.set()
132
+
133
+ def __del__(self):
134
+ HexMujocoBase.__del__(self)
135
+
136
+ def reset(self) -> bool:
137
+ self.__data.qpos = self.__state_init["qpos"]
138
+ self.__data.qvel = self.__state_init["qvel"]
139
+ self.__data.ctrl = self.__state_init["ctrl"]
140
+ mujoco.mj_forward(self.__model, self.__data)
141
+ if not self.__headless:
142
+ self.__viewer.sync()
143
+ return True
144
+
145
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
146
+ states_robot_queue = hex_queues[0]
147
+ states_obj_queue = hex_queues[1]
148
+ cmds_robot_queue = hex_queues[2]
149
+ rgb_queue = hex_queues[3]
150
+ depth_queue = hex_queues[4]
151
+ stop_event = hex_queues[5]
152
+
153
+ last_states_ts = {"s": 0, "ns": 0}
154
+ states_robot_count = 0
155
+ states_obj_count = 0
156
+ last_cmds_robot_seq = -1
157
+ rgb_count = 0
158
+ depth_count = 0
159
+ cmds_robot = None
160
+
161
+ rate = HexRate(self.__sim_rate)
162
+ states_trig_count = 0
163
+ img_trig_count = 0
164
+ self.__bias_ns = hex_ns_now() - self.__data.time * 1_000_000_000
165
+ init_ts = self.__mujoco_ts() if self.__sens_ts else hex_zmq_ts_now()
166
+ rgb_queue.append((init_ts, 0,
167
+ np.zeros((self.__height, self.__width, 3),
168
+ dtype=np.uint8)))
169
+ depth_queue.append((init_ts, 0,
170
+ np.zeros((self.__height, self.__width),
171
+ dtype=np.uint16)))
172
+ while self._working.is_set() and not stop_event.is_set():
173
+ states_trig_count += 1
174
+ if states_trig_count >= self.__states_trig_thresh:
175
+ states_trig_count = 0
176
+
177
+ # states
178
+ ts, states_robot, states_obj = self.__get_states()
179
+ if states_robot is not None:
180
+ if hex_zmq_ts_delta_ms(ts, last_states_ts) > 1e-6:
181
+ last_states_ts = ts
182
+
183
+ # states robot
184
+ states_robot_queue.append(
185
+ (ts, states_robot_count, states_robot))
186
+ states_robot_count = (states_robot_count +
187
+ 1) % self._max_seq_num
188
+
189
+ # states obj
190
+ states_obj_queue.append(
191
+ (ts, states_obj_count, states_obj))
192
+ states_obj_count = (states_obj_count +
193
+ 1) % self._max_seq_num
194
+
195
+ # cmds
196
+ cmds_robot_pack = None
197
+ try:
198
+ cmds_robot_pack = cmds_robot_queue[
199
+ -1] if self._realtime_mode else cmds_robot_queue.popleft(
200
+ )
201
+ except IndexError:
202
+ pass
203
+ if cmds_robot_pack is not None:
204
+ ts, seq, cmds_robot_get = cmds_robot_pack
205
+ if seq != last_cmds_robot_seq:
206
+ last_cmds_robot_seq = seq
207
+ if hex_zmq_ts_delta_ms(hex_zmq_ts_now(), ts) < 200.0:
208
+ cmds_robot = cmds_robot_get.copy()
209
+ if cmds_robot is not None:
210
+ self.__set_cmds(cmds_robot)
211
+
212
+ img_trig_count += 1
213
+ if img_trig_count >= self.__img_trig_thresh:
214
+ img_trig_count = 0
215
+
216
+ # rgb
217
+ if self.__use_rgb:
218
+ ts, rgb_img = self.__get_rgb()
219
+ if rgb_img is not None:
220
+ rgb_queue.append((ts, rgb_count, rgb_img))
221
+ rgb_count = (rgb_count + 1) % self._max_seq_num
222
+
223
+ # depth
224
+ if self.__use_depth:
225
+ ts, depth_img = self.__get_depth()
226
+ if depth_img is not None:
227
+ depth_queue.append((ts, depth_count, depth_img))
228
+ depth_count = (depth_count + 1) % self._max_seq_num
229
+
230
+ # mujoco step
231
+ mujoco.mj_step(self.__model, self.__data)
232
+ if not self.__headless:
233
+ self.__viewer.sync()
234
+
235
+ # sleep
236
+ rate.sleep()
237
+
238
+ # close
239
+ self.close()
240
+
241
+ def __get_states(self):
242
+ pos = copy.deepcopy(self.__data.qpos)
243
+ vel = copy.deepcopy(self.__data.qvel)
244
+ eff = copy.deepcopy(self.__data.qfrc_actuator)
245
+ pos[self.__state_robot_idx[-1]] = pos[
246
+ self.__state_robot_idx[-1]] * self.__gripper_ratio
247
+ return self.__mujoco_ts() if self.__sens_ts else hex_zmq_ts_now(
248
+ ), np.array([
249
+ pos[self.__state_robot_idx],
250
+ vel[self.__state_robot_idx],
251
+ eff[self.__state_robot_idx],
252
+ ]).T, self.__data.qpos[self.__state_obj_idx].copy()
253
+
254
+ def __set_cmds(self, cmds: np.ndarray):
255
+ tau_cmds = None
256
+ if not self.__tau_ctrl:
257
+ cmd_pos = None
258
+ tar_vel = np.zeros(cmds.shape[0])
259
+ cmd_tor = np.zeros(cmds.shape[0])
260
+ cmd_kp = self.__mit_kp.copy()
261
+ cmd_kd = self.__mit_kd.copy()
262
+ if len(cmds.shape) == 1:
263
+ cmd_pos = cmds
264
+ elif len(cmds.shape) == 2:
265
+ if cmds.shape[1] == 2:
266
+ cmd_pos = cmds[:, 0].copy()
267
+ cmd_tor = cmds[:, 1].copy()
268
+ elif cmds.shape[1] == 5:
269
+ cmd_pos = cmds[:, 0].copy()
270
+ tar_vel = cmds[:, 1].copy()
271
+ cmd_tor = cmds[:, 2].copy()
272
+ cmd_kp = cmds[:, 3].copy()
273
+ cmd_kd = cmds[:, 4].copy()
274
+ else:
275
+ raise ValueError(
276
+ f"The shape of cmds is invalid: {cmds.shape}")
277
+ else:
278
+ raise ValueError(f"The shape of cmds is invalid: {cmds.shape}")
279
+ tar_pos = self._apply_pos_limits(
280
+ cmd_pos,
281
+ self._limits[0, :, 0],
282
+ self._limits[0, :, 1],
283
+ )
284
+ tar_pos[-1] /= self.__gripper_ratio
285
+ tau_cmds = self.__mit_ctrl(
286
+ cmd_kp,
287
+ cmd_kd,
288
+ tar_pos,
289
+ tar_vel,
290
+ self.__data.qpos[self.__state_robot_idx],
291
+ self.__data.qvel[self.__state_robot_idx],
292
+ cmd_tor,
293
+ )
294
+ else:
295
+ tau_cmds = cmds.copy()
296
+ self.__data.ctrl[self.__ctrl_robot_idx] = tau_cmds
297
+
298
+ def __get_rgb(self):
299
+ self.__rgb_cam.update_scene(self.__data, "end_camera")
300
+ rgb_img = self.__rgb_cam.render()
301
+ return self.__mujoco_ts() if self.__sens_ts else hex_zmq_ts_now(
302
+ ), cv2.cvtColor(rgb_img, cv2.COLOR_RGB2BGR)
303
+
304
+ def __get_depth(self):
305
+ self.__depth_cam.update_scene(self.__data, "end_camera")
306
+ depth_m = self.__depth_cam.render().astype(np.float32)
307
+ depth_img = np.clip(depth_m * 1000.0, 0, 65535).astype(np.uint16)
308
+ return self.__mujoco_ts() if self.__sens_ts else hex_zmq_ts_now(
309
+ ), depth_img
310
+
311
+ def __mujoco_ts(self):
312
+ mujoco_ts = self.__data.time * 1_000_000_000 + self.__bias_ns
313
+ return ns_to_hex_zmq_ts(mujoco_ts)
314
+
315
+ def close(self):
316
+ if not self._working.is_set():
317
+ return
318
+ self._working.clear()
319
+ if self.__rgb_cam is not None:
320
+ self.__rgb_cam.close()
321
+ if self.__depth_cam is not None:
322
+ self.__depth_cam.close()
323
+ if not self.__headless:
324
+ self.__viewer.close()
325
+ hex_log(HEX_LOG_LEVEL["info"], "HexMujocoArcherY6 closed")
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding:utf-8 -*-
3
+ ################################################################
4
+ # Copyright 2025 Dong Zhaorui. All rights reserved.
5
+ # Author: Dong Zhaorui 847235539@qq.com
6
+ # Date : 2025-09-12
7
+ ################################################################
8
+
9
+ from ..mujoco_base import HexMujocoClientBase
10
+ from ...zmq_base import HexRate
11
+
12
+ NET_CONFIG = {
13
+ "ip": "127.0.0.1",
14
+ "port": 12345,
15
+ "realtime_mode": False,
16
+ "deque_maxlen": 10,
17
+ "client_timeout_ms": 200,
18
+ "server_timeout_ms": 1_000,
19
+ "server_num_workers": 4,
20
+ }
21
+
22
+ RECV_CONFIG = {
23
+ "rgb": True,
24
+ "depth": True,
25
+ "obj": True,
26
+ }
27
+
28
+
29
+ class HexMujocoArcherY6Client(HexMujocoClientBase):
30
+
31
+ def __init__(
32
+ self,
33
+ net_config: dict = NET_CONFIG,
34
+ recv_config: dict = RECV_CONFIG,
35
+ ):
36
+ HexMujocoClientBase.__init__(self, net_config)
37
+ self.__recv_config = recv_config
38
+ self._wait_for_working()
39
+
40
+ def _recv_loop(self):
41
+ rate = HexRate(2000)
42
+ image_trig_cnt = 0
43
+ while self._recv_flag:
44
+ hdr, states = self._get_states_inner("robot")
45
+ if hdr is not None:
46
+ self._states_queue["robot"].append((hdr, states))
47
+ if self.__recv_config["obj"]:
48
+ hdr, obj_pose = self._get_states_inner("obj")
49
+ if hdr is not None:
50
+ self._states_queue["obj"].append((hdr, obj_pose))
51
+
52
+ image_trig_cnt += 1
53
+ if image_trig_cnt >= 10:
54
+ image_trig_cnt = 0
55
+ if self.__recv_config["rgb"]:
56
+ hdr, img = self._get_rgb_inner()
57
+ if hdr is not None:
58
+ self._rgb_queue.append((hdr, img))
59
+ if self.__recv_config["depth"]:
60
+ hdr, img = self._get_depth_inner()
61
+ if hdr is not None:
62
+ self._depth_queue.append((hdr, img))
63
+
64
+ try:
65
+ cmds = self._cmds_queue[
66
+ -1] if self._realtime_mode else self._cmds_queue.popleft()
67
+ _ = self._set_cmds_inner(cmds)
68
+ except IndexError:
69
+ pass
70
+
71
+ rate.sleep()