kuavo-humanoid-sdk 1.2.2__20250922181216-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 (137) hide show
  1. kuavo_humanoid_sdk/__init__.py +6 -0
  2. kuavo_humanoid_sdk/common/logger.py +45 -0
  3. kuavo_humanoid_sdk/interfaces/__init__.py +4 -0
  4. kuavo_humanoid_sdk/interfaces/data_types.py +276 -0
  5. kuavo_humanoid_sdk/interfaces/end_effector.py +62 -0
  6. kuavo_humanoid_sdk/interfaces/robot.py +22 -0
  7. kuavo_humanoid_sdk/interfaces/robot_info.py +56 -0
  8. kuavo_humanoid_sdk/kuavo/__init__.py +11 -0
  9. kuavo_humanoid_sdk/kuavo/core/audio.py +32 -0
  10. kuavo_humanoid_sdk/kuavo/core/core.py +612 -0
  11. kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +114 -0
  12. kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +67 -0
  13. kuavo_humanoid_sdk/kuavo/core/ros/audio.py +92 -0
  14. kuavo_humanoid_sdk/kuavo/core/ros/control.py +1309 -0
  15. kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
  16. kuavo_humanoid_sdk/kuavo/core/ros/param.py +183 -0
  17. kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
  18. kuavo_humanoid_sdk/kuavo/core/ros/state.py +605 -0
  19. kuavo_humanoid_sdk/kuavo/core/ros/tools.py +219 -0
  20. kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
  21. kuavo_humanoid_sdk/kuavo/core/ros_env.py +237 -0
  22. kuavo_humanoid_sdk/kuavo/dexterous_hand.py +201 -0
  23. kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
  24. kuavo_humanoid_sdk/kuavo/robot.py +465 -0
  25. kuavo_humanoid_sdk/kuavo/robot_arm.py +210 -0
  26. kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
  27. kuavo_humanoid_sdk/kuavo/robot_head.py +50 -0
  28. kuavo_humanoid_sdk/kuavo/robot_info.py +113 -0
  29. kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
  30. kuavo_humanoid_sdk/kuavo/robot_state.py +299 -0
  31. kuavo_humanoid_sdk/kuavo/robot_tool.py +82 -0
  32. kuavo_humanoid_sdk/kuavo/robot_vision.py +83 -0
  33. kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
  34. kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1126 -0
  35. kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +104 -0
  36. kuavo_humanoid_sdk/msg/__init__.py +4 -0
  37. kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +7 -0
  38. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +306 -0
  39. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +437 -0
  40. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +191 -0
  41. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +199 -0
  42. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +112 -0
  43. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +323 -0
  44. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +48 -0
  45. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +160 -0
  46. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
  47. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +168 -0
  48. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +151 -0
  49. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +178 -0
  50. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +229 -0
  51. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +256 -0
  52. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +227 -0
  53. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +123 -0
  54. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
  55. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
  56. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +258 -0
  57. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +147 -0
  58. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +218 -0
  59. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +149 -0
  60. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +136 -0
  61. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +145 -0
  62. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +171 -0
  63. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +140 -0
  64. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +165 -0
  65. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +201 -0
  66. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +390 -0
  67. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +205 -0
  68. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +320 -0
  69. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +341 -0
  70. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +122 -0
  71. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -0
  72. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_questJoySticks.py +191 -0
  73. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +121 -0
  74. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +177 -0
  75. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +225 -0
  76. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +128 -0
  77. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +222 -0
  78. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +495 -0
  79. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
  80. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
  81. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +272 -0
  82. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +315 -0
  83. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
  84. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
  85. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +251 -0
  86. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +168 -0
  87. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
  88. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
  89. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
  90. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
  91. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +29 -0
  92. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +275 -0
  93. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +236 -0
  94. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +299 -0
  95. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +274 -0
  96. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +408 -0
  97. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +304 -0
  98. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +394 -0
  99. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +409 -0
  100. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +339 -0
  101. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +257 -0
  102. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +418 -0
  103. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +253 -0
  104. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +299 -0
  105. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +330 -0
  106. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
  107. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +421 -0
  108. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +490 -0
  109. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +268 -0
  110. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +304 -0
  111. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +273 -0
  112. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +283 -0
  113. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +275 -0
  114. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +444 -0
  115. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
  116. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +662 -0
  117. kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +7 -0
  118. kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +7 -0
  119. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +12 -0
  120. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +142 -0
  121. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +121 -0
  122. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +148 -0
  123. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +150 -0
  124. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +666 -0
  125. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +122 -0
  126. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +209 -0
  127. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +140 -0
  128. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +886 -0
  129. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +122 -0
  130. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +239 -0
  131. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +148 -0
  132. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +1 -0
  133. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +376 -0
  134. kuavo_humanoid_sdk-1.2.2.dist-info/METADATA +291 -0
  135. kuavo_humanoid_sdk-1.2.2.dist-info/RECORD +137 -0
  136. kuavo_humanoid_sdk-1.2.2.dist-info/WHEEL +6 -0
  137. kuavo_humanoid_sdk-1.2.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,114 @@
