dexcontrol 0.2.10__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.
- dexcontrol/__init__.py +1 -0
- dexcontrol/config/core/arm.py +5 -1
- dexcontrol/config/core/hand.py +1 -1
- dexcontrol/config/core/head.py +7 -8
- dexcontrol/config/core/misc.py +14 -1
- dexcontrol/config/core/torso.py +8 -4
- dexcontrol/config/sensors/cameras/__init__.py +2 -1
- dexcontrol/config/sensors/cameras/luxonis_camera.py +51 -0
- dexcontrol/config/sensors/cameras/rgb_camera.py +1 -1
- dexcontrol/config/sensors/cameras/zed_camera.py +2 -2
- dexcontrol/config/sensors/vega_sensors.py +9 -1
- dexcontrol/config/vega.py +30 -2
- dexcontrol/core/arm.py +71 -46
- dexcontrol/core/component.py +41 -4
- dexcontrol/core/head.py +35 -23
- dexcontrol/core/misc.py +94 -13
- dexcontrol/core/torso.py +24 -6
- dexcontrol/proto/dexcontrol_msg_pb2.py +38 -36
- dexcontrol/proto/dexcontrol_msg_pb2.pyi +48 -20
- dexcontrol/proto/dexcontrol_query_pb2.py +7 -3
- dexcontrol/proto/dexcontrol_query_pb2.pyi +24 -0
- dexcontrol/robot.py +232 -68
- dexcontrol/sensors/__init__.py +2 -1
- dexcontrol/sensors/camera/__init__.py +2 -0
- dexcontrol/sensors/camera/luxonis_camera.py +169 -0
- dexcontrol/sensors/camera/zed_camera.py +17 -8
- dexcontrol/sensors/imu/chassis_imu.py +5 -1
- dexcontrol/sensors/imu/zed_imu.py +3 -2
- dexcontrol/sensors/lidar/rplidar.py +1 -0
- dexcontrol/sensors/manager.py +3 -0
- dexcontrol/utils/constants.py +3 -0
- dexcontrol/utils/error_code.py +236 -0
- dexcontrol/utils/subscribers/lidar.py +1 -0
- dexcontrol/utils/trajectory_utils.py +17 -5
- dexcontrol/utils/viz_utils.py +86 -11
- dexcontrol/utils/zenoh_utils.py +39 -0
- {dexcontrol-0.2.10.dist-info → dexcontrol-0.2.12.dist-info}/METADATA +4 -2
- dexcontrol-0.2.12.dist-info/RECORD +75 -0
- dexcontrol-0.2.10.dist-info/RECORD +0 -72
- {dexcontrol-0.2.10.dist-info → dexcontrol-0.2.12.dist-info}/WHEEL +0 -0
- {dexcontrol-0.2.10.dist-info → dexcontrol-0.2.12.dist-info}/licenses/LICENSE +0 -0
dexcontrol/core/head.py
CHANGED
|
@@ -58,24 +58,23 @@ class Head(RobotJointComponent):
|
|
|
58
58
|
state_message_type=dexcontrol_msg_pb2.HeadState,
|
|
59
59
|
zenoh_session=zenoh_session,
|
|
60
60
|
joint_name=configs.joint_name,
|
|
61
|
+
joint_limit=configs.joint_limit
|
|
62
|
+
if hasattr(configs, "joint_limit")
|
|
63
|
+
else None,
|
|
64
|
+
joint_vel_limit=configs.joint_vel_limit
|
|
65
|
+
if hasattr(configs, "joint_vel_limit")
|
|
66
|
+
else None,
|
|
61
67
|
pose_pool=configs.pose_pool,
|
|
62
68
|
)
|
|
63
69
|
|
|
64
70
|
self.mode_querier: Final[zenoh.Querier] = zenoh_session.declare_querier(
|
|
65
71
|
resolve_key_name(configs.set_mode_query), timeout=2.0
|
|
66
72
|
)
|
|
67
|
-
self.
|
|
68
|
-
self.max_vel: Final[float] = configs.max_vel
|
|
69
|
-
assert self.max_vel > self.default_vel, (
|
|
70
|
-
"max_vel must be greater than default_vel"
|
|
71
|
-
)
|
|
72
|
-
self._joint_limit: Float[np.ndarray, "3 2"] = np.stack(
|
|
73
|
-
[configs.joint_limit_lower, configs.joint_limit_upper], axis=1
|
|
74
|
-
)
|
|
73
|
+
assert self._joint_vel_limit is not None, "joint_vel_limit is not set"
|
|
75
74
|
|
|
76
75
|
def set_joint_pos(
|
|
77
76
|
self,
|
|
78
|
-
joint_pos: Float[np.ndarray, "
|
|
77
|
+
joint_pos: Float[np.ndarray, "3"] | list[float] | dict[str, float],
|
|
79
78
|
relative: bool = False,
|
|
80
79
|
wait_time: float = 0.0,
|
|
81
80
|
wait_kwargs: dict[str, float] | None = None,
|
|
@@ -87,7 +86,7 @@ class Head(RobotJointComponent):
|
|
|
87
86
|
Args:
|
|
88
87
|
joint_pos: Joint positions as either:
|
|
89
88
|
- List of joint values [j1, j2]
|
|
90
|
-
- Numpy array with shape (
|
|
89
|
+
- Numpy array with shape (3,), in radians
|
|
91
90
|
- Dictionary mapping joint names to position values
|
|
92
91
|
relative: If True, the joint positions are relative to the current position.
|
|
93
92
|
wait_time: Time to wait after sending command in seconds. If 0, returns
|
|
@@ -110,8 +109,8 @@ class Head(RobotJointComponent):
|
|
|
110
109
|
|
|
111
110
|
def set_joint_pos_vel(
|
|
112
111
|
self,
|
|
113
|
-
joint_pos: Float[np.ndarray, "
|
|
114
|
-
joint_vel: Float[np.ndarray, "
|
|
112
|
+
joint_pos: Float[np.ndarray, "3"] | list[float] | dict[str, float],
|
|
113
|
+
joint_vel: Float[np.ndarray, "3"]
|
|
115
114
|
| list[float]
|
|
116
115
|
| dict[str, float]
|
|
117
116
|
| float
|
|
@@ -126,11 +125,11 @@ class Head(RobotJointComponent):
|
|
|
126
125
|
Args:
|
|
127
126
|
joint_pos: Joint positions as either:
|
|
128
127
|
- List of joint values [j1, j2]
|
|
129
|
-
- Numpy array with shape (
|
|
128
|
+
- Numpy array with shape (3,), in radians
|
|
130
129
|
- Dictionary mapping joint names to position values
|
|
131
130
|
joint_vel: Optional joint velocities as either:
|
|
132
131
|
- List of joint values [v1, v2]
|
|
133
|
-
- Numpy array with shape (
|
|
132
|
+
- Numpy array with shape (3,), in rad/s
|
|
134
133
|
- Dictionary mapping joint names to velocity values
|
|
135
134
|
- Single float value to be applied to all joints
|
|
136
135
|
If None, velocities are calculated based on default velocity setting.
|
|
@@ -155,6 +154,15 @@ class Head(RobotJointComponent):
|
|
|
155
154
|
joint_pos = self._convert_joint_cmd_to_array(joint_pos)
|
|
156
155
|
joint_vel = self._process_joint_velocities(joint_vel, joint_pos)
|
|
157
156
|
|
|
157
|
+
if self._joint_limit is not None:
|
|
158
|
+
joint_pos = np.clip(
|
|
159
|
+
joint_pos, self._joint_limit[:, 0], self._joint_limit[:, 1]
|
|
160
|
+
)
|
|
161
|
+
if self._joint_vel_limit is not None:
|
|
162
|
+
joint_vel = np.clip(
|
|
163
|
+
joint_vel, -self._joint_vel_limit, self._joint_vel_limit
|
|
164
|
+
)
|
|
165
|
+
|
|
158
166
|
# Create and send control message
|
|
159
167
|
control_msg = dexcontrol_msg_pb2.HeadCommand()
|
|
160
168
|
control_msg.joint_pos.extend(joint_pos.tolist())
|
|
@@ -197,12 +205,12 @@ class Head(RobotJointComponent):
|
|
|
197
205
|
logger.info(reply.ok.payload.to_string())
|
|
198
206
|
time.sleep(0.5)
|
|
199
207
|
|
|
200
|
-
def get_joint_limit(self) -> Float[np.ndarray, "3 2"]:
|
|
208
|
+
def get_joint_limit(self) -> Float[np.ndarray, "3 2"] | None:
|
|
201
209
|
"""Get the joint limits of the head.
|
|
202
210
|
|
|
203
211
|
Returns:
|
|
204
212
|
Array of joint limits with shape (3, 2), where the first column contains
|
|
205
|
-
lower limits and the second column contains upper limits.
|
|
213
|
+
lower limits and the second column contains upper limits, or None if not configured.
|
|
206
214
|
"""
|
|
207
215
|
return self._joint_limit
|
|
208
216
|
|
|
@@ -229,7 +237,7 @@ class Head(RobotJointComponent):
|
|
|
229
237
|
|
|
230
238
|
def _process_joint_velocities(
|
|
231
239
|
self,
|
|
232
|
-
joint_vel: Float[np.ndarray, "
|
|
240
|
+
joint_vel: Float[np.ndarray, "3"]
|
|
233
241
|
| list[float]
|
|
234
242
|
| dict[str, float]
|
|
235
243
|
| float
|
|
@@ -251,14 +259,18 @@ class Head(RobotJointComponent):
|
|
|
251
259
|
motion_norm = np.linalg.norm(joint_motion)
|
|
252
260
|
|
|
253
261
|
if motion_norm < 1e-6: # Avoid division by zero
|
|
254
|
-
return np.zeros(
|
|
262
|
+
return np.zeros(3, dtype=np.float32)
|
|
255
263
|
|
|
256
|
-
|
|
257
|
-
|
|
264
|
+
default_vel = (
|
|
265
|
+
2.5 if self._joint_vel_limit is None else np.min(self._joint_vel_limit)
|
|
266
|
+
)
|
|
267
|
+
return (joint_motion / motion_norm) * default_vel
|
|
258
268
|
|
|
259
269
|
if isinstance(joint_vel, (int, float)):
|
|
260
270
|
# Single value - apply to all joints
|
|
261
|
-
return np.full(
|
|
271
|
+
return np.full(3, joint_vel, dtype=np.float32)
|
|
262
272
|
|
|
263
|
-
# Convert to array and clip to
|
|
264
|
-
return self._convert_joint_cmd_to_array(
|
|
273
|
+
# Convert to array and clip to velocity limits
|
|
274
|
+
return self._convert_joint_cmd_to_array(
|
|
275
|
+
joint_vel, clip_value=self._joint_vel_limit
|
|
276
|
+
)
|
dexcontrol/core/misc.py
CHANGED
|
@@ -95,6 +95,14 @@ class Battery(RobotComponent):
|
|
|
95
95
|
- power: Power consumption in Watts
|
|
96
96
|
"""
|
|
97
97
|
state = self._get_state()
|
|
98
|
+
if state is None:
|
|
99
|
+
return {
|
|
100
|
+
"percentage": 0.0,
|
|
101
|
+
"temperature": 0.0,
|
|
102
|
+
"current": 0.0,
|
|
103
|
+
"voltage": 0.0,
|
|
104
|
+
"power": 0.0,
|
|
105
|
+
}
|
|
98
106
|
return {
|
|
99
107
|
"percentage": float(state.percentage),
|
|
100
108
|
"temperature": float(state.temperature),
|
|
@@ -111,6 +119,11 @@ class Battery(RobotComponent):
|
|
|
111
119
|
table.add_column("Parameter", style="cyan")
|
|
112
120
|
table.add_column("Value")
|
|
113
121
|
|
|
122
|
+
if state is None:
|
|
123
|
+
table.add_row("Status", "[red]No battery data available[/]")
|
|
124
|
+
self._console.print(table)
|
|
125
|
+
return
|
|
126
|
+
|
|
114
127
|
battery_style = self._get_battery_level_style(state.percentage)
|
|
115
128
|
table.add_row("Battery Level", f"[{battery_style}]{state.percentage:.1f}%[/]")
|
|
116
129
|
|
|
@@ -213,10 +226,14 @@ class EStop(RobotComponent):
|
|
|
213
226
|
configs: EStop configuration containing subscription topics.
|
|
214
227
|
zenoh_session: Active Zenoh session for communication.
|
|
215
228
|
"""
|
|
229
|
+
self._enabled = configs.enabled
|
|
216
230
|
super().__init__(
|
|
217
231
|
configs.state_sub_topic, zenoh_session, dexcontrol_msg_pb2.EStopState
|
|
218
232
|
)
|
|
219
233
|
self._estop_query_name = configs.estop_query_name
|
|
234
|
+
if not self._enabled:
|
|
235
|
+
logger.warning("EStop monitoring is DISABLED via configuration")
|
|
236
|
+
return
|
|
220
237
|
self._shutdown_event = threading.Event()
|
|
221
238
|
self._monitor_thread = threading.Thread(target=self._estop_monitor, daemon=True)
|
|
222
239
|
self._monitor_thread.start()
|
|
@@ -264,6 +281,11 @@ class EStop(RobotComponent):
|
|
|
264
281
|
- software_estop_enabled: Software EStop enabled
|
|
265
282
|
"""
|
|
266
283
|
state = self._get_state()
|
|
284
|
+
if state is None:
|
|
285
|
+
return {
|
|
286
|
+
"button_pressed": False,
|
|
287
|
+
"software_estop_enabled": False,
|
|
288
|
+
}
|
|
267
289
|
return {
|
|
268
290
|
"button_pressed": state.button_pressed,
|
|
269
291
|
"software_estop_enabled": state.software_estop_enabled,
|
|
@@ -271,11 +293,13 @@ class EStop(RobotComponent):
|
|
|
271
293
|
|
|
272
294
|
def is_button_pressed(self) -> bool:
|
|
273
295
|
"""Checks if the EStop button is pressed."""
|
|
274
|
-
|
|
296
|
+
state = self._get_state()
|
|
297
|
+
return state.button_pressed if state is not None else False
|
|
275
298
|
|
|
276
299
|
def is_software_estop_enabled(self) -> bool:
|
|
277
300
|
"""Checks if the software EStop is enabled."""
|
|
278
|
-
|
|
301
|
+
state = self._get_state()
|
|
302
|
+
return state.software_estop_enabled if state is not None else False
|
|
279
303
|
|
|
280
304
|
def activate(self) -> None:
|
|
281
305
|
"""Activates the software emergency stop (E-Stop)."""
|
|
@@ -291,11 +315,12 @@ class EStop(RobotComponent):
|
|
|
291
315
|
|
|
292
316
|
def shutdown(self) -> None:
|
|
293
317
|
"""Shuts down the EStop component and stops monitoring thread."""
|
|
294
|
-
self.
|
|
295
|
-
|
|
296
|
-
self._monitor_thread.
|
|
297
|
-
|
|
298
|
-
|
|
318
|
+
if self._enabled:
|
|
319
|
+
self._shutdown_event.set()
|
|
320
|
+
if self._monitor_thread and self._monitor_thread.is_alive():
|
|
321
|
+
self._monitor_thread.join(timeout=2.0) # Extended timeout
|
|
322
|
+
if self._monitor_thread.is_alive():
|
|
323
|
+
logger.warning("EStop monitor thread did not terminate cleanly")
|
|
299
324
|
super().shutdown()
|
|
300
325
|
|
|
301
326
|
def show(self) -> None:
|
|
@@ -306,6 +331,12 @@ class EStop(RobotComponent):
|
|
|
306
331
|
table.add_column("Parameter", style="cyan")
|
|
307
332
|
table.add_column("Value")
|
|
308
333
|
|
|
334
|
+
if state is None:
|
|
335
|
+
table.add_row("Status", "[red]No E-Stop data available[/]")
|
|
336
|
+
console = Console()
|
|
337
|
+
console.print(table)
|
|
338
|
+
return
|
|
339
|
+
|
|
309
340
|
button_style = "bold red" if state.button_pressed else "bold dark_green"
|
|
310
341
|
table.add_row("Button Pressed", f"[{button_style}]{state.button_pressed}[/]")
|
|
311
342
|
|
|
@@ -387,9 +418,12 @@ class Heartbeat:
|
|
|
387
418
|
Returns:
|
|
388
419
|
Decoded heartbeat timestamp value in seconds.
|
|
389
420
|
"""
|
|
390
|
-
|
|
391
|
-
#
|
|
392
|
-
|
|
421
|
+
# Decode UTF-8 string and convert to float
|
|
422
|
+
# Publisher sends: str(self.timecount_now).encode() in milliseconds
|
|
423
|
+
timestamp_str = data.to_bytes().decode("utf-8")
|
|
424
|
+
timestamp_ms = float(timestamp_str)
|
|
425
|
+
# Convert from milliseconds to seconds
|
|
426
|
+
return timestamp_ms / 1000.0
|
|
393
427
|
|
|
394
428
|
def _heartbeat_monitor(self) -> None:
|
|
395
429
|
"""Background thread that continuously monitors heartbeat signal."""
|
|
@@ -527,6 +561,52 @@ class Heartbeat:
|
|
|
527
561
|
return False
|
|
528
562
|
return self._subscriber.is_active()
|
|
529
563
|
|
|
564
|
+
@staticmethod
|
|
565
|
+
def _format_uptime(seconds: float) -> str:
|
|
566
|
+
"""Convert seconds to human-readable uptime format with high resolution.
|
|
567
|
+
|
|
568
|
+
Args:
|
|
569
|
+
seconds: Total seconds of uptime.
|
|
570
|
+
|
|
571
|
+
Returns:
|
|
572
|
+
Human-readable string like "1mo 2d 3h 45m 12s 345ms".
|
|
573
|
+
"""
|
|
574
|
+
# Calculate months (assuming 30 days per month)
|
|
575
|
+
months = int(seconds // (86400 * 30))
|
|
576
|
+
remaining = seconds % (86400 * 30)
|
|
577
|
+
|
|
578
|
+
# Calculate days
|
|
579
|
+
days = int(remaining // 86400)
|
|
580
|
+
remaining = remaining % 86400
|
|
581
|
+
|
|
582
|
+
# Calculate hours
|
|
583
|
+
hours = int(remaining // 3600)
|
|
584
|
+
remaining = remaining % 3600
|
|
585
|
+
|
|
586
|
+
# Calculate minutes
|
|
587
|
+
minutes = int(remaining // 60)
|
|
588
|
+
remaining = remaining % 60
|
|
589
|
+
|
|
590
|
+
# Calculate seconds and milliseconds
|
|
591
|
+
secs = int(remaining)
|
|
592
|
+
milliseconds = int((remaining - secs) * 1000)
|
|
593
|
+
|
|
594
|
+
parts = []
|
|
595
|
+
if months > 0:
|
|
596
|
+
parts.append(f"{months}mo")
|
|
597
|
+
if days > 0:
|
|
598
|
+
parts.append(f"{days}d")
|
|
599
|
+
if hours > 0:
|
|
600
|
+
parts.append(f"{hours}h")
|
|
601
|
+
if minutes > 0:
|
|
602
|
+
parts.append(f"{minutes}m")
|
|
603
|
+
if secs > 0:
|
|
604
|
+
parts.append(f"{secs}s")
|
|
605
|
+
if milliseconds > 0 or not parts:
|
|
606
|
+
parts.append(f"{milliseconds}ms")
|
|
607
|
+
|
|
608
|
+
return " ".join(parts)
|
|
609
|
+
|
|
530
610
|
def shutdown(self) -> None:
|
|
531
611
|
"""Shuts down the heartbeat monitor and stops monitoring thread."""
|
|
532
612
|
if not self._enabled:
|
|
@@ -567,12 +647,13 @@ class Heartbeat:
|
|
|
567
647
|
active_style = "bold dark_green" if status["is_active"] else "bold red"
|
|
568
648
|
table.add_row("Signal Active", f"[{active_style}]{status['is_active']}[/]")
|
|
569
649
|
|
|
570
|
-
# Last heartbeat value
|
|
650
|
+
# Last heartbeat value (robot uptime)
|
|
571
651
|
last_value = status["last_value"]
|
|
572
652
|
if last_value is not None:
|
|
573
|
-
|
|
653
|
+
uptime_str = self._format_uptime(last_value)
|
|
654
|
+
table.add_row("Robot server uptime", f"[blue]{uptime_str}[/]")
|
|
574
655
|
else:
|
|
575
|
-
table.add_row("
|
|
656
|
+
table.add_row("Robot server uptime", "[red]No data[/]")
|
|
576
657
|
|
|
577
658
|
# Time since last heartbeat
|
|
578
659
|
time_since = status["time_since_last"]
|
dexcontrol/core/torso.py
CHANGED
|
@@ -52,10 +52,15 @@ class Torso(RobotJointComponent):
|
|
|
52
52
|
state_message_type=dexcontrol_msg_pb2.TorsoState,
|
|
53
53
|
zenoh_session=zenoh_session,
|
|
54
54
|
joint_name=configs.joint_name,
|
|
55
|
+
joint_limit=configs.joint_limit
|
|
56
|
+
if hasattr(configs, "joint_limit")
|
|
57
|
+
else None,
|
|
58
|
+
joint_vel_limit=configs.joint_vel_limit
|
|
59
|
+
if hasattr(configs, "joint_vel_limit")
|
|
60
|
+
else None,
|
|
55
61
|
pose_pool=configs.pose_pool,
|
|
56
62
|
)
|
|
57
|
-
self.
|
|
58
|
-
self.max_vel = configs.max_vel
|
|
63
|
+
assert self._joint_vel_limit is not None, "joint_vel_limit is not set"
|
|
59
64
|
|
|
60
65
|
def set_joint_pos_vel(
|
|
61
66
|
self,
|
|
@@ -104,6 +109,15 @@ class Torso(RobotJointComponent):
|
|
|
104
109
|
joint_pos = self._convert_joint_cmd_to_array(joint_pos)
|
|
105
110
|
joint_vel = self._process_joint_velocities(joint_vel, joint_pos)
|
|
106
111
|
|
|
112
|
+
if self._joint_limit is not None:
|
|
113
|
+
joint_pos = np.clip(
|
|
114
|
+
joint_pos, self._joint_limit[:, 0], self._joint_limit[:, 1]
|
|
115
|
+
)
|
|
116
|
+
if self._joint_vel_limit is not None:
|
|
117
|
+
joint_vel = np.clip(
|
|
118
|
+
joint_vel, -self._joint_vel_limit, self._joint_vel_limit
|
|
119
|
+
)
|
|
120
|
+
|
|
107
121
|
# Create and send control message
|
|
108
122
|
control_msg = dexcontrol_msg_pb2.TorsoCommand()
|
|
109
123
|
control_msg.joint_pos.extend(joint_pos.tolist())
|
|
@@ -207,12 +221,16 @@ class Torso(RobotJointComponent):
|
|
|
207
221
|
if motion_norm < 1e-6: # Avoid division by zero
|
|
208
222
|
return np.zeros(3, dtype=np.float32)
|
|
209
223
|
|
|
210
|
-
|
|
211
|
-
|
|
224
|
+
default_vel = (
|
|
225
|
+
0.6 if self._joint_vel_limit is None else np.min(self._joint_vel_limit)
|
|
226
|
+
)
|
|
227
|
+
return (joint_motion / motion_norm) * default_vel
|
|
212
228
|
|
|
213
229
|
if isinstance(joint_vel, (int, float)):
|
|
214
230
|
# Single value - apply to all joints
|
|
215
231
|
return np.full(3, joint_vel, dtype=np.float32)
|
|
216
232
|
|
|
217
|
-
# Convert to array and clip to
|
|
218
|
-
return self._convert_joint_cmd_to_array(
|
|
233
|
+
# Convert to array and clip to velocity limits
|
|
234
|
+
return self._convert_joint_cmd_to_array(
|
|
235
|
+
joint_vel, clip_value=self._joint_vel_limit
|
|
236
|
+
)
|
|
@@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x64\x65xcontrol_msg.proto\x12\ndexcontrol\"
|
|
28
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x64\x65xcontrol_msg.proto\x12\ndexcontrol\"l\n\x08\x41rmState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x11\n\tjoint_cur\x18\x03 \x03(\x02\x12\x11\n\tjoint_err\x18\x04 \x03(\r\x12\x14\n\x0ctimestamp_ns\x18\x05 \x01(\x04\"\\\n\tHandState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x13\n\x0bjoint_statu\x18\x03 \x03(\r\x12\x14\n\x0ctimestamp_ns\x18\x04 \x01(\x04\"G\n\tHeadState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x14\n\x0ctimestamp_ns\x18\x03 \x01(\x04\"H\n\nTorsoState\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\x12\x14\n\x0ctimestamp_ns\x18\x03 \x01(\x04\"a\n\x10SingleWheelState\x12\x14\n\x0csteering_pos\x18\x01 \x01(\x02\x12\x11\n\twheel_pos\x18\x02 \x01(\x02\x12\x11\n\twheel_vel\x18\x03 \x01(\x02\x12\x11\n\twheel_cur\x18\x04 \x01(\x02\"}\n\x0c\x43hassisState\x12*\n\x04left\x18\x01 \x01(\x0b\x32\x1c.dexcontrol.SingleWheelState\x12+\n\x05right\x18\x02 \x01(\x0b\x32\x1c.dexcontrol.SingleWheelState\x12\x14\n\x0ctimestamp_ns\x18\x05 \x01(\x04\"\x8f\x01\n\x08\x42MSState\x12\x0f\n\x07voltage\x18\x01 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x02 \x01(\x02\x12\x13\n\x0btemperature\x18\x03 \x01(\x02\x12\x12\n\npercentage\x18\x04 \x01(\r\x12\x13\n\x0bis_charging\x18\x05 \x01(\x08\x12\r\n\x05\x65rror\x18\x06 \x01(\r\x12\x14\n\x0ctimestamp_ns\x18\x07 \x01(\x04\"^\n\x0bWrenchState\x12\x0e\n\x06wrench\x18\x01 \x03(\x02\x12\x13\n\x0b\x62lue_button\x18\x02 \x01(\x08\x12\x14\n\x0cgreen_button\x18\x03 \x01(\x08\x12\x14\n\x0ctimestamp_ns\x18\x04 \x01(\x04\"Z\n\nEStopState\x12\x16\n\x0e\x62utton_pressed\x18\x01 \x01(\x08\x12\x1e\n\x16software_estop_enabled\x18\x02 \x01(\x08\x12\x14\n\x0ctimestamp_ns\x18\x03 \x01(\x04\"w\n\x0fUltrasonicState\x12\x12\n\nfront_left\x18\x01 \x01(\x02\x12\x13\n\x0b\x66ront_right\x18\x02 \x01(\x02\x12\x11\n\tback_left\x18\x03 \x01(\x02\x12\x12\n\nback_right\x18\x04 \x01(\x02\x12\x14\n\x0ctimestamp_ns\x18\x05 \x01(\x04\"\xbd\x01\n\x08IMUState\x12\r\n\x05\x61\x63\x63_x\x18\x01 \x01(\x02\x12\r\n\x05\x61\x63\x63_y\x18\x02 \x01(\x02\x12\r\n\x05\x61\x63\x63_z\x18\x03 \x01(\x02\x12\x0e\n\x06gyro_x\x18\x04 \x01(\x02\x12\x0e\n\x06gyro_y\x18\x05 \x01(\x02\x12\x0e\n\x06gyro_z\x18\x06 \x01(\x02\x12\x0e\n\x06quat_w\x18\x07 \x01(\x02\x12\x0e\n\x06quat_x\x18\x08 \x01(\x02\x12\x0e\n\x06quat_y\x18\t \x01(\x02\x12\x0e\n\x06quat_z\x18\n \x01(\x02\x12\x14\n\x0ctimestamp_ns\x18\x0b \x01(\x04\"\xa3\x01\n\nArmCommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32\".dexcontrol.ArmCommand.CommandType\x12\x11\n\tjoint_pos\x18\x02 \x03(\x02\x12\x11\n\tjoint_vel\x18\x03 \x03(\x02\"5\n\x0b\x43ommandType\x12\x0c\n\x08POSITION\x10\x00\x12\x18\n\x14VELOCITY_FEEDFORWARD\x10\x01\" \n\x0bHandCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\"3\n\x0bHeadCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"4\n\x0cTorsoCommand\x12\x11\n\tjoint_pos\x18\x01 \x03(\x02\x12\x11\n\tjoint_vel\x18\x02 \x03(\x02\"=\n\x12SingleWheelCommand\x12\x14\n\x0csteering_pos\x18\x01 \x01(\x02\x12\x11\n\twheel_vel\x18\x02 \x01(\x02\"m\n\x0e\x43hassisCommand\x12,\n\x04left\x18\x01 \x01(\x0b\x32\x1e.dexcontrol.SingleWheelCommand\x12-\n\x05right\x18\x02 \x01(\x0b\x32\x1e.dexcontrol.SingleWheelCommand\"-\n\x1d\x45ndEffectorPassThroughCommand\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x62\x06proto3')
|
|
29
29
|
|
|
30
30
|
_globals = globals()
|
|
31
31
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -33,39 +33,41 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dexcontrol_msg_pb2', _globa
|
|
|
33
33
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
34
34
|
DESCRIPTOR._loaded_options = None
|
|
35
35
|
_globals['_ARMSTATE']._serialized_start=36
|
|
36
|
-
_globals['_ARMSTATE']._serialized_end=
|
|
37
|
-
_globals['_HANDSTATE']._serialized_start=
|
|
38
|
-
_globals['_HANDSTATE']._serialized_end=
|
|
39
|
-
_globals['_HEADSTATE']._serialized_start=
|
|
40
|
-
_globals['_HEADSTATE']._serialized_end=
|
|
41
|
-
_globals['_TORSOSTATE']._serialized_start=
|
|
42
|
-
_globals['_TORSOSTATE']._serialized_end=
|
|
43
|
-
_globals['_SINGLEWHEELSTATE']._serialized_start=
|
|
44
|
-
_globals['_SINGLEWHEELSTATE']._serialized_end=
|
|
45
|
-
_globals['_CHASSISSTATE']._serialized_start=
|
|
46
|
-
_globals['_CHASSISSTATE']._serialized_end=
|
|
47
|
-
_globals['_BMSSTATE']._serialized_start=
|
|
48
|
-
_globals['_BMSSTATE']._serialized_end=
|
|
49
|
-
_globals['_WRENCHSTATE']._serialized_start=
|
|
50
|
-
_globals['_WRENCHSTATE']._serialized_end=
|
|
51
|
-
_globals['_ESTOPSTATE']._serialized_start=
|
|
52
|
-
_globals['_ESTOPSTATE']._serialized_end=
|
|
53
|
-
_globals['_ULTRASONICSTATE']._serialized_start=
|
|
54
|
-
_globals['_ULTRASONICSTATE']._serialized_end=
|
|
55
|
-
_globals['_IMUSTATE']._serialized_start=
|
|
56
|
-
_globals['_IMUSTATE']._serialized_end=
|
|
57
|
-
_globals['_ARMCOMMAND']._serialized_start=
|
|
58
|
-
_globals['_ARMCOMMAND']._serialized_end=
|
|
59
|
-
_globals['_ARMCOMMAND_COMMANDTYPE']._serialized_start=
|
|
60
|
-
_globals['_ARMCOMMAND_COMMANDTYPE']._serialized_end=
|
|
61
|
-
_globals['_HANDCOMMAND']._serialized_start=
|
|
62
|
-
_globals['_HANDCOMMAND']._serialized_end=
|
|
63
|
-
_globals['_HEADCOMMAND']._serialized_start=
|
|
64
|
-
_globals['_HEADCOMMAND']._serialized_end=
|
|
65
|
-
_globals['_TORSOCOMMAND']._serialized_start=
|
|
66
|
-
_globals['_TORSOCOMMAND']._serialized_end=
|
|
67
|
-
_globals['_SINGLEWHEELCOMMAND']._serialized_start=
|
|
68
|
-
_globals['_SINGLEWHEELCOMMAND']._serialized_end=
|
|
69
|
-
_globals['_CHASSISCOMMAND']._serialized_start=
|
|
70
|
-
_globals['_CHASSISCOMMAND']._serialized_end=
|
|
36
|
+
_globals['_ARMSTATE']._serialized_end=144
|
|
37
|
+
_globals['_HANDSTATE']._serialized_start=146
|
|
38
|
+
_globals['_HANDSTATE']._serialized_end=238
|
|
39
|
+
_globals['_HEADSTATE']._serialized_start=240
|
|
40
|
+
_globals['_HEADSTATE']._serialized_end=311
|
|
41
|
+
_globals['_TORSOSTATE']._serialized_start=313
|
|
42
|
+
_globals['_TORSOSTATE']._serialized_end=385
|
|
43
|
+
_globals['_SINGLEWHEELSTATE']._serialized_start=387
|
|
44
|
+
_globals['_SINGLEWHEELSTATE']._serialized_end=484
|
|
45
|
+
_globals['_CHASSISSTATE']._serialized_start=486
|
|
46
|
+
_globals['_CHASSISSTATE']._serialized_end=611
|
|
47
|
+
_globals['_BMSSTATE']._serialized_start=614
|
|
48
|
+
_globals['_BMSSTATE']._serialized_end=757
|
|
49
|
+
_globals['_WRENCHSTATE']._serialized_start=759
|
|
50
|
+
_globals['_WRENCHSTATE']._serialized_end=853
|
|
51
|
+
_globals['_ESTOPSTATE']._serialized_start=855
|
|
52
|
+
_globals['_ESTOPSTATE']._serialized_end=945
|
|
53
|
+
_globals['_ULTRASONICSTATE']._serialized_start=947
|
|
54
|
+
_globals['_ULTRASONICSTATE']._serialized_end=1066
|
|
55
|
+
_globals['_IMUSTATE']._serialized_start=1069
|
|
56
|
+
_globals['_IMUSTATE']._serialized_end=1258
|
|
57
|
+
_globals['_ARMCOMMAND']._serialized_start=1261
|
|
58
|
+
_globals['_ARMCOMMAND']._serialized_end=1424
|
|
59
|
+
_globals['_ARMCOMMAND_COMMANDTYPE']._serialized_start=1371
|
|
60
|
+
_globals['_ARMCOMMAND_COMMANDTYPE']._serialized_end=1424
|
|
61
|
+
_globals['_HANDCOMMAND']._serialized_start=1426
|
|
62
|
+
_globals['_HANDCOMMAND']._serialized_end=1458
|
|
63
|
+
_globals['_HEADCOMMAND']._serialized_start=1460
|
|
64
|
+
_globals['_HEADCOMMAND']._serialized_end=1511
|
|
65
|
+
_globals['_TORSOCOMMAND']._serialized_start=1513
|
|
66
|
+
_globals['_TORSOCOMMAND']._serialized_end=1565
|
|
67
|
+
_globals['_SINGLEWHEELCOMMAND']._serialized_start=1567
|
|
68
|
+
_globals['_SINGLEWHEELCOMMAND']._serialized_end=1628
|
|
69
|
+
_globals['_CHASSISCOMMAND']._serialized_start=1630
|
|
70
|
+
_globals['_CHASSISCOMMAND']._serialized_end=1739
|
|
71
|
+
_globals['_ENDEFFECTORPASSTHROUGHCOMMAND']._serialized_start=1741
|
|
72
|
+
_globals['_ENDEFFECTORPASSTHROUGHCOMMAND']._serialized_end=1786
|
|
71
73
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -12,42 +12,50 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
|
|
12
12
|
DESCRIPTOR: _descriptor.FileDescriptor
|
|
13
13
|
|
|
14
14
|
class ArmState(_message.Message):
|
|
15
|
-
__slots__ = ("joint_pos", "joint_vel", "joint_cur", "joint_err")
|
|
15
|
+
__slots__ = ("joint_pos", "joint_vel", "joint_cur", "joint_err", "timestamp_ns")
|
|
16
16
|
JOINT_POS_FIELD_NUMBER: _ClassVar[int]
|
|
17
17
|
JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
|
|
18
18
|
JOINT_CUR_FIELD_NUMBER: _ClassVar[int]
|
|
19
19
|
JOINT_ERR_FIELD_NUMBER: _ClassVar[int]
|
|
20
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
20
21
|
joint_pos: _containers.RepeatedScalarFieldContainer[float]
|
|
21
22
|
joint_vel: _containers.RepeatedScalarFieldContainer[float]
|
|
22
23
|
joint_cur: _containers.RepeatedScalarFieldContainer[float]
|
|
23
24
|
joint_err: _containers.RepeatedScalarFieldContainer[int]
|
|
24
|
-
|
|
25
|
+
timestamp_ns: int
|
|
26
|
+
def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., joint_cur: _Optional[_Iterable[float]] = ..., joint_err: _Optional[_Iterable[int]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
25
27
|
|
|
26
28
|
class HandState(_message.Message):
|
|
27
|
-
__slots__ = ("joint_pos", "joint_vel", "joint_statu")
|
|
29
|
+
__slots__ = ("joint_pos", "joint_vel", "joint_statu", "timestamp_ns")
|
|
28
30
|
JOINT_POS_FIELD_NUMBER: _ClassVar[int]
|
|
29
31
|
JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
|
|
30
32
|
JOINT_STATU_FIELD_NUMBER: _ClassVar[int]
|
|
33
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
31
34
|
joint_pos: _containers.RepeatedScalarFieldContainer[float]
|
|
32
35
|
joint_vel: _containers.RepeatedScalarFieldContainer[float]
|
|
33
36
|
joint_statu: _containers.RepeatedScalarFieldContainer[int]
|
|
34
|
-
|
|
37
|
+
timestamp_ns: int
|
|
38
|
+
def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., joint_statu: _Optional[_Iterable[int]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
35
39
|
|
|
36
40
|
class HeadState(_message.Message):
|
|
37
|
-
__slots__ = ("joint_pos", "joint_vel")
|
|
41
|
+
__slots__ = ("joint_pos", "joint_vel", "timestamp_ns")
|
|
38
42
|
JOINT_POS_FIELD_NUMBER: _ClassVar[int]
|
|
39
43
|
JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
|
|
44
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
40
45
|
joint_pos: _containers.RepeatedScalarFieldContainer[float]
|
|
41
46
|
joint_vel: _containers.RepeatedScalarFieldContainer[float]
|
|
42
|
-
|
|
47
|
+
timestamp_ns: int
|
|
48
|
+
def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
43
49
|
|
|
44
50
|
class TorsoState(_message.Message):
|
|
45
|
-
__slots__ = ("joint_pos", "joint_vel")
|
|
51
|
+
__slots__ = ("joint_pos", "joint_vel", "timestamp_ns")
|
|
46
52
|
JOINT_POS_FIELD_NUMBER: _ClassVar[int]
|
|
47
53
|
JOINT_VEL_FIELD_NUMBER: _ClassVar[int]
|
|
54
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
48
55
|
joint_pos: _containers.RepeatedScalarFieldContainer[float]
|
|
49
56
|
joint_vel: _containers.RepeatedScalarFieldContainer[float]
|
|
50
|
-
|
|
57
|
+
timestamp_ns: int
|
|
58
|
+
def __init__(self, joint_pos: _Optional[_Iterable[float]] = ..., joint_vel: _Optional[_Iterable[float]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
51
59
|
|
|
52
60
|
class SingleWheelState(_message.Message):
|
|
53
61
|
__slots__ = ("steering_pos", "wheel_pos", "wheel_vel", "wheel_cur")
|
|
@@ -62,59 +70,71 @@ class SingleWheelState(_message.Message):
|
|
|
62
70
|
def __init__(self, steering_pos: _Optional[float] = ..., wheel_pos: _Optional[float] = ..., wheel_vel: _Optional[float] = ..., wheel_cur: _Optional[float] = ...) -> None: ...
|
|
63
71
|
|
|
64
72
|
class ChassisState(_message.Message):
|
|
65
|
-
__slots__ = ("left", "right")
|
|
73
|
+
__slots__ = ("left", "right", "timestamp_ns")
|
|
66
74
|
LEFT_FIELD_NUMBER: _ClassVar[int]
|
|
67
75
|
RIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
76
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
68
77
|
left: SingleWheelState
|
|
69
78
|
right: SingleWheelState
|
|
70
|
-
|
|
79
|
+
timestamp_ns: int
|
|
80
|
+
def __init__(self, left: _Optional[_Union[SingleWheelState, _Mapping]] = ..., right: _Optional[_Union[SingleWheelState, _Mapping]] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
71
81
|
|
|
72
82
|
class BMSState(_message.Message):
|
|
73
|
-
__slots__ = ("voltage", "current", "temperature", "percentage", "is_charging")
|
|
83
|
+
__slots__ = ("voltage", "current", "temperature", "percentage", "is_charging", "error", "timestamp_ns")
|
|
74
84
|
VOLTAGE_FIELD_NUMBER: _ClassVar[int]
|
|
75
85
|
CURRENT_FIELD_NUMBER: _ClassVar[int]
|
|
76
86
|
TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
|
|
77
87
|
PERCENTAGE_FIELD_NUMBER: _ClassVar[int]
|
|
78
88
|
IS_CHARGING_FIELD_NUMBER: _ClassVar[int]
|
|
89
|
+
ERROR_FIELD_NUMBER: _ClassVar[int]
|
|
90
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
79
91
|
voltage: float
|
|
80
92
|
current: float
|
|
81
93
|
temperature: float
|
|
82
94
|
percentage: int
|
|
83
95
|
is_charging: bool
|
|
84
|
-
|
|
96
|
+
error: int
|
|
97
|
+
timestamp_ns: int
|
|
98
|
+
def __init__(self, voltage: _Optional[float] = ..., current: _Optional[float] = ..., temperature: _Optional[float] = ..., percentage: _Optional[int] = ..., is_charging: bool = ..., error: _Optional[int] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
85
99
|
|
|
86
100
|
class WrenchState(_message.Message):
|
|
87
|
-
__slots__ = ("wrench", "blue_button", "green_button")
|
|
101
|
+
__slots__ = ("wrench", "blue_button", "green_button", "timestamp_ns")
|
|
88
102
|
WRENCH_FIELD_NUMBER: _ClassVar[int]
|
|
89
103
|
BLUE_BUTTON_FIELD_NUMBER: _ClassVar[int]
|
|
90
104
|
GREEN_BUTTON_FIELD_NUMBER: _ClassVar[int]
|
|
105
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
91
106
|
wrench: _containers.RepeatedScalarFieldContainer[float]
|
|
92
107
|
blue_button: bool
|
|
93
108
|
green_button: bool
|
|
94
|
-
|
|
109
|
+
timestamp_ns: int
|
|
110
|
+
def __init__(self, wrench: _Optional[_Iterable[float]] = ..., blue_button: bool = ..., green_button: bool = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
95
111
|
|
|
96
112
|
class EStopState(_message.Message):
|
|
97
|
-
__slots__ = ("button_pressed", "software_estop_enabled")
|
|
113
|
+
__slots__ = ("button_pressed", "software_estop_enabled", "timestamp_ns")
|
|
98
114
|
BUTTON_PRESSED_FIELD_NUMBER: _ClassVar[int]
|
|
99
115
|
SOFTWARE_ESTOP_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
|
116
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
100
117
|
button_pressed: bool
|
|
101
118
|
software_estop_enabled: bool
|
|
102
|
-
|
|
119
|
+
timestamp_ns: int
|
|
120
|
+
def __init__(self, button_pressed: bool = ..., software_estop_enabled: bool = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
103
121
|
|
|
104
122
|
class UltrasonicState(_message.Message):
|
|
105
|
-
__slots__ = ("front_left", "front_right", "back_left", "back_right")
|
|
123
|
+
__slots__ = ("front_left", "front_right", "back_left", "back_right", "timestamp_ns")
|
|
106
124
|
FRONT_LEFT_FIELD_NUMBER: _ClassVar[int]
|
|
107
125
|
FRONT_RIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
108
126
|
BACK_LEFT_FIELD_NUMBER: _ClassVar[int]
|
|
109
127
|
BACK_RIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
128
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
110
129
|
front_left: float
|
|
111
130
|
front_right: float
|
|
112
131
|
back_left: float
|
|
113
132
|
back_right: float
|
|
114
|
-
|
|
133
|
+
timestamp_ns: int
|
|
134
|
+
def __init__(self, front_left: _Optional[float] = ..., front_right: _Optional[float] = ..., back_left: _Optional[float] = ..., back_right: _Optional[float] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
115
135
|
|
|
116
136
|
class IMUState(_message.Message):
|
|
117
|
-
__slots__ = ("acc_x", "acc_y", "acc_z", "gyro_x", "gyro_y", "gyro_z", "quat_w", "quat_x", "quat_y", "quat_z")
|
|
137
|
+
__slots__ = ("acc_x", "acc_y", "acc_z", "gyro_x", "gyro_y", "gyro_z", "quat_w", "quat_x", "quat_y", "quat_z", "timestamp_ns")
|
|
118
138
|
ACC_X_FIELD_NUMBER: _ClassVar[int]
|
|
119
139
|
ACC_Y_FIELD_NUMBER: _ClassVar[int]
|
|
120
140
|
ACC_Z_FIELD_NUMBER: _ClassVar[int]
|
|
@@ -125,6 +145,7 @@ class IMUState(_message.Message):
|
|
|
125
145
|
QUAT_X_FIELD_NUMBER: _ClassVar[int]
|
|
126
146
|
QUAT_Y_FIELD_NUMBER: _ClassVar[int]
|
|
127
147
|
QUAT_Z_FIELD_NUMBER: _ClassVar[int]
|
|
148
|
+
TIMESTAMP_NS_FIELD_NUMBER: _ClassVar[int]
|
|
128
149
|
acc_x: float
|
|
129
150
|
acc_y: float
|
|
130
151
|
acc_z: float
|
|
@@ -135,7 +156,8 @@ class IMUState(_message.Message):
|
|
|
135
156
|
quat_x: float
|
|
136
157
|
quat_y: float
|
|
137
158
|
quat_z: float
|
|
138
|
-
|
|
159
|
+
timestamp_ns: int
|
|
160
|
+
def __init__(self, acc_x: _Optional[float] = ..., acc_y: _Optional[float] = ..., acc_z: _Optional[float] = ..., gyro_x: _Optional[float] = ..., gyro_y: _Optional[float] = ..., gyro_z: _Optional[float] = ..., quat_w: _Optional[float] = ..., quat_x: _Optional[float] = ..., quat_y: _Optional[float] = ..., quat_z: _Optional[float] = ..., timestamp_ns: _Optional[int] = ...) -> None: ...
|
|
139
161
|
|
|
140
162
|
class ArmCommand(_message.Message):
|
|
141
163
|
__slots__ = ("command_type", "joint_pos", "joint_vel")
|
|
@@ -190,3 +212,9 @@ class ChassisCommand(_message.Message):
|
|
|
190
212
|
left: SingleWheelCommand
|
|
191
213
|
right: SingleWheelCommand
|
|
192
214
|
def __init__(self, left: _Optional[_Union[SingleWheelCommand, _Mapping]] = ..., right: _Optional[_Union[SingleWheelCommand, _Mapping]] = ...) -> None: ...
|
|
215
|
+
|
|
216
|
+
class EndEffectorPassThroughCommand(_message.Message):
|
|
217
|
+
__slots__ = ("data",)
|
|
218
|
+
DATA_FIELD_NUMBER: _ClassVar[int]
|
|
219
|
+
data: bytes
|
|
220
|
+
def __init__(self, data: _Optional[bytes] = ...) -> None: ...
|