hex-zmq-servers 0.3.3__tar.gz → 0.3.5__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 (118) hide show
  1. {hex_zmq_servers-0.3.3/hex_zmq_servers.egg-info → hex_zmq_servers-0.3.5}/PKG-INFO +1 -1
  2. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/__init__.py +5 -3
  3. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/berxel/cam_berxel.py +8 -10
  4. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/berxel/cam_berxel_cli.py +1 -0
  5. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/cam_base.py +40 -10
  6. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/dummy/cam_dummy.py +7 -7
  7. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/dummy/cam_dummy_cli.py +1 -0
  8. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/realsense/cam_realsense.py +9 -9
  9. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/realsense/cam_realsense_cli.py +1 -0
  10. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/rgb/cam_rgb.py +33 -7
  11. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/rgb/cam_rgb_cli.py +11 -0
  12. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/cam_rgb.json +8 -0
  13. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/mujoco_archer_y6.json +1 -1
  14. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/mujoco_e3_desktop.json +1 -1
  15. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/robot_hexarm.json +1 -1
  16. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/device_base.py +3 -2
  17. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/hex_launch.py +8 -3
  18. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/scene.xml +1 -1
  19. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6.py +28 -22
  20. hex_zmq_servers-0.3.5/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_cli.py +68 -0
  21. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_srv.py +16 -14
  22. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/scene.xml +1 -1
  23. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop.py +50 -40
  24. hex_zmq_servers-0.3.5/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_cli.py +233 -0
  25. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_srv.py +39 -35
  26. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/mujoco_base.py +101 -64
  27. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/dummy/robot_dummy.py +11 -7
  28. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/dummy/robot_dummy_cli.py +1 -0
  29. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/gello/robot_gello.py +11 -7
  30. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/gello/robot_gello_cli.py +1 -0
  31. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/robot_hexarm.py +56 -23
  32. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/robot_hexarm_cli.py +1 -0
  33. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/robot_base.py +40 -10
  34. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/zmq_base.py +92 -31
  35. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5/hex_zmq_servers.egg-info}/PKG-INFO +1 -1
  36. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/pyproject.toml +1 -1
  37. hex_zmq_servers-0.3.3/hex_zmq_servers/mujoco/archer_y6/mujoco_archer_y6_cli.py +0 -26
  38. hex_zmq_servers-0.3.3/hex_zmq_servers/mujoco/e3_desktop/mujoco_e3_desktop_cli.py +0 -118
  39. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/LICENSE +0 -0
  40. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/MANIFEST.in +0 -0
  41. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/README.md +0 -0
  42. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/__init__.py +0 -0
  43. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/berxel/__init__.py +0 -0
  44. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/berxel/cam_berxel_srv.py +0 -0
  45. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/dummy/__init__.py +0 -0
  46. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/dummy/cam_dummy_srv.py +0 -0
  47. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/realsense/__init__.py +0 -0
  48. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/realsense/cam_realsense_srv.py +0 -0
  49. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/rgb/__init__.py +0 -0
  50. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/cam/rgb/cam_rgb_srv.py +0 -0
  51. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/cam_berxel.json +0 -0
  52. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/cam_dummy.json +0 -0
  53. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/cam_realsense.json +0 -0
  54. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/robot_dummy.json +0 -0
  55. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/robot_gello.json +0 -0
  56. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/config/zmq_dummy.json +0 -0
  57. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/__init__.py +0 -0
  58. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/__init__.py +0 -0
  59. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/arm_base_link.STL +0 -0
  60. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_1.STL +0 -0
  61. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_2.STL +0 -0
  62. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_3.STL +0 -0
  63. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_4.STL +0 -0
  64. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/arm_link_5.STL +0 -0
  65. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/assets.xml +0 -0
  66. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/camera_link.STL +0 -0
  67. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_base_link.STL +0 -0
  68. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_left_helper_link.STL +0 -0
  69. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_left_link_1.STL +0 -0
  70. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_left_link_2.STL +0 -0
  71. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_right_helper_link.STL +0 -0
  72. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_right_link_1.STL +0 -0
  73. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/gripper_right_link_2.STL +0 -0
  74. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/assets/table_link.STL +0 -0
  75. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/robot.xml +0 -0
  76. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/archer_y6/model/setting.xml +0 -0
  77. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/__init__.py +0 -0
  78. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_base_link.STL +0 -0
  79. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_1.STL +0 -0
  80. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_2.STL +0 -0
  81. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_3.STL +0 -0
  82. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_4.STL +0 -0
  83. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/arm_link_5.STL +0 -0
  84. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/assets.xml +0 -0
  85. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/camera_link.STL +0 -0
  86. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/e3_desktop_base_link.STL +0 -0
  87. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_base_link.STL +0 -0
  88. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_helper_link.STL +0 -0
  89. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_link_1.STL +0 -0
  90. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_left_link_2.STL +0 -0
  91. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_helper_link.STL +0 -0
  92. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_link_1.STL +0 -0
  93. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/gripper_right_link_2.STL +0 -0
  94. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/assets/table_link.STL +0 -0
  95. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/robot.xml +0 -0
  96. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/mujoco/e3_desktop/model/setting.xml +0 -0
  97. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/__init__.py +0 -0
  98. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/dummy/__init__.py +0 -0
  99. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/dummy/robot_dummy_srv.py +0 -0
  100. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/gello/__init__.py +0 -0
  101. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/gello/robot_gello_srv.py +0 -0
  102. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/__init__.py +0 -0
  103. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/robot_hexarm_srv.py +0 -0
  104. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/empty.urdf +0 -0
  105. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100.urdf +0 -0
  106. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_handle.urdf +0 -0
  107. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_p050.urdf +0 -0
  108. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_l6y/gp100_p050_handle.urdf +0 -0
  109. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_y6/empty.urdf +0 -0
  110. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100.urdf +0 -0
  111. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100_handle.urdf +0 -0
  112. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100_p050.urdf +0 -0
  113. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers/robot/hexarm/urdf/archer_y6/gp100_p050_handle.urdf +0 -0
  114. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers.egg-info/SOURCES.txt +0 -0
  115. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers.egg-info/dependency_links.txt +0 -0
  116. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers.egg-info/requires.txt +0 -0
  117. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/hex_zmq_servers.egg-info/top_level.txt +0 -0
  118. {hex_zmq_servers-0.3.3 → hex_zmq_servers-0.3.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hex_zmq_servers
3
- Version: 0.3.3
3
+ Version: 0.3.5
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>
@@ -9,8 +9,8 @@
9
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
- from .zmq_base import HexRate, hex_zmq_ts_now, hex_zmq_ts_delta_ms
13
- from .zmq_base import HexSafeValue, HexZMQClientBase, HexZMQServerBase, hex_server_helper
12
+ from .zmq_base import hex_zmq_ts_to_ns, ns_to_hex_zmq_ts, hex_ns_now, hex_zmq_ts_now, hex_zmq_ts_delta_ms
13
+ from .zmq_base import HexRate, HexZMQClientBase, HexZMQServerBase, hex_server_helper
14
14
  from .zmq_base import HexZMQDummyClient, HexZMQDummyServer
15
15
 
16
16
  from .robot import HexRobotBase, HexRobotClientBase, HexRobotServerBase
@@ -62,9 +62,11 @@ __all__ = [
62
62
  # base
63
63
  "HexDeviceBase",
64
64
  "HexRate",
65
+ "hex_zmq_ts_to_ns",
66
+ "ns_to_hex_zmq_ts",
67
+ "hex_ns_now",
65
68
  "hex_zmq_ts_now",
66
69
  "hex_zmq_ts_delta_ms",
67
- "HexSafeValue",
68
70
  "HexZMQClientBase",
69
71
  "HexZMQServerBase",
70
72
  "hex_server_helper",
@@ -9,12 +9,10 @@
9
9
  import cv2
10
10
  import threading
11
11
  import numpy as np
12
+ from collections import deque
12
13
 
13
14
  from ..cam_base import HexCamBase
14
- from ...zmq_base import (
15
- hex_zmq_ts_now,
16
- HexSafeValue,
17
- )
15
+ from ...zmq_base import hex_zmq_ts_now
18
16
  from ...hex_launch import hex_log, HEX_LOG_LEVEL
19
17
  from berxel_py_wrapper import *
20
18
 
@@ -74,10 +72,10 @@ class HexCamBerxel(HexCamBase):
74
72
  self._wait_for_working()
75
73
  return self.__serial_number
76
74
 
77
- def work_loop(self, hex_values: list[HexSafeValue | threading.Event]):
78
- rgb_value = hex_values[0]
79
- depth_value = hex_values[1]
80
- stop_event = hex_values[2]
75
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
76
+ rgb_queue = hex_queues[0]
77
+ depth_queue = hex_queues[1]
78
+ stop_event = hex_queues[2]
81
79
 
82
80
  rgb_count = 0
83
81
  depth_count = 0
@@ -89,13 +87,13 @@ class HexCamBerxel(HexCamBase):
89
87
  # collect rgb frame
90
88
  if hawk_rgb_frame is not None:
91
89
  ts, frame = self.__unpack_frame(hawk_rgb_frame, False)
92
- rgb_value.set((ts, rgb_count, frame))
90
+ rgb_queue.append((ts, rgb_count, frame))
93
91
  rgb_count = (rgb_count + 1) % self._max_seq_num
94
92
 
95
93
  # collect depth frame
96
94
  if hawk_depth_frame is not None:
97
95
  ts, frame = self.__unpack_frame(hawk_depth_frame, True)
98
- depth_value.set((ts, depth_count, frame))
96
+ depth_queue.append((ts, depth_count, frame))
99
97
  depth_count = (depth_count + 1) % self._max_seq_num
100
98
 
101
99
  self.__device.releaseFrame(hawk_rgb_frame)
@@ -24,6 +24,7 @@ class HexCamBerxelClient(HexCamClientBase):
24
24
  net_config: dict = NET_CONFIG,
25
25
  ):
26
26
  HexCamClientBase.__init__(self, net_config)
27
+ self._wait_for_working()
27
28
 
28
29
  def get_intri(self):
29
30
  intri_hdr, intri = self.request({"cmd": "get_intri"})
@@ -8,10 +8,11 @@
8
8
 
9
9
  import threading
10
10
  import numpy as np
11
+ from collections import deque
11
12
  from abc import abstractmethod
12
13
 
13
14
  from ..device_base import HexDeviceBase
14
- from ..zmq_base import HexSafeValue, HexZMQClientBase, HexZMQServerBase
15
+ from ..zmq_base import HexZMQClientBase, HexZMQServerBase, HexRate
15
16
 
16
17
  NET_CONFIG = {
17
18
  "ip": "127.0.0.1",
@@ -31,7 +32,7 @@ class HexCamBase(HexDeviceBase):
31
32
  HexDeviceBase.__del__(self)
32
33
 
33
34
  @abstractmethod
34
- def work_loop(self, hex_values: list[HexSafeValue | threading.Event]):
35
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
35
36
  raise NotImplementedError(
36
37
  "`work_loop` should be implemented by the child class")
37
38
 
@@ -47,14 +48,30 @@ class HexCamClientBase(HexZMQClientBase):
47
48
  HexZMQClientBase.__init__(self, net_config)
48
49
  self._rgb_seq = 0
49
50
  self._depth_seq = 0
51
+ self._rgb_queue = deque(maxlen=10)
52
+ self._depth_queue = deque(maxlen=10)
50
53
 
51
54
  def __del__(self):
52
55
  HexZMQClientBase.__del__(self)
53
56
 
54
- def get_rgb(self):
57
+ def get_rgb(self, newest: bool = False):
58
+ try:
59
+ return self._rgb_queue.popleft(
60
+ ) if not newest else self._rgb_queue[-1]
61
+ except IndexError:
62
+ return None, None
63
+
64
+ def get_depth(self, newest: bool = False):
65
+ try:
66
+ return self._depth_queue.popleft(
67
+ ) if not newest else self._depth_queue[-1]
68
+ except IndexError:
69
+ return None, None
70
+
71
+ def _get_rgb_inner(self):
55
72
  return self._process_frame(False)
56
73
 
57
- def get_depth(self):
74
+ def _get_depth_inner(self):
58
75
  return self._process_frame(True)
59
76
 
60
77
  def _process_frame(self, depth_flag: bool):
@@ -83,14 +100,25 @@ class HexCamClientBase(HexZMQClientBase):
83
100
  print(f"\033[91m__process_frame failed: {e}\033[0m")
84
101
  return None, None
85
102
 
103
+ def _recv_loop(self):
104
+ rate = HexRate(200)
105
+ while self._recv_flag:
106
+ hdr, img = self._get_rgb_inner()
107
+ if hdr is not None:
108
+ self._rgb_queue.append((hdr, img))
109
+ hdr, img = self._get_depth_inner()
110
+ if hdr is not None:
111
+ self._depth_queue.append((hdr, img))
112
+ rate.sleep()
113
+
86
114
 
87
115
  class HexCamServerBase(HexZMQServerBase):
88
116
 
89
117
  def __init__(self, net_config: dict = NET_CONFIG):
90
118
  HexZMQServerBase.__init__(self, net_config)
91
119
  self._device: HexDeviceBase = None
92
- self._rgb_value = HexSafeValue()
93
- self._depth_value = HexSafeValue()
120
+ self._rgb_queue = deque(maxlen=10)
121
+ self._depth_queue = deque(maxlen=10)
94
122
 
95
123
  def __del__(self):
96
124
  HexZMQServerBase.__del__(self)
@@ -99,8 +127,8 @@ class HexCamServerBase(HexZMQServerBase):
99
127
  def work_loop(self):
100
128
  try:
101
129
  self._device.work_loop([
102
- self._rgb_value,
103
- self._depth_value,
130
+ self._rgb_queue,
131
+ self._depth_queue,
104
132
  self._stop_event,
105
133
  ])
106
134
  finally:
@@ -115,9 +143,11 @@ class HexCamServerBase(HexZMQServerBase):
115
143
 
116
144
  try:
117
145
  if depth_flag:
118
- ts, count, img = self._depth_value.get()
146
+ ts, count, img = self._depth_queue.popleft()
119
147
  else:
120
- ts, count, img = self._rgb_value.get()
148
+ ts, count, img = self._rgb_queue.popleft()
149
+ except IndexError:
150
+ return {"cmd": f"{recv_hdr['cmd']}_failed"}, None
121
151
  except Exception as e:
122
152
  print(f"\033[91m{recv_hdr['cmd']} failed: {e}\033[0m")
123
153
  return {"cmd": f"{recv_hdr['cmd']}_failed"}, None
@@ -8,12 +8,12 @@
8
8
 
9
9
  import threading
10
10
  import numpy as np
11
+ from collections import deque
11
12
 
12
13
  from ..cam_base import HexCamBase
13
14
  from ...zmq_base import (
14
15
  hex_zmq_ts_now,
15
16
  HexRate,
16
- HexSafeValue,
17
17
  )
18
18
  from ...hex_launch import hex_log, HEX_LOG_LEVEL
19
19
 
@@ -27,10 +27,10 @@ class HexCamDummy(HexCamBase):
27
27
  def __del__(self):
28
28
  HexCamBase.__del__(self)
29
29
 
30
- def work_loop(self, hex_values: list[HexSafeValue | threading.Event]):
31
- rgb_value = hex_values[0]
32
- depth_value = hex_values[1]
33
- stop_event = hex_values[2]
30
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
31
+ rgb_queue = hex_queues[0]
32
+ depth_queue = hex_queues[1]
33
+ stop_event = hex_queues[2]
34
34
 
35
35
  rgb_count = 0
36
36
  depth_count = 0
@@ -43,7 +43,7 @@ class HexCamDummy(HexCamBase):
43
43
  (480, 640, 3),
44
44
  dtype=np.uint8,
45
45
  )
46
- rgb_value.set((hex_zmq_ts_now(), rgb_count, rgb_img))
46
+ rgb_queue.append((hex_zmq_ts_now(), rgb_count, rgb_img))
47
47
  rgb_count = (rgb_count + 1) % self._max_seq_num
48
48
 
49
49
  # depth
@@ -53,7 +53,7 @@ class HexCamDummy(HexCamBase):
53
53
  (480, 640),
54
54
  dtype=np.uint16,
55
55
  )
