hex-zmq-servers 0.2.4__tar.gz → 0.3.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 (106) hide show
  1. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/MANIFEST.in +1 -1
  2. {hex_zmq_servers-0.2.4/hex_zmq_servers.egg-info → hex_zmq_servers-0.3.0}/PKG-INFO +5 -4
  3. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/README.md +1 -1
  4. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/__init__.py +13 -15
  5. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/robot_hexarm.json +1 -1
  6. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/hex_launch.py +178 -13
  7. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/__init__.py +5 -5
  8. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/__init__.py +6 -6
  9. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/scene.xml +1 -1
  10. hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y/mujoco_archer_d6y.py → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6.py +4 -4
  11. hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y/mujoco_archer_d6y_cli.py → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_cli.py +1 -1
  12. hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y/mujoco_archer_d6y_srv.py → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_srv.py +5 -5
  13. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop.py +2 -2
  14. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/__init__.py +10 -10
  15. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/robot_hexarm.py +3 -3
  16. {hex_zmq_servers-0.2.4/hex_zmq_servers/robot/hexarm/urdf/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/robot/hexarm/urdf/archer_y6}/empty.urdf +15 -15
  17. {hex_zmq_servers-0.2.4/hex_zmq_servers/robot/hexarm/urdf/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/robot/hexarm/urdf/archer_y6}/gp100.urdf +15 -15
  18. {hex_zmq_servers-0.2.4/hex_zmq_servers/robot/hexarm/urdf/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/robot/hexarm/urdf/archer_y6}/gp100_handle.urdf +15 -15
  19. {hex_zmq_servers-0.2.4/hex_zmq_servers/robot/hexarm/urdf/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/robot/hexarm/urdf/archer_y6}/gp100_p050.urdf +15 -15
  20. {hex_zmq_servers-0.2.4/hex_zmq_servers/robot/hexarm/urdf/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/robot/hexarm/urdf/archer_y6}/gp100_p050_handle.urdf +15 -15
  21. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0/hex_zmq_servers.egg-info}/PKG-INFO +5 -4
  22. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers.egg-info/SOURCES.txt +30 -30
  23. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers.egg-info/requires.txt +1 -1
  24. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/pyproject.toml +4 -3
  25. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/LICENSE +0 -0
  26. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/__init__.py +0 -0
  27. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/berxel/__init__.py +0 -0
  28. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/berxel/cam_berxel.py +0 -0
  29. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/berxel/cam_berxel_cli.py +0 -0
  30. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/berxel/cam_berxel_srv.py +0 -0
  31. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/cam_base.py +0 -0
  32. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/dummy/__init__.py +0 -0
  33. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/dummy/cam_dummy.py +0 -0
  34. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/dummy/cam_dummy_cli.py +0 -0
  35. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/cam/dummy/cam_dummy_srv.py +0 -0
  36. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/cam_berxel.json +0 -0
  37. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/cam_dummy.json +0 -0
  38. /hex_zmq_servers-0.2.4/hex_zmq_servers/config/mujoco_archer_d6y.json → /hex_zmq_servers-0.3.0/hex_zmq_servers/config/mujoco_archer_y6.json +0 -0
  39. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/mujoco_e3_desktop.json +0 -0
  40. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/robot_dummy.json +0 -0
  41. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/robot_gello.json +0 -0
  42. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/config/zmq_dummy.json +0 -0
  43. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/device_base.py +0 -0
  44. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/arm_base_link.STL +0 -0
  45. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/arm_link_1.STL +0 -0
  46. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/arm_link_2.STL +0 -0
  47. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/arm_link_3.STL +0 -0
  48. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/arm_link_4.STL +0 -0
  49. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/arm_link_5.STL +0 -0
  50. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/assets.xml +0 -0
  51. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/camera_link.STL +0 -0
  52. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_base_link.STL +0 -0
  53. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_left_helper_link.STL +0 -0
  54. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_left_link_1.STL +0 -0
  55. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_left_link_2.STL +0 -0
  56. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_right_helper_link.STL +0 -0
  57. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_right_link_1.STL +0 -0
  58. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/gripper_right_link_2.STL +0 -0
  59. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/assets/table_link.STL +0 -0
  60. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/robot.xml +0 -0
  61. {hex_zmq_servers-0.2.4/hex_zmq_servers/mujoco/archer_d6y → hex_zmq_servers-0.3.0/hex_zmq_servers/mujoco/archer_y6}/model/setting.xml +0 -0
  62. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/__init__.py +0 -0
  63. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_base_link.STL +0 -0
  64. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_1.STL +0 -0
  65. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_2.STL +0 -0
  66. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_3.STL +0 -0
  67. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_4.STL +0 -0
  68. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_5.STL +0 -0
  69. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/assets.xml +0 -0
  70. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/camera_link.STL +0 -0
  71. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/e3_desktop_base_link.STL +0 -0
  72. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_base_link.STL +0 -0
  73. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_helper_link.STL +0 -0
  74. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_link_1.STL +0 -0
  75. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_link_2.STL +0 -0
  76. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_helper_link.STL +0 -0
  77. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_link_1.STL +0 -0
  78. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_link_2.STL +0 -0
  79. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/assets/table_link.STL +0 -0
  80. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/robot.xml +0 -0
  81. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/scene.xml +0 -0
  82. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/model/setting.xml +0 -0
  83. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_cli.py +0 -0
  84. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_srv.py +0 -0
  85. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/mujoco/mujoco_base.py +0 -0
  86. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/__init__.py +0 -0
  87. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/dummy/__init__.py +0 -0
  88. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/dummy/robot_dummy.py +0 -0
  89. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/dummy/robot_dummy_cli.py +0 -0
  90. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/dummy/robot_dummy_srv.py +0 -0
  91. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/gello/__init__.py +0 -0
  92. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/gello/robot_gello.py +0 -0
  93. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/gello/robot_gello_cli.py +0 -0
  94. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/gello/robot_gello_srv.py +0 -0
  95. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/robot_hexarm_cli.py +0 -0
  96. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/robot_hexarm_srv.py +0 -0
  97. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/empty.urdf +0 -0
  98. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100.urdf +0 -0
  99. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_handle.urdf +0 -0
  100. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_p050.urdf +0 -0
  101. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_p050_handle.urdf +0 -0
  102. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/robot/robot_base.py +0 -0
  103. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers/zmq_base.py +0 -0
  104. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers.egg-info/dependency_links.txt +0 -0
  105. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/hex_zmq_servers.egg-info/top_level.txt +0 -0
  106. {hex_zmq_servers-0.2.4 → hex_zmq_servers-0.3.0}/setup.cfg +0 -0
