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.
- kuavo_humanoid_sdk/__init__.py +6 -0
- kuavo_humanoid_sdk/common/logger.py +45 -0
- kuavo_humanoid_sdk/interfaces/__init__.py +4 -0
- kuavo_humanoid_sdk/interfaces/data_types.py +276 -0
- kuavo_humanoid_sdk/interfaces/end_effector.py +62 -0
- kuavo_humanoid_sdk/interfaces/robot.py +22 -0
- kuavo_humanoid_sdk/interfaces/robot_info.py +56 -0
- kuavo_humanoid_sdk/kuavo/__init__.py +11 -0
- kuavo_humanoid_sdk/kuavo/core/audio.py +32 -0
- kuavo_humanoid_sdk/kuavo/core/core.py +612 -0
- kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +114 -0
- kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +67 -0
- kuavo_humanoid_sdk/kuavo/core/ros/audio.py +92 -0
- kuavo_humanoid_sdk/kuavo/core/ros/control.py +1309 -0
- kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
- kuavo_humanoid_sdk/kuavo/core/ros/param.py +183 -0
- kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
- kuavo_humanoid_sdk/kuavo/core/ros/state.py +605 -0
- kuavo_humanoid_sdk/kuavo/core/ros/tools.py +219 -0
- kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
- kuavo_humanoid_sdk/kuavo/core/ros_env.py +237 -0
- kuavo_humanoid_sdk/kuavo/dexterous_hand.py +201 -0
- kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
- kuavo_humanoid_sdk/kuavo/robot.py +465 -0
- kuavo_humanoid_sdk/kuavo/robot_arm.py +210 -0
- kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
- kuavo_humanoid_sdk/kuavo/robot_head.py +50 -0
- kuavo_humanoid_sdk/kuavo/robot_info.py +113 -0
- kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
- kuavo_humanoid_sdk/kuavo/robot_state.py +299 -0
- kuavo_humanoid_sdk/kuavo/robot_tool.py +82 -0
- kuavo_humanoid_sdk/kuavo/robot_vision.py +83 -0
- kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
- kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1126 -0
- kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +104 -0
- kuavo_humanoid_sdk/msg/__init__.py +4 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +7 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +306 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +437 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +191 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +199 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +112 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +323 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +48 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +160 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +168 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +151 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +178 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +229 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +256 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +227 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +123 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +258 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +147 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +218 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +149 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +136 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +145 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +171 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +140 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +165 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +201 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +390 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +205 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +320 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +341 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +122 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_questJoySticks.py +191 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +121 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +177 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +225 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +128 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +222 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +495 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +272 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +315 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +251 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +168 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +29 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +275 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +236 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +299 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +274 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +408 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +304 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +394 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +409 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +339 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +257 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +418 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +253 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +299 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +330 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +421 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +490 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +268 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +304 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +273 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +283 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +275 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +444 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +662 -0
- kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +7 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +7 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +12 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +142 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +121 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +148 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +150 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +666 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +122 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +209 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +140 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +886 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +122 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +239 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +148 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +1 -0
- kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +376 -0
- kuavo_humanoid_sdk-1.2.2.dist-info/METADATA +291 -0
- kuavo_humanoid_sdk-1.2.2.dist-info/RECORD +137 -0
- kuavo_humanoid_sdk-1.2.2.dist-info/WHEEL +6 -0
- 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
|
+
|