kuavo-humanoid-sdk 1.2.1b3279__20250911210455-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 (184) 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/control.py +1524 -0
  18. kuavo_humanoid_sdk/kuavo/core/ros/microphone.py +38 -0
  19. kuavo_humanoid_sdk/kuavo/core/ros/navigation.py +217 -0
  20. kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
  21. kuavo_humanoid_sdk/kuavo/core/ros/param.py +201 -0
  22. kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
  23. kuavo_humanoid_sdk/kuavo/core/ros/state.py +652 -0
  24. kuavo_humanoid_sdk/kuavo/core/ros/tools.py +220 -0
  25. kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
  26. kuavo_humanoid_sdk/kuavo/core/ros_env.py +238 -0
  27. kuavo_humanoid_sdk/kuavo/demo_climbstair.py +249 -0
  28. kuavo_humanoid_sdk/kuavo/dexterous_hand.py +238 -0
  29. kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
  30. kuavo_humanoid_sdk/kuavo/logger_client.py +80 -0
  31. kuavo_humanoid_sdk/kuavo/robot.py +561 -0
  32. kuavo_humanoid_sdk/kuavo/robot_arm.py +299 -0
  33. kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
  34. kuavo_humanoid_sdk/kuavo/robot_blockly.py +1162 -0
  35. kuavo_humanoid_sdk/kuavo/robot_climbstair.py +1607 -0
  36. kuavo_humanoid_sdk/kuavo/robot_head.py +74 -0
  37. kuavo_humanoid_sdk/kuavo/robot_info.py +134 -0
  38. kuavo_humanoid_sdk/kuavo/robot_microphone.py +19 -0
  39. kuavo_humanoid_sdk/kuavo/robot_navigation.py +135 -0
  40. kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
  41. kuavo_humanoid_sdk/kuavo/robot_speech.py +24 -0
  42. kuavo_humanoid_sdk/kuavo/robot_state.py +310 -0
  43. kuavo_humanoid_sdk/kuavo/robot_tool.py +109 -0
  44. kuavo_humanoid_sdk/kuavo/robot_vision.py +81 -0
  45. kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
  46. kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1325 -0
  47. kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +106 -0
  48. kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +340 -0
  49. kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +215 -0
  50. kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +25 -0
  51. kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +331 -0
  52. kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +504 -0
  53. kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +40 -0
  54. kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +88 -0
  55. kuavo_humanoid_sdk/msg/__init__.py +4 -0
  56. kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +7 -0
  57. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +306 -0
  58. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +437 -0
  59. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AudioReceiverData.py +122 -0
  60. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_FTsensorData.py +260 -0
  61. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +191 -0
  62. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +199 -0
  63. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_MmDetectionMsg.py +264 -0
  64. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +112 -0
  65. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +323 -0
  66. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TaskPoint.py +175 -0
  67. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +62 -0
  68. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +160 -0
  69. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +161 -0
  70. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
  71. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +168 -0
  72. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +171 -0
  73. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +178 -0
  74. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +229 -0
  75. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +256 -0
  76. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +227 -0
  77. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +123 -0
  78. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6D.py +123 -0
  79. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +320 -0
  80. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
  81. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +136 -0
  82. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +231 -0
  83. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
  84. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.py +149 -0
  85. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +258 -0
  86. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +147 -0
  87. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +218 -0
  88. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +149 -0
  89. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +136 -0
  90. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +145 -0
  91. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +171 -0
  92. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +140 -0
  93. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +165 -0
  94. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +201 -0
  95. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +390 -0
  96. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +205 -0
  97. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_kuavoModeSchedule.py +224 -0
  98. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +320 -0
  99. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +341 -0
  100. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +122 -0
  101. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfo.py +143 -0
  102. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +220 -0
  103. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -0
  104. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +121 -0
  105. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +177 -0
  106. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotBodyMatrices.py +332 -0
  107. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +225 -0
  108. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +128 -0
  109. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +222 -0
  110. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +655 -0
  111. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
  112. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +216 -0
  113. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
  114. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +273 -0
  115. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +316 -0
  116. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
  117. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
  118. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +251 -0
  119. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +168 -0
  120. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_CreatePath.py +581 -0
  121. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
  122. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetAllMaps.py +241 -0
  123. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetCurrentMap.py +225 -0
  124. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +298 -0
  125. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_InitialPoseWithTaskPoint.py +281 -0
  126. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_LoadMap.py +281 -0
  127. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_NavigateToTaskPoint.py +281 -0
  128. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
  129. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetInitialPose.py +394 -0
  130. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
  131. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +468 -0
  132. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode_free.py +289 -0
  133. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
  134. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_TaskPointOperation.py +536 -0
  135. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +43 -0
  136. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_adjustZeroPoint.py +277 -0
  137. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +275 -0
  138. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +236 -0
  139. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +299 -0
  140. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +274 -0
  141. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +408 -0
  142. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +304 -0
  143. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +395 -0
  144. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +426 -0
  145. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +409 -0
  146. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +339 -0
  147. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +257 -0
  148. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +418 -0
  149. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +253 -0
  150. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +299 -0
  151. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorZeroPoints.py +286 -0
  152. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +330 -0
  153. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
  154. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +422 -0
  155. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +490 -0
  156. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +268 -0
  157. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +304 -0
  158. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +273 -0
  159. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +283 -0
  160. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +275 -0
  161. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +444 -0
  162. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
  163. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +664 -0
  164. kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +7 -0
  165. kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +7 -0
  166. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +12 -0
  167. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +142 -0
  168. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +121 -0
  169. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +148 -0
  170. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +150 -0
  171. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +666 -0
  172. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +122 -0
  173. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +209 -0
  174. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +140 -0
  175. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +886 -0
  176. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +122 -0
  177. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +239 -0
  178. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +148 -0
  179. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +1 -0
  180. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +376 -0
  181. kuavo_humanoid_sdk-1.2.1b3279.dist-info/METADATA +296 -0
  182. kuavo_humanoid_sdk-1.2.1b3279.dist-info/RECORD +184 -0
  183. kuavo_humanoid_sdk-1.2.1b3279.dist-info/WHEEL +6 -0
  184. kuavo_humanoid_sdk-1.2.1b3279.dist-info/top_level.txt +1 -0
