kuavo-humanoid-sdk 1.1.3a1240__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.
- kuavo_humanoid_sdk/common/global_config.py +1 -0
- kuavo_humanoid_sdk/kuavo/core/audio.py +6 -2
- kuavo_humanoid_sdk/kuavo/core/core.py +2 -1
- kuavo_humanoid_sdk/kuavo/core/ros/audio.py +86 -3
- kuavo_humanoid_sdk/kuavo/core/ros/vision.py +246 -0
- {kuavo_humanoid_sdk-1.1.3a1240.dist-info → kuavo_humanoid_sdk-1.1.3a1252.dist-info}/METADATA +1 -1
- {kuavo_humanoid_sdk-1.1.3a1240.dist-info → kuavo_humanoid_sdk-1.1.3a1252.dist-info}/RECORD +9 -9
- {kuavo_humanoid_sdk-1.1.3a1240.dist-info → kuavo_humanoid_sdk-1.1.3a1252.dist-info}/WHEEL +0 -0
- {kuavo_humanoid_sdk-1.1.3a1240.dist-info → kuavo_humanoid_sdk-1.1.3a1252.dist-info}/top_level.txt +0 -0
|
@@ -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.
|
|
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
|
-
|
|
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
|
|
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
|
+
|
|
@@ -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,5 +1,5 @@
|
|
|
1
1
|
kuavo_humanoid_sdk/__init__.py,sha256=pdgXhpulXKUcdUPwDVFZCe47AZAkOJdh_YAM8f3g2Ek,141
|
|
2
|
-
kuavo_humanoid_sdk/common/global_config.py,sha256=
|
|
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=
|
|
22
|
-
kuavo_humanoid_sdk/kuavo/core/core.py,sha256=
|
|
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=
|
|
26
|
+
kuavo_humanoid_sdk/kuavo/core/ros/audio.py,sha256=aJQ9i7df8mK55XCtNM4MDLcwz8CnEk-K3P93QrtWwXQ,6850
|
|
27
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=
|
|
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.
|
|
110
|
-
kuavo_humanoid_sdk-1.1.
|
|
111
|
-
kuavo_humanoid_sdk-1.1.
|
|
112
|
-
kuavo_humanoid_sdk-1.1.
|
|
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,,
|
|
File without changes
|
{kuavo_humanoid_sdk-1.1.3a1240.dist-info → kuavo_humanoid_sdk-1.1.3a1252.dist-info}/top_level.txt
RENAMED
|
File without changes
|