@@ -3,7 +3,7 @@ include README.md
3
3
  include requirements.txt
4
4
 
5
5
  recursive-include package_name *
6
- recursive-include hex_zmq_servers/mujoco/archer_d6y/model * *
6
+ recursive-include hex_zmq_servers/mujoco/archer_y6/model * *
7
7
  recursive-include hex_zmq_servers/mujoco/e3_desktop/model * *
8
8
  recursive-include hex_zmq_servers/robot/hexarm/urdf * *
9
9
  recursive-include hex_zmq_servers/config *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hex_zmq_servers
3
- Version: 0.2.4
3
+ Version: 0.3.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>
@@ -15,15 +15,16 @@ Classifier: Intended Audience :: Developers
15
15
  Classifier: Intended Audience :: Science/Research
16
16
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
17
  Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
18
19
  Classifier: Programming Language :: Python :: 3.11
19
20
  Classifier: Programming Language :: Python :: 3.12
20
21
  Classifier: Operating System :: POSIX :: Linux
21
- Requires-Python: >=3.8
22
+ Requires-Python: >=3.10
22
23
  Description-Content-Type: text/markdown
23
24
  License-File: LICENSE
24
25
  Requires-Dist: pyzmq>=27.0.1
25
26
  Requires-Dist: hex_device<1.4.0,>=1.3.1
26
- Requires-Dist: hex_robo_utils<0.2.0,>=0.1.19
27
+ Requires-Dist: hex_robo_utils<0.2.0,>=0.1.20
27
28
  Requires-Dist: dynamixel-sdk==3.8.4
28
29
  Provides-Extra: camera
29
30
  Requires-Dist: berxel_py_wrapper>=2.0; extra == "camera"
@@ -73,7 +74,7 @@ hex_zmq_servers/
73
74
 
74
75
  ### Mujoco
75
76
 