@@ -0,0 +1,561 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ from kuavo_humanoid_sdk.kuavo.core.ros_env import KuavoROSEnv
4
+ from kuavo_humanoid_sdk.interfaces.robot import RobotBase
5
+ from kuavo_humanoid_sdk.common.logger import SDKLogger, disable_sdk_logging
6
+ from kuavo_humanoid_sdk.interfaces.data_types import KuavoPose, KuavoIKParams, KuavoManipulationMpcFrame, KuavoManipulationMpcCtrlMode, KuavoManipulationMpcControlFlow
7
+ from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
8
+
9
+ from typing import Tuple
10
+ from kuavo_humanoid_sdk.kuavo.robot_info import KuavoRobotInfo
11
+ from kuavo_humanoid_sdk.kuavo.robot_arm import KuavoRobotArm
12
+ from kuavo_humanoid_sdk.kuavo.robot_head import KuavoRobotHead
13
+
14
+ """
15
+ Kuavo SDK - Kuavo机器人控制的Python接口
16
+
17
+ 本模块提供了通过Python控制Kuavo机器人的主要接口。
18
+ 包含两个主要类:
19
+
20
+ KuavoSDK:
21
+ 一个静态类,提供SDK初始化和配置功能,以及处理核心设置、ROS环境初始化和日志配置。
22
+
23
+ KuavoRobot:
24
+ 主要的机器人控制接口类,提供以下功能的访问:
25
+ - 机器人信息和状态 (通过 KuavoRobotInfo)
26
+ - 机械臂控制功能 (通过 KuavoRobotArm)
27
+ - 头部控制功能 (通过 KuavoRobotHead)
28
+ - 核心机器人功能 (通过 KuavoRobotCore)
29
+
30
+ 该模块需要正确配置的ROS环境才能运行。
31
+ """
32
+ __all__ = ["KuavoSDK", "KuavoRobot"]
33
+
34
+
35
+ class KuavoSDK:
36
+ class Options:
37
+ Normal = 0x01
38
+ WithIK = 0x02
39
+
40
+ def __init__(self):
41
+ pass
42
+
43
+ @staticmethod
44
+ def Init(options:int=Options.Normal, log_level: str = "INFO")-> bool:
45
+ """初始化SDK。
46
+
47
+ 使用指定的选项和配置初始化Kuavo SDK。
48
+
49
+ Args:
50
+ options (int): SDK的配置选项。使用: :class:`KuavoSDK.Options` 常量,默认为Options.Normal。
51
+ log_level (str): 日志级别。可选值为"ERROR"、"WARN"、"INFO"、"DEBUG",默认为"INFO"。
52
+
53
+ Returns:
54
+ bool: 初始化成功返回True,否则返回False。
55
+
56
+ Raises:
57
+ RuntimeError: 如果由于缺少依赖项或连接问题导致初始化失败。
58
+ """
59
+
60
+ SDKLogger.setLevel(log_level.upper())
61
+ SDKLogger.debug(f" ================= Kuavo Humanoid SDK =================")
62
+ kuavo_ros_env = KuavoROSEnv()
63
+ if not kuavo_ros_env.Init():
64
+ raise RuntimeError("Failed to initialize ROS environment")
65
+
66
+ # Initialize core components, connect ROS Topics...
67
+ kuavo_core = KuavoRobotCore()
68
+ if log_level.upper() == 'DEBUG':
69
+ debug = True
70
+ else:
71
+ debug = False
72
+ # Check if IK option is enabled
73
+
74
+ if options & KuavoSDK.Options.WithIK:
75
+ if not KuavoROSEnv.check_rosnode_exists('/arms_ik_node'):
76
+ print("\033[31m\nError:WithIK option is enabled but ik_node is not running, please run `roslaunch motion_capture_ik ik_node.launch`\033[0m")
77
+ exit(1)
78
+
79
+
80
+ if not kuavo_core.initialize(debug=debug):
81
+ SDKLogger.error("[SDK] Failed to initialize core components.")
82
+ return False
83
+
84
+ return True
85
+
86
+ @staticmethod
87
+ def DisableLogging():
88
+ """禁用SDK的所有日志输出。"""
89
+ disable_sdk_logging()
90
+
91
+ class KuavoRobot(RobotBase):
92
+ def __init__(self):
93
+ super().__init__(robot_type="kuavo")
94
+
95
+ self._robot_info = KuavoRobotInfo()
96
+ self._robot_arm = KuavoRobotArm()
97
+ self._robot_head = KuavoRobotHead()
98
+ self._kuavo_core = KuavoRobotCore()
99
+ def stance(self)->bool:
100
+ """使机器人进入'stance'站立模式。
101
+
102
+ Returns:
103
+ bool: 如果机器人成功进入站立模式返回 True,否则返回 False。
104
+
105
+ Note:
106
+ 你可以调用 :meth:`KuavoRobotState.wait_for_stance` 来等待机器人进入 stance 模式。
107
+ """
108
+ return self._kuavo_core.to_stance()
109
+
110
+ def trot(self)->bool:
111
+ """使机器人进入'trot'踏步模式。
112
+
113
+ Returns:
114
+ bool: 如果机器人成功进入踏步模式返回 True,否则返回 False。
115
+
116
+ Note:
117
+ 你可以调用 :meth:`KuavoRobotState.wait_for_walk` 来等待机器人进入踏步模式。
118
+ """
119
+ return self._kuavo_core.to_trot()
120
+
121
+ def walk(self, linear_x:float, linear_y:float, angular_z:float)->bool:
122
+ """控制机器人行走运动。
123
+
124
+ Args:
125
+ linear_x (float): x轴方向的线速度,单位m/s,范围[-0.4, 0.4]。
126
+ linear_y (float): y轴方向的线速度,单位m/s,范围[-0.2, 0.2]。
127
+ angular_z (float): 绕z轴的角速度,单位rad/s,范围[-0.4, 0.4]。
128
+
129
+ Returns:
130
+ bool: 如果运动控制成功返回 True,否则返回 False。
131
+
132
+ Note:
133
+ 你可以调用 :meth:`KuavoRobotState.wait_for_walk` 来等待机器人进入行走模式。
134
+ """
135
+ # Limit velocity ranges
136
+ limited_linear_x = min(0.4, max(-0.4, linear_x))
137
+ limited_linear_y = min(0.2, max(-0.2, linear_y))
138
+ limited_angular_z = min(0.4, max(-0.4, angular_z))
139
+
140
+ # Check if any velocity exceeds limits.
141
+ if abs(linear_x) > 0.4:
142
+ SDKLogger.warn(f"[Robot] linear_x velocity {linear_x} exceeds limit [-0.4, 0.4], will be limited")
143
+ if abs(linear_y) > 0.2:
144
+ SDKLogger.warn(f"[Robot] linear_y velocity {linear_y} exceeds limit [-0.2, 0.2], will be limited")
145
+ if abs(angular_z) > 0.4:
146
+ SDKLogger.warn(f"[Robot] angular_z velocity {angular_z} exceeds limit [-0.4, 0.4], will be limited")
147
+ return self._kuavo_core.walk(limited_linear_x, limited_linear_y, limited_angular_z)
148
+
149
+ def jump(self):
150
+ """使机器人跳跃。
151
+
152
+ Warning:
153
+ 此函数暂未实现,无法调用
154
+ """
155
+ raise NotImplementedError("跳跃功能尚未实现")
156
+
157
+ def squat(self, height: float, pitch: float=0.0)->bool:
158
+ """控制机器人的蹲姿高度和俯仰角。
159
+
160
+ Args:
161
+ height (float): 相对于正常站立高度的高度偏移量,单位米,范围[-0.35, 0.0],负值表示下蹲。
162
+ 正常站立高度参考 :attr:`KuavoRobotInfo.init_stand_height`
163
+ pitch (float): 机器人躯干的俯仰角,单位弧度,范围[-0.4, 0.4]。
164
+
165
+ Returns:
166
+ bool: 如果蹲姿控制成功返回True,否则返回False。
167
+
168
+ Note:
169
+ 下蹲和起立不要变化过快,一次变化最大不要超过0.2米。
170
+ """
171
+ # Limit height range
172
+ MAX_HEIGHT = 0.0
173
+ MIN_HEIGHT = -0.35
174
+ MAX_PITCH = 0.4
175
+ MIN_PITCH = -0.4
176
+
177
+ limited_height = min(MAX_HEIGHT, max(MIN_HEIGHT, height))
178
+
179
+ # Check if height exceeds limits
180
+ if height > MAX_HEIGHT or height < MIN_HEIGHT:
181
+ print(f"\033[33m[Robot] height {height} exceeds limit [{MIN_HEIGHT}, {MAX_HEIGHT}], will be limited\033[0m")
182
+ # Limit pitch range
183
+ limited_pitch = min(MAX_PITCH, max(MIN_PITCH, pitch))
184
+
185
+ # Check if pitch exceeds limits
186
+ if abs(pitch) > MAX_PITCH:
187
+ print(f"\033[33m[Robot] pitch {pitch} exceeds limit [{MIN_PITCH}, {MAX_PITCH}], will be limited\033[0m")
188
+
189
+ return self._kuavo_core.squat(limited_height, limited_pitch)
190
+
191
+ def step_by_step(self, target_pose:list, dt:float=0.4, is_left_first_default:bool=True, collision_check:bool=True)->bool:
192
+ """单步控制机器人运动。
193
+
194
+ Args:
195
+ target_pose (list): 机器人的目标位姿[x, y, z, yaw],单位m,rad。
196
+ dt (float): 每步之间的时间间隔,单位秒。默认为0.4秒。
197
+ is_left_first_default (bool): 是否先迈左脚。默认为True。
198
+ collision_check (bool): 是否进行碰撞检测。默认为True。
199
+
200
+ Returns:
201
+ bool: 如果运动成功返回True,否则返回False。
202
+
203
+ Raises:
204
+ RuntimeError: 如果在尝试控制步态时机器人不在stance状态。
205
+ ValueError: 如果target_pose长度不为4。
206
+
207
+ Note:
208
+ 你可以调用 :meth:`KuavoRobotState.wait_for_step_control` 来等待机器人进入step-control模式。
209
+ 你可以调用 :meth:`KuavoRobotState.wait_for_stance` 来等待step-control完成。
210
+
211
+ Warning:
212
+ 如果当前机器人的躯干高度过低(相对于正常站立高度低于-0.15m),调用该函数会返回失败。
213
+ 正常站立高度参考 :attr:`KuavoRobotInfo.init_stand_height`
214
+
215
+ tips:
216
+ 坐标系: base_link坐标系
217
+ 执行误差: 0.005~0.05m, 0.05°以下
218
+ """
219
+ if len(target_pose) != 4:
220
+ raise ValueError(f"[Robot] target_pose length must be 4 (x, y, z, yaw), but got {len(target_pose)}")
221
+
222
+ return self._kuavo_core.step_control(target_pose, dt, is_left_first_default, collision_check)
223
+
224
+ def control_command_pose(self, target_pose_x: float, target_pose_y: float, target_pose_z: float, target_pose_yaw: float) -> bool:
225
+ """在base_link坐标系下控制机器人姿态。
226
+
227
+ Args:
228
+ target_pose_x (float): 目标x位置,单位米。
229
+ target_pose_y (float): 目标y位置,单位米。
230
+ target_pose_z (float): 目标z位置,单位米。
231
+ target_pose_yaw (float): 目标偏航角,单位弧度。
232
+
233
+ Returns:
234
+ bool: 如果命令发送成功返回True,否则返回False。
235
+
236
+ Raises:
237
+ RuntimeError: 如果在尝试控制姿态时机器人不在stance状态。
238
+
239
+ Note:
240
+ 此命令会将机器人状态改变为'command_pose'。
241
+
242
+ tips:
243
+ 坐标系: base_link坐标系
244
+ 执行误差: 0.05~0.1m, 0.2~5°
245
+ """
246
+ return self._kuavo_core.control_command_pose(target_pose_x, target_pose_y, target_pose_z, target_pose_yaw)
247
+
248
+ def control_command_pose_world(self, target_pose_x: float, target_pose_y: float, target_pose_z: float, target_pose_yaw: float) -> bool:
249
+ """在odom(世界)坐标系下控制机器人姿态。
250
+
251
+ Args:
252
+ target_pose_x (float): 目标x位置,单位米。
253
+ target_pose_y (float): 目标y位置,单位米。
254
+ target_pose_z (float): 目标z位置,单位米。
255
+ target_pose_yaw (float): 目标偏航角,单位弧度。
256
+
257
+ Returns:
258
+ bool: 如果命令发送成功返回True,否则返回False。
259
+
260
+ Raises:
261
+ RuntimeError: 如果在尝试控制姿态时机器人不在stance状态。
262
+
263
+ Note:
264
+ 此命令会将机器人状态改变为'command_pose_world'。
265
+
266
+ tips:
267
+ 坐标系: odom坐标系
268
+ 执行误差: 0.03~0.1m, 0.5~5°
269
+ """
270
+ return self._kuavo_core.control_command_pose_world(target_pose_x, target_pose_y, target_pose_z, target_pose_yaw)
271
+
272
+ def control_head(self, yaw: float, pitch: float)->bool:
273
+ """控制机器人的头部关节运动。
274
+
275
+ Args:
276
+ yaw (float): 头部的偏航角,单位弧度,范围[-1.396, 1.396](-80到80度)。
277
+ pitch (float): 头部的俯仰角,单位弧度,范围[-0.436, 0.436](-25到25度)。
278
+
279
+ Returns:
280
+ bool: 如果头部控制成功返回True,否则返回False。
281
+ """
282
+ return self._robot_head.control_head(yaw=yaw, pitch=pitch)
283
+
284
+ def enable_head_tracking(self, target_id: int)->bool:
285
+ """启用头部跟踪 April Tag"""
286
+ return self._robot_head.enable_head_tracking(target_id)
287
+
288
+ def disable_head_tracking(self)->bool:
289
+ """禁用头部跟踪。"""
290
+ return self._robot_head.disable_head_tracking()
291
+
292
+ """ Robot Arm Control """
293
+ def control_hand_wrench(self, left_wrench: list, right_wrench: list) -> bool:
294
+ """控制机器人末端力/力矩
295
+
296
+ Args:
297
+ left_wrench (list): 左手臂6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
298
+ right_wrench (list): 右手臂6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
299
+ 单位:
300
+ Fx,Fy,Fz: 牛顿(N)
301
+ Tx,Ty,Tz: 牛·米(N·m)
302
+
303
+ Returns:
304
+ bool: 控制成功返回True, 否则返回False
305
+ """
306
+ return self._robot_arm.control_hand_wrench(left_wrench, right_wrench)
307
+
308
+ def arm_reset(self)->bool:
309
+ """手臂归位
310
+
311
+ Returns:
312
+ bool: 如果手臂归位成功返回True,否则返回False。
313
+ """
314
+ return self._robot_arm.arm_reset()
315
+
316
+ def manipulation_mpc_reset(self)->bool:
317
+ """重置机器人手臂。
318
+
319
+ Returns:
320
+ bool: 如果手臂重置成功返回True,否则返回False。
321
+ """
322
+ return self._robot_arm.manipulation_mpc_reset()
323
+
324
+ def control_arm_joint_positions(self, joint_positions:list)->bool:
325
+ """通过关节位置角度控制手臂
326
+
327
+ Args:
328
+ joint_positions (list): 手臂的目标关节位置,单位弧度。
329
+
330
+ Returns:
331
+ bool: 如果手臂控制成功返回True,否则返回False。
332
+
333
+ Raises:
334
+ ValueError: 如果关节位置列表长度不正确。
335
+ ValueError: 如果关节位置超出[-π, π]范围。
336
+ RuntimeError: 如果在尝试控制手臂时机器人不在stance状态。
337
+ """
338
+ if len(joint_positions) != self._robot_info.arm_joint_dof:
339
+ print("The length of the position list must be equal to the number of DOFs of the arm.")
340
+ return False
341
+
342
+ return self._robot_arm.control_arm_joint_positions(joint_positions)
343
+
344
+ def control_arm_joint_trajectory(self, times:list, q_frames:list)->bool:
345
+ """控制机器人手臂的目标轨迹。
346
+
347
+ Args:
348
+ times (list): 时间间隔列表,单位秒。
349
+ q_frames (list): 关节位置列表,单位弧度。
350
+
351
+ Returns:
352
+ bool: 如果控制成功返回True,否则返回False。
353
+
354
+ Raises:
355
+ ValueError: 如果times列表长度不正确。
356
+ ValueError: 如果关节位置列表长度不正确。
357
+ ValueError: 如果关节位置超出[-π, π]范围。
358
+ RuntimeError: 如果在尝试控制手臂时机器人不在stance状态。
359
+
360
+ Warning:
361
+ 异步接口,函数在发送命令后立即返回,用户需要自行等待运动完成。
362
+ """
363
+ return self._robot_arm.control_arm_joint_trajectory(times, q_frames)
364
+
365
+ def control_arm_target_poses(self, times: list, q_frames: list) -> bool:
366
+ """控制机器人手臂目标姿态(已废弃)。
367
+
368
+ .. deprecated::
369
+ 请使用 :meth:`control_arm_joint_trajectory` 替代此函数。
370
+
371
+ Args:
372
+ times (list): 时间间隔列表,单位秒
373
+ q_frames (list): 关节位置列表,单位弧度
374
+
375
+ Returns:
376
+ bool: 控制成功返回True,否则返回False
377
+
378
+ Note:
379
+ 此函数已废弃,请使用 :meth:`control_arm_joint_trajectory` 函数。
380
+ """
381
+ return self._robot_arm.control_arm_target_poses(times, q_frames)
382
+ def set_fixed_arm_mode(self) -> bool:
383
+ """固定/冻结机器人手臂。
384
+
385
+ Returns:
386
+ bool: 如果手臂固定/冻结成功返回True,否则返回False。
387
+ """
388
+ return self._robot_arm.set_fixed_arm_mode()
389
+
390
+ def set_auto_swing_arm_mode(self) -> bool:
391
+ """机器人手臂自动摆动。
392
+
393
+ Returns:
394
+ bool: 如果切换手臂自动摆动模式成功返回True,否则返回False。
395
+ """
396
+ return self._robot_arm.set_auto_swing_arm_mode()
397
+
398
+ def set_external_control_arm_mode(self) -> bool:
399
+ """切换手臂控制模式到外部控制模式。
400
+
401
+ Returns:
402
+ bool: 如果切换手臂控制模式到外部控制模式成功返回True,否则返回False。
403
+ """
404
+ return self._robot_arm.set_external_control_arm_mode()
405
+
406
+ def set_manipulation_mpc_mode(self, ctrl_mode: KuavoManipulationMpcCtrlMode) -> bool:
407
+ """
408
+ 设置 Manipulation MPC 模式。
409
+ Returns:
410
+ bool: 如果 Manipulation MPC 模式设置成功返回True,否则返回False。
411
+ """
412
+ return self._robot_arm.set_manipulation_mpc_mode(ctrl_mode)
413
+
414
+ def set_manipulation_mpc_control_flow(self, control_flow: KuavoManipulationMpcControlFlow) -> bool:
415
+ """
416
+ 设置 Manipulation MPC 控制流。
417
+ Returns:
418
+ bool: 如果 Manipulation MPC 控制流设置成功返回True,否则返回False。
419
+ """
420
+ return self._robot_arm.set_manipulation_mpc_control_flow(control_flow)
421
+
422
+ def set_manipulation_mpc_frame(self, frame: KuavoManipulationMpcFrame) -> bool:
423
+ """
424
+ 设置 Manipulation MPC 坐标系。
425
+ Returns:
426
+ bool: 如果 Manipulation MPC 坐标系设置成功返回True,否则返回False。
427
+ """
428
+ return self._robot_arm.set_manipulation_mpc_frame(frame)
429
+
430
+ """ Arm Forward kinematics && Arm Inverse kinematics """
431
+ def arm_ik(self,
432
+ left_pose: KuavoPose,
433
+ right_pose: KuavoPose,
434
+ left_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
435
+ right_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
436
+ arm_q0: list = None,
437
+ params: KuavoIKParams=None) -> list:
438
+ """机器人手臂逆向运动学求解
439
+
440
+ Args:
441
+ left_pose (KuavoPose): 左手臂目标姿态,包含xyz位置和四元数方向
442
+ right_pose (KuavoPose): 右手臂目标姿态,包含xyz位置和四元数方向
443
+ left_elbow_pos_xyz (list): 左肘部位置。如果为[0.0, 0.0, 0.0],则忽略
444
+ right_elbow_pos_xyz (list): 右肘部位置。如果为[0.0, 0.0, 0.0],则忽略
445
+ arm_q0 (list, optional): 初始关节位置,单位为弧度。如果为None,则忽略
446
+ params (KuavoIKParams, optional): 逆向运动学参数。如果为None,则忽略,包含:
447
+ - major_optimality_tol: 主要最优性容差 \n
448
+ - major_feasibility_tol: 主要可行性容差 \n
449
+ - minor_feasibility_tol: 次要可行性容差 \n
450
+ - major_iterations_limit: 主要迭代次数限制 \n
451
+ - oritation_constraint_tol: 方向约束容差 \n
452
+ - pos_constraint_tol: 位置约束容差,当pos_cost_weight==0.0时生效 \n
453
+ - pos_cost_weight: 位置代价权重。设为0.0可获得高精度 \n
454
+
455
+ Returns:
456
+ list: 关节位置列表,单位为弧度。如果计算失败返回None
457
+
458
+ Warning:
459
+ 此函数需要在初始化SDK时设置 :attr:`KuavoSDK.Options.WithIK` 选项。
460
+ """
461
+ return self._robot_arm.arm_ik(left_pose, right_pose, left_elbow_pos_xyz, right_elbow_pos_xyz, arm_q0, params)
462
+ def arm_ik_free(self,
463
+ left_pose: KuavoPose,
464
+ right_pose: KuavoPose,
465
+ left_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
466
+ right_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
467
+ arm_q0: list = None,
468
+ params: KuavoIKParams=None) -> list:
469
+ """Inverse kinematics for the robot arm.
470
+ """
471
+ return self._robot_arm.arm_ik_free(left_pose, right_pose, left_elbow_pos_xyz, right_elbow_pos_xyz, arm_q0, params)
472
+
473
+ def arm_fk(self, q: list) -> Tuple[KuavoPose, KuavoPose]:
474
+ """机器人手臂的正运动学求解
475
+
476
+ Args:
477
+ q (list): 关节位置列表,单位弧度。
478
+
479
+ Returns:
480
+ Tuple[KuavoPose, KuavoPose]: 左手臂和右手臂的位姿元组,
481
+ 如果正运动学失败则返回(None, None)。
482
+
483
+ Warning:
484
+ 此函数需要使用 :attr:`KuavoSDK.Options.WithIK` 选项初始化SDK。
485
+ """
486
+ return self._robot_arm.arm_fk(q)
487
+
488
+ def control_robot_end_effector_pose(self, left_pose: KuavoPose, right_pose: KuavoPose, frame: KuavoManipulationMpcFrame)->bool:
489
+ """通过手臂末端执行器的位姿控制机器人手臂
490
+
491
+ Args:
492
+ left_pose (KuavoPose): 左手臂的位姿,包含xyz和四元数。
493
+ right_pose (KuavoPose): 右手臂的位姿,包含xyz和四元数。
494
+ frame (KuavoManipulationMpcFrame): 手臂的坐标系。
495
+
496
+ Returns:
497
+ bool: 如果控制成功返回True,否则返回False。
498
+ """
499
+ return self._robot_arm.control_robot_end_effector_pose(left_pose, right_pose, frame)
500
+
501
+ def change_motor_param(self, motor_param:list)->Tuple[bool, str]:
502
+ """更改电机参数
503
+
504
+ Args:
505
+ motor_param (list): :class:`kuavo_humanoid_sdk.interfaces.data_types.KuavoMotorParam` 对象列表,包含:
506
+ - Kp (float): 位置控制比例增益
507
+ - Kd (float): 速度控制微分增益
508
+ - id (int): 电机ID
509
+ Returns:
510
+ Tuple[bool, str]: 成功标志和消息的元组
511
+ """
512
+ return self._kuavo_core.change_motor_param(motor_param)
513
+
514
+ def get_motor_param(self)->Tuple[bool, list]:
515
+ """获取电机参数
516
+
517
+ Returns:
518
+ Tuple[bool, list]: 成功标志和 :class:`kuavo_humanoid_sdk.interfaces.data_types.KuavoMotorParam` 对象列表的元组
519
+ """
520
+ return self._kuavo_core.get_motor_param()
521
+
522
+ def enable_base_pitch_limit(self, enable: bool) -> Tuple[bool, str]:
523
+ """开启/关闭机器人 basePitch 限制
524
+
525
+ Note:
526
+ 该接口用于关闭或开启机器人 basePitch 保护功能,关闭状态下可以进行比较大幅度的前后倾动作而不会触发保护导致摔倒。
527
+
528
+ Args:
529
+ enable (bool): 开启/关闭
530
+ """
531
+ return self._kuavo_core.enable_base_pitch_limit(enable)
532
+
533
+ def is_arm_collision(self)->bool:
534
+ """判断当前是否发生碰撞
535
+
536
+ Returns:
537
+ bool: 发生碰撞返回True,否则返回False
538
+ """
539
+ return self._robot_arm.is_arm_collision()
540
+
541
+ def wait_arm_collision_complete(self):
542
+ """等待碰撞完成
543
+ """
544
+ self._robot_arm.wait_arm_collision_complete()
545
+
546
+ def release_arm_collision_mode(self):
547
+ """释放碰撞模式
548
+ """
549
+ self._robot_arm.release_arm_collision_mode()
550
+
551
+ def set_arm_collision_mode(self, enable: bool):
552
+ """设置碰撞模式
553
+ """
554
+ self._robot_arm.set_arm_collision_mode(enable)
555
+
556
+ if __name__ == "__main__":
557
+ robot = KuavoRobot()
558
+ robot.set_manipulation_mpc_mode(KuavoManipulationMpcCtrlMode.ArmOnly)
559
+ robot.set_manipulation_mpc_control_flow(KuavoManipulationMpcControlFlow.DirectToWbc)
560
+ robot.set_manipulation_mpc_frame(KuavoManipulationMpcFrame.WorldFrame)
561
+ robot.control_robot_end_effector_pose(KuavoPose(position=[0.3, 0.4, 0.9], orientation=[0.0, 0.0, 0.0, 1.0]), KuavoPose(position=[0.3, -0.5, 1.0], orientation=[0.0, 0.0, 0.0, 1.0]), KuavoManipulationMpcFrame.WorldFrame)