56
- depth_value.set((hex_zmq_ts_now(), depth_count, depth_img))
56
+ depth_queue.append((hex_zmq_ts_now(), depth_count, depth_img))
57
57
  depth_count = (depth_count + 1) % self._max_seq_num
58
58
 
59
59
  # sleep
@@ -24,3 +24,4 @@ class HexCamDummyClient(HexCamClientBase):
24
24
  net_config: dict = NET_CONFIG,
25
25
  ):
26
26
  HexCamClientBase.__init__(self, net_config)
27
+ self._wait_for_working()
@@ -6,15 +6,15 @@
6
6
  # Date : 2025-09-14
7
7
  ################################################################
8
8
 
9
- import time
10
9
  import threading
11
10
  import numpy as np
11
+ from collections import deque
12
12
 
13
13
  from ..cam_base import HexCamBase
14
14
  from ...zmq_base import (
15
+ hex_ns_now,
15
16
  hex_zmq_ts_now,
16
17
  hex_zmq_ts_delta_ms,
17
- HexSafeValue,
18
18
  )
19
19
  from ...hex_launch import hex_log, HEX_LOG_LEVEL
20
20
  import pyrealsense2 as rs
@@ -103,13 +103,13 @@ class HexCamRealsense(HexCamBase):
103
103
  self._wait_for_working()