76
- - **archer_d6y**: Physical simulation of Archer D6Y robot
77
+ - **archer_y6**: Physical simulation of Archer Y6 robot
77
78
  - **e3_desktop**: Physical simulation of E3 Desktop robot
78
79
 
79
80
  ## Installation
@@ -34,7 +34,7 @@ hex_zmq_servers/
34
34
 
35
35
  ### Mujoco
36
36
 
37
- - **archer_d6y**: Physical simulation of Archer D6Y robot
37
+ - **archer_y6**: Physical simulation of Archer Y6 robot
38
38
  - **e3_desktop**: Physical simulation of E3 Desktop robot
39
39
 
40
40
  ## Installation
@@ -6,17 +6,13 @@
6
6
  # Date : 2025-09-15
7
7
  ################################################################
8
8
 
9
- from .hex_launch import HexLaunch, HEX_LOG_LEVEL, hex_log, hex_err
9
+ from .hex_launch import HexLaunch, HexNodeConfig, HEX_LOG_LEVEL, hex_dict_str, hex_log, hex_err
10
10
 
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
14
  from .zmq_base import HexZMQDummyClient, HexZMQDummyServer
15
15
 
16
- from .mujoco import HexMujocoBase, HexMujocoClientBase, HexMujocoServerBase
17
- from .mujoco import HexMujocoArcherD6y, HexMujocoArcherD6yClient, HexMujocoArcherD6yServer
18
- from .mujoco import HexMujocoE3Desktop, HexMujocoE3DesktopClient, HexMujocoE3DesktopServer
19
-
20
16
  from .robot import HexRobotBase, HexRobotClientBase, HexRobotServerBase
21
17
  from .robot import HexRobotDummy, HexRobotDummyClient, HexRobotDummyServer
22
18
  from .robot import HexRobotGello, HexRobotGelloClient, HexRobotGelloServer
@@ -49,7 +45,9 @@ __all__ = [
49
45
 
50
46
  # launch
51
47
  "HexLaunch",
48
+ "HexNodeConfig",
52
49
  "HEX_LOG_LEVEL",
50
+ "hex_dict_str",
53
51
  "hex_log",
54
52
  "hex_err",
55
53
 
@@ -111,23 +109,23 @@ try:
111
109
  ])
112
110
  except ImportError:
113
111
  # berxel_py_wrapper not installed
114
- # Install with: pip install hex_zmq_servers[berxel]
112
+ # Install with: pip install hex_zmq_servers[berxel] or pip install hex_zmq_servers[all]
115
113
  pass
116
114
 
117
115
  # Optional: mujoco
118
116
  try:
119
117
  from .mujoco import HexMujocoBase, HexMujocoClientBase, HexMujocoServerBase
120
- from .mujoco import HexMujocoArcherD6y, HexMujocoArcherD6yClient, HexMujocoArcherD6yServer
118
+ from .mujoco import HexMujocoArcherY6, HexMujocoArcherY6Client, HexMujocoArcherY6Server
121
119
  from .mujoco import HexMujocoE3Desktop, HexMujocoE3DesktopClient, HexMujocoE3DesktopServer
122
120
  HEX_ZMQ_SERVERS_PATH_DICT.update({
123
- "mujoco_archer_d6y":
124
- f"{file_dir}/mujoco/archer_d6y/mujoco_archer_d6y_srv.py",
121
+ "mujoco_archer_y6":
122
+ f"{file_dir}/mujoco/archer_y6/mujoco_archer_y6_srv.py",
125
123
  "mujoco_e3_desktop":
126
124
  f"{file_dir}/mujoco/e3_desktop/mujoco_e3_desktop_srv.py",
127
125
  })
128
126
  HEX_ZMQ_CONFIGS_PATH_DICT.update({
129
- "mujoco_archer_d6y":
130
- f"{file_dir}/config/mujoco_archer_d6y.json",
127
+ "mujoco_archer_y6":
128
+ f"{file_dir}/config/mujoco_archer_y6.json",
131
129
  "mujoco_e3_desktop":
132
130
  f"{file_dir}/config/mujoco_e3_desktop.json",
133
131
  })
@@ -136,16 +134,16 @@ try:
136
134
  "HexMujocoBase",
137
135
  "HexMujocoClientBase",
138
136
  "HexMujocoServerBase",
