kuavo-humanoid-sdk 1.2.1b3290__20250912184757-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 (186) 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 +288 -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 +16 -0
  9. kuavo_humanoid_sdk/kuavo/core/audio.py +32 -0
  10. kuavo_humanoid_sdk/kuavo/core/core.py +666 -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/llm_doubao.py +608 -0
  14. kuavo_humanoid_sdk/kuavo/core/microphone.py +192 -0
  15. kuavo_humanoid_sdk/kuavo/core/navigation.py +70 -0
  16. kuavo_humanoid_sdk/kuavo/core/ros/audio.py +110 -0
  17. kuavo_humanoid_sdk/kuavo/core/ros/camera.py +105 -0
  18. kuavo_humanoid_sdk/kuavo/core/ros/control.py +1524 -0
  19. kuavo_humanoid_sdk/kuavo/core/ros/microphone.py +38 -0
  20. kuavo_humanoid_sdk/kuavo/core/ros/navigation.py +217 -0
  21. kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
  22. kuavo_humanoid_sdk/kuavo/core/ros/param.py +201 -0
  23. kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
  24. kuavo_humanoid_sdk/kuavo/core/ros/state.py +652 -0
  25. kuavo_humanoid_sdk/kuavo/core/ros/tools.py +220 -0
  26. kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
  27. kuavo_humanoid_sdk/kuavo/core/ros_env.py +238 -0
  28. kuavo_humanoid_sdk/kuavo/core/sdk_deprecated.py +41 -0
  29. kuavo_humanoid_sdk/kuavo/demo_climbstair.py +249 -0
  30. kuavo_humanoid_sdk/kuavo/dexterous_hand.py +238 -0
  31. kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
  32. kuavo_humanoid_sdk/kuavo/logger_client.py +80 -0
  33. kuavo_humanoid_sdk/kuavo/robot.py +561 -0
  34. kuavo_humanoid_sdk/kuavo/robot_arm.py +411 -0
  35. kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
  36. kuavo_humanoid_sdk/kuavo/robot_blockly.py +1154 -0
  37. kuavo_humanoid_sdk/kuavo/robot_climbstair.py +1607 -0
  38. kuavo_humanoid_sdk/kuavo/robot_head.py +95 -0
  39. kuavo_humanoid_sdk/kuavo/robot_info.py +134 -0
  40. kuavo_humanoid_sdk/kuavo/robot_microphone.py +19 -0
  41. kuavo_humanoid_sdk/kuavo/robot_navigation.py +135 -0
  42. kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
  43. kuavo_humanoid_sdk/kuavo/robot_speech.py +24 -0
  44. kuavo_humanoid_sdk/kuavo/robot_state.py +310 -0
  45. kuavo_humanoid_sdk/kuavo/robot_tool.py +109 -0
  46. kuavo_humanoid_sdk/kuavo/robot_vision.py +81 -0
  47. kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
  48. kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1325 -0
  49. kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +106 -0
  50. kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +340 -0
  51. kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +215 -0
  52. kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +25 -0
  53. kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +331 -0
  54. kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +504 -0
  55. kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +40 -0
  56. kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +88 -0
  57. kuavo_humanoid_sdk/msg/__init__.py +4 -0
  58. kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +7 -0
  59. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +306 -0
  60. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +437 -0
  61. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AudioReceiverData.py +122 -0
  62. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_FTsensorData.py +260 -0
  63. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +191 -0
  64. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +199 -0
  65. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_MmDetectionMsg.py +264 -0
  66. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +112 -0
  67. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +323 -0
  68. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TaskPoint.py +175 -0
  69. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +62 -0
  70. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +160 -0
  71. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +161 -0
  72. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
  73. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +168 -0
  74. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +171 -0
  75. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +178 -0
  76. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +229 -0
  77. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +256 -0
  78. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +227 -0
  79. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +123 -0
  80. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6D.py +123 -0
  81. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +320 -0
  82. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
  83. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +136 -0
  84. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +231 -0
  85. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
  86. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.py +149 -0
  87. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +258 -0
  88. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +147 -0
  89. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +218 -0
  90. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +149 -0
  91. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +136 -0
  92. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +145 -0
  93. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +171 -0
  94. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +140 -0
  95. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +165 -0
  96. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +201 -0
  97. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +390 -0
  98. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +205 -0
  99. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_kuavoModeSchedule.py +224 -0
  100. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +320 -0
  101. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +341 -0
  102. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +122 -0
  103. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfo.py +143 -0
  104. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +220 -0
  105. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -0
  106. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +121 -0
  107. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +177 -0
  108. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotBodyMatrices.py +332 -0
  109. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +225 -0
  110. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +128 -0
  111. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +222 -0
  112. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +655 -0
  113. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
  114. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +216 -0
  115. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
  116. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +273 -0
  117. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +316 -0
  118. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
  119. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
  120. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +251 -0
  121. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +168 -0
  122. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_CreatePath.py +581 -0
  123. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
  124. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetAllMaps.py +241 -0
  125. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetCurrentMap.py +225 -0
  126. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +298 -0
  127. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_InitialPoseWithTaskPoint.py +281 -0
  128. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_LoadMap.py +281 -0
  129. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_NavigateToTaskPoint.py +281 -0
  130. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
  131. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetInitialPose.py +394 -0
  132. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
  133. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +468 -0
  134. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode_free.py +289 -0
  135. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
  136. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_TaskPointOperation.py +536 -0
  137. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +43 -0
  138. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_adjustZeroPoint.py +277 -0
  139. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +275 -0
  140. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +236 -0
  141. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +299 -0
  142. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +274 -0
  143. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +408 -0
  144. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +304 -0
  145. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +395 -0
  146. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +426 -0
  147. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +409 -0
  148. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +339 -0
  149. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +257 -0
  150. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +418 -0
  151. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +253 -0
  152. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +299 -0
  153. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorZeroPoints.py +286 -0
  154. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +330 -0
  155. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
  156. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +422 -0
  157. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +490 -0
  158. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +268 -0
  159. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +304 -0
  160. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +273 -0
  161. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +283 -0
  162. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +275 -0
  163. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +444 -0
  164. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
  165. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +664 -0
  166. kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +7 -0
  167. kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +7 -0
  168. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +12 -0
  169. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +142 -0
  170. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +121 -0
  171. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +148 -0
  172. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +150 -0
  173. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +666 -0
  174. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +122 -0
  175. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +209 -0
  176. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +140 -0
  177. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +886 -0
  178. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +122 -0
  179. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +239 -0
  180. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +148 -0
  181. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +1 -0
  182. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +376 -0
  183. kuavo_humanoid_sdk-1.2.1b3290.dist-info/METADATA +296 -0
  184. kuavo_humanoid_sdk-1.2.1b3290.dist-info/RECORD +186 -0
  185. kuavo_humanoid_sdk-1.2.1b3290.dist-info/WHEEL +6 -0
  186. kuavo_humanoid_sdk-1.2.1b3290.dist-info/top_level.txt +1 -0
