kuavo-humanoid-sdk 1.1.2a924__py3-none-any.whl → 1.1.3a1226__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.

Files changed (45) hide show
  1. kuavo_humanoid_sdk/common/global_config.py +15 -0
  2. kuavo_humanoid_sdk/common/websocket_kuavo_sdk.py +23 -0
  3. kuavo_humanoid_sdk/interfaces/data_types.py +46 -0
  4. kuavo_humanoid_sdk/kuavo/__init__.py +3 -0
  5. kuavo_humanoid_sdk/kuavo/core/audio.py +33 -0
  6. kuavo_humanoid_sdk/kuavo/core/core.py +16 -6
  7. kuavo_humanoid_sdk/kuavo/core/ros/audio.py +87 -0
  8. kuavo_humanoid_sdk/kuavo/core/ros/control.py +645 -19
  9. kuavo_humanoid_sdk/kuavo/core/ros/param.py +142 -4
  10. kuavo_humanoid_sdk/kuavo/core/ros/state.py +329 -15
  11. kuavo_humanoid_sdk/kuavo/core/ros/tools.py +149 -0
  12. kuavo_humanoid_sdk/kuavo/core/ros/vision.py +272 -0
  13. kuavo_humanoid_sdk/kuavo/core/ros_env.py +229 -1
  14. kuavo_humanoid_sdk/kuavo/dexterous_hand.py +6 -2
  15. kuavo_humanoid_sdk/kuavo/leju_claw.py +6 -2
  16. kuavo_humanoid_sdk/kuavo/robot.py +43 -22
  17. kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
  18. kuavo_humanoid_sdk/kuavo/robot_info.py +7 -2
  19. kuavo_humanoid_sdk/kuavo/robot_state.py +6 -2
  20. kuavo_humanoid_sdk/kuavo/robot_tool.py +62 -0
  21. kuavo_humanoid_sdk/kuavo/robot_vision.py +87 -0
  22. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +306 -0
  23. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +437 -0
  24. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +9 -0
  25. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_armHandPose.py +2 -2
  26. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_handPose.py +2 -2
  27. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_ikSolveError.py +13 -13
  28. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_ikSolveParam.py +2 -2
  29. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_robotArmQVVD.py +2 -2
  30. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_twoArmHandPose.py +13 -13
  31. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/msg/_twoArmHandPoseCmd.py +15 -15
  32. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
  33. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +5 -0
  34. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/srv/_changeArmCtrlModeKuavo.py +5 -5
  35. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/srv/_fkSrv.py +13 -13
  36. kuavo_humanoid_sdk/msg/{motion_capture_ik/srv/_changeArmCtrlMode.py → kuavo_msgs/srv/_playmusic.py} +97 -98
  37. kuavo_humanoid_sdk/msg/{motion_capture_ik → kuavo_msgs}/srv/_twoArmHandPoseCmdSrv.py +23 -23
  38. {kuavo_humanoid_sdk-1.1.2a924.dist-info → kuavo_humanoid_sdk-1.1.3a1226.dist-info}/METADATA +2 -1
  39. {kuavo_humanoid_sdk-1.1.2a924.dist-info → kuavo_humanoid_sdk-1.1.3a1226.dist-info}/RECORD +41 -33
  40. kuavo_humanoid_sdk/msg/motion_capture_ik/msg/__init__.py +0 -9
  41. kuavo_humanoid_sdk/msg/motion_capture_ik/msg/_headBodyPose.py +0 -145
  42. kuavo_humanoid_sdk/msg/motion_capture_ik/msg/_robotHandPosition.py +0 -225
  43. kuavo_humanoid_sdk/msg/motion_capture_ik/srv/__init__.py +0 -4
  44. {kuavo_humanoid_sdk-1.1.2a924.dist-info → kuavo_humanoid_sdk-1.1.3a1226.dist-info}/WHEEL +0 -0
  45. {kuavo_humanoid_sdk-1.1.2a924.dist-info → kuavo_humanoid_sdk-1.1.3a1226.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,15 @@
1
+
2
+ class GlobalConfig:
3
+
4
+ _instance = None
5
+
6
+ use_websocket = False
7
+ websocket_host = '127.0.0.1'
8
+ websocket_port = 9090
9
+
10
+ def __new__(cls, *args, **kwargs):
11
+ if cls._instance is None:
12
+ cls._instance = super().__new__(cls)
13
+ return cls._instance
14
+
15
+
@@ -0,0 +1,23 @@
1
+ import roslibpy
2
+ from kuavo_humanoid_sdk.common.global_config import GlobalConfig
3
+
4
+ class WebSocketKuavoSDK:
5
+
6
+ _instance = None
7
+ _initialized = False
8
+
9
+ def __new__(cls, *args, **kwargs):
10
+ if cls._instance is None:
11
+ cls._instance = super().__new__(cls)
12
+ return cls._instance
13
+
14
+ def __init__(self):
15
+ if not self._initialized:
16
+ self._initialized = True
17
+ self.client = roslibpy.Ros(host=GlobalConfig.websocket_host, port=GlobalConfig.websocket_port)
18
+ self.client.run(timeout=GlobalConfig.websocket_timeout)
19
+
20
+
21
+ def __del__(self):
22
+ self.client.terminate()
23
+ self.instance = None
@@ -1,6 +1,7 @@
1
1
  from typing import Tuple
2
2
  from enum import Enum
3
3
  from dataclasses import dataclass
4
+ import numpy as np
4
5
 
5
6
  @dataclass
6
7
  class KuavoJointData:
@@ -143,3 +144,48 @@ class KuavoDexHandTouchState:
143
144
  status: int # 传感器状态
144
145
  # 5 fingers
145
146
  data: Tuple[KuavoTouchState, KuavoTouchState, KuavoTouchState, KuavoTouchState, KuavoTouchState]
147
+
148
+ @dataclass
149
+ class AprilTagData:
150
+ """Represents detected AprilTag information with pose estimation.
151
+
152
+ Attributes:
153
+ id (list): List of detected AprilTag IDs (integers)
154
+ size (list): List of tag physical sizes in meters (floats)
155
+ pose (list): List of PoseQuaternion objects representing tag poses
156
+ """
157
+ id: list
158
+ size: list
159
+ pose: list
160
+
161
+ @dataclass
162
+ class HomogeneousMatrix:
163
+ """4x4 homogeneous transformation matrix for 3D transformations.
164
+
165
+ Represents both rotation and translation in 3D space. Can be used for
166
+ coordinate frame transformations and pose composition.
167
+
168
+ Attributes:
169
+ matrix (np.ndarray): 4x4 numpy array of shape (4, 4) containing::
170
+
171
+ [[R, t],
172
+ [0, 1]]
173
+
174
+ where R is 3x3 rotation matrix and t is 3x1 translation
175
+ """
176
+ matrix: np.ndarray # Shape (4,4) homogeneous transformation matrix
177
+
178
+ @dataclass
179
+ class PoseQuaternion:
180
+ """3D pose representation using position and quaternion orientation.
181
+
182
+ Provides a singularity-free orientation representation. Commonly used
183
+ in robotics for smooth interpolation between orientations.
184
+
185
+ Attributes:
186
+ position (Tuple[float, float, float]): XYZ coordinates in meters
187
+ orientation (Tuple[float, float, float, float]): Unit quaternion in
188
+ (x, y, z, w) format following ROS convention
189
+ """
190
+ position: Tuple[float, float, float]
191
+ orientation: Tuple[float, float, float, float]
@@ -1,7 +1,10 @@
1
1
  from .robot import KuavoSDK, KuavoRobot
2
2
  from .robot_info import KuavoRobotInfo
3
3
  from .robot_state import KuavoRobotState
4
+ from .robot_vision import KuavoRobotVision
5
+ from .robot_tool import KuavoRobotTools
4
6
  from .robot_arm import KuavoRobotArm
5
7
  from .robot_head import KuavoRobotHead
8
+ from .robot_audio import KuavoRobotAudio
6
9
  from .dexterous_hand import DexterousHand, TouchDexterousHand
7
10
  from .leju_claw import LejuClaw
@@ -0,0 +1,33 @@
1
+ import time
2
+ import math
3
+ import rospy
4
+ import threading
5
+ import numpy as np
6
+ from typing import Tuple
7
+ from transitions import Machine, State
8
+
9
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
10
+ from kuavo_humanoid_sdk.kuavo.core.ros.audio import Audio
11
+
12
+ class KuavoRobotAudioCore:
13
+ def __init__(self):
14
+ self.robot_audio = Audio()
15
+
16
+ def play_audio(self, music_number: str, volume: float = 0.5, speed: float = 1.0) -> bool:
17
+ """
18
+ play music
19
+ """
20
+ return self.robot_audio.play_audio(music_number, volume, speed)
21
+
22
+ def stop_music(self) -> bool:
23
+ """
24
+ stop music
25
+ """
26
+ return self.robot_audio.stop_audio()
27
+
28
+ def text_to_speech(self, text: str, volume: float = 0.5) -> bool:
29
+ """
30
+ text to speech
31
+ """
32
+ return self.robot_audio.text_to_speech(text, volume)
33
+
@@ -19,18 +19,19 @@ Each state has an entry callback that handles initialization when entering that
19
19
 
20
20
  import time
21
21
  import math
22
- import rospy
23
22
  import threading
24
23
  import numpy as np
25
24
  from typing import Tuple
26
25
  from transitions import Machine, State
27
26
 
28
27
  from kuavo_humanoid_sdk.interfaces.data_types import KuavoArmCtrlMode, KuavoIKParams, KuavoPose
29
- from kuavo_humanoid_sdk.kuavo.core.ros.control import KuavoRobotControl
30
- from kuavo_humanoid_sdk.kuavo.core.ros.state import KuavoRobotStateCore
28
+ from kuavo_humanoid_sdk.kuavo.core.ros.control import KuavoRobotControl, KuavoRobotControlWebsocket
29
+ from kuavo_humanoid_sdk.kuavo.core.ros.vision import KuavoRobotVisionCore
30
+ from kuavo_humanoid_sdk.kuavo.core.ros.tools import KuavoRobotToolsCore
31
+ from kuavo_humanoid_sdk.kuavo.core.ros.state import KuavoRobotStateCore, KuavoRobotStateCoreWebsocket
31
32
  from kuavo_humanoid_sdk.kuavo.core.ros.param import make_robot_param
32
33
  from kuavo_humanoid_sdk.common.logger import SDKLogger
33
-
34
+ from kuavo_humanoid_sdk.common.global_config import GlobalConfig
34
35
  # Define robot states
35
36
  ROBOT_STATES = [
36
37
  State(name='stance', on_enter=['_on_enter_stance']),
@@ -65,9 +66,18 @@ class KuavoRobotCore:
65
66
  send_event=True
66
67
  )
67
68
  # robot control
68
- self._control = KuavoRobotControl()
69
- self._rb_state = KuavoRobotStateCore()
69
+ if GlobalConfig.use_websocket:
70
+ self._control = KuavoRobotControlWebsocket()
71
+ self._rb_state = KuavoRobotStateCoreWebsocket()
72
+ else:
73
+ self._control = KuavoRobotControl()
74
+ self._rb_state = KuavoRobotStateCore()
75
+
70
76
  self._arm_ctrl_mode = KuavoArmCtrlMode.AutoSwing
77
+ # robot vision
78
+ self._robot_vision = KuavoRobotVisionCore()
79
+ # robot ros tf
80
+ self._robot_tf_tool = KuavoRobotToolsCore()
71
81
  # register gait changed callback
72
82
  self._rb_state.register_gait_changed_callback(self._humanoid_gait_changed)
73
83
  # initialized
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ import rospy
4
+ from std_msgs.msg import Bool
5
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
6
+ from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
7
+ from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import playmusic, playmusicRequest
8
+ from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import SpeechSynthesis, SpeechSynthesisRequest
9
+ class Audio:
10
+ """Audio system interface for controlling audio playback functionality of Kuavo humanoid robot.
11
+
12
+ Provides functionality to play music files.
13
+ """
14
+
15
+ def __init__(self):
16
+ """Initialize the audio system."""
17
+ self._audio_stop_publisher = rospy.Publisher('stop_music', Bool, queue_size=10)
18
+ rospy.sleep(0.5) # Wait for publisher initialization
19
+ def play_audio(self, file_name: str,volume: float = 0.5,speed: float = 1.0) -> bool:
20
+ """Play the specified audio file.
21
+
22
+ Args:
23
+ file_name (str): Name of the audio file to play
24
+
25
+ Returns:
26
+ bool: True if the play request was successfully sent, False otherwise
27
+ """
28
+ try:
29
+ # Wait for service availability
30
+ rospy.wait_for_service('play_music', timeout=2.0)
31
+ # Create service client
32
+ play_music_service = rospy.ServiceProxy('play_music', playmusic)
33
+ # Call service
34
+ request = playmusicRequest()
35
+ request.music_number = file_name
36
+ volume = min(max(volume , 0), 1.0)
37
+ request.volume = volume
38
+ request.speed = speed
39
+ response = play_music_service(request)
40
+ SDKLogger.info(f"[Robot Audio] Requested to play audio file: {file_name}")
41
+ return True
42
+ except rospy.ROSException as e:
43
+ SDKLogger.error(f"[Robot Audio] Audio playback service unavailable: {str(e)}")
44
+ return False
45
+ except Exception as e:
46
+ SDKLogger.error(f"[Robot Audio] Failed to play audio file: {str(e)}")
47
+ return False
48
+
49
+ def stop_audio(self):
50
+ """Stop the currently playing audio."""
51
+ try:
52
+ msg = Bool()
53
+ msg.data = True
54
+ self._audio_stop_publisher.publish(msg)
55
+ SDKLogger.info("[Robot Audio] Requested to stop audio playback")
56
+ return True
57
+ except Exception as e:
58
+ SDKLogger.error(f"[Robot Audio] Failed to stop audio playback: {str(e)}")
59
+ return False
60
+
61
+ def text_to_speech(self, text: str,volume: float = 0.5) -> bool:
62
+ """Synthesize and play the specified text.
63
+
64
+ Args:
65
+ text (str): Text to be played
66
+
67
+ Returns:
68
+ bool: True if the play request was successfully sent, False otherwise
69
+ """
70
+ try:
71
+ # Wait for service availability
72
+ rospy.wait_for_service('play_music', timeout=2.0)
73
+ # Create service client
74
+ play_music_service = rospy.ServiceProxy('speech_synthesis', SpeechSynthesis)
75
+ # Call service
76
+ request = SpeechSynthesisRequest()
77
+ request.data = text
78
+ request.volume = volume
79
+ response = play_music_service(request)
80
+ SDKLogger.info(f"[Robot Audio] Requested to play audio text: {text}")
81
+ return True
82
+ except rospy.ROSException as e:
83
+ SDKLogger.error(f"[Robot Audio] Audio playback service unavailable: {str(e)}")
84
+ return False
85
+ except Exception as e:
86
+ SDKLogger.error(f"[Robot Audio] Failed to play audio text: {str(e)}")
87
+ return False