104
104
  return self.__serial_number
105
105
 
106
- def work_loop(self, hex_values: list[HexSafeValue | threading.Event]):
107
- rgb_value = hex_values[0]
108
- depth_value = hex_values[1]
109
- stop_event = hex_values[2]
106
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
107
+ rgb_queue = hex_queues[0]
108
+ depth_queue = hex_queues[1]
109
+ stop_event = hex_queues[2]
110
110
 
111
111
  frames = self.__pipeline.wait_for_frames()
112
- bias_ns = np.int64(time.time_ns()) - np.int64(
112
+ bias_ns = np.int64(hex_ns_now()) - np.int64(
113
113
  frames.get_frame_metadata(rs.frame_metadata_value.sensor_timestamp)
114
114
  * 1_000)
115
115
 
@@ -134,14 +134,14 @@ class HexCamRealsense(HexCamBase):
134
134
  color_frame = aligned_frames.get_color_frame()
135
135
  if color_frame:
136
136
 
137
- rgb_value.set((sen_ts if self.__sens_ts else cur_ns, rgb_count,
137
+ rgb_queue.append((sen_ts if self.__sens_ts else cur_ns, rgb_count,
138
138
  np.asanyarray(color_frame.get_data())))
139
139
  rgb_count = (rgb_count + 1) % self._max_seq_num
140
140
 
141
141
  # collect depth frame
142
142
  depth_frame = aligned_frames.get_depth_frame()
143
143
  if depth_frame:
144
- depth_value.set(
144
+ depth_queue.append(
145
145
  (sen_ts if self.__sens_ts else cur_ns, depth_count,
146
146
  np.asanyarray(depth_frame.get_data())))
147
147
  depth_count = (depth_count + 1) % self._max_seq_num
@@ -24,6 +24,7 @@ class HexCamRealsenseClient(HexCamClientBase):
24
24
  net_config: dict = NET_CONFIG,
25
25
  ):
26
26
  HexCamClientBase.__init__(self, net_config)
27
+ self._wait_for_working()
27
28
 
28
29
  def get_intri(self):
29
30
  intri_hdr, intri = self.request({"cmd": "get_intri"})
@@ -6,21 +6,25 @@
6
6
  # Date : 2025-09-14
7
7
  ################################################################
8
8
 
9
+ import platform
9
10
  import cv2
10
11
  import threading
11
12
  import numpy as np
13
+ from collections import deque
12
14
 
13
15
  from ..cam_base import HexCamBase
14
16
  from ...zmq_base import (
15
17
  hex_zmq_ts_now,
16
18
  HexRate,
17
- HexSafeValue,
18
19
  )
19
20
  from ...hex_launch import hex_log, HEX_LOG_LEVEL
20
21
 
21
22
  CAMERA_CONFIG = {
22
23
  "cam_path": "/dev/video0",
23
24
  "resolution": [640, 480],
25
+ "crop": [0, 640, 0, 480],
26
+ "exposure": 100,
27
+ "temperature": 4000,
24
28
  "frame_rate": 30,
25
29
  "sens_ts": True,
26
30
  }
@@ -37,6 +41,9 @@ class HexCamRGB(HexCamBase):
37
41
  try:
38
42
  self.__cam_path = camera_config["cam_path"]
39
43
  self.__resolution = camera_config["resolution"]
44
+ self.__crop = camera_config["crop"]
45
+ self.__exposure = camera_config["exposure"]
46
+ self.__temperature = camera_config["temperature"]
40
47
  self.__frame_rate = camera_config["frame_rate"]
41
48
  self.__sens_ts = camera_config["sens_ts"]
42
49
  except KeyError as ke:
@@ -55,6 +62,18 @@ class HexCamRGB(HexCamBase):
55
62
  self.__cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.__resolution[0])
56
63
  self.__cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.__resolution[1])
57
64
  self.__cap.set(cv2.CAP_PROP_FPS, self.__frame_rate)
65
+ ae_open = 1.0 if platform.system() == "Windows" else 3.0
66
+ ae_close = 0.0 if platform.system() == "Windows" else 1.0
67
+ ae_value = 10000 * (2**self.__exposure) if platform.system(
68
+ ) == "Windows" else self.__exposure
69
+ self.__cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, ae_open)
70
+ if self.__exposure != 0:
71
+ self.__cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, ae_close)
72
+ self.__cap.set(cv2.CAP_PROP_EXPOSURE, ae_value)
73
+ self.__cap.set(cv2.CAP_PROP_AUTO_WB, 1)
74
+ if self.__temperature != 0:
75
+ self.__cap.set(cv2.CAP_PROP_AUTO_WB, 0)
76
+ self.__cap.set(cv2.CAP_PROP_WB_TEMPERATURE, self.__temperature)
58
77
 