1
+ import copy
2
+ import threading
3
+ from queue import Queue
4
+ from kuavo_humanoid_sdk.interfaces.data_types import EndEffectorSide
5
+ from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
6
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
7
+ from kuavo_humanoid_sdk.kuavo.core.ros.param import make_robot_param, EndEffectorType
8
+ class DexHandControl:
9
+ _instance = None
10
+
11
+ def __new__(cls, *args, **kwargs):
12
+ if not cls._instance:
13
+ cls._instance = super().__new__(cls)
14
+ return cls._instance
15
+
16
+ def __init__(self):
17
+ if not hasattr(self, '_initialized'):
18
+ self.queue = Queue() # Initialize a queue to hold commands
19
+ self._kuavo_core = KuavoRobotCore()
20
+ self.thread = threading.Thread(target=self._process_queue) # Create a thread to process the queue
21
+ self.thread.daemon = True # Set the thread as a daemon so it will exit when the main program exits
22
+ self.thread.start() # Start the thread
23
+ kuavo_info = make_robot_param()
24
+ self._ee_type = kuavo_info['end_effector_type']
25
+ # Initialize last command position, torque, and velocity
26
+ self.last_cmd_position = {EndEffectorSide.LEFT: [0] * 6, EndEffectorSide.RIGHT: [0] * 6}
27
+ self._initialized = True
28
+
29
+ def control(self, target_positions: list, side: EndEffectorSide):
30
+ self.queue.put(('position', EndEffectorSide(side.value), target_positions))
31
+
32
+ def control_velocity(self, target_velocities: list, side: EndEffectorSide):
33
+ self.queue.put(('velocity', EndEffectorSide(side.value), target_velocities))
34
+
35
+ def make_gestures(self, gestures:list)->bool:
36
+ """
37
+ Make a gesture for the dexhand.
38
+ Args:
39
+ gestures: list of gestures to make.
40
+ [{'gesture_name': 'name', 'side': EndEffectorSide.LEFT},...]
41
+ """
42
+ exec_gs = []
43
+ for gs in gestures:
44
+ side = gs['hand_side']
45
+ gesture_name = gs['gesture_name']
46
+ if side == EndEffectorSide.LEFT:
47
+ exec_gs.append({'gesture_name': gesture_name, 'hand_side': 0})
48
+ elif side == EndEffectorSide.RIGHT:
49
+ exec_gs.append({'gesture_name': gesture_name, 'hand_side': 1})
50
+ elif side == EndEffectorSide.BOTH:
51
+ exec_gs.append({'gesture_name': gesture_name, 'hand_side': 2})
52
+
53
+ if len(exec_gs) == 0:
54
+ SDKLogger.error('No gestures to make')
55
+ return False
56
+
57
+ # Make gestures
58
+ self._kuavo_core.execute_gesture(exec_gs)
59
+
60
+ def get_gesture_names(self)->list:
61
+ """
62
+ Get the names of all gestures.
63
+ """
64
+ gs = self._kuavo_core.get_gesture_names()
65
+ if not gs:
66
+ return None
67
+ return gs
68
+
69
+
70
+ def _process_dexhand_command(self, command, side, data):
71
+ if command == 'position':
72
+ pos = self.last_cmd_position[EndEffectorSide.LEFT] + self.last_cmd_position[EndEffectorSide.RIGHT]
73
+ if side == EndEffectorSide.BOTH:
74
+ pos = copy.deepcopy(data)
75
+ elif side == EndEffectorSide.LEFT:
76
+ pos[:6] = data
77
+ elif side == EndEffectorSide.RIGHT:
78
+ pos[6:] = data
79
+ else:
80
+ return
81
+ self._kuavo_core.control_robot_dexhand(left_position=pos[:6], right_position=pos[6:])
82
+ self.last_cmd_position[EndEffectorSide.LEFT] = pos[:6]
83
+ self.last_cmd_position[EndEffectorSide.RIGHT] = pos[6:]
84
+
85
+ def _process_touch_dexhand_command(self, command, side, data):
86
+ if command == 'position':
87
+ ctrl_mode = 0
88
+ if side == EndEffectorSide.BOTH:
89
+ self._kuavo_core.robot_dexhand_command(data, ctrl_mode, 2)
90
+ elif side == EndEffectorSide.LEFT:
91
+ self._kuavo_core.robot_dexhand_command(data, ctrl_mode, 0)
92
+ elif side == EndEffectorSide.RIGHT:
93
+ self._kuavo_core.robot_dexhand_command(data, ctrl_mode, 1)
94
+ elif command == 'velocity':
95
+ ctrl_mode = 0
96
+ if side == EndEffectorSide.BOTH:
97
+ self._kuavo_core.robot_dexhand_command(data, ctrl_mode, 2)
98
+ elif side == EndEffectorSide.LEFT:
99
+ self._kuavo_core.robot_dexhand_command(data, ctrl_mode, 0)
100
+ elif side == EndEffectorSide.RIGHT:
101
+ self._kuavo_core.robot_dexhand_command(data, ctrl_mode, 1)
102
+
103
+ def _process_queue(self):
104
+ while True:
105
+ try:
106
+ command, side, data = self.queue.get() # This will block until an item is available in the queue
107
+ SDKLogger.debug(f'[DexHandControl] Received command: {command}, for side: {side}, with data: {data}')
108
+ if self._ee_type == EndEffectorType.QIANGNAO:
109
+ self._process_dexhand_command(command, side, data)
110
+ elif self._ee_type == EndEffectorType.QIANGNAO_TOUCH:
111
+ self._process_touch_dexhand_command(command, side, data)
112
+ self.queue.task_done()
113
+ except KeyboardInterrupt:
114
+ break
@@ -0,0 +1,67 @@
1
+ import threading
2
+ from queue import Queue
3
+ from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
4
+ from kuavo_humanoid_sdk.interfaces.data_types import EndEffectorSide
5
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
6
+ class LejuClawControl:
7
+ _instance = None
8
+
9
+ def __new__(cls, *args, **kwargs):
10
+ if not cls._instance:
11
+ cls._instance = super().__new__(cls)
12
+ return cls._instance
13
+
14
+ def __init__(self):
15
+ if not hasattr(self, '_initialized'):
16
+ self._initialized = True
17
+ self.queue = Queue() # Initialize a queue to hold commands
18
+ self._kuavo_core = KuavoRobotCore()
19
+ self.thread = threading.Thread(target=self._process_queue) # Create a thread to process the queue
20
+ self.thread.daemon = True # Set the thread as a daemon so it will exit when the main program exits
21
+ self.thread.start() # Start the thread
22
+ self.last_cmd_position = {EndEffectorSide.LEFT: 0, EndEffectorSide.RIGHT: 0}
23
+ self.last_cmd_torque = {EndEffectorSide.LEFT: 1.0, EndEffectorSide.RIGHT: 1.0}
24
+ self.last_cmd_velocity = {EndEffectorSide.LEFT: 90, EndEffectorSide.RIGHT: 90}
25
+ def control(self, position:list, velocity:list, torque:list, side:EndEffectorSide):
26
+ self.queue.put((EndEffectorSide(side.value), position, velocity, torque))
27
+
28
+ def release(self, side:EndEffectorSide):
29
+ if side == EndEffectorSide.BOTH:
30
+ self.queue.put((EndEffectorSide.BOTH, [0.0, 0.0], [90, 90], [1.0, 1.0]))
31
+ else:
32
+ self.queue.put((EndEffectorSide(side.value), [0], [90], [1.0]))
33
+
34
+ def _process_queue(self):
35
+ while True:
36
+ try:
37
+ side, q, v, tau = self.queue.get()
38
+ SDKLogger.debug(f"[LejuClawControl] Received command: {side} to {q} with {v} and {tau}")
39
+ postions = [self.last_cmd_position[EndEffectorSide.LEFT], self.last_cmd_position[EndEffectorSide.RIGHT]]
40
+ velocities = [self.last_cmd_velocity[EndEffectorSide.LEFT], self.last_cmd_velocity[EndEffectorSide.RIGHT]]
41
+ torques = [self.last_cmd_torque[EndEffectorSide.LEFT], self.last_cmd_torque[EndEffectorSide.RIGHT]]
42
+ if side == EndEffectorSide.LEFT:
43
+ postions[0] = q[0]
44
+ velocities[0] = v[0]
45
+ torques[0] = tau[0]
46
+ elif side == EndEffectorSide.RIGHT:
47
+ postions[1] = q[0]
48
+ velocities[1] = v[0]
49
+ torques[1] = tau[0]
50
+ else: # both
51
+ postions = q
52
+ velocities = v
53
+ torques = tau
54
+
55
+ # call ros service.
56
+ self._kuavo_core.control_leju_claw(postions, velocities, torques)
57
+ # update last cmd
58
+ self.last_cmd_position[EndEffectorSide.LEFT] = postions[0]
59
+ self.last_cmd_position[EndEffectorSide.RIGHT] = postions[1]
60
+ self.last_cmd_velocity[EndEffectorSide.LEFT] = velocities[0]
61
+ self.last_cmd_velocity[EndEffectorSide.RIGHT] = velocities[1]
62
+ self.last_cmd_torque[EndEffectorSide.LEFT] = torques[0]
63
+ self.last_cmd_torque[EndEffectorSide.RIGHT] = torques[1]
64
+ # mark task as done
65
+ self.queue.task_done()
66
+ except KeyboardInterrupt:
67
+ break
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
4
+ from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
5
+
6
+ try:
7
+ import rospy
8
+ from std_msgs.msg import Bool
9
+ from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import playmusic, playmusicRequest
10
+ from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import SpeechSynthesis, SpeechSynthesisRequest
11
+ except:
12
+ pass
13
+
14
+ class Audio:
15
+ """Audio system interface for controlling audio playback functionality of Kuavo humanoid robot.
16
+
17
+ Provides functionality to play music files.
18
+ """
19
+
20
+ def __init__(self):
21
+ """Initialize the audio system."""
22
+ self._audio_stop_publisher = rospy.Publisher('stop_music', Bool, queue_size=10)
23
+ rospy.sleep(0.5) # Wait for publisher initialization
24
+ def play_audio(self, file_name: str, volume: int = 100, speed: float = 1.0) -> bool:
25
+ """Play the specified audio file.
26
+
27
+ Args:
28
+ file_name (str): Name of the audio file to play
29
+
30
+ Returns:
31
+ bool: True if the play request was successfully sent, False otherwise
32
+ """
33
+ try:
34
+ # Wait for service availability
35
+ rospy.wait_for_service('play_music', timeout=2.0)
36
+ # Create service client
37
+ play_music_service = rospy.ServiceProxy('play_music', playmusic)
38
+ # Call service
39
+ request = playmusicRequest()
40
+ request.music_number = file_name
41
+ volume = min(max(volume , 0), 100)
42
+ request.volume = volume
43
+ response = play_music_service(request)
44
+ SDKLogger.info(f"[Robot Audio] Requested to play audio file: {file_name}")
45
+ return True
46
+ except rospy.ROSException as e:
47
+ SDKLogger.error(f"[Robot Audio] Audio playback service unavailable: {str(e)}")
48
+ return False
49
+ except Exception as e:
50
+ SDKLogger.error(f"[Robot Audio] Failed to play audio file: {str(e)}")
51
+ return False
52
+
53
+ def stop_audio(self):
54
+ """Stop the currently playing audio."""
55
+ try:
56
+ msg = Bool()
57
+ msg.data = True
58
+ self._audio_stop_publisher.publish(msg)
59
+ SDKLogger.info("[Robot Audio] Requested to stop audio playback")
60
+ return True
61
+ except Exception as e:
62
+ SDKLogger.error(f"[Robot Audio] Failed to stop audio playback: {str(e)}")
63
+ return False
64
+
65
+ def text_to_speech(self, text: str,volume: float = 0.5) -> bool:
66
+ """Synthesize and play the specified text.
67
+
68
+ Args:
69
+ text (str): Text to be played
70
+
71
+ Returns:
72
+ bool: True if the play request was successfully sent, False otherwise
73
+ """
74
+ try:
75
+ # Wait for service availability
76
+ rospy.wait_for_service('play_music', timeout=2.0)
77
+ # Create service client
78
+ play_music_service = rospy.ServiceProxy('speech_synthesis', SpeechSynthesis)
79
+ # Call service
80
+ request = SpeechSynthesisRequest()
81
+ request.data = text
82
+ request.volume = volume
83
+ response = play_music_service(request)
84
+ SDKLogger.info(f"[Robot Audio] Requested to play audio text: {text}")
85
+ return True
86
+ except rospy.ROSException as e:
87
+ SDKLogger.error(f"[Robot Audio] Audio playback service unavailable: {str(e)}")
88
+ return False
89
+ except Exception as e:
90
+ SDKLogger.error(f"[Robot Audio] Failed to play audio text: {str(e)}")
91
+ return False
92
+