kuavo-humanoid-sdk 1.1.3a1239__py3-none-any.whl → 1.1.3a1252__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.

Potentially problematic release.


This version of kuavo-humanoid-sdk might be problematic. Click here for more details.

@@ -6,6 +6,7 @@ class GlobalConfig:
6
6
  use_websocket = False
7
7
  websocket_host = '127.0.0.1'
8
8
  websocket_port = 9090
9
+ websocket_timeout = 5.0
9
10
 
10
11
  def __new__(cls, *args, **kwargs):
11
12
  if cls._instance is None:
@@ -6,11 +6,15 @@ from typing import Tuple
6
6
  from transitions import Machine, State
7
7
 
8
8
  from kuavo_humanoid_sdk.common.logger import SDKLogger
9
- from kuavo_humanoid_sdk.kuavo.core.ros.audio import Audio
9
+ from kuavo_humanoid_sdk.common.global_config import GlobalConfig
10
+ from kuavo_humanoid_sdk.kuavo.core.ros.audio import Audio, AudioWebsocket
10
11
 
11
12
  class KuavoRobotAudioCore:
12
13
  def __init__(self):
13
- self.robot_audio = Audio()
14
+ if GlobalConfig.use_websocket:
15
+ self.robot_audio = AudioWebsocket()
16
+ else:
17
+ self.robot_audio = Audio()
14
18
 
15
19
  def play_audio(self, music_number: str, volume: float = 0.5, speed: float = 1.0) -> bool:
