hex-zmq-servers 0.3.16__py3-none-any.whl → 1.0.1__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.
@@ -0,0 +1,208 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <robot name="archer_d6y">
3
+
4
+ <link name="base_link">
5
+ <inertial>
6
+ <origin xyz="-0.001 0 0.322" rpy="0 0 0" />
7
+ <mass value="0.687" />
8
+ <inertia ixx="0.0005" iyy="0.0005" izz="0.0007" ixy="0" ixz="0" iyz="0" />
9
+ </inertial>
10
+ <visual>
11
+ <origin xyz="0 0 0" rpy="0 0 0" />
12
+ <geometry>
13
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/base_link.STL" />
14
+ </geometry>
15
+ <material name="">
16
+ <color rgba="1 1 1 1" />
17
+ </material>
18
+ </visual>
19
+ <collision>
20
+ <origin xyz="0 0 0" rpy="0 0 0" />
21
+ <geometry>
22
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/base_link.STL" />
23
+ </geometry>
24
+ </collision>
25
+ </link>
26
+
27
+ <link name="link_1">
28
+ <inertial>
29
+ <origin xyz="0.008 -0.0023 0.0213" rpy="0 0 0" />
30
+ <mass value="0.2154" />
31
+ <inertia ixx="0.0003" iyy="0.0002" izz="0.0003" ixy="0" ixz="0" iyz="0"/>
32
+ </inertial>
33
+ <visual>
34
+ <origin xyz="0 0 0" rpy="0 0 0" />
35
+ <geometry>
36
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_1.STL" />
37
+ </geometry>
38
+ <material name="">
39
+ <color rgba="1 1 1 1" />
40
+ </material>
41
+ </visual>
42
+ <collision>
43
+ <origin xyz="0 0 0" rpy="0 0 0" />
44
+ <geometry>
45
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_1.STL" />
46
+ </geometry>
47
+ </collision>
48
+ </link>
49
+ <joint name="joint_1" type="revolute">
50
+ <origin xyz="0 0 0.0665" rpy="0 0 0" />
51
+ <parent link="base_link" />
52
+ <child link="link_1" />
53
+ <axis xyz="0 0 1" />
54
+ <limit lower="-2.61" upper="3.14" effort="6" velocity="6" />
55
+ </joint>
56
+
57
+ <link name="link_2">
58
+ <inertial>
59
+ <origin xyz="0.0001 -0.0028 0.1317" rpy="0 0 0" />
60
+ <mass value="1.3123" />
61
+ <inertia ixx="0.018" iyy="0.0177" izz="0.0007" ixy="0" ixz="0" iyz="0.0007" />
62
+ </inertial>
63
+ <visual>
64
+ <origin xyz="0 0 0" rpy="0 0 0" />
65
+ <geometry>
66
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_2.STL" />
67
+ </geometry>
68
+ <material name="">
69
+ <color rgba="1 1 1 1" />
70
+ </material>
71
+ </visual>
72
+ <collision>
73
+ <origin xyz="0 0 0" rpy="0 0 0" />
74
+ <geometry>
75
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_2.STL" />
76
+ </geometry>
77
+ </collision>
78
+ </link>
79
+ <joint name="joint_2" type="revolute">
80
+ <origin xyz="0.02 0 0.045" rpy="0 0 0" />
81
+ <parent link="link_1" />
82
+ <child link="link_2" />
83
+ <axis xyz="0 1 0" />
84
+ <limit lower="-1.57" upper="2.09" effort="6" velocity="6" />
85
+ </joint>
86
+
87
+ <link name="link_3">
88
+ <inertial>
89
+ <origin xyz="-0.051 0.0008 0.1447" rpy="0 0 0" />
90
+ <mass value="1.1083" />
91
+ <inertia ixx="0.0114" iyy="0.0112" izz="0.0016" ixy="-0.0001" ixz="0.0014" iyz="0.0006" />
92
+ </inertial>
93
+ <visual>
94
+ <origin xyz="0 0 0" rpy="0 0 0" />
95
+ <geometry>
96
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_3.STL" />
97
+ </geometry>
98
+ <material name="">
99
+ <color rgba="1 1 1 1" />
100
+ </material>
101
+ </visual>
102
+ <collision>
103
+ <origin xyz="0 0 0" rpy="0 0 0" />
104
+ <geometry>
105
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_3.STL" />
106
+ </geometry>
107
+ </collision>
108
+ </link>
109
+ <joint name="joint_3" type="revolute">
110
+ <origin xyz="0 0 0.264" rpy="0 0 0" />
111
+ <parent link="link_2" />
112
+ <child link="link_3" />
113
+ <axis xyz="0 1 0" />
114
+ <limit lower="0" upper="3.14" effort="6" velocity="6" />
115
+ </joint>
116
+
117
+ <link name="link_4">
118
+ <inertial>
119
+ <origin xyz="-0.0597 -0.001 0.0572" rpy="0 0 0" />
120
+ <mass value="0.5398" />
121
+ <inertia ixx="0.0008" iyy="0.001" izz="0.0008" ixy="0" ixz="0.0003" iyz="0" />
122
+ </inertial>
123
+ <visual>
124
+ <origin xyz="0 0 0" rpy="0 0 0" />
125
+ <geometry>
126
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_4.STL" />
127
+ </geometry>
128
+ <material name="">
129
+ <color rgba="1 1 1 1" />
130
+ </material>
131
+ </visual>
132
+ <collision>
133
+ <origin xyz="0 0 0" rpy="0 0 0" />
134
+ <geometry>
135
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_4.STL" />
136
+ </geometry>
137
+ </collision>
138
+ </link>
139
+ <joint name="joint_4" type="revolute">
140
+ <origin xyz="-0.06 0 0.245" rpy="0 0 0" />
141
+ <parent link="link_3" />
142
+ <child link="link_4" />
143
+ <axis xyz="0 1 0" />
144
+ <limit lower="-1.57" upper="1.57" effort="6" velocity="6" />
145
+ </joint>
146
+
147
+ <link name="link_5">
148
+ <inertial>
149
+ <origin xyz="0.0292 0.0001 -0.0107" rpy="0 0 0" />
150
+ <mass value="0.3984" />
151
+ <inertia ixx="0.0002" iyy="0.0003" izz="0.0002" ixy="0" ixz="0" iyz="0" />
152
+ </inertial>
153
+ <visual>
154
+ <origin xyz="0 0 0" rpy="0 0 0" />
155
+ <geometry>
156
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_5.STL" />
157
+ </geometry>
158
+ <material name="">
159
+ <color rgba="1 1 1 1" />
160
+ </material>
161
+ </visual>
162
+ <collision>
163
+ <origin xyz="0 0 0" rpy="0 0 0" />
164
+ <geometry>
165
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/link_5.STL" />
166
+ </geometry>
167
+ </collision>
168
+ </link>
169
+ <joint name="joint_5" type="revolute">
170
+ <origin xyz="-0.0553 0 0.070" rpy="0 0 0" />
171
+ <parent link="link_4" />
172
+ <child link="link_5" />
173
+ <axis xyz="-1 0 0" />
174
+ <limit lower="-1.57" upper="1.57" effort="6" velocity="6" />
175
+ </joint>
176
+
177
+ <link name="link_6">
178
+ <inertial>
179
+ <origin xyz="0.00003207 0.00004116 0.04297674" rpy="0 0 0" />
180
+ <mass value="0.49758791" />
181
+ <inertia ixx="0.00043292" ixy="0.00000309" ixz="0.00000052"
182
+ iyy="0.00038073" iyz="0.00000073" izz="0.00025998" />
183
+ </inertial>
184
+ <visual>
185
+ <origin xyz="0 0 0" rpy="0 0 0" />
186
+ <geometry>
187
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/gp80.STL" />
188
+ </geometry>
189
+ <material name="">
190
+ <color rgba="1 1 1 1" />
191
+ </material>
192
+ </visual>
193
+ <collision>
194
+ <origin xyz="0 0 0" rpy="0 0 0" />
195
+ <geometry>
196
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/gp80.STL" />
197
+ </geometry>
198
+ </collision>
199
+ </link>
200
+ <joint name="joint_6" type="revolute">
201
+ <origin xyz="0.0553 0 0.029" rpy="0 0 0" />
202
+ <parent link="link_5" />
203
+ <child link="link_6" />
204
+ <axis xyz="0 0 1" />
205
+ <limit lower="-2.96" upper="2.96" effort="6" velocity="6" />
206
+ </joint>
207
+
208
+ </robot>
@@ -0,0 +1,208 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <robot name="firefly_y6">
3
+
4
+ <link name="base_link">
5
+ <inertial>
6
+ <origin xyz="-0.00015122 -0.00000305 0.04925993" rpy="0 0 0" />
7
+ <mass value="0.87430597" />
8
+ <inertia ixx="0.0013187" ixy="0.00000009" ixz="-0.00000212" iyy="0.00133505" iyz="0.00000013" izz="0.0010065" />
9
+ </inertial>
10
+ <visual>
11
+ <origin xyz="0 0 0" rpy="0 0 0" />
12
+ <geometry>
13
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/base_link.STL" />
14
+ </geometry>
15
+ <material name="">
16
+ <color rgba="1 1 1 1" />
17
+ </material>
18
+ </visual>
19
+ <collision>
20
+ <origin xyz="0 0 0" rpy="0 0 0" />
21
+ <geometry>
22
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/base_link.STL" />
23
+ </geometry>
24
+ </collision>
25
+ </link>
26
+
27
+ <link name="link_1">
28
+ <inertial>
29
+ <origin xyz="0.00671535 -0.00275632 0.02393862" rpy="0 0 0" />
30
+ <mass value="0.25449622" />
31
+ <inertia ixx="0.00036700" ixy="0.00000933" ixz="-0.00004363" iyy="0.00022812" iyz="0.00001848" izz="0.00032440" />
32
+ </inertial>
33
+ <visual>
34
+ <origin xyz="0 0 0" rpy="0 0 0" />
35
+ <geometry>
36
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_1.STL" />
37
+ </geometry>
38
+ <material name="">
39
+ <color rgba="1 1 1 1" />
40
+ </material>
41
+ </visual>
42
+ <collision>
43
+ <origin xyz="0 0 0" rpy="0 0 0" />
44
+ <geometry>
45
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_1.STL" />
46
+ </geometry>
47
+ </collision>
48
+ </link>
49
+ <joint name="joint_1" type="revolute">
50
+ <origin xyz="0 0 0.09505" rpy="0 0 0" />
51
+ <parent link="base_link" />
52
+ <child link="link_1" />
53
+ <axis xyz="0 0 1" />
54
+ <limit lower="-2.86" upper="2.86" effort="6" velocity="6" />
55
+ </joint>
56
+
57
+ <link name="link_2">
58
+ <inertial>
59
+ <origin xyz="-0.00065196 0.00050605 0.13439379" rpy="0 0 0" />
60
+ <mass value="1.28270343" />
61
+ <inertia ixx="0.01969749" ixy="-0.00000048" ixz="0.00002449" iyy="0.01949532" iyz="0.00000402" izz="0.00071320" />
62
+ </inertial>
63
+ <visual>
64
+ <origin xyz="0 0 0" rpy="0 0 0" />
65
+ <geometry>
66
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_2.STL" />
67
+ </geometry>
68
+ <material name="">
69
+ <color rgba="1 1 1 1" />
70
+ </material>
71
+ </visual>
72
+ <collision>
73
+ <origin xyz="0 0 0" rpy="0 0 0" />
74
+ <geometry>
75
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_2.STL" />
76
+ </geometry>
77
+ </collision>
78
+ </link>
79
+ <joint name="joint_2" type="revolute">
80
+ <origin xyz="0.02 0 0.05" rpy="0 0 0" />
81
+ <parent link="link_1" />
82
+ <child link="link_2" />
83
+ <axis xyz="0 1 0" />
84
+ <limit lower="-1.57" upper="2.09" effort="6" velocity="6" />
85
+ </joint>
86
+
87
+ <link name="link_3">
88
+ <inertial>
89
+ <origin xyz="-0.05668605 -0.00287518 0.15455959" rpy="0 0 0" />
90
+ <mass value="0.93588267" />
91
+ <inertia ixx="0.00983649" ixy="0.00007803" ixz="0.00124619" iyy="0.00991413" iyz="-0.00026866" izz="0.00104920" />
92
+ </inertial>
93
+ <visual>
94
+ <origin xyz="0 0 0" rpy="0 0 0" />
95
+ <geometry>
96
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_3.STL" />
97
+ </geometry>
98
+ <material name="">
99
+ <color rgba="1 1 1 1" />
100
+ </material>
101
+ </visual>
102
+ <collision>
103
+ <origin xyz="0 0 0" rpy="0 0 0" />
104
+ <geometry>
105
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_3.STL" />
106
+ </geometry>
107
+ </collision>
108
+ </link>
109
+ <joint name="joint_3" type="revolute">
110
+ <origin xyz="0 0 0.27" rpy="0 0 0" />
111
+ <parent link="link_2" />
112
+ <child link="link_3" />
113
+ <axis xyz="0 1 0" />
114
+ <limit lower="0" upper="3.14" effort="6" velocity="6" />
115
+ </joint>
116
+
117
+ <link name="link_4">
118
+ <inertial>
119
+ <origin xyz="-0.05184192 -0.00200161 0.04855136" rpy="0 0 0" />
120
+ <mass value="0.55059939" />
121
+ <inertia ixx="0.00075566" ixy="0.00005198" ixz="0.00037393" iyy="0.00098159" iyz="-0.00004878" izz="0.00079856" />
122
+ </inertial>
123
+ <visual>
124
+ <origin xyz="0 0 0" rpy="0 0 0" />
125
+ <geometry>
126
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_4.STL" />
127
+ </geometry>
128
+ <material name="">
129
+ <color rgba="1 1 1 1" />
130
+ </material>
131
+ </visual>
132
+ <collision>
133
+ <origin xyz="0 0 0" rpy="0 0 0" />
134
+ <geometry>
135
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_4.STL" />
136
+ </geometry>
137
+ </collision>
138
+ </link>
139
+ <joint name="joint_4" type="revolute">
140
+ <origin xyz="-0.065 0 0.25" rpy="0 0 0" />
141
+ <parent link="link_3" />
142
+ <child link="link_4" />
143
+ <axis xyz="0 1 0" />
144
+ <limit lower="-1.57" upper="1.57" effort="6" velocity="6" />
145
+ </joint>
146
+
147
+ <link name="link_5">
148
+ <inertial>
149
+ <origin xyz="0.04236212 -0.00000333 0.00771096" rpy="0 0 0" />
150
+ <mass value="0.41052864" />
151
+ <inertia ixx="0.0001862" ixy="-0.00000002" ixz="-0.00001795" iyy="0.00025554" iyz="-0.00000002" izz="0.0002374" />
152
+ </inertial>
153
+ <visual>
154
+ <origin xyz="0 0 0" rpy="0 0 0" />
155
+ <geometry>
156
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_5.STL" />
157
+ </geometry>
158
+ <material name="">
159
+ <color rgba="1 1 1 1" />
160
+ </material>
161
+ </visual>
162
+ <collision>
163
+ <origin xyz="0 0 0" rpy="0 0 0" />
164
+ <geometry>
165
+ <mesh filename="package://xpkg_urdf_firefly_y6/meshes/link_5.STL" />
166
+ </geometry>
167
+ </collision>
168
+ </link>
169
+ <joint name="joint_5" type="revolute">
170
+ <origin xyz="-0.047 0 0.065" rpy="0 0 0" />
171
+ <parent link="link_4" />
172
+ <child link="link_5" />
173
+ <axis xyz="-1 0 0" />
174
+ <limit lower="-1.54" upper="1.54" effort="6" velocity="6" />
175
+ </joint>
176
+
177
+ <link name="link_6">
178
+ <inertial>
179
+ <origin xyz="0.00003207 0.00004116 0.04297674" rpy="0 0 0" />
180
+ <mass value="0.49758791" />
181
+ <inertia ixx="0.00043292" ixy="0.00000309" ixz="0.00000052"
182
+ iyy="0.00038073" iyz="0.00000073" izz="0.00025998" />
183
+ </inertial>
184
+ <visual>
185
+ <origin xyz="0 0 0" rpy="0 0 0" />
186
+ <geometry>
187
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/gp80.STL" />
188
+ </geometry>
189
+ <material name="">
190
+ <color rgba="1 1 1 1" />
191
+ </material>
192
+ </visual>
193
+ <collision>
194
+ <origin xyz="0 0 0" rpy="0 0 0" />
195
+ <geometry>
196
+ <mesh filename="package://xpkg_urdf_archer_d6y/meshes/gp80.STL" />
197
+ </geometry>
198
+ </collision>
199
+ </link>
200
+ <joint name="joint_6" type="revolute">
201
+ <origin xyz="0.047 0 0.034" rpy="0 0 0" />
202
+ <parent link="link_5" />
203
+ <child link="link_6" />
204
+ <axis xyz="0 0 1" />
205
+ <limit lower="-2.79" upper="2.79" effort="6" velocity="6" />
206
+ </joint>
207
+
208
+ </robot>
@@ -500,11 +500,16 @@ class HexZMQDummyClient(HexZMQClientBase):
500
500
  net_config: dict = NET_CONFIG,
