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.
Files changed (103) hide show
  1. {hex_zmq_servers-0.1.21.1/hex_zmq_servers.egg-info → hex_zmq_servers-0.2.0}/PKG-INFO +2 -2
  2. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/__init__.py +39 -39
  3. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/__init__.py +8 -8
  4. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/berxel/__init__.py +6 -6
  5. 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
  6. 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
  7. 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
  8. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/cam_base.py +0 -1
  9. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/cam/dummy/__init__.py +6 -6
  10. 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
  11. 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
  12. 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
  13. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/robot_dummy.json +3 -1
  14. 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
  15. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/hex_launch.py +119 -47
  16. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/__init__.py +8 -8
  17. {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
  18. 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
  19. 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
  20. 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
  21. {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
  22. 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
  23. 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
  24. hex_zmq_servers-0.2.0/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_srv.py +227 -0
  25. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/mujoco_base.py +33 -41
  26. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/__init__.py +13 -13
  27. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/dummy/__init__.py +6 -6
  28. 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
  29. 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
  30. 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
  31. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/gello/__init__.py +6 -6
  32. 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
  33. 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
  34. 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
  35. hex_zmq_servers-0.2.0/hex_zmq_servers/robot/hexarm/__init__.py +17 -0
  36. 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
  37. 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
  38. 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
  39. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/robot/robot_base.py +1 -1
  40. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/zmq_base.py +3 -3
  41. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0/hex_zmq_servers.egg-info}/PKG-INFO +2 -2
  42. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/SOURCES.txt +23 -23
  43. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/requires.txt +1 -1
  44. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/pyproject.toml +2 -2
  45. hex_zmq_servers-0.1.21.1/hex_zmq_servers/mujoco/archer_d6y/archer_d6y_mujoco_srv.py +0 -89
  46. hex_zmq_servers-0.1.21.1/hex_zmq_servers/robot/hex_arm/__init__.py +0 -17
  47. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/LICENSE +0 -0
  48. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/MANIFEST.in +0 -0
  49. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/README.md +0 -0
  50. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/cam_berxel.json +0 -0
  51. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/cam_dummy.json +0 -0
  52. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/mujoco_archer_d6y.json +0 -0
  53. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/mujoco_e3_desktop.json +0 -0
  54. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/robot_gello.json +0 -0
  55. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/config/zmq_dummy.json +0 -0
  56. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/device_base.py +0 -0
  57. {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
  58. {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
  59. {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
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/robot.xml +0 -0
  76. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/scene.xml +0 -0
  77. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/archer_d6y/model/setting.xml +0 -0
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {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
  98. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/robot.xml +0 -0
  99. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/scene.xml +0 -0
  100. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers/mujoco/e3_desktop/model/setting.xml +0 -0
  101. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/dependency_links.txt +0 -0
  102. {hex_zmq_servers-0.1.21.1 → hex_zmq_servers-0.2.0}/hex_zmq_servers.egg-info/top_level.txt +0 -0
  103. {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.1.21.1
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: berxel_py_warpper>=2.0
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 HexDummyZMQClient, HexDummyZMQServer
14
+ from .zmq_base import HexZMQDummyClient, HexZMQDummyServer
15
15
 
16
16
  from .cam import HexCamBase, HexCamClientBase, HexCamServerBase
17
- from .cam import HexDummyCam, HexDummyCamClient, HexDummyCamServer
18
- from .cam import HexBerxelCam, HexBerxelCamClient, HexBerxelCamServer
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 HexArcherD6yMujoco, HexArcherD6yMujocoClient, HexArcherD6yMujocoServer
22
- from .mujoco import HexE3DesktopMujoco, HexE3DesktopMujocoClient, HexE3DesktopMujocoServer
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 HexDummyRobot, HexDummyRobotClient, HexDummyRobotServer
26
- from .robot import HexGelloRobot, HexGelloRobotClient, HexGelloRobotServer
27
- from .robot import HexHexArmRobot, HexHexArmRobotClient, HexHexArmRobotServer
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/dummy_cam_srv.py",
35
- "cam_berxel": f"{file_dir}/cam/berxel/berxel_cam_srv.py",
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/archer_d6y_mujoco_srv.py",
37
+ f"{file_dir}/mujoco/archer_d6y/mujoco_archer_d6y_srv.py",
38
38
  "mujoco_e3_desktop":
39
- f"{file_dir}/mujoco/e3_desktop/e3_desktop_mujoco_srv.py",
40
- "robot_dummy": f"{file_dir}/robot/dummy/dummy_robot_srv.py",
41
- "robot_gello": f"{file_dir}/robot/gello/gello_robot_srv.py",
42
- "robot_hex_arm": f"{file_dir}/robot/hex_arm/hex_arm_robot_srv.py",
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
- "robot_hex_arm": f"{file_dir}/config/robot_hex_arm.json",
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
- "HexDummyZMQClient",
79
- "HexDummyZMQServer",
78
+ "HexZMQDummyClient",
79
+ "HexZMQDummyServer",
80
80
 
81
81
  # camera
82
82
  "HexCamBase",
83
83
  "HexCamClientBase",
84
84
  "HexCamServerBase",
85
- "HexDummyCam",
86
- "HexDummyCamClient",
87
- "HexDummyCamServer",
88
- "HexBerxelCam",
89
- "HexBerxelCamClient",
90
- "HexBerxelCamServer",
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
- "HexArcherD6yMujoco",
97
- "HexArcherD6yMujocoClient",
98
- "HexArcherD6yMujocoServer",
99
- "HexE3DesktopMujoco",
100
- "HexE3DesktopMujocoClient",
101
- "HexE3DesktopMujocoServer",
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
- "HexDummyRobot",
108
- "HexDummyRobotClient",
109
- "HexDummyRobotServer",
110
- "HexGelloRobot",
111
- "HexGelloRobotClient",
112
- "HexGelloRobotServer",
113
- "HexHexArmRobot",
114
- "HexHexArmRobotClient",
115
- "HexHexArmRobotServer",
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 HexDummyCam, HexDummyCamClient, HexDummyCamServer
11
- from .berxel import HexBerxelCam, HexBerxelCamClient, HexBerxelCamServer
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
- "HexDummyCam",
21
- "HexDummyCamClient",
22
- "HexDummyCamServer",
20
+ "HexCamDummy",
21
+ "HexCamDummyClient",
22
+ "HexCamDummyServer",
23
23
 
24
24
  # berxel
25
- "HexBerxelCam",
26
- "HexBerxelCamClient",
27
- "HexBerxelCamServer",
25
+ "HexCamBerxel",
26
+ "HexCamBerxelClient",
27
+ "HexCamBerxelServer",
28
28
  ]
@@ -6,12 +6,12 @@
6
6
  # Date : 2025-09-12
7
7
  ################################################################
8
8
 
9
- from .berxel_cam import HexBerxelCam
10
- from .berxel_cam_cli import HexBerxelCamClient
11
- from .berxel_cam_srv import HexBerxelCamServer
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
- "HexBerxelCam",
15
- "HexBerxelCamClient",
16
- "HexBerxelCamServer",
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 berxel_py_warpper import *
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 HexBerxelCam(HexCamBase):
25
+ class HexCamBerxel(HexCamBase):
26
26
 
27
27
  def __init__(
28
28
  self,
@@ -17,7 +17,7 @@ NET_CONFIG = {
17
17
  }
18
18
 
19
19
 
20
- class HexBerxelCamClient(HexCamClientBase):
20
+ class HexCamBerxelClient(HexCamClientBase):
21
21
 
22
22
  def __init__(
23
23
  self,
@@ -10,7 +10,7 @@ import numpy as np
10
10
 
11
11
  try:
12
12
  from ..cam_base import HexCamServerBase
13
- from .berxel_cam import HexBerxelCam
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.berxel_cam import HexBerxelCam
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 HexBerxelCamServer(HexCamServerBase):
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 = HexBerxelCam(params_config)
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, HexBerxelCamServer)
76
+ hex_server_helper(cfg, HexCamBerxelServer)
@@ -74,7 +74,6 @@ class HexCamClientBase(HexZMQClientBase):
74
74
  self._rgb_seq = hdr["args"]
75
75
  return hdr, img
76
76
  else:
77
- print(f"\033[91m{cmd} is not {req_cmd}\033[0m")
78
77
  return None, None
79
78
  except KeyError:
80
79
  print(f"\033[91m{hdr['cmd']} requires `cmd`\033[0m")
@@ -6,12 +6,12 @@
6
6
  # Date : 2025-09-12
7
7
  ################################################################
8
8
 
9
- from .dummy_cam import HexDummyCam
10
- from .dummy_cam_cli import HexDummyCamClient
11
- from .dummy_cam_srv import HexDummyCamServer
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
- "HexDummyCam",
15
- "HexDummyCamClient",
16
- "HexDummyCamServer",
14
+ "HexCamDummy",
15
+ "HexCamDummyClient",
16
+ "HexCamDummyServer",
17
17
  ]
@@ -16,7 +16,7 @@ from ...zmq_base import (
16
16
  )
17
17
 
18
18
 
19
- class HexDummyCam(HexCamBase):
19
+ class HexCamDummy(HexCamBase):
20
20
 
21
21
  def __init__(self, params_config: dict = {}):
22
22
  HexCamBase.__init__(self)
@@ -17,7 +17,7 @@ NET_CONFIG = {
17
17
  }
18
18
 
19
19
 
20
- class HexDummyCamClient(HexCamClientBase):
20
+ class HexCamDummyClient(HexCamClientBase):
21
21
 
22
22
  def __init__(
23
23
  self,
@@ -10,7 +10,7 @@ import numpy as np
10
10
 
11
11
  try:
12
12
  from ..cam_base import HexCamServerBase
13
- from .dummy_cam import HexDummyCam
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.dummy_cam import HexDummyCam
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 HexDummyCamServer(HexCamServerBase):
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 = HexDummyCam(params_config)
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, HexDummyCamServer)
65
+ hex_server_helper(cfg, HexCamDummyServer)
@@ -7,7 +7,9 @@
7
7
  "server_num_workers": 4
8
8
  },
9
9
  "params": {
10
- "dofs": 7,
10
+ "dofs": [
11
+ 7
12
+ ],
11
13
  "limits": [
12
14
  [
13
15
  [
@@ -19,7 +19,7 @@
19
19
  75.0,
20
20
  15.0,
21
21
  15.0,
22
- 0.0
22
+ 20.0
23
23
  ],
24
24
  "mit_kd": [
25
25
  12.5,
@@ -28,7 +28,7 @@
28
28
  6.0,
29
29
  0.31,
30
30
  0.31,
31
- 0.0
31
+ 1.0
32
32
  ],
33
33
  "sens_ts": true
34
34
  }
@@ -7,7 +7,8 @@
7
7
  ################################################################
8
8
 
9
9
  import json
10
- import os, sys, signal, asyncio
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 = asyncio.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
- async def __stream_printer(
119
+ def __stream_printer(
84
120
  self,
85
121
  prefix: str,
86
- stream: asyncio.StreamReader,
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 = await stream.readline()
131
+ raw = stream.readline()
96
132
  if not raw:
97
- break
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
- async def __start_node(self, node_cfg: dict):
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 = await asyncio.create_subprocess_exec(
150
- *cmd,
186
+ proc = subprocess.Popen(
187
+ cmd,
151
188
  cwd=cwd,
152
189
  env=env,
153
- stdout=asyncio.subprocess.PIPE,
154
- stderr=asyncio.subprocess.PIPE,
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
- log_task = asyncio.create_task(
168
- self.__stream_printer(name, proc.stdout, False, log_path,
169
- self.__min_level))
170
- err_task = asyncio.create_task(
171
- self.__stream_printer(name, proc.stderr, True, err_path,
172
- self.__min_level))
173
-
174
- return {"proc": proc, "tasks": (log_task, err_task), "cfg": node_cfg}
175
-
176
- async def __monitor_loop(self):
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 = await self.__start_node(node)
183
- self.__state[node.get("name", node.get("node_path"))] = entry
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.__state:
187
- for name, entry in list(self.__state.items()):
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.returncode is not None:
242
+ if proc.poll() is not None:
192
243
  print(
193
244
  f"[launcher] Node {name} exited {proc.returncode}")
194
- for t in entry["tasks"]:
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
- await asyncio.sleep(delay)
202
- new_entry = await self.__start_node(cfg_node)
203
- self.__state[name] = new_entry
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
- del self.__state[name]
256
+ with self.__state_lock:
257
+ del self.__state[name]
206
258
 
207
- await asyncio.sleep(0.5)
208
- except asyncio.CancelledError:
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
- for name, entry in self.__state.items():
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
- async def main(self):
225
- loop = asyncio.get_running_loop()
284
+ def run(self):
285
+ # Set up signal handlers
226
286
  for s in (signal.SIGINT, signal.SIGTERM):
227
- loop.add_signal_handler(s, lambda s=s: self.__shutdown(s.name))
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 = asyncio.create_task(self.__monitor_loop())
230
- await self.__stop_event.wait()
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
- await asyncio.sleep(1.0)
233
- for name, entry in self.__state.items():
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.returncode is None:
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
- def run(self):
247
- asyncio.run(self.main())
318
+ # Wait for monitor thread to finish
319
+ monitor_thread.join(timeout=0.5)