dexcontrol 0.2.7__py3-none-any.whl → 0.2.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. dexcontrol/__init__.py +1 -0
  2. dexcontrol/config/core/arm.py +6 -0
  3. dexcontrol/config/core/hand.py +5 -16
  4. dexcontrol/config/core/head.py +7 -8
  5. dexcontrol/config/core/misc.py +14 -1
  6. dexcontrol/config/core/torso.py +8 -4
  7. dexcontrol/config/sensors/cameras/__init__.py +2 -1
  8. dexcontrol/config/sensors/cameras/luxonis_camera.py +51 -0
  9. dexcontrol/config/sensors/cameras/rgb_camera.py +1 -1
  10. dexcontrol/config/sensors/cameras/zed_camera.py +2 -2
  11. dexcontrol/config/sensors/vega_sensors.py +9 -1
  12. dexcontrol/config/vega.py +30 -2
  13. dexcontrol/core/arm.py +95 -43
  14. dexcontrol/core/component.py +92 -6
  15. dexcontrol/core/hand.py +81 -13
  16. dexcontrol/core/head.py +55 -26
  17. dexcontrol/core/misc.py +94 -13
  18. dexcontrol/core/torso.py +44 -11
  19. dexcontrol/proto/dexcontrol_msg_pb2.py +38 -36
  20. dexcontrol/proto/dexcontrol_msg_pb2.pyi +48 -20
  21. dexcontrol/proto/dexcontrol_query_pb2.py +7 -3
  22. dexcontrol/proto/dexcontrol_query_pb2.pyi +24 -0
  23. dexcontrol/robot.py +319 -75
  24. dexcontrol/sensors/__init__.py +2 -1
  25. dexcontrol/sensors/camera/__init__.py +2 -0
  26. dexcontrol/sensors/camera/luxonis_camera.py +169 -0
  27. dexcontrol/sensors/camera/rgb_camera.py +36 -0
  28. dexcontrol/sensors/camera/zed_camera.py +48 -8
  29. dexcontrol/sensors/imu/chassis_imu.py +5 -1
  30. dexcontrol/sensors/imu/zed_imu.py +3 -2
  31. dexcontrol/sensors/lidar/rplidar.py +1 -0
  32. dexcontrol/sensors/manager.py +3 -0
  33. dexcontrol/utils/constants.py +3 -0
  34. dexcontrol/utils/error_code.py +236 -0
  35. dexcontrol/utils/subscribers/lidar.py +1 -0
  36. dexcontrol/utils/trajectory_utils.py +17 -5
  37. dexcontrol/utils/viz_utils.py +86 -11
  38. dexcontrol/utils/zenoh_utils.py +39 -0
  39. {dexcontrol-0.2.7.dist-info → dexcontrol-0.2.12.dist-info}/METADATA +6 -4
  40. dexcontrol-0.2.12.dist-info/RECORD +75 -0
  41. dexcontrol-0.2.7.dist-info/RECORD +0 -72
  42. {dexcontrol-0.2.7.dist-info → dexcontrol-0.2.12.dist-info}/WHEEL +0 -0
  43. {dexcontrol-0.2.7.dist-info → dexcontrol-0.2.12.dist-info}/licenses/LICENSE +0 -0
@@ -10,13 +10,14 @@
10
10
 
11
11
  """Utility functions for displaying information in a Rich table format."""
12
12
 
13
+ from loguru import logger
13
14
  from rich.console import Console
14
15
  from rich.table import Table
15
16
 
16
17
  from dexcontrol.utils.pb_utils import TYPE_SOFTWARE_VERSION
17
18
 
18
19
 
19
- def show_software_version(version_info: dict[str, TYPE_SOFTWARE_VERSION]) -> None:
20
+ def show_software_version(version_info: dict[str, TYPE_SOFTWARE_VERSION]):
20
21
  """Create a Rich table for displaying firmware version information.
21
22
 
22
23
  Args:
@@ -42,25 +43,26 @@ def show_software_version(version_info: dict[str, TYPE_SOFTWARE_VERSION]) -> Non
42
43
  console.print(table)
43
44
 
44
45
 
45
- def show_component_status(status_info: dict[str, dict]) -> None:
46
+ def show_component_status(status_info: dict[str, dict]):
46
47
  """Create a Rich table for displaying component status information.
47
48
 
48
49
  Args:
49
50
  status_info: Dictionary containing status info for each component.