501
501
  ):
502
502
  HexZMQClientBase.__init__(self, net_config)
503
-
503
+ self._wait_for_working()
504
+
504
505
  def single_test(self):
505
506
  resp_hdr, resp_buf = self.request({"cmd": "test"})
506
- print(f"resp_hdr: {resp_hdr}")
507
- print(f"resp_buf: {resp_buf}")
507
+ return resp_hdr, resp_buf
508
+
509
+ def _recv_loop(self):
510
+ rate = HexRate(500)
511
+ while self._recv_flag:
512
+ rate.sleep()
508
513
 
509
514
 
510
515
  class HexZMQDummyServer(HexZMQServerBase):
@@ -524,6 +529,8 @@ class HexZMQDummyServer(HexZMQServerBase):
524
529
  self.close()
525
530
 
526
531
  def _process_request(self, recv_hdr: dict, recv_buf: np.ndarray):
532
+ if recv_hdr["cmd"] == "is_working":
533
+ return self.no_ts_hdr(recv_hdr, True), None
527
534
  if recv_hdr["cmd"] == "test":
528
535
  print("test received")
529
536
  print(f"recv_hdr: {recv_hdr}")
@@ -0,0 +1,195 @@
1
+ Metadata-Version: 2.4
2
+ Name: hex_zmq_servers
3
+ Version: 1.0.1
4
+ Summary: HEXFELLOW ZMQ Servers
5
+ Author-email: Dong Zhaorui <dzr159@gmail.com>
6
+ Maintainer-email: jecjune <zejun.chen@hexfellow.com>, Dong Zhaorui <dzr159@gmail.com>
7
+ License-Expression: Apache-2.0
8
+ Project-URL: Homepage, https://github.com/hexfellow/hex_zmq_servers
9
+ Project-URL: Repository, https://github.com/hexfellow/hex_zmq_servers.git
10
+ Project-URL: Bug Tracker, https://github.com/hexfellow/hex_zmq_servers/issues
11
+ Project-URL: Documentation, https://github.com/hexfellow/hex_zmq_servers/wiki
12
+ Keywords: hex_zmq_servers
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Operating System :: POSIX :: Linux
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: pyzmq>=27.0.1
26
+ Requires-Dist: hex_device<1.4.0,>=1.3.14
27
+ Requires-Dist: hex_robo_utils<0.3.0,>=0.2.0
28
+ Requires-Dist: opencv-python>=4.2
29
+ Provides-Extra: berxel
30
+ Requires-Dist: berxel_py_wrapper>=2.0.182; extra == "berxel"
31
+ Provides-Extra: realsense
32
+ Requires-Dist: pyrealsense2>=2.56.5.9235; extra == "realsense"
33
+ Provides-Extra: dynamixel
34
+ Requires-Dist: dynamixel-sdk==3.8.4; extra == "dynamixel"
35
+ Provides-Extra: mujoco
36
+ Requires-Dist: mujoco>=3.3.3; extra == "mujoco"
37
+ Provides-Extra: all
38
+ Requires-Dist: berxel_py_wrapper>=2.0.182; extra == "all"
39
+ Requires-Dist: pyrealsense2>=2.56.5.9235; extra == "all"
40
+ Requires-Dist: dynamixel-sdk==3.8.4; extra == "all"
41
+ Requires-Dist: mujoco>=3.3.3; extra == "all"
42
+ Dynamic: license-file
43
+
44
+ <h1 align="center">HEXFELLOW ZMQ SERVERS</h1>
45
+
46
+ <p align="center">
47
+ <a href="https://github.com/hexfellow/hex_zmq_servers/stargazers">
48
+ <img src="https://img.shields.io/github/stars/hexfellow/hex_zmq_servers?style=flat-square&logo=github" />
49
+ </a>
50
+ <a href="https://github.com/hexfellow/hex_zmq_servers/forks">
51
+ <img src="https://img.shields.io/github/forks/hexfellow/hex_zmq_servers?style=flat-square&logo=github" />
52
+ </a>
53
+ <a href="https://doi.org/10.5281/zenodo.18309954">
54
+ <img src="https://zenodo.org/badge/1088506315.svg" alt="DOI">
55
+ </a>
56
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
57
+ <a href="https://github.com/hexfellow/hex_zmq_servers/issues">
58
+ <img src="https://img.shields.io/github/issues/hexfellow/hex_zmq_servers?style=flat-square&logo=github" />
59
+ </a>
60
+ </p>
61
+
62
+ ---
63
+
64
+ # 📖 Overview
65
+
66
+ ## What is `hex_zmq_servers`
67
+
68
+ `hex_zmq_servers` provides a client–server layer on top of ZeroMQ to control and stream data from HEXFELLOW hardware (robots, RGB/RGB-D cameras) and MuJoCo-based simulators. Servers run device logic and command loops; clients send requests (e.g. `get_rgb`, `get_state`, `set_target`) and receive headers plus optional binary buffers (e.g. images, joint state).
69
+
70
+ ## What problem it solves
71
+
72
+ - **Decoupled control**: Run device drivers and control loops in separate processes; clients connect over TCP.
73
+ - **Unified transport**: All devices use the same ZMQ request/response pattern (JSON header + NumPy buffer).
74
+ - **Multi-node management**: `HexLaunch` and `HexNodeConfig` start and monitor multiple server/client nodes from one process.
75
+
76
+ ## Target users
77
+
78
+ - Engineers integrating HEXFELLOW robots into their systems.
79
+ - Researchers running experiments with HEXFELLOW robots.
80
+
81
+ ---
82
+
83
+ # 📦 Installation
84
+
85
+ ## Requirements
86
+
87
+ - **Python**
88
+ - **OS**: `Linux` / `macOS`
89
+ - **Core dependencies**:
90
+ - `pyzmq`
91
+ - `hex_device`
92
+ - `hex_robo_utils`
93
+ - `opencv-python`
94
+
95
+ Optional device support (install via extras):
96
+
97
+ | Extra | Purpose |
98
+ | ----------- | ----------------------------------------------- |
99
+ | `berxel` | Berxel RGB-D: `berxel_py_wrapper` |
100
+ | `realsense` | RealSense RGB-D: `pyrealsense2` |
101
+ | `dynamixel` | Dynamixel: `dynamixel-sdk` |
102
+ | `mujoco` | MuJoCo sims: `mujoco` |
103
+ | `all` | `berxel` + `dynamixel` + `realsense` + `mujoco` |
104
+
105
+ ## Install from PyPI
106
+
107
+ For those who don't need examples, you can install the package from PyPI.
108
+
109
+ - **Full install**: includes all optional devices (Berxel, RealSense, Dynamixel, MuJoCo)
110
+
111
+ ```bash
112
+ pip install hex_zmq_servers[all]
113
+ ```
114
+
115
+ - **Core install**: only the core package (no optional devices)
116
+
117
+ ```bash
118
+ pip install hex_zmq_servers
119
+ ```
120
+
121
+ ## Install from Source
122
+
123
+ For those who need examples, you can install the package from source code with examples.
124
+
125
+ **Noet**: We use [**uv**](https://github.com/astral-sh/uv) to manage the Python environment. Please install it first.
126
+
127
+ 1. Clone and install in editable mode. The `venv.sh` script expects [uv](https://github.com/astral-sh/uv).
128
+
129
+ ```bash
130
+ git clone https://github.com/hexfellow/hex_zmq_servers.git
131
+ cd hex_zmq_servers
132
+ ./venv.sh
133
+ ```
134
+
135
+ - `./venv.sh` — creates `.venv`, installs `hex_zmq_servers` with `[all]` and `examples/adv/requirements.txt` (e.g. `pygame` for some examples).
136
+ - `./venv.sh --min` — installs the core package only (no optional device extras). Some examples will not run.
137
+ - `./venv.sh --pkg-only` — installs the package only, skips example-related dependencies.
138
+
139
+ 2. Activate before running examples:
140
+
141
+ ```bash
142
+ source .venv/bin/activate
143
+ ```
144
+
145
+ ---
146
+
147
+ # 📚 Tutorial
148
+
149
+ See [**Tutorial**](docs/tutorial.md) for details of all tutorials.
150
+
151
+ # 📑 API
152
+
153
+ See [**API**](docs/api.md) for details of all APIs.
154
+
155
+ # 💡 Example
156
+
157
+ See [**Example**](docs/example.md) for details of all examples.
158
+
159
+ ---
160
+
161
+ # 🏷️ Citation
162
+
163
+ If you want to cite this project in your work, you can use the following BibTeX entry:
164
+
165
+ ```bibtex
166
+ @software{hex_zmq_servers,
167
+ author = {Dong, Zhaorui and Chen, Zejun},
168
+ title = {Hex ZMQ Servers: A ZeroMQ-Based Embodied AI Communication Framework},
169
+ year = {2025},
170
+ publisher = {Zenodo},
171
+ version = {v1.0.0},
172
+ doi = {10.5281/zenodo.18309960},
173
+ url = {https://doi.org/10.5281/zenodo.18309960}
174
+ }
175
+ ```
176
+
177
+ ---
178
+
179
+ # 📄 License
180
+
181
+ Apache License 2.0. See [LICENSE](LICENSE).
182
+
183
+ ---
184
+
185
+ # 🌟 Star History
186
+
187
+ [![Star History Chart](https://api.star-history.com/svg?repos=hexfellow/hex_zmq_servers&type=Date)](https://star-history.com/#hexfellow/hex_zmq_servers&Date)
188
+
189
+ ---
190
+
191
+ # 👥 Contributors
192
+
193
+ <a href="https://github.com/hexfellow/hex_zmq_servers/graphs/contributors">
194
+ <img src="https://contrib.rocks/image?repo=hexfellow/hex_zmq_servers" />
195
+ </a>