59
78
  print("#############################")
60
79
  print(
@@ -66,6 +85,11 @@ class HexCamRGB(HexCamBase):
66
85
  (four_cc_int >> 8) & 0xff) + chr((four_cc_int >> 16) & 0xff) + chr(
67
86
  (four_cc_int >> 24) & 0xff)
68
87
  print(f"# FourCC: {four_cc_str}")
88
+ print(f"# Auto Exposure: {self.__cap.get(cv2.CAP_PROP_AUTO_EXPOSURE)}")
89
+ print(f"# Exposure: {self.__cap.get(cv2.CAP_PROP_EXPOSURE)}")
90
+ print(f"# Auto WB: {self.__cap.get(cv2.CAP_PROP_AUTO_WB)}")
91
+ print(
92
+ f"# WB Temperature: {self.__cap.get(cv2.CAP_PROP_WB_TEMPERATURE)}")
69
93
  print("#############################")
70
94
 
71
95
  # start work loop
@@ -75,13 +99,13 @@ class HexCamRGB(HexCamBase):
75
99
  self._wait_for_working()
76
100
  return self.__intri
77
101
 
78
- def work_loop(self, hex_values: list[HexSafeValue | threading.Event]):
79
- rgb_value = hex_values[0]
80
- depth_value = hex_values[1]
81
- stop_event = hex_values[2]
102
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
103
+ rgb_queue = hex_queues[0]
104
+ depth_queue = hex_queues[1]
105
+ stop_event = hex_queues[2]
82
106
 