@@ -0,0 +1,106 @@
1
+ from abc import ABC, abstractmethod
2
+ from kuavo_humanoid_sdk import KuavoSDK, KuavoRobot
3
+ from kuavo_humanoid_sdk import KuavoRobotState
4
+ from kuavo_humanoid_sdk import KuavoRobotTools
5
+ from kuavo_humanoid_sdk import KuavoRobotVision
6
+ from kuavo_humanoid_sdk.interfaces.data_types import KuavoPose
7
+
8
+ class KuavoRobotStrategyBase(ABC):
9
+ """Kuavo机器人策略基础类,提供策略执行的抽象接口"""
10
+
11
+ def __init__(self, robot:KuavoRobot, robot_state:KuavoRobotState, robot_tools:KuavoRobotTools, robot_vision:KuavoRobotVision):
12
+ """初始化策略基础类
13
+
14
+ Args:
15
+ robot: KuavoRobot实例,提供机器人控制能力
16
+ robot_state: KuavoRobotState实例,提供机器人状态信息
17
+ robot_tools: KuavoRobotTools实例,提供坐标转换等工具
18
+ robot_vision: KuavoRobotVision实例,提供视觉感知能力
19
+ """
20
+ self.robot = robot
21
+ self.state = robot_state
22
+ self.tools = robot_tools
23
+ self.vision = robot_vision
24
+
25
+ @abstractmethod
26
+ def head_find_target(self, target_info, **kwargs):
27
+ """寻找特定ID的目标
28
+
29
+ Args:
30
+ target_id: 目标的ID标识
31
+ **kwargs: 其他参数
32
+
33
+ Returns:
34
+ bool: 是否成功找到目标
35
+ """
36
+ pass
37
+
38
+ @abstractmethod
39
+ def walk_approach_target(self, target_id, target_distance=0.5, **kwargs):
40
+ """走/接近特定的目标到指定距离
41
+
42
+ Args:
43
+ target_id: 目标的ID标识
44
+ target_distance: 与目标的期望距离(米)
45
+ **kwargs: 其他参数
46
+
47
+ Returns:
48
+ bool: 是否成功接近目标
49
+ """
50
+ pass
51
+
52
+ @abstractmethod
53
+ def walk_to_pose(self, target_pose:KuavoPose, target_distance=0.5, timeout=10.0, **kwargs):
54
+ """走到指定距离的目标位置
55
+
56
+ Args:
57
+ target_pose: 目标位姿
58
+ target_distance: 与目标的期望距离(米)
59
+ timeout: 超时时间(秒)
60
+ **kwargs: 其他参数
61
+
62
+ Returns:
63
+ bool: 是否成功接近目标
64
+ """
65
+ pass
66
+
67
+ @abstractmethod
68
+ def arm_move_to_target(self, target_info, **kwargs):
69
+ """手臂移动到特定的位置
70
+
71
+ Args:
72
+ target_info: 目标信息,包含位置、姿态等
73
+ arm_mode: 手臂控制模式
74
+ **kwargs: 其他参数
75
+
76
+ Returns:
77
+ bool: 是否成功移动到目标位置
78
+ """
79
+ pass
80
+
81
+ @abstractmethod
82
+ def arm_transport_target_up(self, target_info, **kwargs):
83
+ """提起操作对象
84
+
85
+ Args:
86
+ target_info: 目标信息,包含位置、姿态等
87
+ arm_mode: 手臂控制模式
88
+ **kwargs: 其他参数
89
+
90
+ Returns:
91
+ bool: 是否成功提起操作对象
92
+ """
93
+ pass
94
+
95
+ @abstractmethod
96
+ def arm_transport_target_down(self, target_info, **kwargs):
97
+ """放下操作对象
98
+
99
+ Args:
100
+ target_info: 目标信息,包含位置、姿态等
101
+ arm_mode: 手臂控制模式
102
+ **kwargs: 其他参数
103
+
104
+ Returns:
105
+ bool: 是否成功放下操作对象
106
+ """
@@ -0,0 +1,340 @@
1
+ import numpy as np
2
+ from typing import Tuple
3
+ from scipy.spatial.transform import Rotation as R
4
+ from enum import Enum
5
+
6
+ from kuavo_humanoid_sdk.kuavo_strategy_v2.utils.utils import quaternion_rotate, quaternion_multiply, quaternion_inverse
7
+
8
+
9
+ class Frame(str, Enum):
10
+ BASE = "base_link" # 基座坐标系
11
+ CAMERA_LINK = "camera_link" # 相机坐标系
12
+ ODOM = "odom" # 里程计原点
13
+ # WORLD = "world" # 世界坐标系
14
+ ROBOT = "robot" # 机器人坐标系
15
+ TAG = "tag" # AprilTag坐标系
16
+
17
+
18
+ class Point:
19
+ def __init__(self, x: float, y: float, z: float, frame: Frame):
20
+ """
21
+ 初始化三维坐标点。
22
+
23
+ 参数:
24
+ x (float): x坐标。
25
+ y (float): y坐标。
26
+ z (float): z坐标。
27
+ frame (Frame): 坐标系框架名称。
28
+ """
29
+ self.x = x
30
+ self.y = y
31
+ self.z = z
32
+ self.frame = frame # 坐标系框架名称
33
+
34
+ def __repr__(self):
35
+ """
36
+ 返回Point对象的字符串表示。
37
+ """
38
+ return f"Point(x={self.x}, \n y={self.y}, \n z={self.z}, \n frame={self.frame})"
39
+
40
+
41
+ class Pose:
42
+ def __init__(self,
43
+ pos: Tuple[float, float, float],
44
+ quat: Tuple[float, float, float, float],
45
+ frame: str = None,
46
+ ):
47
+ """
48
+ 初始化姿态对象,包含位置和四元数。
49
+
50
+ 参数:
51
+ pos (Tuple[float, float, float]): 位置坐标。
52
+ quat (Tuple[float, float, float, float]): 四元数 (x, y, z, w)。
53
+ frame (str): 坐标系框架名称,可选。
54
+ """
55
+ self.pos = np.array(pos)
56
+ self.quat = np.array(quat)
57
+ self.frame = frame # 坐标系框架名称,可选
58
+
59
+ @classmethod
60
+ def from_euler(cls, pos: Tuple[float, float, float], euler: Tuple[float, float, float], frame=None, degrees=True):
61
+ """
62
+ 从欧拉角创建Pose对象。
63
+
64
+ 参数:
65
+ pos (Tuple[float, float, float]): 位置坐标。
66
+ euler (Tuple[float, float, float]): 欧拉角。
67
+ frame (str): 坐标系框架名称,可选。
68
+ degrees (bool): 欧拉角是否为度数。
69
+
70
+ 返回:
71
+ Pose: 创建的Pose对象。
72
+ """
73
+ r = R.from_euler('xyz', euler, degrees=degrees)
74
+ quat = r.as_quat() # x, y, z, w
75
+ # array to tuple
76
+ return cls(pos, quat, frame)
77
+
78
+ @classmethod
79
+ def from_rotmat(cls, pos: Tuple[float, float, float], rotmat: Tuple[float, float, float], frame=None):
80
+ """
81
+ 从旋转矩阵创建Pose对象。
82
+
83
+ 参数:
84
+ pos (Tuple[float, float, float]): 位置坐标。
85
+ rotmat (Tuple[float, float, float]): 旋转矩阵。
86
+ frame (str): 坐标系框架名称,可选。
87
+
88
+ 返回:
89
+ Pose: 创建的Pose对象。
90
+ """
91
+ r = R.from_matrix(rotmat)
92
+ quat = r.as_quat()
93
+ return cls(pos, quat, frame)
94
+
95
+ def get_quat(self):
96
+ """
97
+ 获取姿态的四元数。
98
+
99
+ 返回:
100
+ np.ndarray: 四元数。
101
+ """
102
+ return self.quat
103
+
104
+ def get_euler(self, degrees=False):
105
+ """
106
+ 获取姿态的欧拉角。
107
+
108
+ 参数:
109
+ degrees (bool): 是否返回度数。
110
+
111
+ 返回:
112
+ np.ndarray: 欧拉角。
113
+ """
114
+ r = R.from_quat(self.quat)
115
+ return r.as_euler('xyz', degrees=degrees)
116
+
117
+ def get_rotmat(self):
118
+ """
119
+ 获取姿态的旋转矩阵。
120
+
121
+ 返回:
122
+ np.ndarray: 旋转矩阵。
123
+ """
124
+ r = R.from_quat(self.quat)
125
+ return r.as_matrix()
126
+
127
+ def position_l1_norm(self, other: "Pose"):
128
+ """
129
+ 计算位置的L1范数(曼哈顿距离)。
130
+
131
+ 参数:
132
+ other (Pose): 另一个姿态对象。
133
+
134
+ 返回:
135
+ float: L1范数。
136
+ """
137
+ return np.sum(np.abs(self.pos - other.pos))
138
+
139
+ def position_l2_norm(self, other: "Pose"):
140
+ """
141
+ 计算位置的L2范数(欧氏距离)。
142
+
143
+ 参数:
144
+ other (Pose): 另一个姿态对象。
145
+
146
+ 返回:
147
+ float: L2范数。
148
+ """
149
+ return np.linalg.norm(self.pos - other.pos)
150
+
151
+ def position_l2_norm_squared(self, other: "Pose"):
152
+ """
153
+ 计算位置的L2范数的平方。
154
+
155
+ 参数:
156
+ other (Pose): 另一个姿态对象。
157
+
158
+ 返回:
159
+ float: L2范数的平方。
160
+ """
161
+ return np.sum((self.pos - other.pos) ** 2)
162
+
163
+ def angle(self, other: "Pose"):
164
+ """
165
+ 计算姿态的角度差(弧度)。
166
+
167
+ 参数:
168
+ other (Pose): 另一个姿态对象。
169
+
170
+ 返回:
171
+ float: 角度差。
172
+ """
173
+ # 确保四元数已归一化
174
+ quat1_norm = np.linalg.norm(self.quat)
175
+ quat2_norm = np.linalg.norm(other.quat)
176
+
177
+ if quat1_norm == 0 or quat2_norm == 0:
178
+ return 0.0
179
+
180
+ # 计算归一化的四元数点积
181
+ quat1_normalized = self.quat / quat1_norm
182
+ quat2_normalized = other.quat / quat2_norm
183
+
184
+ quat_dot = np.abs(np.dot(quat1_normalized, quat2_normalized))
185
+
186
+ # 确保点积在有效范围内 [-1, 1]
187
+ quat_dot = np.clip(quat_dot, -1.0, 1.0)
188
+
189
+ return 2 * np.arccos(quat_dot)
190
+
191
+ def angle_yaw(self, other: "Pose"):
192
+ """
193
+ 计算姿态的角度差(弧度)。
194
+ 只考虑yaw的误差。用于2d情况下的计算。
195
+ 参数:
196
+ other (Pose): 另一个姿态对象。
197
+
198
+ 返回:
199
+ float: 角度差。
200
+ """
201
+ # 确保四元数已归一化
202
+ # quat1_norm = np.linalg.norm(self.quat)
203
+ # quat2_norm = np.linalg.norm(other.quat)
204
+ #
205
+ # if quat1_norm == 0 or quat2_norm == 0:
206
+ # return 0.0
207
+ #
208
+ # # 计算归一化的四元数点积
209
+ # quat1_normalized = self.quat / quat1_norm
210
+ # quat2_normalized = other.quat / quat2_norm
211
+
212
+ quat1_normalized = R.from_quat(self.quat)
213
+ quat2_normalized = R.from_quat(other.quat)
214
+
215
+ # 相对旋转:从 self 变换到 other
216
+ r_rel = quat2_normalized * quat1_normalized.inv()
217
+ print(r_rel)
218
+ # 转换为欧拉角
219
+ yaw = r_rel.as_euler("xyz", degrees=False)[2]
220
+ return yaw
221
+
222
+ def __repr__(self):
223
+ """
224
+ 返回Pose对象的字符串表示。
225
+ """
226
+ return f"Pose(pos={self.pos}, \n quat={self.quat}, \n euler={self.get_euler(degrees=True)}, \n frame={self.frame})"
227
+
228
+
229
+ class Tag:
230
+ def __init__(self, id: int, pose: Pose, size: float = None):
231
+ """
232
+ 初始化AprilTag对象。
233
+
234
+ 参数:
235
+ id (int): AprilTag ID。
236
+ pose (Pose): Tag的Pose对象,包含位置和方向。
237
+ size (float): AprilTag物理尺寸,单位米。
238
+ """
239
+ self.id = id
240
+ self.size = size
241
+ self.pose = pose
242
+
243
+ def __repr__(self):
244
+ """
245
+ 返回Tag对象的字符串表示。
246
+ """
247
+ return f"Tag(id={self.id}, size={self.size}, pose={self.pose})"
248
+
249
+ class Transform3D:
250
+ def __init__(self, trans_pose: Pose, source_frame: Frame, target_frame: Frame):
251
+ """
252
+ 初始化3D变换对象,通过translation和rotation来定义。
253
+
254
+ 参数:
255
+ trans_pose (Pose): 变换的Pose对象。
256
+ source_frame (Frame): 被转换数据所在的坐标系。
257
+ target_frame (Frame): 要转到的坐标系。
258
+ """
259
+ assert trans_pose.frame == target_frame, f"转换的目标坐标系{target_frame}必须与传入的Pose的frame {trans_pose.frame}一致"
260
+ self.trans_pose = trans_pose
261
+ self.source_frame = source_frame # 源坐标系
262
+ self.target_frame = target_frame # 目标坐标系
263
+
264
+ def apply_to_pose_inverse(self, pose: Pose):
265
+ """
266
+ 将Pose从target_frame逆变换到source_frame。
267
+ """
268
+
269
+ assert pose.frame == self.target_frame, "逆变换要求Pose的frame必须是target_frame"
270
+
271
+ # 1. 姿态逆变换
272
+ quat_pose = np.array(pose.quat)
273
+ quat_trans = np.array(self.trans_pose.quat)
274
+ quat_trans_inv = quaternion_inverse(quat_trans)
275
+ quat_new = quaternion_multiply(quat_trans_inv, quat_pose)
276
+
277
+ # 2. 位置逆变换
278
+ # pos_diff = pose.pos - trans.pos,然后用 trans.quat 的逆旋转回来
279
+ pos_diff = np.array(pose.pos) - np.array(self.trans_pose.pos)
280
+ pos_new = quaternion_rotate(quat_trans_inv, pos_diff)
281
+
282
+ return Pose(
283
+ pos=pos_new,
284
+ quat=quat_new,
285
+ frame=self.source_frame
286
+ )
287
+
288
+ def apply_to_pose(self, pose: Pose):
289
+ """
290
+ 将Pose从source_frame转换到target_frame。
291
+
292
+ 参数:
293
+ pose (Pose): 要转换的Pose对象。
294
+
295
+ 返回:
296
+ Pose: 转换后的Pose对象。
297
+ """
298
+ assert pose.frame == self.source_frame, "转换的目标坐标系必须与传入的Pose的frame一致"
299
+ # 位置转换
300
+ rotated_pos = quaternion_rotate(
301
+ np.array(self.trans_pose.quat), # 确保四元数是numpy数组
302
+ pose.pos
303
+ )
304
+ pos = np.asarray(self.trans_pose.pos) + rotated_pos
305
+
306
+ # 姿态转换(显式转换为numpy数组)
307
+ quat_1 = np.array(pose.quat)
308
+ quat_2 = np.array(self.trans_pose.quat)
309
+ quat = quaternion_multiply(quat_2, quat_1)
310
+
311
+ return Pose(
312
+ pos=pos.tolist(),
313
+ quat=quat,
314
+ frame=self.target_frame # 返回转换后的坐标系
315
+ )
316
+
317
+ def apply_to_point(self, point: Point):
318
+ """
319
+ 将Point从source_frame转换到target_frame。
320
+
321
+ 参数:
322
+ point (Point): 要转换的Point对象。
323
+
324
+ 返回:
325
+ Point: 转换后的Point对象。
326
+ """
327
+ assert point.frame == self.source_frame, "转换的目标坐标系必须与传入的Point的frame一致"
328
+ rotated_pos = quaternion_rotate(
329
+ np.array(self.trans_pose.quat), # 确保四元数是numpy数组
330
+ [point.x, point.y, point.z] # 将Point转换为列表
331
+ )
332
+ pos = np.asarray(self.trans_pose.pos) + rotated_pos
333
+ pos = pos.tolist()
334
+
335
+ return Point(
336
+ x=pos[0],
337
+ y=pos[1],
338
+ z=pos[2],
339
+ frame=self.target_frame # 返回转换后的坐标系
340
+ )
@@ -0,0 +1,215 @@
1
+ import time
2
+ from enum import Enum
3
+ from typing import Any
4
+ import logging
5
+ import colorlog
6
+
7
+
8
+ class EventStatus(Enum):
9
+ IDLE = "idle" # 空闲状态,事件未开始
10
+ RUNNING = "running" # 事件正在进行中
11
+ SUCCESS = "success"
12
+
13
+ FAILED = "failed"
14
+ CLOSED = "closed" # 事件已停止
15
+ TIMEOUT = "timeout" # 事件超时
16
+
17
+
18
+ class BaseEvent:
19
+ """
20
+ 事件:
21
+ 单一的输入
22
+ 有状态判断
23
+ """
24
+
25
+ def __init__(self,
26
+ event_name,
27
+ ):
28
+ """
29
+ 初始化事件,设置事件名称并将初始状态设置为IDLE。
30
+
31
+ 参数:
32
+ event_name (str): 事件名称。
33
+ """
34
+ self.event_name = event_name
35
+ self.status = EventStatus.IDLE # 事件状态,初始为IDLE
36
+ self.start_time = None # 事件初始状态
37
+ self.target = None # 事件目标,初始为None
38
+
39
+ self.logger = logging.getLogger(self.event_name)
40
+ self.logger.setLevel(logging.INFO)
41
+ # 避免重复添加 handler
42
+ if not self.logger.handlers:
43
+ handler = colorlog.StreamHandler()
44
+ formatter = colorlog.ColoredFormatter(
45
+ fmt='%(log_color)s[%(asctime)s] [事件:%(name)s] %(levelname)s: %(message)s',
46
+ datefmt='%H:%M:%S',
47
+ log_colors={
48
+ 'DEBUG': 'cyan',
49
+ 'INFO': 'green',
50
+ 'WARNING': 'yellow',
51
+ 'ERROR': 'red',
52
+ 'CRITICAL': 'bold_red',
53
+ }
54
+ )
55
+ handler.setFormatter(formatter)
56
+ self.logger.addHandler(handler)
57
+
58
+ def set_timeout(self, timeout):
59
+ """
60
+ 设置事件的超时时间。
61
+
62
+ 参数:
63
+ timeout (int): 超时时间(秒),必须大于0。
64
+ """
65
+ assert timeout > 0, "超时时间必须大于0 !!!"
66
+ self.timeout = timeout
67
+ self.logger.info(f"事件 {self.event_name} 超时时间设置为 {self.timeout} 秒")
68
+
69
+ def set_target(self, target: Any, *args, **kwargs):
70
+ """
71
+ 设置事件的目标,可以在事件执行期间动态更新。
72
+
73
+ 参数:
74
+ target (Any): 事件目标,例如位置或ID。
75
+ `*args`: 额外的参数。
76
+ `**kwargs`: 额外的关键字参数。
77
+
78
+ 返回:
79
+ bool: 如果目标设置成功返回True,否则返回False。
80
+ """
81
+
82
+ if self.status == EventStatus.CLOSED:
83
+ self.logger.error(f"事件 {self.event_name} 已关闭,无法设置目标 !!! 请先调用open() 方法开始事件")
84
+ return False
85
+
86
+ if self.status != EventStatus.RUNNING and self.status != EventStatus.IDLE:
87
+ self.logger.error(f"事件 {self.event_name} 不是运行中或空闲状态,无法设置目标 !!!")
88
+ return False
89
+
90
+ is_valid = self._check_target_valid(target, *args, **kwargs)
91
+
92
+ if not is_valid:
93
+ self.logger.error(f"事件 {self.event_name} 的目标无效,无法设置目标 !!!")
94
+ return False
95
+
96
+ self.target = target
97
+
98
+ self.logger.info(f"目标已设置为:\n {self.target}")
99
+
100
+ return True
101
+
102
+ def open(self, *args, **kwargs):
103
+ """
104
+ 开始事件,将状态更改为RUNNING并记录开始时间。
105
+
106
+ 参数:
107
+ `*args`: 额外的参数。
108
+ `**kwargs`: 额外的关键字参数。
109
+ """
110
+ self.status = EventStatus.RUNNING
111
+ self.start_time = time.time() # 记录事件开始时间
112
+ self.logger.info(f"🔵 事件开始啦")
113
+
114
+ def close(self):
115
+ """
116
+ 停止事件,将状态更改为CLOSED。
117
+ """
118
+ self.status = EventStatus.CLOSED
119
+ self.logger.info(f"🔵 事件关闭啦")
120
+
121
+ def step(self):
122
+ """
123
+ 抽象方法,需要在子类中实现以定义事件的每一步行为。
124
+
125
+ 异常:
126
+ NotImplementedError: 如果在子类中未实现。
127
+ """
128
+ raise NotImplementedError("请在子类中实现 step 方法")
129
+
130
+ def _check_target_valid(self, target: Any, *args, **kwargs) -> bool:
131
+ """
132
+ 抽象方法,需要在子类中实现以验证事件的目标。
133
+
134
+ 参数:
135
+ target (Any): 需要验证的目标。
136
+ `*args`: 额外的参数。
137
+ `**kwargs`: 额外的关键字参数。
138
+
139
+ 返回:
140
+ bool: 如果目标有效返回True,否则返回False。
141
+
142
+ 异常:
143
+ NotImplementedError: 如果在子类中未实现。
144
+ """
145
+ raise NotImplementedError("请在子类中实现 _check_target_valid 方法")
146
+
147
+ def get_status(self):
148
+ """
149
+ 返回更新后的事件状态。
150
+
151
+ 返回:
152
+ EventStatus: 当前事件状态。
153
+ """
154
+ self._update_status()
155
+ return self.status
156
+
157
+ def _update_status(self):
158
+ """
159
+ 根据当前状态更新事件的状态,检查是否失败、成功或超时。
160
+ """
161
+ # 如果已经是failed或者success或者timeout,则不再变化状态
162
+ if self.status in [EventStatus.FAILED, EventStatus.SUCCESS, EventStatus.TIMEOUT]:
163
+ return
164
+
165
+ if self._check_failed():
166
+ self.logger.error(f"❌ 当前状态为:失败 !!!")
167
+ self.status = EventStatus.FAILED
168
+ elif self._check_success():
169
+ self.logger.info(f"✅ 当前状态为:成功 !!!")
170
+ self.status = EventStatus.SUCCESS
171
+ elif self._check_timeout():
172
+ self.logger.error(f"❌ 当前状态为:超时 !!!")
173
+ self.status = EventStatus.TIMEOUT
174
+
175
+ def _check_timeout(self):
176
+ """
177
+ 检查事件是否超时。
178
+
179
+ 返回:
180
+ bool: 如果事件超时返回True,否则返回False。
181
+
182
+ 异常:
183
+ AssertionError: 如果事件未开始或未设置超时时间。
184
+ """
185
+ assert self.start_time is not None, "事件未开始,无法检查超时 !!!"
186
+ assert self.timeout is not None, "事件超时时间未设置 !!!"
187
+
188
+ elapsed_time = time.time() - self.start_time
189
+ if elapsed_time > self.timeout:
190
+ return True
191
+ return False
192
+
193
+ def _check_failed(self):
194
+ """
195
+ 抽象方法,需要在子类中实现以判断事件是否失败。
196
+
197
+ 返回:
198
+ bool: 如果事件失败返回True,否则返回False。
199
+
200
+ 异常:
201
+ NotImplementedError: 如果在子类中未实现。
202
+ """
203
+ raise NotImplementedError("请在子类中实现 _check_failed 方法")
204
+
205
+ def _check_success(self):
206
+ """
207
+ 抽象方法,需要在子类中实现以判断事件是否成功。
208
+
209
+ 返回:
210
+ bool: 如果事件成功返回True,否则返回False。
211
+
212
+ 异常:
213
+ NotImplementedError: 如果在子类中未实现。
214
+ """
215
+ raise NotImplementedError("请在子类中实现 _check_success 方法")
@@ -0,0 +1,25 @@
1
+ import time
2
+
3
+ from kuavo_humanoid_sdk import KuavoSDK, KuavoRobot
4
+ from kuavo_humanoid_sdk import KuavoRobotState
5
+ from kuavo_humanoid_sdk import KuavoRobotTools
6
+ from kuavo_humanoid_sdk import KuavoRobotVision
7
+ from kuavo_humanoid_sdk.kuavo.robot_arm import KuavoRobotArm
8
+
9
+ class RobotSDK:
10
+ def __init__(self):
11
+ """
12
+ 初始化机器人SDK
13
+
14
+ Args:
15
+ robot: KuavoRobot实例,提供机器人控制能力
16
+ robot_state: KuavoRobotState实例,提供机器人状态信息
17
+ robot_tools: KuavoRobotTools实例,提供坐标转换等工具
18
+ """
19
+ self.control = KuavoRobot()
20
+ self.state = KuavoRobotState()
21
+ self.tools = KuavoRobotTools()
22
+ self.vision = KuavoRobotVision()
23
+ self.arm = KuavoRobotArm()
24
+
25
+ time.sleep(2) # 等待底层初始化完成