16
20
  """
@@ -26,7 +26,7 @@ from transitions import Machine, State
26
26
 
27
27
  from kuavo_humanoid_sdk.interfaces.data_types import KuavoArmCtrlMode, KuavoIKParams, KuavoPose
28
28
  from kuavo_humanoid_sdk.kuavo.core.ros.control import KuavoRobotControl, KuavoRobotControlWebsocket
29
- from kuavo_humanoid_sdk.kuavo.core.ros.vision import KuavoRobotVisionCore
29
+ from kuavo_humanoid_sdk.kuavo.core.ros.vision import KuavoRobotVisionCore, KuavoRobotVisionCoreWebsocket
30
30
  from kuavo_humanoid_sdk.kuavo.core.ros.tools import KuavoRobotToolsCore
31
31
  from kuavo_humanoid_sdk.kuavo.core.ros.state import KuavoRobotStateCore, KuavoRobotStateCoreWebsocket
32
32
  from kuavo_humanoid_sdk.kuavo.core.ros.param import make_robot_param
@@ -69,6 +69,7 @@ class KuavoRobotCore:
69
69
  if GlobalConfig.use_websocket:
70
70
  self._control = KuavoRobotControlWebsocket()
71
71
  self._rb_state = KuavoRobotStateCoreWebsocket()
72
+ self._robot_vision = KuavoRobotVisionCoreWebsocket()
72
73
  else:
73
74
  self._control = KuavoRobotControl()
74
75
  self._rb_state = KuavoRobotStateCore()
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env python3
2
2
  # coding: utf-8
3
-
4
3
  from kuavo_humanoid_sdk.common.logger import SDKLogger
5
4
  from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
5
+ from kuavo_humanoid_sdk.common.websocket_kuavo_sdk import WebSocketKuavoSDK
6
+ import roslibpy
6
7
 
7
- try:
8
+ try:
8
9
  import rospy
9
10
  from std_msgs.msg import Bool
10
11
  from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import playmusic, playmusicRequest
11
12
  from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import SpeechSynthesis, SpeechSynthesisRequest
12
- except ImportError:
13
+ except:
13
14
  pass
14
15
 
15
16
  class Audio:
@@ -91,3 +92,85 @@ class Audio:
91
92
  except Exception as e:
92
93
  SDKLogger.error(f"[Robot Audio] Failed to play audio text: {str(e)}")
93
94
  return False
95
+
96
+ class AudioWebsocket:
97
+ """WebSocket-based audio system interface for controlling audio playback functionality of Kuavo humanoid robot.
98
+
99
+ Provides functionality to play music files through WebSocket connection.
100
+ """
101
+
102
+ def __init__(self):
103
+ """Initialize the WebSocket audio system."""
104
+ websocket = WebSocketKuavoSDK()
105
+ self._audio_stop_publisher = roslibpy.Topic(websocket.client, 'stop_music', 'std_msgs/Bool')
106
+ self._audio_stop_publisher.advertise()
107
+
108
+ def play_audio(self, file_name: str, volume: float = 0.5, speed: float = 1.0) -> bool:
109
+ """Play the specified audio file through WebSocket.
110
+
111
+ Args:
112
+ file_name (str): Name of the audio file to play
113
+ volume (float): Volume level (0.0 to 1.0)
114
+ speed (float): Playback speed
115
+
116
+ Returns:
117
+ bool: True if the play request was successfully sent, False otherwise
118
+ """
119
+ try:
120
+ websocket = WebSocketKuavoSDK()
121
+ service = roslibpy.Service(websocket.client, 'play_music', 'kuavo_msgs/playmusic')
122
+
123
+ volume = min(max(volume, 0), 1.0)
124
+ request = {
125
+ "music_number": file_name,
126
+ "volume": volume,
127
+ "speed": speed
128
+ }
129
+
130
+ response = service.call(request)
131
+ SDKLogger.info(f"[Robot Audio] Requested to play audio file: {file_name}")
132
+ return True
133
+ except Exception as e:
134
+ SDKLogger.error(f"[Robot Audio] Failed to play audio file: {str(e)}")
135
+ return False
136
+
137
+ def stop_audio(self) -> bool:
138
+ """Stop the currently playing audio through WebSocket."""
139
+ try:
140
+ msg = {
141
+ "data": True
142
+ }
143
+ self._audio_stop_publisher.publish(roslibpy.Message(msg))
144
+ SDKLogger.info("[Robot Audio] Requested to stop audio playback")
145
+ return True
146
+ except Exception as e:
147
+ SDKLogger.error(f"[Robot Audio] Failed to stop audio playback: {str(e)}")
148
+ return False
149
+
150
+ def text_to_speech(self, text: str, volume: float = 0.5) -> bool:
151
+ """Synthesize and play the specified text through WebSocket.
152
+
153
+ Args:
154
+ text (str): Text to be played
155
+ volume (float): Volume level (0.0 to 1.0)
156
+
157
+ Returns:
158
+ bool: True if the play request was successfully sent, False otherwise
159
+ """
160
+ try:
161
+ websocket = WebSocketKuavoSDK()
162
+ service = roslibpy.Service(websocket.client, 'speech_synthesis', 'kuavo_msgs/SpeechSynthesis')
163
+
164
+ request = {
165
+ "data": text,
166
+ "volume": volume
167
+ }
168
+
169
+ response = service.call(request)
170
+ SDKLogger.info(f"[Robot Audio] Requested to play audio text: {text}")
171
+ return True
172
+ except Exception as e:
173
+ SDKLogger.error(f"[Robot Audio] Failed to play audio text: {str(e)}")
174
+ return False
175
+
176
+
@@ -272,9 +272,9 @@ class ControlEndEffectorWebsocket:
272
272
  ]
273
273
  }
274
274
  response = service.call(request)
275
- if not response.get('result', False):
275
+ if not response.get('success', False):
276
276
  SDKLogger.error(f"Failed to execute gesture '{gestures}': {response.get('message', '')}")
277
- return response.get('result', False)
277
+ return response.get('success', False)
278
278
  except Exception as e:
279
279
  SDKLogger.error(f"Service call failed: {e}")
280
280
  return False
@@ -9,6 +9,8 @@ from typing import Tuple, Optional
9
9
  from kuavo_humanoid_sdk.kuavo.core.ros.param import make_robot_param, EndEffectorType
10
10
  from kuavo_humanoid_sdk.common.logger import SDKLogger
11
11
  from kuavo_humanoid_sdk.interfaces.data_types import (AprilTagData)
12
+ import roslibpy
13
+ from kuavo_humanoid_sdk.common.websocket_kuavo_sdk import WebSocketKuavoSDK
12
14
 
13
15
  try:
14
16
  import rospy
@@ -263,6 +265,250 @@ class KuavoRobotVisionCore:
263
265
  "poses": [data.pose[i] for i in indices]
264
266
  }
265
267
 
268
+ class KuavoRobotVisionCoreWebsocket:
269
+ _instance = None
270
+
271
+ def __new__(cls, *args, **kwargs):
272
+ if not cls._instance:
273
+ cls._instance = super().__new__(cls)
274
+ return cls._instance
275
+
276
+ def __init__(self):
277
+ if not hasattr(self, '_initialized'):
278
+ try:
279
+ self.websocket = WebSocketKuavoSDK()
280
+ if not self.websocket.client.is_connected:
281
+ SDKLogger.error("Failed to connect to WebSocket server")
282
+ raise ConnectionError("Failed to connect to WebSocket server")
283
+
284
+ # Initialize subscribers for vision-related topics
285
+ self._sub_apriltag_camera = roslibpy.Topic(self.websocket.client, '/tag_detections', 'apriltag_ros/AprilTagDetectionArray')
286
+ self._sub_apriltag_base = roslibpy.Topic(self.websocket.client, '/robot_tag_info', 'apriltag_ros/AprilTagDetectionArray')
287
+
288
+ # Initialize TF-related topics
289
+ self._sub_tf = roslibpy.Topic(self.websocket.client, '/tf', 'tf2_msgs/TFMessage')
290
+ self._sub_tf_static = roslibpy.Topic(self.websocket.client, '/tf_static', 'tf2_msgs/TFMessage')
291
+
292
+ # Subscribe to topics
293
+ self._sub_apriltag_camera.subscribe(self._apriltag_camera_callback)
294
+ self._sub_apriltag_base.subscribe(self._apriltag_base_callback)
295
+ self._sub_tf.subscribe(self._tf_callback)
296
+ self._sub_tf_static.subscribe(self._tf_static_callback)
297
+
298
+ # Initialize data structures
299
+ self._apriltag_data_from_camera = AprilTagData(
300
+ id = [],
301
+ size = [],
302
+ pose = []
303
+ )
304
+ self._apriltag_data_from_base = AprilTagData(
305
+ id = [],
306
+ size = [],
307
+ pose = []
308
+ )
309
+ self._apriltag_data_from_odom = AprilTagData(
310
+ id = [],
311
+ size = [],
312
+ pose = []
313
+ )
314
+
315
+ # TF buffer for storing transforms
316
+ self._tf_buffer = {}
317
+ self._tf_static_buffer = {}
318
+
319
+ self._initialized = True
320
+ except Exception as e:
321
+ SDKLogger.error(f"Failed to initialize KuavoRobotVisionCoreWebsocket: {e}")
322
+ raise
323
+
324
+ def _tf_callback(self, msg):
325
+ """Callback for TF messages."""
326
+ for transform in msg['transforms']:
327
+ key = (transform['header']['frame_id'], transform['child_frame_id'])
328
+ self._tf_buffer[key] = transform
329
+
330
+ def _tf_static_callback(self, msg):
331
+ """Callback for static TF messages."""
332
+ for transform in msg['transforms']:
333
+ key = (transform['header']['frame_id'], transform['child_frame_id'])
334
+ self._tf_static_buffer[key] = transform
335
+
336
+ def _get_transform(self, target_frame, source_frame):
337
+ """Get transform between two frames.
338
+
339
+ Args:
340
+ target_frame (str): Target frame ID
341
+ source_frame (str): Source frame ID
342
+
343
+ Returns:
344
+ dict: Transform data if found, None otherwise
345
+ """
346
+ # Check both dynamic and static transforms
347
+ key = (source_frame, target_frame)
348
+ if key in self._tf_buffer:
349
+ return self._tf_buffer[key]
350
+ if key in self._tf_static_buffer:
351
+ return self._tf_static_buffer[key]
352
+ return None
353
+
354
+ def _transform_pose(self, pose, transform):
355
+ """Transform a pose using the given transform.
356
+
357
+ Args:
358
+ pose (dict): Pose to transform
359
+ transform (dict): Transform to apply
360
+
361
+ Returns:
362
+ dict: Transformed pose
363
+ """
364
+ # Extract transform components
365
+ t = transform['transform']
366
+ translation = t['translation']
367
+ rotation = t['rotation']
368
+
369
+ # Extract pose components
370
+ p = pose['position']
371
+ o = pose['orientation']
372
+
373
+ # TODO: Implement actual pose transformation
374
+ # This is a placeholder - actual implementation would involve
375
+ # proper quaternion and vector math
376
+ transformed_pose = {
377
+ 'position': {
378
+ 'x': p['x'] + translation['x'],
379
+ 'y': p['y'] + translation['y'],
380
+ 'z': p['z'] + translation['z']
381
+ },
382
+ 'orientation': {
383
+ 'x': o['x'],
384
+ 'y': o['y'],
385
+ 'z': o['z'],
386
+ 'w': o['w']
387
+ }
388
+ }
389
+
390
+ return transformed_pose
391
+
392
+ def _apriltag_camera_callback(self, msg):
393
+ """Callback for AprilTag detections in camera frame."""
394
+ # Clear previous data
395
+ self._apriltag_data_from_camera.id = []
396
+ self._apriltag_data_from_camera.size = []
397
+ self._apriltag_data_from_camera.pose = []
398
+
399
+ # Process each detection
400
+ for detection in msg['detections']:
401
+ # Add ID
402
+ for tag_id in detection['id']:
403
+ self._apriltag_data_from_camera.id.append(tag_id)
404
+
405
+ # Add size
406
+ if detection.get('size') and len(detection['size']) > 0:
407
+ self._apriltag_data_from_camera.size.append(detection['size'][0])
408
+ else:
409
+ self._apriltag_data_from_camera.size.append(0.0)
410
+
411
+ # Add pose
412
+ self._apriltag_data_from_camera.pose.append(detection['pose']['pose']['pose'])
413
+
414
+ def _apriltag_base_callback(self, msg):
415
+ """Callback for AprilTag detections in base frame."""
416
+ # Clear previous data
417
+ self._apriltag_data_from_base.id = []
418
+ self._apriltag_data_from_base.size = []
419
+ self._apriltag_data_from_base.pose = []
420
+
421
+ # Process each detection
422
+ for detection in msg['detections']:
423
+ # Add ID
424
+ for tag_id in detection['id']:
425
+ self._apriltag_data_from_base.id.append(tag_id)
426
+
427
+ # Add size
428
+ if detection.get('size') and len(detection['size']) > 0:
429
+ self._apriltag_data_from_base.size.append(detection['size'][0])
430
+ else:
431
+ self._apriltag_data_from_base.size.append(0.0)
432
+
433
+ # Add pose
434
+ self._apriltag_data_from_base.pose.append(detection['pose']['pose']['pose'])
435
+
436
+ # Transform base data to odom frame
437
+ self._transform_base_to_odom()
438
+
439
+ def _transform_base_to_odom(self):
440
+ """Transform AprilTag poses from base_link to odom coordinate frame."""
441
+ # Clear previous odom data
442
+ self._apriltag_data_from_odom.id = []
443
+ self._apriltag_data_from_odom.size = []
444
+ self._apriltag_data_from_odom.pose = []
445
+
446
+ # If no base data, skip transformation
447
+ if not self._apriltag_data_from_base.id:
448
+ SDKLogger.warn("No base tag data, skip transform")
449
+ return
450
+
451
+ # Get transform from base_link to odom
452
+ transform = self._get_transform("odom", "base_link")
453
+ if not transform:
454
+ SDKLogger.warn("Transform from base_link to odom not available")
455
+ return
456
+
457
+ # Copy ID and size information
458
+ self._apriltag_data_from_odom.id = self._apriltag_data_from_base.id.copy()
459
+ self._apriltag_data_from_odom.size = self._apriltag_data_from_base.size.copy()
460
+
461
+ # Transform each pose
462
+ for pose in self._apriltag_data_from_base.pose:
463
+ transformed_pose = self._transform_pose(pose, transform)
464
+ self._apriltag_data_from_odom.pose.append(transformed_pose)
465
+
466
+ @property
467
+ def apriltag_data_from_camera(self):
468
+ return self._apriltag_data_from_camera
469
+
470
+ @property
471
+ def apriltag_data_from_base(self):
472
+ return self._apriltag_data_from_base
473
+
474
+ @property
475
+ def apriltag_data_from_odom(self):
476
+ return self._apriltag_data_from_odom
477
+
478
+ def get_data_by_id(self, tag_id: int, frame: str = "odom"):
479
+ """Get AprilTag data for a specific tag ID from the specified frame.
480
+
481
+ Args:
482
+ tag_id (int): The ID of the AprilTag to get data for
483
+ frame (str): The frame to get data from ("camera", "base", or "odom")
484
+
485
+ Returns:
486
+ dict: The AprilTag data for the specified ID and frame, or None if not found
487
+ """
488
+ if frame == "camera":
489
+ data = self._apriltag_data_from_camera
490
+ elif frame == "base":
491
+ data = self._apriltag_data_from_base
492
+ elif frame == "odom":
493
+ data = self._apriltag_data_from_odom
494
+ else:
495
+ SDKLogger.error(f"Invalid frame: {frame}")
496
+ return None
497
+
498
+ if not data or not data.id:
499
+ return None
500
+
501
+ # Find all matching indices
502
+ indices = [i for i, id in enumerate(data.id) if id == tag_id]
503
+
504
+ if not indices:
505
+ return None
506
+
507
+ return {
508
+ "sizes": [data.size[i] for i in indices],
509
+ "poses": [data.pose[i] for i in indices]
510
+ }
511
+
266
512
  # if __name__ == "__main__":
267
513
 
268
514
  # kuavo_robot_vision_core = KuavoRobotVisionCore()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuavo-humanoid-sdk
3
- Version: 1.1.3a1239
3
+ Version: 1.1.3a1252
4
4
  Summary: A Python SDK for kuavo humanoid robot.
5
5
  Home-page: https://gitee.com/leju-robot/kuavo-ros-opensource/
6
6
  Author: ['lejurobot']
@@ -1,5 +1,5 @@
1
1
  kuavo_humanoid_sdk/__init__.py,sha256=pdgXhpulXKUcdUPwDVFZCe47AZAkOJdh_YAM8f3g2Ek,141
2
- kuavo_humanoid_sdk/common/global_config.py,sha256=Tae7-RfXsQk5G3VC-OQoMwB_eB-oud90cmAE7BywmI0,287
2
+ kuavo_humanoid_sdk/common/global_config.py,sha256=2iDGXEwjmfc9MQ4jYOYxFyTB_BnLIxf6HYent5dS4gA,315
3
3
  kuavo_humanoid_sdk/common/logger.py,sha256=nSIbsJaW4nDcaQdhZebZkjtji6kmWVR8tYO-sUTz3Gg,1246
4
4
  kuavo_humanoid_sdk/common/websocket_kuavo_sdk.py,sha256=lfilfXYdZFTasjRudHb_Xc89ah44jWljpQTozVSABGU,675
5
5
  kuavo_humanoid_sdk/interfaces/__init__.py,sha256=_zXDinj2T3X7UH19-Xrotc7uYZWHmZqHaMCWU1FYR5I,100
@@ -18,18 +18,18 @@ kuavo_humanoid_sdk/kuavo/robot_info.py,sha256=etyqcUg22IAA2O59cjBhLTpacQ3DLhT8qZ
18
18
  kuavo_humanoid_sdk/kuavo/robot_state.py,sha256=VT2kcOAoc9MtJGVJ6pOwTkFDeFX9mHtRcdpkMxVEetA,11084
19
19
  kuavo_humanoid_sdk/kuavo/robot_tool.py,sha256=moCaX46JWO6k9QXIhXPXjL_ywccz4iovkrjS2yH9Dgg,2747
20
20
  kuavo_humanoid_sdk/kuavo/robot_vision.py,sha256=AxlD3Ckl2GafsNpPNWYUM89653AN1BvWtMi9stdDALE,3156
21
- kuavo_humanoid_sdk/kuavo/core/audio.py,sha256=omoUCjZKFSG1yvAuM7fAJ65T9ppQk-kwjM-xllBSJ-I,838
22
- kuavo_humanoid_sdk/kuavo/core/core.py,sha256=u7PU4LTYOlwJwIdAc31Y9thABa-Im69cXz23BqHC8fo,18576
21
+ kuavo_humanoid_sdk/kuavo/core/audio.py,sha256=lyoYTKkt3ZEnehh1cJenksrkYUrlHBC559r1JmzysR4,1024
22
+ kuavo_humanoid_sdk/kuavo/core/core.py,sha256=VZfyot7BOeUpwJfjHa7_hcKNegdqYqLCEGLBNeb54fc,18676
23
23
  kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py,sha256=51iLPIKMFKeOhc5TpRCMWTm7Aw8pt6XG9XUB-_swr4Y,5158
24
24
  kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py,sha256=RCrnWTMW-L0fOMa1op7t43aGWSyMVqrOjR0lVtIFzqY,3432
25
25
  kuavo_humanoid_sdk/kuavo/core/ros_env.py,sha256=lVhEVUZvdQI43mPkFqRYBld3N-L4nPigRkcSZ-ejL9I,18848
26
- kuavo_humanoid_sdk/kuavo/core/ros/audio.py,sha256=KbsZMs8XTlGnPixUWAPgSrhrcVZx5MFQuYjVeROdeUQ,3678
27
- kuavo_humanoid_sdk/kuavo/core/ros/control.py,sha256=KCH5NrcTqjles98GTCtJOMfj5gx5ldeG5dKIdyl86cM,62286
26
+ kuavo_humanoid_sdk/kuavo/core/ros/audio.py,sha256=aJQ9i7df8mK55XCtNM4MDLcwz8CnEk-K3P93QrtWwXQ,6850
27
+ kuavo_humanoid_sdk/kuavo/core/ros/control.py,sha256=YnANyRmeXXdcV6lyeAmbpu6VQyiUp8RHgp_qbUni3F4,62288
28
28
  kuavo_humanoid_sdk/kuavo/core/ros/param.py,sha256=r8Xve8zsfFBBZQnEbLOCNC1YQhv_h-Xv1hHx6gHkQag,11745
29
29
  kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py,sha256=AhBNM-s9nVwRiLZ8gtqC2RvPImkT9uulONSLXk3KooI,3317
30
30
  kuavo_humanoid_sdk/kuavo/core/ros/state.py,sha256=OkoGUWj0llDSYWFE-unKKHeiPKik1vSSU6mtVP4Mwwg,34658
31
31
  kuavo_humanoid_sdk/kuavo/core/ros/tools.py,sha256=RF9PVvHEfYBuNYyKRbgtLrFrR15kfPTjtcXmZG17Gk4,6142
32
- kuavo_humanoid_sdk/kuavo/core/ros/vision.py,sha256=v7G12z7Ncj94kEa5ff85D1cDNlbfGVSZGmCEbSGu8qk,10810
32
+ kuavo_humanoid_sdk/kuavo/core/ros/vision.py,sha256=0sVTsfvaaLyHJIos7aUpHi_DkxCD0LDw90ZedK8YFGg,20173
33
33
  kuavo_humanoid_sdk/msg/__init__.py,sha256=8TElMWrXsBCGxhJBe3mfgtiAlX4LzgQep66TSwMcaDQ,19
34
34
  kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py,sha256=wk-pfWFvAOl475vxWFVTwbJGejP6UKgivUApv8RvK_8,216
35
35
  kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py,sha256=2Iz0kN1w5IqvXFmK-DN14i-9hrtZNSRSWvxr6tSPIlA,11655
@@ -106,7 +106,7 @@ kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py,sha256=c8l2__Lu
106
106
  kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py,sha256=UY0klrLwiuQeEOxBXGrLdivCOhI3HsHUbi5uX7nsT8g,4895
107
107
  kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py,sha256=LaBHLkXuxdf1Z6BCqgWQC2F9yUNSDYC_iQp6NMYAnjQ,22
108
108
  kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py,sha256=KtnylmS0VOjVfa3lldprbhZl04wU3ng5v94jghu3dYU,13379
109
- kuavo_humanoid_sdk-1.1.3a1239.dist-info/METADATA,sha256=U4mW2wfjkpSrWT7XJ23Y5uT8FKT4YbxSEwFTNcuxCC8,10831
110
- kuavo_humanoid_sdk-1.1.3a1239.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
111
- kuavo_humanoid_sdk-1.1.3a1239.dist-info/top_level.txt,sha256=9uSyZoiOEykRMOf0Gm-N9mkyQQg9yOSimfsb632G99c,19
112
- kuavo_humanoid_sdk-1.1.3a1239.dist-info/RECORD,,
109
+ kuavo_humanoid_sdk-1.1.3a1252.dist-info/METADATA,sha256=njSY4oZBP93mFsnwGqGn7LTY-4h2RRbQ0pllUQhvS6c,10831
110
+ kuavo_humanoid_sdk-1.1.3a1252.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
111
+ kuavo_humanoid_sdk-1.1.3a1252.dist-info/top_level.txt,sha256=9uSyZoiOEykRMOf0Gm-N9mkyQQg9yOSimfsb632G99c,19
112
+ kuavo_humanoid_sdk-1.1.3a1252.dist-info/RECORD,,