83
107
  rgb_count = 0
84
- depth_value.set((hex_zmq_ts_now(), 0,
108
+ depth_queue.append((hex_zmq_ts_now(), 0,
85
109
  np.zeros((self.__resolution[1], self.__resolution[0]),
86
110
  dtype=np.uint16)))
87
111
  rate = HexRate(self.__frame_rate * 5)
@@ -91,7 +115,9 @@ class HexCamRGB(HexCamBase):
91
115
 
92
116
  # collect rgb frame
93
117
  if ret:
94
- rgb_value.set((hex_zmq_ts_now(), rgb_count, frame))
118
+ frame = frame[self.__crop[2]:self.__crop[3],
119
+ self.__crop[0]:self.__crop[1]]
120
+ rgb_queue.append((hex_zmq_ts_now(), rgb_count, frame))
95
121
  rgb_count = (rgb_count + 1) % self._max_seq_num
96
122
 
97
123
  rate.sleep()
@@ -7,6 +7,7 @@
7
7
  ################################################################
8
8
 
9
9
  from ..cam_base import HexCamClientBase
10
+ from ...zmq_base import HexRate
10
11
 
11
12
  NET_CONFIG = {
12
13
  "ip": "127.0.0.1",
@@ -24,7 +25,17 @@ class HexCamRGBClient(HexCamClientBase):
24
25
  net_config: dict = NET_CONFIG,
25
26
  ):
26
27
  HexCamClientBase.__init__(self, net_config)
28
+ self._wait_for_working()
27
29
 
28
30
  def get_intri(self):
29
31
  intri_hdr, intri = self.request({"cmd": "get_intri"})
30
32
  return intri_hdr, intri
33
+
34
+ def _recv_loop(self):
35
+ rate = HexRate(200)
36
+ while self._recv_flag:
37
+ hdr, img = self._get_rgb_inner()
38
+ if hdr is not None:
39
+ self._rgb_queue.append((hdr, img))
40
+ rate.sleep()
41
+
@@ -12,6 +12,14 @@
12
12
  640,
13
13
  480
14
14
  ],
15
+ "crop": [
16
+ 0,
17
+ 640,
18
+ 0,
19
+ 480
20
+ ],
21
+ "exposure": 70,
22
+ "temperature": 0,
15
23
  "frame_rate": 30,
16
24
  "sens_ts": true
17
25
  }