139
- "HexMujocoArcherD6y",
140
- "HexMujocoArcherD6yClient",
141
- "HexMujocoArcherD6yServer",
137
+ "HexMujocoArcherY6",
138
+ "HexMujocoArcherY6Client",
139
+ "HexMujocoArcherY6Server",
142
140
  "HexMujocoE3Desktop",
143
141
  "HexMujocoE3DesktopClient",
144
142
  "HexMujocoE3DesktopServer",
145
143
  ])
146
144
  except ImportError:
147
145
  # mujoco not installed
148
- # Install with: pip install hex_zmq_servers[mujoco]
146
+ # Install with: pip install hex_zmq_servers[mujoco] or pip install hex_zmq_servers[all]
149
147
  pass
150
148
 
151
149
  # print("#### Thanks for using hex_zmq_servers :D ####")
@@ -10,7 +10,7 @@
10
10
  "device_ip": "172.18.8.161",
11
11
  "device_port": 8439,
12
12
  "control_hz": 500,
13
- "arm_type": 16,
13
+ "arm_type": "archer_l6y",
14
14
  "use_gripper": true,
15
15
  "mit_kp": [
16
16
  200.0,
@@ -6,13 +6,15 @@
6
6
  # Date : 2025-09-25
7
7
  ################################################################
8
8
 
9
+ from __future__ import annotations
10
+
9
11
  import json
10
12
  import os, sys, signal, subprocess, threading, time
11
13
  import termios
14
+ import importlib.util
12
15
 
13
16
  from datetime import datetime
14
17
  from pathlib import Path
15
- from typing import Dict, List
16
18
 
17
19
  HEX_LOG_LEVEL = {
18
20
  "info": 0,
@@ -29,16 +31,187 @@ def hex_err(message):
29
31
  print(message, file=sys.stderr)
30
32
 
31
33
 
34
+ def dict_update(dict_raw: dict, dict_new: dict, add_new: bool = False):
35
+ for key, value in dict_new.items():
36
+ if key in dict_raw:
37
+ if isinstance(dict_raw[key], dict) and isinstance(value, dict):
38
+ dict_update(dict_raw[key], value)
39
+ else:
40
+ dict_raw[key] = value
41
+ elif add_new:
42
+ dict_raw[key] = value
43
+
44
+
45
+ def hex_dict_str(dict_raw: dict, indent: int = 0) -> str:
46
+ print_str = ("\n" + "*" * 50 + "\n") if indent == 0 else ""
47
+ for key, value in dict_raw.items():
48
+ if isinstance(value, dict):
49
+ print_str += f"{' ' * indent * 4}{key}:\n{hex_dict_str(value, indent + 1)}"
50
+ else:
51
+ print_str += f"{' ' * indent * 4}{key}: {value}\n"
52
+ print_str += ("*" * 50) if indent == 0 else ""
53
+ return print_str
54
+
55
+
56
+ class HexNodeConfig():
57
+
58
+ def __init__(
59
+ self,
60
+ init_params: dict[str, dict] | list[dict] | HexNodeConfig = {},
61
+ ):
62
+ len_init_params = len(init_params)
63
+ if isinstance(init_params, list):
64
+ self._cfgs_dict = {cfg["name"]: cfg for cfg in init_params}
65
+ elif isinstance(init_params, dict):
66
+ self._cfgs_dict = init_params
67
+ if len_init_params != len(self._cfgs_dict):
68
+ raise ValueError(f"Invalid init_params: {init_params}")
69
+ elif isinstance(init_params, HexNodeConfig):
70
+ self._cfgs_dict = init_params._cfgs_dict
71
+ else:
72
+ raise ValueError(f"Invalid init_params: {init_params}")
73
+
74
+ assert len(self._cfgs_dict
75
+ ) == len_init_params, f"Invalid init_params: {init_params}"
76
+
77
+ def __len__(self) -> int:
78
+ return len(self._cfgs_dict)
79
+
80
+ def get_cfgs(self, use_list: bool = True) -> list[dict]:
81
+ if use_list:
82
+ return list(self._cfgs_dict.values())
83
+ else:
84
+ return self._cfgs_dict
85
+
86
+ def add_cfgs(
87
+ self,
88
+ node_cfgs: list[dict] | dict[str, dict] | HexNodeConfig,
89
+ ):
90
+ new_cfgs = {}
91
+ if isinstance(node_cfgs, list):
92
+ new_cfgs = {cfg["name"]: cfg for cfg in node_cfgs}
93
+ elif isinstance(node_cfgs, dict):
94
+ new_cfgs = node_cfgs
95
+ elif isinstance(node_cfgs, HexNodeConfig):
96
+ new_cfgs = node_cfgs.get_cfgs(use_list=False)
97
+ else:
98
+ raise ValueError(f"Invalid node_cfgs: {node_cfgs}")
99
+
100
+ dict_update(self._cfgs_dict, new_cfgs, add_new=True)
101
+
102
+ def __str__(self) -> str:
103
+ print_str = f"[HexNodeConfig] Total {len(self._cfgs_dict)} nodes:\n"
104
+ for name in self._cfgs_dict.keys():
105
+ print_str += f" - {name}\n"
106
+ return print_str
107
+
108
+ @staticmethod
109
+ def parse_node_params_dict(
110
+ node_params_dict: dict,
111
+ node_default_params_dict: dict,
112
+ ) -> HexNodeConfig:
113
+ node_dict = {}
114
+ for cur_name, cur_default_params in node_default_params_dict.items():
115
+ if cur_name in node_params_dict.keys():
116
+ dict_update(cur_default_params, node_params_dict[cur_name])
117
+ node_dict[cur_name] = cur_default_params
118
+ return HexNodeConfig(node_dict)
119
+
120
+ @staticmethod
121
+ def get_launch_params_cfgs(
122
+ launch_params_dict: dict,
123
+ launch_default_params_dict: dict,
124
+ launch_path_dict: dict,
125
+ ) -> HexNodeConfig:
126
+ cfg_list = []
127
+ for launch_name, launch_path in launch_path_dict.items():
128
+ node_default_params_dict = launch_default_params_dict.get(
129
+ launch_name, {})
130
+
131
+ node_params_dict = {}
132
+ if launch_name in launch_params_dict.keys():
133
+ node_params_dict = launch_params_dict[launch_name]
134
+ else:
135
+ for node_name in node_default_params_dict.keys():
136
+ if node_name in launch_params_dict.keys():
137
+ node_params_dict[node_name] = launch_params_dict[
138
+ node_name]
139
+
140
+ launch_update_cfg = HexNodeConfig.parse_node_params_dict(
141
+ node_params_dict,
142
+ node_default_params_dict,
143
+ )
144
+
145
+ cfg_list.append(
146
+ HexNodeConfig.get_node_cfgs_from_launch(
147
+ launch_path,
148
+ launch_update_cfg,
149
+ ))
150
+
151
+ final_cfg = HexNodeConfig()
152
+ for cfg in cfg_list:
153
+ # use name as key to make sure every node has a unique name
154
+ final_cfg.add_cfgs(cfg.get_cfgs(use_list=True))
155
+ print(f"final_cfg: {final_cfg}")
156
+ return final_cfg
157
+
158
+ @staticmethod
159
+ def get_node_cfgs_from_launch(
160
+ launch_path: str,
161
+ params: dict | HexNodeConfig = {},
162
+ ) -> HexNodeConfig:
163
+ # normalize the path
164
+ launch_path = os.path.abspath(launch_path)
165
+ if not os.path.exists(launch_path):
166
+ raise FileNotFoundError(f"Launch file not found: {launch_path}")
167
+
168
+ # load the module dynamically
169
+ spec = importlib.util.spec_from_file_location("launch_module",
170
+ launch_path)
171
+ if spec is None or spec.loader is None:
172
+ raise ImportError(f"Failed to load module from: {launch_path}")
173
+
174
+ # load module
175
+ launch_module = importlib.util.module_from_spec(spec)
176
+ sys.modules["launch_module"] = launch_module
177
+ spec.loader.exec_module(launch_module)
178
+
179
+ # check if `get_node_cfgs` function exists
180
+ if not hasattr(launch_module, "get_node_cfgs"):
181
+ raise AttributeError(
182
+ f"Function 'get_node_cfgs' not found in {launch_path}")
183
+
184
+ # call `get_node_cfgs` function
185
+ get_node_cfgs_func = getattr(launch_module, "get_node_cfgs")
186
+ if isinstance(params, dict):
187
+ print("params is dict")
188
+ node_cfgs = get_node_cfgs_func(params)
189
+ elif isinstance(params, HexNodeConfig):
190
+ print("params is HexNodeConfig")
191
+ node_cfgs = get_node_cfgs_func(params.get_cfgs(use_list=False))
192
+ else:
193
+ raise ValueError(f"Invalid params: {params}")
194
+ return node_cfgs
195
+
196
+
32
197
  class HexLaunch:
33
198
 
34
199
  def __init__(
35
200
  self,
36
- node_cfgs: List[dict],
201
+ node_cfgs: list[dict] | dict[str, dict] | HexNodeConfig,
37
202
  log_dir: str = "logs",
38
203
  min_level: int = HEX_LOG_LEVEL["warn"],
39
204
  ):
40
- self.__node_cfgs = node_cfgs
41
- self.__state: Dict[str, dict] = {}
205
+ if isinstance(node_cfgs, list):
206
+ node_cfgs = HexNodeConfig(node_cfgs)
207
+ elif isinstance(node_cfgs, dict):
208
+ node_cfgs = HexNodeConfig(node_cfgs)
209
+ elif isinstance(node_cfgs, HexNodeConfig):
210
+ node_cfgs = node_cfgs
211
+ else:
212
+ raise ValueError(f"Invalid node_cfgs: {node_cfgs}")
213
+ self.__node_cfgs = node_cfgs.get_cfgs(use_list=True)
214
+ self.__state: dict[str, dict] = {}
42
215
  self.__stop_event = threading.Event()
43
216
  self.__log_dir = Path(log_dir)
44
217
  self.__log_dir.mkdir(parents=True, exist_ok=True)
@@ -102,20 +275,12 @@ class HexLaunch:
102
275
  with open(cfg_path, "r", encoding="utf-8") as f:
103
276
  cfg_file = json.load(f)
104
277
  cfg_obj.update(cfg_file)
105
- self.__dict_update(cfg_obj, node_cfg.get("cfg", {}))
278
+ dict_update(cfg_obj, node_cfg.get("cfg", {}))
106
279
  cfg_str = json.dumps(cfg_obj)
107
280
 
108
281
  # build cmd
109
282
  return [python_exe, "-u", str(node_path)] + ["--cfg", cfg_str]
110
283
 
111
- def __dict_update(self, dict_raw: dict, dict_new: dict):
112
- for key, value in dict_new.items():
113
- if key in dict_raw:
114
- if isinstance(dict_raw[key], dict) and isinstance(value, dict):
115
- self.__dict_update(dict_raw[key], value)
116
- else:
117
- dict_raw[key] = value
118
-
119
284
  def __stream_printer(
120
285
  self,
121
286
  prefix: str,
@@ -7,7 +7,7 @@
7
7
  ################################################################
8
8
 
9
9
  from .mujoco_base import HexMujocoBase, HexMujocoClientBase, HexMujocoServerBase
10
- from .archer_d6y import HexMujocoArcherD6y, HexMujocoArcherD6yClient, HexMujocoArcherD6yServer
10
+ from .archer_y6 import HexMujocoArcherY6, HexMujocoArcherY6Client, HexMujocoArcherY6Server
11
11
  from .e3_desktop import HexMujocoE3Desktop, HexMujocoE3DesktopClient, HexMujocoE3DesktopServer
12
12
 
13
13
  __all__ = [
@@ -16,10 +16,10 @@ __all__ = [
16
16
  "HexMujocoClientBase",
17
17
  "HexMujocoServerBase",
18
18
 
19
- # archer_d6y
20
- "HexMujocoArcherD6y",
21
- "HexMujocoArcherD6yClient",
22
- "HexMujocoArcherD6yServer",
19
+ # archer_y6
20
+ "HexMujocoArcherY6",
21
+ "HexMujocoArcherY6Client",
22
+ "HexMujocoArcherY6Server",
23
23
 
24
24
  # e3_desktop
25
25
  "HexMujocoE3Desktop",
@@ -6,12 +6,12 @@
6
6
  # Date : 2025-09-15
7
7
  ################################################################
8
8
 
9
- from .mujoco_archer_d6y import HexMujocoArcherD6y
10
- from .mujoco_archer_d6y_cli import HexMujocoArcherD6yClient
11
- from .mujoco_archer_d6y_srv import HexMujocoArcherD6yServer
9
+ from .mujoco_archer_y6 import HexMujocoArcherY6
10
+ from .mujoco_archer_y6_cli import HexMujocoArcherY6Client
11
+ from .mujoco_archer_y6_srv import HexMujocoArcherY6Server
12
12
 
13
13
  __all__ = [
14
- "HexMujocoArcherD6y",
15
- "HexMujocoArcherD6yClient",
16
- "HexMujocoArcherD6yServer",
14
+ "HexMujocoArcherY6",
15
+ "HexMujocoArcherY6Client",
16
+ "HexMujocoArcherY6Server",
17
17
  ]
@@ -1,4 +1,4 @@
1
- <mujoco model="archer_d6y scene">
1
+ <mujoco model="archer_y6 scene">
2
2
  <compiler angle="radian"/>
3
3
  <option integrator="implicitfast"/>
4
4
  <option timestep="2e-3"/>
@@ -36,7 +36,7 @@ MUJOCO_CONFIG = {
36
36
  }
37
37
 
38
38
 
39
- class HexMujocoArcherD6y(HexMujocoBase):
39
+ class HexMujocoArcherY6(HexMujocoBase):
40
40
 
41
41
  def __init__(
42
42
  self,
@@ -219,8 +219,8 @@ class HexMujocoArcherD6y(HexMujocoBase):
219
219
  tau_cmds = None
220
220
  if not self.__tau_ctrl:
221
221
  cmd_pos = None
222
- tar_vel = np.zeros_like(cmds)
223
- cmd_tor = np.zeros_like(cmds)
222
+ tar_vel = np.zeros(cmds.shape[0])
223
+ cmd_tor = np.zeros(cmds.shape[0])
224
224
  cmd_kp = self.__mit_kp.copy()
225
225
  cmd_kd = self.__mit_kd.copy()
226
226
  if len(cmds.shape) == 1:
@@ -286,4 +286,4 @@ class HexMujocoArcherD6y(HexMujocoBase):
286
286
  self.__depth_cam.close()
287
287
  if not self.__headless:
288
288
  self.__viewer.close()
289
- hex_log(HEX_LOG_LEVEL["info"], "HexMujocoArcherD6y closed")
289
+ hex_log(HEX_LOG_LEVEL["info"], "HexMujocoArcherY6 closed")
@@ -17,7 +17,7 @@ NET_CONFIG = {
17
17
  }
18
18
 
19
19
 
20
- class HexMujocoArcherD6yClient(HexMujocoClientBase):
20
+ class HexMujocoArcherY6Client(HexMujocoClientBase):
21
21
 
22
22
  def __init__(
23
23
  self,
@@ -11,7 +11,7 @@ from hex_zmq_servers.zmq_base import HexSafeValue
11
11
 
12
12
  try:
13
13
  from ..mujoco_base import HexMujocoServerBase
14
- from .mujoco_archer_d6y import HexMujocoArcherD6y
14
+ from .mujoco_archer_y6 import HexMujocoArcherY6
15
15
  except (ImportError, ValueError):
16
16
  import sys
17
17
  from pathlib import Path
@@ -20,7 +20,7 @@ except (ImportError, ValueError):
20
20
  if str(project_root) not in sys.path:
21
21
  sys.path.insert(0, str(project_root))
22
22
  from hex_zmq_servers.mujoco.mujoco_base import HexMujocoServerBase
23
- from hex_zmq_servers.mujoco.archer_d6y.mujoco_archer_d6y import HexMujocoArcherD6y
23
+ from hex_zmq_servers.mujoco.archer_y6.mujoco_archer_y6 import HexMujocoArcherY6
24
24
 
25
25
  NET_CONFIG = {
26
26
  "ip": "127.0.0.1",
@@ -38,7 +38,7 @@ MUJOCO_CONFIG = {
38
38
  }
39
39
 
40
40
 
41
- class HexMujocoArcherD6yServer(HexMujocoServerBase):
41
+ class HexMujocoArcherY6Server(HexMujocoServerBase):
42
42
 
43
43
  def __init__(
44
44
  self,
@@ -48,7 +48,7 @@ class HexMujocoArcherD6yServer(HexMujocoServerBase):
48
48
  HexMujocoServerBase.__init__(self, net_config)
49
49
 
50
50
  # mujoco
51
- self._device = HexMujocoArcherD6y(params_config)
51
+ self._device = HexMujocoArcherY6(params_config)
52
52
 
53
53
  # values
54
54
  self._states_robot_value = HexSafeValue()
@@ -139,4 +139,4 @@ if __name__ == "__main__":
139
139
  args = parser.parse_args()
140
140
  cfg = json.loads(args.cfg)
141
141
 
142
- hex_server_helper(cfg, HexMujocoArcherD6yServer)
142
+ hex_server_helper(cfg, HexMujocoArcherY6Server)
@@ -305,8 +305,8 @@ class HexMujocoE3Desktop(HexMujocoBase):
305
305
  tau_cmds = None
306
306
  if not self.__tau_ctrl:
307
307
  cmd_pos = None
308
- tar_vel = np.zeros_like(cmds)
309
- cmd_tor = np.zeros_like(cmds)
308
+ tar_vel = np.zeros(cmds.shape[0])
309
+ cmd_tor = np.zeros(cmds.shape[0])
310
310
  cmd_kp = self.__mit_kp.copy()
311
311
  cmd_kd = self.__mit_kd.copy()
312
312
  if len(cmds.shape) == 1:
@@ -14,16 +14,16 @@ import os
14
14
 
15
15
  urdf_dir = os.path.join(os.path.dirname(__file__), "urdf")
16
16
  HEXARM_URDF_PATH_DICT = {
17
- "archer_d6y_empty":
18
- f"{urdf_dir}/archer_d6y/empty.urdf",
19
- "archer_d6y_gp100":
20
- f"{urdf_dir}/archer_d6y/gp100.urdf",
21
- "archer_d6y_gp100_handle":
22
- f"{urdf_dir}/archer_d6y/gp100_handle.urdf",
23
- "archer_d6y_gp100_p050":
24
- f"{urdf_dir}/archer_d6y/gp100_p050.urdf",
25
- "archer_d6y_gp100_p050_handle":
26
- f"{urdf_dir}/archer_d6y/gp100_p050_handle.urdf",
17
+ "archer_y6_empty":
18
+ f"{urdf_dir}/archer_y6/empty.urdf",
19
+ "archer_y6_gp100":
20
+ f"{urdf_dir}/archer_y6/gp100.urdf",
21
+ "archer_y6_gp100_handle":
22
+ f"{urdf_dir}/archer_y6/gp100_handle.urdf",
23
+ "archer_y6_gp100_p050":
24
+ f"{urdf_dir}/archer_y6/gp100_p050.urdf",
25
+ "archer_y6_gp100_p050_handle":
26
+ f"{urdf_dir}/archer_y6/gp100_p050_handle.urdf",
27
27
  "archer_l6y_empty":
28
28
  f"{urdf_dir}/archer_l6y/empty.urdf",
29
29
  "archer_l6y_gp100":
@@ -25,7 +25,7 @@ ROBOT_CONFIG = {
25
25
  "device_ip": "172.18.8.161",
26
26
  "device_port": 8439,
27
27
  "control_hz": 250,
28
- "arm_type": "archer_d6y",
28
+ "arm_type": "archer_y6",
29
29
  "use_gripper": True,
30
30
  "mit_kp": [200.0, 200.0, 200.0, 75.0, 15.0, 15.0, 20.0],
31
31
  "mit_kd": [12.5, 12.5, 12.5, 6.0, 0.31, 0.31, 1.0],
@@ -33,7 +33,7 @@ ROBOT_CONFIG = {
33
33
  }
34
34
 
35
35
  HEX_DEVICE_TYPE_DICT = {
36
- "archer_d6y": 16,
36
+ "archer_y6": 16,
37
37
  "archer_l6y": 17,
38
38
  }
39
39
 
@@ -93,7 +93,7 @@ class HexRobotHexarm(HexRobotBase):
93
93
  self.__gripper_dofs = 0
94
94
  self.__gripper = None
95
95
  if use_gripper:
96
- self.__gripper = self.__hex_api.find_optional_device('hand_status')
96
+ self.__gripper = self.__hex_api.find_optional_device_by_id(1)
97
97
  if self.__gripper is not None:
98
98
  self.__gripper_dofs = len(self.__gripper)
99
99
  self._limits += [self.__gripper.get_joint_limits()]