50
51
  """
52
+ from dexcontrol.utils.error_code import get_error_description
51
53
  from dexcontrol.utils.pb_utils import ComponentStatus
52
54
 
53
55
  table = Table(title="Component Status")
54
56
  table.add_column("Component", style="cyan")
55
57
  table.add_column("Connected", justify="center")
56
58
  table.add_column("Enabled", justify="center")
57
- table.add_column("Error", justify="center")
59
+ table.add_column("Error", justify="left")
58
60
 
59
61
  status_icons = {
60
- True: ":white_check_mark:",
61
- False: ":x:",
62
- ComponentStatus.NORMAL: ":white_check_mark:",
63
- ComponentStatus.NA: "N/A",
62
+ True: "[green]:white_check_mark:[/green]",
63
+ False: "[red]:x:[/red]",
64
+ ComponentStatus.NORMAL: "[green]:white_check_mark:[/green]",
65
+ ComponentStatus.NA: "[dim]N/A[/dim]",
64
66
  }
65
67
 
66
68
  # Sort components by name to ensure consistent order
@@ -70,15 +72,51 @@ def show_component_status(status_info: dict[str, dict]) -> None:
70
72
  connected = status_icons[status["connected"]]
71
73
 
72
74
  # Format enabled status
73
- enabled = status_icons.get(status["enabled"], ":x:")
75
+ enabled = status_icons.get(status["enabled"], "[red]:x:[/red]")
74
76
 
75
77
  # Format error status
76
78
  if status["error_state"] == ComponentStatus.NORMAL:
77
- error = ":white_check_mark:"
79
+ error = "[green]:white_check_mark:[/green]"
78
80
  elif status["error_state"] == ComponentStatus.NA:
79
- error = "N/A"
81
+ error = "[dim]N/A[/dim]"
80
82
  else:
81
- error = status["error_code"]
83
+ # Convert error code to human-readable text
84
+ error_code = status["error_code"]
85
+ if isinstance(error_code, int):
86
+ error_desc = get_error_description(component, error_code)
87
+ # Show both raw code and description with formatting
88
+ if error_code == 0:
89
+ error = "[green]:white_check_mark:[/green]"
90
+ else:
91
+ # Check if this is an unknown error
92
+ if "Unknown" in error_desc:
93
+ # For unknown errors, show the hex code prominently
94
+ error = f"[bold red]:warning: 0x{error_code:08X}[/bold red]\n[dim italic]Unknown error code[/dim italic]"
95
+ else:
96
+ # For known errors, show both code and description
97
+ error = f"[bold red]:warning: 0x{error_code:08X}[/bold red]\n[yellow]{error_desc}[/yellow]"
98
+ else:
99
+ # Handle hex string format if provided
100
+ try:
101
+ error_code_int = (
102
+ int(error_code, 16)
103
+ if isinstance(error_code, str)
104
+ else error_code
105
+ )
106
+ error_desc = get_error_description(component, error_code_int)
107
+ # Show both raw code and description with formatting
108
+ if error_code_int == 0:
109
+ error = "[green]:white_check_mark:[/green]"
110
+ else:
111
+ # Check if this is an unknown error
112
+ if "Unknown" in error_desc:
113
+ # For unknown errors, show the hex code prominently
114
+ error = f"[bold red]:warning: 0x{error_code_int:08X}[/bold red]\n[dim italic]Unknown error code[/dim italic]"
115
+ else:
116
+ # For known errors, show both code and description
117
+ error = f"[bold red]:warning: 0x{error_code_int:08X}[/bold red]\n[yellow]{error_desc}[/yellow]"
118
+ except (ValueError, TypeError):
119
+ error = f"[red]{str(error_code)}[/red]"
82
120
 
83
121
  table.add_row(
84
122
  component,
@@ -89,3 +127,40 @@ def show_component_status(status_info: dict[str, dict]) -> None:
89
127
 
90
128
  console = Console()
91
129
  console.print(table)
130
+
131
+
132
+ def show_ntp_stats(stats: dict[str, float]):
133
+ """Display NTP statistics in a Rich table format.
134
+
135
+ Args:
136
+ stats: Dictionary containing NTP statistics (e.g., mean_offset, mean_rtt, etc.).
137
+ """
138
+ table = Table()
139
+ table.add_column("Time Statistic", style="cyan")
140
+ table.add_column("Value (Unit: second)", justify="right")
141
+
142
+ for key, value in stats.items():
143
+ # Format floats to 6 decimal places, lists as comma-separated, others as str
144
+ if isinstance(value, float):
145
+ value_str = f"{value:.6f}"
146
+ elif isinstance(value, list):
147
+ value_str = ", ".join(
148
+ f"{v:.6f}" if isinstance(v, float) else str(v) for v in value
149
+ )
150
+ else:
151
+ value_str = str(value)
152
+ table.add_row(key, value_str)
153
+
154
+ console = Console()
155
+ console.print(table)
156
+
157
+ if "offset (mean)" in stats:
158
+ offset = stats["offset (mean)"]
159
+ if offset > 0:
160
+ logger.info(
161
+ f"To synchronize: server_time ≈ local_time + {offset:.3f} second"
162
+ )
163
+ else:
164
+ logger.info(
165
+ f"To synchronize: server_time ≈ local_time - {abs(offset):.3f} second"
166
+ )
@@ -17,6 +17,7 @@ communication framework.
17
17
  import json
18
18
  import time
19
19
 
20
+ import numpy as np
20
21
  import zenoh
21
22
  from loguru import logger
22
23
 
@@ -81,3 +82,41 @@ def query_zenoh_json(
81
82
  logger.error(f"Query failed after {max_retries + 1} attempts: {e}")
82
83
 
83
84
  return None
85
+
86
+
87
+ def compute_ntp_stats(offsets: list[float], rtts: list[float]) -> dict[str, float]:
88
+ """Compute NTP statistics, removing outliers based on RTT median and std.
89
+
90
+ Args:
91
+ offsets: List of offset values (seconds).
92
+ rtts: List of round-trip time values (seconds).
93
+
94
+ Returns:
95
+ Dictionary with computed statistics (mean, std, min, max, sample_count) for offset and rtt.
96
+ """
97
+ offsets_np = np.array(offsets)
98
+ rtts_np = np.array(rtts)
99
+ if len(rtts_np) < 3:
100
+ mask = np.ones_like(rtts_np, dtype=bool)
101
+ else:
102
+ median = np.median(rtts_np)
103
+ std = np.std(rtts_np)
104
+ mask = np.abs(rtts_np - median) <= 2 * std
105
+ offsets_filtered = offsets_np[mask]
106
+ rtts_filtered = rtts_np[mask]
107
+
108
+ def safe_stat(arr, func):
109
+ return float(func(arr)) if len(arr) > 0 else 0.0
110
+
111
+ stats = {
112
+ "offset (mean)": safe_stat(offsets_filtered, np.mean),
113
+ "offset (std)": safe_stat(offsets_filtered, np.std),
114
+ "offset (min)": safe_stat(offsets_filtered, np.min),
115
+ "offset (max)": safe_stat(offsets_filtered, np.max),
116
+ "round_trip_time (mean)": safe_stat(rtts_filtered, np.mean),
117
+ "round_trip_time (std)": safe_stat(rtts_filtered, np.std),
118
+ "round_trip_time (min)": safe_stat(rtts_filtered, np.min),
119
+ "round_trip_time (max)": safe_stat(rtts_filtered, np.max),
120
+ "sample_count": int(len(offsets_filtered)),
121
+ }
122
+ return stats
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dexcontrol
3
- Version: 0.2.7
3
+ Version: 0.2.12
4
4
  Summary: A Python library of Sensing and Control for Dexmate's Robot
5
5
  Project-URL: Repository, https://github.com/dexmate-ai/dexcontrol
6
6
  Author-email: Dexmate <contact@dexmate.ai>
@@ -200,16 +200,18 @@ Classifier: Programming Language :: Python :: 3.11
200
200
  Classifier: Programming Language :: Python :: 3.12
201
201
  Classifier: Programming Language :: Python :: 3.13
202
202
  Classifier: Typing :: Typed
203
- Requires-Python: <3.13,>=3.10
203
+ Requires-Python: <3.14,>=3.10
204
+ Requires-Dist: aiortc
204
205
  Requires-Dist: eclipse-zenoh>=1.2.0
205
206
  Requires-Dist: hydra-core==1.3.2
206
207
  Requires-Dist: jaxtyping>=0.2.38
207
208
  Requires-Dist: loguru>=0.7.3
208
- Requires-Dist: numpy>=2.2.6
209
+ Requires-Dist: numpy>=1.26.4
209
210
  Requires-Dist: opencv-python>=4.11.0
210
211
  Requires-Dist: protobuf>=6.31.0
211
212
  Requires-Dist: rich
212
213
  Requires-Dist: uvloop>=0.17.0; sys_platform != 'win32'
214
+ Requires-Dist: websockets
213
215
  Provides-Extra: dev
214
216
  Requires-Dist: isort>=5.12.0; extra == 'dev'
215
217
  Requires-Dist: pre-commit; extra == 'dev'
@@ -225,7 +227,7 @@ Requires-Dist: sphinx-autodoc-typehints>=1.24.0; extra == 'docs'
225
227
  Requires-Dist: sphinx-rtd-theme>=1.3.0; extra == 'docs'
226
228
  Requires-Dist: sphinx>=7.0.0; extra == 'docs'
227
229
  Provides-Extra: example
228
- Requires-Dist: dexmotion>=0.2.0; extra == 'example'
230
+ Requires-Dist: dexmotion>=0.2.1; extra == 'example'
229
231
  Requires-Dist: dualsense-controller>=0.3.1; extra == 'example'
230
232
  Requires-Dist: matplotlib>=3.8.0; extra == 'example'
231
233
  Requires-Dist: pytransform3d==3.13.0; extra == 'example'
@@ -0,0 +1,75 @@
1
+ dexcontrol/__init__.py,sha256=9y7PGcWv9KYcLg7nH54FQv2vv0Q_GeVy3wcFa4Yf_gs,1692
2
+ dexcontrol/robot.py,sha256=Ab-9HhfPiqKq4gGNoBUUMKqYsjPK4u9KW2ykPlbKe4A,51914
3
+ dexcontrol/apps/dualsense_teleop_base.py,sha256=Dw1z-2HA5D7DPKutZxlOdXsN9vpk4gS6XzJsL5ZQLM0,12702
4
+ dexcontrol/config/__init__.py,sha256=UVLNpzGD14e8g68rUZFXTh0B7FRx6uS0Eg_MecjinYM,520
5
+ dexcontrol/config/vega.py,sha256=UE5XAdk5IpYj-LgLUzbAvr6Zi83e4XYPAvXdgM9z3VY,8239
6
+ dexcontrol/config/core/__init__.py,sha256=Ym2R1hr1iMKQuXcg16BpZfQtTb0hQ5Q7smUIMlwKfho,637
7
+ dexcontrol/config/core/arm.py,sha256=5hN1dQMe2H6oufaqgtZqx9vuB969DxM26leJqPsKEiA,1471
8
+ dexcontrol/config/core/chassis.py,sha256=163hO4lVVaW7r9dvNleH0cdDds_GfO15EepnjloeT9U,868
9
+ dexcontrol/config/core/hand.py,sha256=bGRO-_usaFP0GU6jgB6Lm3Z07DMqMVO_tiB5j4c8Cu4,954
10
+ dexcontrol/config/core/head.py,sha256=SLwZE-lYEOk8XAmW-Ex7VkLF2w5HLItwsA3Dc7n5FtE,1061
11
+ dexcontrol/config/core/misc.py,sha256=zHkJ144b6kbmMFE63wy_fgfo_6V-4XmM19hr6BUtQ0Y,1567
12
+ dexcontrol/config/core/torso.py,sha256=DCTFgN1_Gn4THkKy23sIHOedACQtQ7cET3g4AmkVPco,1460
13
+ dexcontrol/config/sensors/__init__.py,sha256=bYPMLxbbn5QeuPyA6OPGDS2JTYpnVvaZJT8PeILFjQY,252
14
+ dexcontrol/config/sensors/vega_sensors.py,sha256=VTC8OPLEhBmnQpWdbPTOAr1JGeKOEekLc1Vew62yVtk,2969
15
+ dexcontrol/config/sensors/cameras/__init__.py,sha256=UcY9soHfHTEZL4VX705yH7RM6jWf3Mqd8MWJMp59big,454
16
+ dexcontrol/config/sensors/cameras/luxonis_camera.py,sha256=e3I5jiIbyAK2HjM8E0VRUOdYODTMjaA_zRH7Du9D8qI,1648
17
+ dexcontrol/config/sensors/cameras/rgb_camera.py,sha256=MN4SjyZlfbrQ3JKDDkT8HhC0Aiyc0bWfDLt4ik0Xcvs,1448
18
+ dexcontrol/config/sensors/cameras/zed_camera.py,sha256=cPXR84m2P3P2-qls1usHCbR6iz-l9gaBjjXyDmTXoiE,1836
19
+ dexcontrol/config/sensors/imu/__init__.py,sha256=fW-DlevCvf_W8HV_fvLe9yIe-XL5op2mggoTKh-6fGQ,328
20
+ dexcontrol/config/sensors/imu/chassis_imu.py,sha256=3OlTTBH6k1QGM5c5bcg8NL3XUXzYA8gCLM8lpCq2KFM,559
21
+ dexcontrol/config/sensors/imu/zed_imu.py,sha256=y-dPI-XS6Kyq0WOf0wwuc2BgVnMN2hwCMxb0Vmwt4O4,550
22
+ dexcontrol/config/sensors/lidar/__init__.py,sha256=j8vFkF675Z7zKtCztJcyG7oSA_XqrD8OeQLEK0GACug,288
23
+ dexcontrol/config/sensors/lidar/rplidar.py,sha256=ybuT_f1ADWF3oGH1gi6D2F80TbJEm4vbm68Fe108OAA,541
24
+ dexcontrol/config/sensors/ultrasonic/__init__.py,sha256=-q83RhIMZJGVFVPYaA4hOugoG6wZw8EL6wJg7-HTSxU,294
25
+ dexcontrol/config/sensors/ultrasonic/ultrasonic.py,sha256=7b4dm1QOhy5_5RFVpY-frXZyDzqok0K1u7ed9gf3PL0,552
26
+ dexcontrol/core/__init__.py,sha256=bYPMLxbbn5QeuPyA6OPGDS2JTYpnVvaZJT8PeILFjQY,252
27
+ dexcontrol/core/arm.py,sha256=wbRm7G4v3ByVwscZ9rEu_IpmBdqZoI6gKXDphDeNN5Q,15360
28
+ dexcontrol/core/chassis.py,sha256=tB-tsx6MjKJDOtQxBf7PIX0L1JwgnsXUzmNPC1VKsQU,23165
29
+ dexcontrol/core/component.py,sha256=mkYH7W7tWIWnfWfXmCUQulzaZ7VfrwYI0ET_L7pPw2k,34779
30
+ dexcontrol/core/hand.py,sha256=wd__YB5wcM-LlksEm3PatXhy665zLnu9nV_9x85WxIA,8649
31
+ dexcontrol/core/head.py,sha256=iz9umFxiizYzK49BdML1i6pKM_i8kbk44tH0uu_TaVM,10512
32
+ dexcontrol/core/misc.py,sha256=0YNJCrTJS1yCT9N-p9us5I7uSiAK470k8nWgJu638X4,25153
33
+ dexcontrol/core/torso.py,sha256=4MB5EojHnlBpUaHzcZOh4IkKcjI6pSluXmpb5RpmdV4,8932
34
+ dexcontrol/proto/dexcontrol_msg_pb2.py,sha256=YgPlHnOZbVfCuTdfK1DD0t4yf6qeDf-ximl4qY5YeWo,6397
35
+ dexcontrol/proto/dexcontrol_msg_pb2.pyi,sha256=5sI3nH1hhLPAg_UpNk5Mgh5bt5YrzcoPj1tCL6bT45s,10865
36
+ dexcontrol/proto/dexcontrol_query_pb2.py,sha256=n5EazrveRw2UXFM-J5n5c7NVfr8LzaPigmOns4UOI9k,5946
37
+ dexcontrol/proto/dexcontrol_query_pb2.pyi,sha256=0Lr0wYPGHhhNeAK24JJ2A7bzZ7q-r5ssOI2_ZfoYzVk,7108
38
+ dexcontrol/sensors/__init__.py,sha256=3DtVBwX5E3RPPjfCh2elnqk6uIWB_ukIqPQgBPZ7w7g,1008
39
+ dexcontrol/sensors/manager.py,sha256=Qsbs9zZ4TvJgyn8yuI85wOU6mqgBQEus_MYSXj7wA9w,7025
40
+ dexcontrol/sensors/ultrasonic.py,sha256=WAHvHh64iQ0HfqVf-Oo0Rg8R32Cdk5d8k8kDSwa3Xrc,3258
41
+ dexcontrol/sensors/camera/__init__.py,sha256=w7-w58fAsV57lSb4ANC8tn8YbY5o1GVymw3p2agNJEE,684
42
+ dexcontrol/sensors/camera/luxonis_camera.py,sha256=OeKoX7JL2ogbNJa7JPYkPT4LHKg8Wby5PPtoMQcFo8c,6307
43
+ dexcontrol/sensors/camera/rgb_camera.py,sha256=UaEk8aszHeBRg5xMQlHxZk2KMP7wU3m6UnE_qgh6V4Q,5892
44
+ dexcontrol/sensors/camera/zed_camera.py,sha256=hrnTrON0WieCkJ7i2pvO6nUjHOD_N8po9arl9jbqtuQ,15501
45
+ dexcontrol/sensors/imu/__init__.py,sha256=bBC7_NSLJ5qLMvUYu2-9yXKO2bRpQLC0HyywBwnbM0A,768
46
+ dexcontrol/sensors/imu/chassis_imu.py,sha256=a_PMH2I2UVHZ2xIqGac2M4xFIDgiUopjUOjD87xNFL0,5058
47
+ dexcontrol/sensors/imu/zed_imu.py,sha256=kNXdOq0STucWG5Vvy6AWL3Hs4JZB6dxtfhCsjEWnRGY,5251
48
+ dexcontrol/sensors/lidar/__init__.py,sha256=frF16HmeQnfbvH0dVJ4pPjD4TySF13wCk-O9L3Memeg,317
49
+ dexcontrol/sensors/lidar/rplidar.py,sha256=HpPeO2lqGDGGrnR3j4rZ6suw_pc07Rhsfti9GCCi-1M,4499
50
+ dexcontrol/utils/__init__.py,sha256=ayMZ6xNlA9xKfS_XRr8bWcoXW4-8Jg_25XSbMd5Jx58,468
51
+ dexcontrol/utils/constants.py,sha256=6SG5HoSo7V-DlWH7cdNaMJtZs05dWrqYWIuKpmXfdI0,792
52
+ dexcontrol/utils/error_code.py,sha256=iy840qnWn9wv_nVqyEDP8-l2CuXlPH2xXXW0k-5cHKk,7321
53
+ dexcontrol/utils/io_utils.py,sha256=4TYV33ufECo8fuQivrZR9vtSdwWYUiPvpAUSneEzOOs,850
54
+ dexcontrol/utils/motion_utils.py,sha256=p4kXQm_YorISDC2crrpY0gwCVw_yQCPv-acxPUSfh8w,7172
55
+ dexcontrol/utils/os_utils.py,sha256=CC2st_Pb0C5cWfCg-i1P5bgBx3ZBX4LWVUiBq63dNeo,1852
56
+ dexcontrol/utils/pb_utils.py,sha256=_6nFLKwAtq56vYXMZ6YmHnMfL5SarD96MVEA-9cxXns,3178
57
+ dexcontrol/utils/rate_limiter.py,sha256=wFNaJ1fh-GO6zItuksKd_DSxLA1esE71WAiNDLpGsU0,6176
58
+ dexcontrol/utils/rtc_utils.py,sha256=o2F9puC7CdAPnqiVq2vzomFZ7hMHljwtAbp9UiLhxJY,4426
59
+ dexcontrol/utils/timer.py,sha256=1sOYYEapbZ5aBqJwknClsxgjDx0FDRQuGEdcTGnYTCI,3948
60
+ dexcontrol/utils/trajectory_utils.py,sha256=TURFb0DeDey0416z4L7AXiWcKJYsgg_bB5AE_JPSpXY,1879
61
+ dexcontrol/utils/viz_utils.py,sha256=rKtZfu32-9D9CS4cSiil-oLub_MiKTJV6hURvJbKd0s,6295
62
+ dexcontrol/utils/zenoh_utils.py,sha256=83BSwWM0RZQP5Zey4Py83P_QC-vuk1qyk2Ac5iuschA,4264
63
+ dexcontrol/utils/subscribers/__init__.py,sha256=Sqa-PPElwdUKxdh9BbU5MSqnf_i7BFqANrzVUXYUNuQ,1380
64
+ dexcontrol/utils/subscribers/base.py,sha256=t4zcps_kjFG1wj6WSrZ4HJg0Bxcdnu-C8NkVVupmNVg,9769
65
+ dexcontrol/utils/subscribers/camera.py,sha256=0kaeoKjKCxRQ5iaKK3r_94xEaVxNDBAMd2ZHL6X1kWU,11201
66
+ dexcontrol/utils/subscribers/decoders.py,sha256=X39NY7zNEUlOaG0b1Eooc1T7U5SCQ3rZ2ddaz12fi0o,2134
67
+ dexcontrol/utils/subscribers/generic.py,sha256=EKRutiu2zJBfzNIHCfYEfkcGE6QQTJmkOEMRRvEXJXA,3704
68
+ dexcontrol/utils/subscribers/imu.py,sha256=Us4ZWzLfqujg16jvrNIoHcvUyxbRCv6mZlaAizvX6uo,5925
69
+ dexcontrol/utils/subscribers/lidar.py,sha256=OlmORIf-dBO4LV4u6pWccoxh-nYTAtGlIfhjj-sG1F4,5691
70
+ dexcontrol/utils/subscribers/protobuf.py,sha256=gtE2b9ZtR2UXftKA5nX7bvTLkj8AeXDYZMqe4B3t5BQ,3696
71
+ dexcontrol/utils/subscribers/rtc.py,sha256=mxD-IIeQwluvq0_D63lQJJEXrJsIc6yxX7uD0PDh08k,11350
72
+ dexcontrol-0.2.12.dist-info/METADATA,sha256=3O9vIN5nR0U_mpL2QAb7Enr_eRzUbSI3Zk49Vv_HFpI,36840
73
+ dexcontrol-0.2.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
74
+ dexcontrol-0.2.12.dist-info/licenses/LICENSE,sha256=0J2KCMNNnW5WZPK5x8xUiCxApBf7h83693ggSJYiue0,31745
75
+ dexcontrol-0.2.12.dist-info/RECORD,,
@@ -1,72 +0,0 @@
1
- dexcontrol/__init__.py,sha256=1UGkcmMHphLJM7MYIfSuWfSameV1XLBDVjEazl5hb1I,1656
2
- dexcontrol/robot.py,sha256=Kyp8VXcDM6PORlvWBQqH4JR-4Uu6ttn652gNX7t5fg8,41686
3
- dexcontrol/apps/dualsense_teleop_base.py,sha256=Dw1z-2HA5D7DPKutZxlOdXsN9vpk4gS6XzJsL5ZQLM0,12702
4
- dexcontrol/config/__init__.py,sha256=UVLNpzGD14e8g68rUZFXTh0B7FRx6uS0Eg_MecjinYM,520
5
- dexcontrol/config/vega.py,sha256=4RrP0V5bmH0OUM3V0gND6cpRuMqoziLTQdKiRey1_ag,7192
6
- dexcontrol/config/core/__init__.py,sha256=Ym2R1hr1iMKQuXcg16BpZfQtTb0hQ5Q7smUIMlwKfho,637
7
- dexcontrol/config/core/arm.py,sha256=bRemtNO_eQVUgcojw1ItwWiqOZVOaaIq72G5-QqFu-I,1183
8
- dexcontrol/config/core/chassis.py,sha256=163hO4lVVaW7r9dvNleH0cdDds_GfO15EepnjloeT9U,868
9
- dexcontrol/config/core/hand.py,sha256=MONnh9rUmfDqUl3NMoJ6rOy8hZKvD5iv1egkYdIl1pQ,1272
10
- dexcontrol/config/core/head.py,sha256=1eqsDPGBG8r8MocJwUMnDAQnOD152sl7P2k6Lg_ZKOA,1124
11
- dexcontrol/config/core/misc.py,sha256=KQstrVKFL-vdoaHVdj-VGwMrrhzm4pVz2g4A2etnav4,1169
12
- dexcontrol/config/core/torso.py,sha256=6B_-8LhT4rJ4K_oF9sjroOwIIj_JwlNS2JC8LmCCrSA,1456
13
- dexcontrol/config/sensors/__init__.py,sha256=bYPMLxbbn5QeuPyA6OPGDS2JTYpnVvaZJT8PeILFjQY,252
14
- dexcontrol/config/sensors/vega_sensors.py,sha256=oQrJcder-kcGujON5mwmThSgnBeIclq7OVWQ5lbwj1E,2581
15
- dexcontrol/config/sensors/cameras/__init__.py,sha256=GmwRW9ovZ_JcpD2QmzTO_in_LRBoRDorjMVGY6XgGI8,383
16
- dexcontrol/config/sensors/cameras/rgb_camera.py,sha256=20sniWVjo-Lj8SEfsXfwN07pm3MYOOaT1WP0G6Vrfxs,1465
17
- dexcontrol/config/sensors/cameras/zed_camera.py,sha256=7wgY-jBePtAWC6PWYKb3S0XSxD0Eg3UlPzoy5p0Y1lw,1852
18
- dexcontrol/config/sensors/imu/__init__.py,sha256=fW-DlevCvf_W8HV_fvLe9yIe-XL5op2mggoTKh-6fGQ,328
19
- dexcontrol/config/sensors/imu/chassis_imu.py,sha256=3OlTTBH6k1QGM5c5bcg8NL3XUXzYA8gCLM8lpCq2KFM,559
20
- dexcontrol/config/sensors/imu/zed_imu.py,sha256=y-dPI-XS6Kyq0WOf0wwuc2BgVnMN2hwCMxb0Vmwt4O4,550
21
- dexcontrol/config/sensors/lidar/__init__.py,sha256=j8vFkF675Z7zKtCztJcyG7oSA_XqrD8OeQLEK0GACug,288
22
- dexcontrol/config/sensors/lidar/rplidar.py,sha256=ybuT_f1ADWF3oGH1gi6D2F80TbJEm4vbm68Fe108OAA,541
23
- dexcontrol/config/sensors/ultrasonic/__init__.py,sha256=-q83RhIMZJGVFVPYaA4hOugoG6wZw8EL6wJg7-HTSxU,294
24
- dexcontrol/config/sensors/ultrasonic/ultrasonic.py,sha256=7b4dm1QOhy5_5RFVpY-frXZyDzqok0K1u7ed9gf3PL0,552
25
- dexcontrol/core/__init__.py,sha256=bYPMLxbbn5QeuPyA6OPGDS2JTYpnVvaZJT8PeILFjQY,252
26
- dexcontrol/core/arm.py,sha256=jeBpPILV_-n6r-tqFUUjQPSog1Jxd9HKki572S6e8qk,12467
27
- dexcontrol/core/chassis.py,sha256=tB-tsx6MjKJDOtQxBf7PIX0L1JwgnsXUzmNPC1VKsQU,23165
28
- dexcontrol/core/component.py,sha256=KRlf6XR5vvki1N4EorIJzvc15_O8UZMHWa4khHTPDVk,31060
29
- dexcontrol/core/hand.py,sha256=swfWWM9h6o27i-41R-fw_JLfOzBHtpNIJDI1IgQPGIE,6541
30
- dexcontrol/core/head.py,sha256=V1ySWoFSPGCX65tbP-UHWiXgiJEtnEdiWLUDtvl-Sns,9227
31
- dexcontrol/core/misc.py,sha256=m7WtziXGyhM7z27MjxiIQfTMu0_z30ReLkUCHzaRk9E,22547
32
- dexcontrol/core/torso.py,sha256=N5XE_lY-i78iMFEjIxMJ9I6KWK4YgHv6VqVUKEWLrcg,7402
33
- dexcontrol/proto/dexcontrol_msg_pb2.py,sha256=iRvfKLjV7eRxb9jOB_KrCsd77GbgzByThW_JIKd_ibM,5691
34
- dexcontrol/proto/dexcontrol_msg_pb2.pyi,sha256=_vzo6hozKpC5jzdKUOTH81VXCNYO1awcgTFhVNo91N0,9371
35
- dexcontrol/proto/dexcontrol_query_pb2.py,sha256=Aa98bPmOuImBheN6fv4Ysy1Bmk5oX2tGatqcykDUz0E,5328
36
- dexcontrol/proto/dexcontrol_query_pb2.pyi,sha256=iZXySZ_GJkB23ALpLpf2r5bpiGEtsf1zQt0wALz9aKU,5839
37
- dexcontrol/sensors/__init__.py,sha256=Dp06cuO_3xC6i4u5rHqfK5NqlIC5kaCue_bAtTC6JEE,960
38
- dexcontrol/sensors/manager.py,sha256=pBseqoAcrYdbBbSpFGChh_ROQlxnKDcolcKzKCEjpwM,6853
39
- dexcontrol/sensors/ultrasonic.py,sha256=WAHvHh64iQ0HfqVf-Oo0Rg8R32Cdk5d8k8kDSwa3Xrc,3258
40
- dexcontrol/sensors/camera/__init__.py,sha256=Vwe98I4Lvdv3F2UslOzKkeUkt5Rl2jSqbKlU6gIBeF0,609
41
- dexcontrol/sensors/camera/rgb_camera.py,sha256=ZyWS2FkEF7MYg5rlG_YXd8VpbBu--Y-1Rlb6uzYHNNo,5045
42
- dexcontrol/sensors/camera/zed_camera.py,sha256=7gVoRhwynCUjyTOtUBZCiNZS3MhXoQYBDrr_fGlho4g,14007
43
- dexcontrol/sensors/imu/__init__.py,sha256=bBC7_NSLJ5qLMvUYu2-9yXKO2bRpQLC0HyywBwnbM0A,768
44
- dexcontrol/sensors/imu/chassis_imu.py,sha256=9gziCrtFKfWmeiDdbgD4aIkkdtjJahbckayYj_Lv5r4,4858
45
- dexcontrol/sensors/imu/zed_imu.py,sha256=VB0TfQYIqKNEPGPCbdAO9YtshWs4nE7y0y9FnWU-Mko,5148
46
- dexcontrol/sensors/lidar/__init__.py,sha256=frF16HmeQnfbvH0dVJ4pPjD4TySF13wCk-O9L3Memeg,317
47
- dexcontrol/sensors/lidar/rplidar.py,sha256=xi3y0imYJwfKTzRX66okrxwbo-ZWZmreUnXIK-RZfoU,4439
48
- dexcontrol/utils/__init__.py,sha256=ayMZ6xNlA9xKfS_XRr8bWcoXW4-8Jg_25XSbMd5Jx58,468
49
- dexcontrol/utils/constants.py,sha256=qTaMgMPexSOgn9eGkKNZBAmvac_QCfU2g_fCTaMjb78,661
50
- dexcontrol/utils/io_utils.py,sha256=4TYV33ufECo8fuQivrZR9vtSdwWYUiPvpAUSneEzOOs,850
51
- dexcontrol/utils/motion_utils.py,sha256=p4kXQm_YorISDC2crrpY0gwCVw_yQCPv-acxPUSfh8w,7172
52
- dexcontrol/utils/os_utils.py,sha256=CC2st_Pb0C5cWfCg-i1P5bgBx3ZBX4LWVUiBq63dNeo,1852
53
- dexcontrol/utils/pb_utils.py,sha256=_6nFLKwAtq56vYXMZ6YmHnMfL5SarD96MVEA-9cxXns,3178
54
- dexcontrol/utils/rate_limiter.py,sha256=wFNaJ1fh-GO6zItuksKd_DSxLA1esE71WAiNDLpGsU0,6176
55
- dexcontrol/utils/rtc_utils.py,sha256=o2F9puC7CdAPnqiVq2vzomFZ7hMHljwtAbp9UiLhxJY,4426
56
- dexcontrol/utils/timer.py,sha256=1sOYYEapbZ5aBqJwknClsxgjDx0FDRQuGEdcTGnYTCI,3948
57
- dexcontrol/utils/trajectory_utils.py,sha256=gEi-hYSkySUO8rZPFig8t14vMxJPBY7hK-UldsXY1uA,1420
58
- dexcontrol/utils/viz_utils.py,sha256=UZZ-IX9yz7T9e8Rb-xN1wtD4H_vDBZxf-BSc7VGEMZo,2770
59
- dexcontrol/utils/zenoh_utils.py,sha256=JlfhNwg4agPSRb6_Gkqi3ymuw_b13bnnTWClchWpGn8,2809
60
- dexcontrol/utils/subscribers/__init__.py,sha256=Sqa-PPElwdUKxdh9BbU5MSqnf_i7BFqANrzVUXYUNuQ,1380
61
- dexcontrol/utils/subscribers/base.py,sha256=t4zcps_kjFG1wj6WSrZ4HJg0Bxcdnu-C8NkVVupmNVg,9769
62
- dexcontrol/utils/subscribers/camera.py,sha256=0kaeoKjKCxRQ5iaKK3r_94xEaVxNDBAMd2ZHL6X1kWU,11201
63
- dexcontrol/utils/subscribers/decoders.py,sha256=X39NY7zNEUlOaG0b1Eooc1T7U5SCQ3rZ2ddaz12fi0o,2134
64
- dexcontrol/utils/subscribers/generic.py,sha256=EKRutiu2zJBfzNIHCfYEfkcGE6QQTJmkOEMRRvEXJXA,3704
65
- dexcontrol/utils/subscribers/imu.py,sha256=Us4ZWzLfqujg16jvrNIoHcvUyxbRCv6mZlaAizvX6uo,5925
66
- dexcontrol/utils/subscribers/lidar.py,sha256=ZIUpzfb-n5zLnCfZBDxJMMI4FKmlwdOYHQzpVlfIGQw,5631
67
- dexcontrol/utils/subscribers/protobuf.py,sha256=gtE2b9ZtR2UXftKA5nX7bvTLkj8AeXDYZMqe4B3t5BQ,3696
68
- dexcontrol/utils/subscribers/rtc.py,sha256=mxD-IIeQwluvq0_D63lQJJEXrJsIc6yxX7uD0PDh08k,11350
69
- dexcontrol-0.2.7.dist-info/METADATA,sha256=9V7o2gUcFDBux04BFEqFSmYs0MCA8Pxqbvara3g9Fe8,36790
70
- dexcontrol-0.2.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
- dexcontrol-0.2.7.dist-info/licenses/LICENSE,sha256=0J2KCMNNnW5WZPK5x8xUiCxApBf7h83693ggSJYiue0,31745
72
- dexcontrol-0.2.7.dist-info/RECORD,,