@@ -7,7 +7,7 @@
7
7
  "server_num_workers": 4
8
8
  },
9
9
  "params": {
10
- "states_rate": 500,
10
+ "states_rate": 1000,
11
11
  "img_rate": 30,
12
12
  "tau_ctrl": false,
13
13
  "mit_kp": [
@@ -7,7 +7,7 @@
7
7
  "server_num_workers": 4
8
8
  },
9
9
  "params": {
10
- "states_rate": 500,
10
+ "states_rate": 1000,
11
11
  "img_rate": 30,
12
12
  "tau_ctrl": false,
13
13
  "mit_kp": [
@@ -9,7 +9,7 @@
9
9
  "params": {
10
10
  "device_ip": "172.18.8.161",
11
11
  "device_port": 8439,
12
- "control_hz": 500,
12
+ "control_hz": 1000,
13
13
  "arm_type": "archer_l6y",
14
14
  "use_gripper": true,
15
15
  "mit_kp": [
@@ -7,9 +7,10 @@
7
7
  ################################################################
8
8
 
9
9
  import threading
10
+ from collections import deque
10
11
  from abc import ABC, abstractmethod
11
12
 
12
- from .zmq_base import MAX_SEQ_NUM, HexSafeValue
13
+ from .zmq_base import MAX_SEQ_NUM
13
14
 
14
15
 
15
16
  class HexDeviceBase(ABC):
@@ -32,7 +33,7 @@ class HexDeviceBase(ABC):
32
33
  self._working.wait(0.1)
33
34
 
34
35
  @abstractmethod
35
- def work_loop(self, hex_values: list[HexSafeValue | threading.Event]):
36
+ def work_loop(self, hex_queues: list[deque | threading.Event]):
36
37
  raise NotImplementedError(
37
38
  "`work_loop` should be implemented by the child class")
38
39
 
@@ -124,7 +124,7 @@ class HexNodeConfig():
124
124
  launch_path_dict: dict,
125
125
  ) -> HexNodeConfig:
126
126
  cfg_list = []
127
- for launch_name, launch_path in launch_path_dict.items():
127
+ for launch_name, (launch_path, launch_arg) in launch_path_dict.items():
128
128
  node_default_params_dict = launch_default_params_dict.get(
129
129
  launch_name, {})
130
130
 
@@ -146,6 +146,7 @@ class HexNodeConfig():
146
146
  HexNodeConfig.get_node_cfgs_from_launch(
147
147
  launch_path,
148
148
  launch_update_cfg,
149
+ launch_arg,
149
150
  ))
150
151
 
151
152
  final_cfg = HexNodeConfig()
@@ -159,6 +160,7 @@ class HexNodeConfig():
159
160
  def get_node_cfgs_from_launch(
160
161
  launch_path: str,
161
162
  params: dict | HexNodeConfig = {},
163
+ launch_arg: dict | None = None,
162
164
  ) -> HexNodeConfig:
163
165
  # normalize the path
164
166
  launch_path = os.path.abspath(launch_path)
@@ -185,10 +187,13 @@ class HexNodeConfig():
185
187
  get_node_cfgs_func = getattr(launch_module, "get_node_cfgs")
186
188
  if isinstance(params, dict):
187
189
  print("params is dict")
188
- node_cfgs = get_node_cfgs_func(params)
190
+ node_cfgs = get_node_cfgs_func(params, launch_arg)
189
191
  elif isinstance(params, HexNodeConfig):
190
192
  print("params is HexNodeConfig")
191
- node_cfgs = get_node_cfgs_func(params.get_cfgs(use_list=False))
193
+ node_cfgs = get_node_cfgs_func(
194
+ params.get_cfgs(use_list=False),
195
+ launch_arg,
196
+ )
192
197
  else:
193
198
  raise ValueError(f"Invalid params: {params}")
194
199
  return node_cfgs
@@ -1,7 +1,7 @@
1
1
  <mujoco model="archer_y6 scene">
2
2
  <compiler angle="radian"/>
3
3
  <option integrator="implicitfast"/>
4
- <option timestep="2e-3"/>
4
+ <option timestep="1e-3"/>
5
5
 
6
6
  <statistic center="0.3 0 0.45" extent="0.8" meansize="0.05"/>
7
7