hex-zmq-servers 0.1.21.1__tar.gz → 0.2.0__tar.gz
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.
- {hex_zmq_servers-0.1.21.1/hex_zmq_servers.egg-info → hex_zmq_servers-0.2.0}/PKG-INFO +2 -2
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/__init__.py +39 -39
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/__init__.py +8 -8
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/berxel/__init__.py +6 -6
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/cam/berxel/berxel_cam.py → hex_zmq_servers-0.2.0/hex_zmq_servers/cam/berxel/cam_berxel.py +2 -2
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/cam/berxel/berxel_cam_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/cam/berxel/cam_berxel_cli.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/cam/berxel/berxel_cam_srv.py → hex_zmq_servers-0.2.0/hex_zmq_servers/cam/berxel/cam_berxel_srv.py +5 -5
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/cam_base.py +0 -1
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/dummy/__init__.py +6 -6
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/cam/dummy/dummy_cam.py → hex_zmq_servers-0.2.0/hex_zmq_servers/cam/dummy/cam_dummy.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/cam/dummy/dummy_cam_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/cam/dummy/cam_dummy_cli.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/cam/dummy/dummy_cam_srv.py → hex_zmq_servers-0.2.0/hex_zmq_servers/cam/dummy/cam_dummy_srv.py +5 -5
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/robot_dummy.json +3 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/config/robot_hex_arm.json → hex_zmq_servers-0.2.0/hex_zmq_servers/config/robot_hexarm.json +2 -2
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/hex_launch.py +119 -47
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/__init__.py +8 -8
- {hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/e3_desktop → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/archer_d6y}/__init__.py +6 -6
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/archer_d6y/archer_d6y_mujoco.py → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/archer_d6y/mujoco_archer_d6y.py +48 -37
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/archer_d6y/archer_d6y_mujoco_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/archer_d6y/mujoco_archer_d6y_cli.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/e3_desktop/e3_desktop_mujoco_srv.py → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/archer_d6y/mujoco_archer_d6y_srv.py +30 -46
- {hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/e3_desktop}/__init__.py +6 -6
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/e3_desktop/e3_desktop_mujoco.py → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop.py +90 -58
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/e3_desktop/e3_desktop_mujoco_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_cli.py +43 -1
- hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_srv.py +227 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/mujoco_base.py +33 -41
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/__init__.py +13 -13
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/dummy/__init__.py +6 -6
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/dummy/dummy_robot.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/dummy/robot_dummy.py +3 -3
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/dummy/dummy_robot_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/dummy/robot_dummy_cli.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/dummy/dummy_robot_srv.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/dummy/robot_dummy_srv.py +6 -6
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/gello/__init__.py +6 -6
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/gello/gello_robot.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/gello/robot_gello.py +2 -2
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/gello/gello_robot_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/gello/robot_gello_cli.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/gello/gello_robot_srv.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/gello/robot_gello_srv.py +5 -5
- hex_zmq_servers-0.2.0/hex_zmq_servers/robot/hexarm/__init__.py +17 -0
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/hex_arm/hex_arm_robot.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/hexarm/robot_hexarm.py +32 -14
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/hex_arm/hex_arm_robot_cli.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/hexarm/robot_hexarm_cli.py +1 -1
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/hex_arm/hex_arm_robot_srv.py → hex_zmq_servers-0.2.0/hex_zmq_servers/robot/hexarm/robot_hexarm_srv.py +5 -5
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/robot_base.py +1 -1
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/zmq_base.py +3 -3
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0/hex_zmq_servers.egg-info}/PKG-INFO +2 -2
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/SOURCES.txt +23 -23
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/requires.txt +1 -1
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/pyproject.toml +2 -2
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/archer_d6y/archer_d6y_mujoco_srv.py +0 -89
- hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/hex_arm/__init__.py +0 -17
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/LICENSE +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/MANIFEST.in +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/README.md +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/cam_berxel.json +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/cam_dummy.json +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/mujoco_archer_d6y.json +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/mujoco_e3_desktop.json +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/robot_gello.json +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/zmq_dummy.json +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/device_base.py +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/arm_base_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/arm_link_1.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/arm_link_2.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/arm_link_3.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/arm_link_4.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/arm_link_5.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/assets.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/camera_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_base_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_narrow1_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_narrow2_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_narrow3_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_narrow_loop_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_wide1_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_wide2_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_wide3_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/picker_wide_loop_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/assets/table_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/robot.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/scene.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/setting.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_base_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_1.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_2.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_3.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_4.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_5.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/assets.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/camera_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/e3_desktop_base_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/link_camera.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_base_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_narrow1_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_narrow2_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_narrow3_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_narrow_loop_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_wide1_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_wide2_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_wide3_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/picker_wide_loop_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/table_link.STL +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/robot.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/scene.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/setting.xml +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/dependency_links.txt +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/top_level.txt +0 -0
- {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hex_zmq_servers
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: HEXFELLOW ZMQ Servers
|
|
5
5
|
Author-email: Dong Zhaorui <joray.dong@hexfellow.com>
|
|
6
6
|
Maintainer-email: jecjune <zejun.chen@hexfellow.com>, Dong Zhaorui <joray.dong@hexfellow.com>
|
|
@@ -27,7 +27,7 @@ License-File: LICENSE
|
|
|
27
27
|
Requires-Dist: pyzmq>=27.0.1
|
|
28
28
|
Requires-Dist: opencv-python>=4.2
|
|
29
29
|
Requires-Dist: mujoco>=3.3.3
|
|
30
|
-
Requires-Dist:
|
|
30
|
+
Requires-Dist: berxel_py_wrapper>=2.0
|
|
31
31
|
Requires-Dist: hex_device>=1.1.3
|
|
32
32
|
Requires-Dist: dynamixel-sdk==3.8.4
|
|
33
33
|
Dynamic: license-file
|
|
@@ -11,35 +11,35 @@ from .hex_launch import HexLaunch, HEX_LOG_LEVEL, hex_log, hex_err
|
|
|
11
11
|
from .device_base import HexDeviceBase
|
|
12
12
|
from .zmq_base import HexRate, hex_zmq_ts_now, hex_zmq_ts_delta_ms
|
|
13
13
|
from .zmq_base import HexSafeValue, HexZMQClientBase, HexZMQServerBase, hex_server_helper
|
|
14
|
-
from .zmq_base import
|
|
14
|
+
from .zmq_base import HexZMQDummyClient, HexZMQDummyServer
|
|
15
15
|
|
|
16
16
|
from .cam import HexCamBase, HexCamClientBase, HexCamServerBase
|
|
17
|
-
from .cam import
|
|
18
|
-
from .cam import
|
|
17
|
+
from .cam import HexCamDummy, HexCamDummyClient, HexCamDummyServer
|
|
18
|
+
from .cam import HexCamBerxel, HexCamBerxelClient, HexCamBerxelServer
|
|
19
19
|
|
|
20
20
|
from .mujoco import HexMujocoBase, HexMujocoClientBase, HexMujocoServerBase
|
|
21
|
-
from .mujoco import
|
|
22
|
-
from .mujoco import
|
|
21
|
+
from .mujoco import HexMujocoArcherD6y, HexMujocoArcherD6yClient, HexMujocoArcherD6yServer
|
|
22
|
+
from .mujoco import HexMujocoE3Desktop, HexMujocoE3DesktopClient, HexMujocoE3DesktopServer
|
|
23
23
|
|
|
24
24
|
from .robot import HexRobotBase, HexRobotClientBase, HexRobotServerBase
|
|
25
|
-
from .robot import
|
|
26
|
-
from .robot import
|
|
27
|
-
from .robot import
|
|
25
|
+
from .robot import HexRobotDummy, HexRobotDummyClient, HexRobotDummyServer
|
|
26
|
+
from .robot import HexRobotGello, HexRobotGelloClient, HexRobotGelloServer
|
|
27
|
+
from .robot import HexRobotHexarm, HexRobotHexarmClient, HexRobotHexarmServer
|
|
28
28
|
|
|
29
29
|
import os
|
|
30
30
|
|
|
31
31
|
file_dir = os.path.dirname(os.path.abspath(__file__))
|
|
32
32
|
HEX_ZMQ_SERVERS_PATH_DICT = {
|
|
33
33
|
"zmq_dummy": f"{file_dir}/zmq_base.py",
|
|
34
|
-
"cam_dummy": f"{file_dir}/cam/dummy/
|
|
35
|
-
"cam_berxel": f"{file_dir}/cam/berxel/
|
|
34
|
+
"cam_dummy": f"{file_dir}/cam/dummy/cam_dummy_srv.py",
|
|
35
|
+
"cam_berxel": f"{file_dir}/cam/berxel/cam_berxel_srv.py",
|
|
36
36
|
"mujoco_archer_d6y":
|
|
37
|
-
f"{file_dir}/mujoco/archer_d6y/
|
|
37
|
+
f"{file_dir}/mujoco/archer_d6y/mujoco_archer_d6y_srv.py",
|
|
38
38
|
"mujoco_e3_desktop":
|
|
39
|
-
f"{file_dir}/mujoco/e3_desktop/
|
|
40
|
-
"robot_dummy": f"{file_dir}/robot/dummy/
|
|
41
|
-
"robot_gello": f"{file_dir}/robot/gello/
|
|
42
|
-
"
|
|
39
|
+
f"{file_dir}/mujoco/e3_desktop/mujoco_e3_desktop_srv.py",
|
|
40
|
+
"robot_dummy": f"{file_dir}/robot/dummy/robot_dummy_srv.py",
|
|
41
|
+
"robot_gello": f"{file_dir}/robot/gello/robot_gello_srv.py",
|
|
42
|
+
"robot_hexarm": f"{file_dir}/robot/hexarm/robot_hexarm_srv.py",
|
|
43
43
|
}
|
|
44
44
|
HEX_ZMQ_CONFIGS_PATH_DICT = {
|
|
45
45
|
"zmq_dummy": f"{file_dir}/config/zmq_dummy.json",
|
|
@@ -49,7 +49,7 @@ HEX_ZMQ_CONFIGS_PATH_DICT = {
|
|
|
49
49
|
"mujoco_e3_desktop": f"{file_dir}/config/mujoco_e3_desktop.json",
|
|
50
50
|
"robot_dummy": f"{file_dir}/config/robot_dummy.json",
|
|
51
51
|
"robot_gello": f"{file_dir}/config/robot_gello.json",
|
|
52
|
-
"
|
|
52
|
+
"robot_hexarm": f"{file_dir}/config/robot_hexarm.json",
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
__all__ = [
|
|
@@ -75,44 +75,44 @@ __all__ = [
|
|
|
75
75
|
"HexZMQClientBase",
|
|
76
76
|
"HexZMQServerBase",
|
|
77
77
|
"hex_server_helper",
|
|
78
|
-
"
|
|
79
|
-
"
|
|
78
|
+
"HexZMQDummyClient",
|
|
79
|
+
"HexZMQDummyServer",
|
|
80
80
|
|
|
81
81
|
# camera
|
|
82
82
|
"HexCamBase",
|
|
83
83
|
"HexCamClientBase",
|
|
84
84
|
"HexCamServerBase",
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
85
|
+
"HexCamDummy",
|
|
86
|
+
"HexCamDummyClient",
|
|
87
|
+
"HexCamDummyServer",
|
|
88
|
+
"HexCamBerxel",
|
|
89
|
+
"HexCamBerxelClient",
|
|
90
|
+
"HexCamBerxelServer",
|
|
91
91
|
|
|
92
92
|
# mujoco
|
|
93
93
|
"HexMujocoBase",
|
|
94
94
|
"HexMujocoClientBase",
|
|
95
95
|
"HexMujocoServerBase",
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
96
|
+
"HexMujocoArcherD6y",
|
|
97
|
+
"HexMujocoArcherD6yClient",
|
|
98
|
+
"HexMujocoArcherD6yServer",
|
|
99
|
+
"HexMujocoE3Desktop",
|
|
100
|
+
"HexMujocoE3DesktopClient",
|
|
101
|
+
"HexMujocoE3DesktopServer",
|
|
102
102
|
|
|
103
103
|
# robot
|
|
104
104
|
"HexRobotBase",
|
|
105
105
|
"HexRobotClientBase",
|
|
106
106
|
"HexRobotServerBase",
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
107
|
+
"HexRobotDummy",
|
|
108
|
+
"HexRobotDummyClient",
|
|
109
|
+
"HexRobotDummyServer",
|
|
110
|
+
"HexRobotGello",
|
|
111
|
+
"HexRobotGelloClient",
|
|
112
|
+
"HexRobotGelloServer",
|
|
113
|
+
"HexRobotHexarm",
|
|
114
|
+
"HexRobotHexarmClient",
|
|
115
|
+
"HexRobotHexarmServer",
|
|
116
116
|
]
|
|
117
117
|
|
|
118
118
|
# print("#### Thanks for using hex_zmq_servers :D ####")
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
################################################################
|
|
8
8
|
|
|
9
9
|
from .cam_base import HexCamBase, HexCamClientBase, HexCamServerBase
|
|
10
|
-
from .dummy import
|
|
11
|
-
from .berxel import
|
|
10
|
+
from .dummy import HexCamDummy, HexCamDummyClient, HexCamDummyServer
|
|
11
|
+
from .berxel import HexCamBerxel, HexCamBerxelClient, HexCamBerxelServer
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
14
|
# base
|
|
@@ -17,12 +17,12 @@ __all__ = [
|
|
|
17
17
|
"HexCamServerBase",
|
|
18
18
|
|
|
19
19
|
# dummy
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
20
|
+
"HexCamDummy",
|
|
21
|
+
"HexCamDummyClient",
|
|
22
|
+
"HexCamDummyServer",
|
|
23
23
|
|
|
24
24
|
# berxel
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
25
|
+
"HexCamBerxel",
|
|
26
|
+
"HexCamBerxelClient",
|
|
27
|
+
"HexCamBerxelServer",
|
|
28
28
|
]
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
# Date : 2025-09-12
|
|
7
7
|
################################################################
|
|
8
8
|
|
|
9
|
-
from .
|
|
10
|
-
from .
|
|
11
|
-
from .
|
|
9
|
+
from .cam_berxel import HexCamBerxel
|
|
10
|
+
from .cam_berxel_cli import HexCamBerxelClient
|
|
11
|
+
from .cam_berxel_srv import HexCamBerxelServer
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
14
|
+
"HexCamBerxel",
|
|
15
|
+
"HexCamBerxelClient",
|
|
16
|
+
"HexCamBerxelServer",
|
|
17
17
|
]
|
|
@@ -11,7 +11,7 @@ import numpy as np
|
|
|
11
11
|
|
|
12
12
|
from ..cam_base import HexCamBase
|
|
13
13
|
from ...zmq_base import HexSafeValue
|
|
14
|
-
from
|
|
14
|
+
from berxel_py_wrapper import *
|
|
15
15
|
|
|
16
16
|
CAMERA_CONFIG = {
|
|
17
17
|
"serial_number": 'P100RYB4C03M2B322',
|
|
@@ -22,7 +22,7 @@ CAMERA_CONFIG = {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class
|
|
25
|
+
class HexCamBerxel(HexCamBase):
|
|
26
26
|
|
|
27
27
|
def __init__(
|
|
28
28
|
self,
|
|
@@ -10,7 +10,7 @@ import numpy as np
|
|
|
10
10
|
|
|
11
11
|
try:
|
|
12
12
|
from ..cam_base import HexCamServerBase
|
|
13
|
-
from .
|
|
13
|
+
from .cam_berxel import HexCamBerxel
|
|
14
14
|
except (ImportError, ValueError):
|
|
15
15
|
import sys
|
|
16
16
|
from pathlib import Path
|
|
@@ -19,7 +19,7 @@ except (ImportError, ValueError):
|
|
|
19
19
|
if str(project_root) not in sys.path:
|
|
20
20
|
sys.path.insert(0, str(project_root))
|
|
21
21
|
from hex_zmq_servers.cam.cam_base import HexCamServerBase
|
|
22
|
-
from hex_zmq_servers.cam.berxel.
|
|
22
|
+
from hex_zmq_servers.cam.berxel.cam_berxel import HexCamBerxel
|
|
23
23
|
|
|
24
24
|
NET_CONFIG = {
|
|
25
25
|
"ip": "127.0.0.1",
|
|
@@ -38,7 +38,7 @@ CAMERA_CONFIG = {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
class
|
|
41
|
+
class HexCamBerxelServer(HexCamServerBase):
|
|
42
42
|
|
|
43
43
|
def __init__(
|
|
44
44
|
self,
|
|
@@ -48,7 +48,7 @@ class HexBerxelCamServer(HexCamServerBase):
|
|
|
48
48
|
HexCamServerBase.__init__(self, net_config)
|
|
49
49
|
|
|
50
50
|
# camera
|
|
51
|
-
self._device =
|
|
51
|
+
self._device = HexCamBerxel(params_config)
|
|
52
52
|
|
|
53
53
|
def _process_request(self, recv_hdr: dict, recv_buf: np.ndarray):
|
|
54
54
|
if recv_hdr["cmd"] == "is_working":
|
|
@@ -73,4 +73,4 @@ if __name__ == "__main__":
|
|
|
73
73
|
args = parser.parse_args()
|
|
74
74
|
cfg = json.loads(args.cfg)
|
|
75
75
|
|
|
76
|
-
hex_server_helper(cfg,
|
|
76
|
+
hex_server_helper(cfg, HexCamBerxelServer)
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
# Date : 2025-09-12
|
|
7
7
|
################################################################
|
|
8
8
|
|
|
9
|
-
from .
|
|
10
|
-
from .
|
|
11
|
-
from .
|
|
9
|
+
from .cam_dummy import HexCamDummy
|
|
10
|
+
from .cam_dummy_cli import HexCamDummyClient
|
|
11
|
+
from .cam_dummy_srv import HexCamDummyServer
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
14
|
+
"HexCamDummy",
|
|
15
|
+
"HexCamDummyClient",
|
|
16
|
+
"HexCamDummyServer",
|
|
17
17
|
]
|
|
@@ -10,7 +10,7 @@ import numpy as np
|
|
|
10
10
|
|
|
11
11
|
try:
|
|
12
12
|
from ..cam_base import HexCamServerBase
|
|
13
|
-
from .
|
|
13
|
+
from .cam_dummy import HexCamDummy
|
|
14
14
|
except (ImportError, ValueError):
|
|
15
15
|
import sys
|
|
16
16
|
from pathlib import Path
|
|
@@ -19,7 +19,7 @@ except (ImportError, ValueError):
|
|
|
19
19
|
if str(project_root) not in sys.path:
|
|
20
20
|
sys.path.insert(0, str(project_root))
|
|
21
21
|
from hex_zmq_servers.cam.cam_base import HexCamServerBase
|
|
22
|
-
from hex_zmq_servers.cam.dummy.
|
|
22
|
+
from hex_zmq_servers.cam.dummy.cam_dummy import HexCamDummy
|
|
23
23
|
|
|
24
24
|
NET_CONFIG = {
|
|
25
25
|
"ip": "127.0.0.1",
|
|
@@ -30,7 +30,7 @@ NET_CONFIG = {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class
|
|
33
|
+
class HexCamDummyServer(HexCamServerBase):
|
|
34
34
|
|
|
35
35
|
def __init__(
|
|
36
36
|
self,
|
|
@@ -40,7 +40,7 @@ class HexDummyCamServer(HexCamServerBase):
|
|
|
40
40
|
HexCamServerBase.__init__(self, net_config)
|
|
41
41
|
|
|
42
42
|
# camera
|
|
43
|
-
self._device =
|
|
43
|
+
self._device = HexCamDummy(params_config)
|
|
44
44
|
|
|
45
45
|
def _process_request(self, recv_hdr: dict, recv_buf: np.ndarray):
|
|
46
46
|
if recv_hdr["cmd"] == "is_working":
|
|
@@ -62,4 +62,4 @@ if __name__ == "__main__":
|
|
|
62
62
|
args = parser.parse_args()
|
|
63
63
|
cfg = json.loads(args.cfg)
|
|
64
64
|
|
|
65
|
-
hex_server_helper(cfg,
|
|
65
|
+
hex_server_helper(cfg, HexCamDummyServer)
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
################################################################
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
|
-
import os, sys, signal,
|
|
10
|
+
import os, sys, signal, subprocess, threading, time
|
|
11
|
+
import termios
|
|
11
12
|
|
|
12
13
|
from datetime import datetime
|
|
13
14
|
from pathlib import Path
|
|
@@ -38,10 +39,45 @@ class HexLaunch:
|
|
|
38
39
|
):
|
|
39
40
|
self.__node_cfgs = node_cfgs
|
|
40
41
|
self.__state: Dict[str, dict] = {}
|
|
41
|
-
self.__stop_event =
|
|
42
|
+
self.__stop_event = threading.Event()
|
|
42
43
|
self.__log_dir = Path(log_dir)
|
|
43
44
|
self.__log_dir.mkdir(parents=True, exist_ok=True)
|
|
44
45
|
self.__min_level = min_level
|
|
46
|
+
# lock state for node messages
|
|
47
|
+
self.__state_lock = threading.Lock()
|
|
48
|
+
self.__shutdown_called = False
|
|
49
|
+
# terminal attrs
|
|
50
|
+
self.__terminal_attrs = None
|
|
51
|
+
self.__record_terminal_attrs()
|
|
52
|
+
|
|
53
|
+
def __record_terminal_attrs(self):
|
|
54
|
+
"""record terminal attrs"""
|
|
55
|
+
try:
|
|
56
|
+
self.__terminal_attrs = termios.tcgetattr(sys.stdin.fileno())
|
|
57
|
+
self.__terminal_attrs[3] |= (termios.ICANON | termios.ECHO)
|
|
58
|
+
try:
|
|
59
|
+
self.__terminal_attrs[6][termios.VMIN] = 1
|
|
60
|
+
self.__terminal_attrs[6][termios.VTIME] = 0
|
|
61
|
+
except Exception:
|
|
62
|
+
pass
|
|
63
|
+
print("[launcher] Terminal settings recorded")
|
|
64
|
+
except Exception as e:
|
|
65
|
+
print(f"[launcher] Failed to record terminal attrs: {e}")
|
|
66
|
+
|
|
67
|
+
def __restore_terminal_attrs(self):
|
|
68
|
+
"""restore terminal attrs"""
|
|
69
|
+
if self.__terminal_attrs is not None:
|
|
70
|
+
try:
|
|
71
|
+
termios.tcsetattr(
|
|
72
|
+
sys.stdin.fileno(),
|
|
73
|
+
termios.TCSADRAIN,
|
|
74
|
+
self.__terminal_attrs,
|
|
75
|
+
)
|
|
76
|
+
print("[launcher] Terminal attrs restored")
|
|
77
|
+
except Exception as e:
|
|
78
|
+
print(f"[launcher] Failed to restore terminal attrs: {e}")
|
|
79
|
+
else:
|
|
80
|
+
print("[launcher] No terminal attrs to restore")
|
|
45
81
|
|
|
46
82
|
def __build_cmd(self, node_cfg: dict):
|
|
47
83
|
# python path
|
|
@@ -80,10 +116,10 @@ class HexLaunch:
|
|
|
80
116
|
else:
|
|
81
117
|
dict_raw[key] = value
|
|
82
118
|
|
|
83
|
-
|
|
119
|
+
def __stream_printer(
|
|
84
120
|
self,
|
|
85
121
|
prefix: str,
|
|
86
|
-
stream
|
|
122
|
+
stream,
|
|
87
123
|
is_stderr: bool,
|
|
88
124
|
logfile_path: Path | None,
|
|
89
125
|
min_level: int,
|
|
@@ -92,9 +128,10 @@ class HexLaunch:
|
|
|
92
128
|
encoding="utf-8") if logfile_path else None
|
|
93
129
|
try:
|
|
94
130
|
while True:
|
|
95
|
-
raw =
|
|
131
|
+
raw = stream.readline()
|
|
96
132
|
if not raw:
|
|
97
|
-
|
|
133
|
+
time.sleep(0.001)
|
|
134
|
+
continue
|
|
98
135
|
line = raw.decode(errors="replace").rstrip("\n")
|
|
99
136
|
|
|
100
137
|
record_flag = True
|
|
@@ -139,19 +176,19 @@ class HexLaunch:
|
|
|
139
176
|
if logfile:
|
|
140
177
|
logfile.close()
|
|
141
178
|
|
|
142
|
-
|
|
179
|
+
def __start_node(self, node_cfg: dict):
|
|
143
180
|
name = node_cfg.get("name", node_cfg.get("node_path"))
|
|
144
181
|
env = os.environ.copy()
|
|
145
182
|
env.update(node_cfg.get("env", {}) or {})
|
|
146
183
|
cwd = node_cfg.get("cwd") or None
|
|
147
184
|
cmd = self.__build_cmd(node_cfg)
|
|
148
185
|
|
|
149
|
-
proc =
|
|
150
|
-
|
|
186
|
+
proc = subprocess.Popen(
|
|
187
|
+
cmd,
|
|
151
188
|
cwd=cwd,
|
|
152
189
|
env=env,
|
|
153
|
-
stdout=
|
|
154
|
-
stderr=
|
|
190
|
+
stdout=subprocess.PIPE,
|
|
191
|
+
stderr=subprocess.PIPE,
|
|
155
192
|
preexec_fn=os.setsid,
|
|
156
193
|
)
|
|
157
194
|
|
|
@@ -164,53 +201,75 @@ class HexLaunch:
|
|
|
164
201
|
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
165
202
|
err_path.parent.mkdir(parents=True, exist_ok=True)
|
|
166
203
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
204
|
+
log_thread = threading.Thread(target=self.__stream_printer,
|
|
205
|
+
args=(name, proc.stdout, False, log_path,
|
|
206
|
+
self.__min_level),
|
|
207
|
+
daemon=True)
|
|
208
|
+
err_thread = threading.Thread(target=self.__stream_printer,
|
|
209
|
+
args=(name, proc.stderr, True, err_path,
|
|
210
|
+
self.__min_level),
|
|
211
|
+
daemon=True)
|
|
212
|
+
log_thread.start()
|
|
213
|
+
err_thread.start()
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
"proc": proc,
|
|
217
|
+
"threads": (log_thread, err_thread),
|
|
218
|
+
"cfg": node_cfg
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
def __monitor_loop(self):
|
|
177
222
|
print(f"[launcher] Started {len(self.__node_cfgs)} nodes")
|
|
178
223
|
for node in self.__node_cfgs:
|
|
179
224
|
print(
|
|
180
225
|
f"[launcher] Starting {node.get('name', node.get('node_path'))}"
|
|
181
226
|
)
|
|
182
|
-
entry =
|
|
183
|
-
self.
|
|
227
|
+
entry = self.__start_node(node)
|
|
228
|
+
with self.__state_lock:
|
|
229
|
+
self.__state[node.get("name", node.get("node_path"))] = entry
|
|
184
230
|
|
|
185
231
|
try:
|
|
186
|
-
while self.
|
|
187
|
-
|
|
232
|
+
while not self.__stop_event.is_set():
|
|
233
|
+
with self.__state_lock:
|
|
234
|
+
if not self.__state:
|
|
235
|
+
break
|
|
236
|
+
state_items = list(self.__state.items())
|
|
237
|
+
|
|
238
|
+
for name, entry in state_items:
|
|
188
239
|
proc = entry["proc"]
|
|
189
240
|
cfg_node = entry["cfg"]
|
|
190
241
|
|
|
191
|
-
if proc.
|
|
242
|
+
if proc.poll() is not None:
|
|
192
243
|
print(
|
|
193
244
|
f"[launcher] Node {name} exited {proc.returncode}")
|
|
194
|
-
|
|
195
|
-
t.cancel()
|
|
245
|
+
# Threads will stop automatically when stream ends
|
|
196
246
|
|
|
197
247
|
if cfg_node.get("respawn"):
|
|
198
248
|
delay = cfg_node.get("respawn_delay", 1)
|
|
199
249
|
print(
|
|
200
250
|
f"[launcher] Respawning {name} in {delay}s...")
|
|
201
|
-
|
|
202
|
-
new_entry =
|
|
203
|
-
self.
|
|
251
|
+
time.sleep(delay)
|
|
252
|
+
new_entry = self.__start_node(cfg_node)
|
|
253
|
+
with self.__state_lock:
|
|
254
|
+
self.__state[name] = new_entry
|
|
204
255
|
else:
|
|
205
|
-
|
|
256
|
+
with self.__state_lock:
|
|
257
|
+
del self.__state[name]
|
|
206
258
|
|
|
207
|
-
|
|
208
|
-
except
|
|
259
|
+
time.sleep(0.5)
|
|
260
|
+
except KeyboardInterrupt:
|
|
209
261
|
pass
|
|
210
262
|
|
|
211
263
|
def __shutdown(self, signame):
|
|
264
|
+
if self.__shutdown_called:
|
|
265
|
+
return
|
|
266
|
+
self.__shutdown_called = True
|
|
267
|
+
|
|
212
268
|
print(f"[launcher] Got signal {signame}, shutting down children...")
|
|
213
|
-
|
|
269
|
+
with self.__state_lock:
|
|
270
|
+
state_items = list(self.__state.items())
|
|
271
|
+
|
|
272
|
+
for _, entry in state_items:
|
|
214
273
|
proc = entry["proc"]
|
|
215
274
|
try:
|
|
216
275
|
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
|
|
@@ -220,19 +279,34 @@ class HexLaunch:
|
|
|
220
279
|
except Exception:
|
|
221
280
|
pass
|
|
222
281
|
self.__stop_event.set()
|
|
282
|
+
self.__restore_terminal_attrs()
|
|
223
283
|
|
|
224
|
-
|
|
225
|
-
|
|
284
|
+
def run(self):
|
|
285
|
+
# Set up signal handlers
|
|
226
286
|
for s in (signal.SIGINT, signal.SIGTERM):
|
|
227
|
-
|
|
287
|
+
signal.signal(
|
|
288
|
+
s, lambda signum, frame: self.__shutdown(
|
|
289
|
+
signal.Signals(signum).name))
|
|
290
|
+
|
|
291
|
+
# Start monitor in a separate thread
|
|
292
|
+
monitor_thread = threading.Thread(target=self.__monitor_loop,
|
|
293
|
+
daemon=True)
|
|
294
|
+
monitor_thread.start()
|
|
228
295
|
|
|
229
|
-
monitor
|
|
230
|
-
|
|
296
|
+
# Wait for stop event or monitor thread to finish
|
|
297
|
+
while monitor_thread.is_alive() and not self.__stop_event.is_set():
|
|
298
|
+
self.__stop_event.wait(timeout=0.5)
|
|
231
299
|
|
|
232
|
-
|
|
233
|
-
|
|
300
|
+
# Give processes time to terminate gracefully
|
|
301
|
+
time.sleep(1.0)
|
|
302
|
+
|
|
303
|
+
# Force kill any remaining processes
|
|
304
|
+
with self.__state_lock:
|
|
305
|
+
state_items = list(self.__state.items())
|
|
306
|
+
|
|
307
|
+
for name, entry in state_items:
|
|
234
308
|
proc = entry["proc"]
|
|
235
|
-
if proc.
|
|
309
|
+
if proc.poll() is None:
|
|
236
310
|
try:
|
|
237
311
|
os.killpg(os.getpgid(proc.pid), signal.SIGKILL)
|
|
238
312
|
except Exception:
|
|
@@ -240,8 +314,6 @@ class HexLaunch:
|
|
|
240
314
|
proc.kill()
|
|
241
315
|
except Exception:
|
|
242
316
|
pass
|
|
243
|
-
monitor.cancel()
|
|
244
|
-
await asyncio.sleep(0.1)
|
|
245
317
|
|
|
246
|
-
|
|
247
|
-
|
|
318
|
+
# Wait for monitor thread to finish
|
|
319
|
+
monitor_thread.join(timeout=0.5)
|