kuavo-humanoid-sdk 1.2.0__20250714105223-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 (132) 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/_Metadata.py +199 -0
  41. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +112 -0
  42. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +323 -0
  43. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +44 -0
  44. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +160 -0
  45. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +168 -0
  46. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +151 -0
  47. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +178 -0
  48. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +229 -0
  49. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +256 -0
  50. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +227 -0
  51. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +123 -0
  52. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
  53. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
  54. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +258 -0
  55. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +147 -0
  56. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +218 -0
  57. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +149 -0
  58. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +136 -0
  59. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +145 -0
  60. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +171 -0
  61. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +140 -0
  62. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +165 -0
  63. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +201 -0
  64. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +390 -0
  65. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +205 -0
  66. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +320 -0
  67. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +341 -0
  68. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +122 -0
  69. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -0
  70. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_questJoySticks.py +191 -0
  71. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +121 -0
  72. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +177 -0
  73. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +225 -0
  74. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +128 -0
  75. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +222 -0
  76. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +495 -0
  77. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
  78. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
  79. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +272 -0
  80. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +315 -0
  81. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +251 -0
  82. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +168 -0
  83. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
  84. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
  85. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
  86. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
  87. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +28 -0
  88. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +275 -0
  89. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +236 -0
  90. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +299 -0
  91. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +274 -0
  92. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +408 -0
  93. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +304 -0
  94. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +394 -0
  95. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +409 -0
  96. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +339 -0
  97. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +257 -0
  98. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +418 -0
  99. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +253 -0
  100. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +299 -0
  101. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +330 -0
  102. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
  103. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +421 -0
  104. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +490 -0
  105. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +268 -0
  106. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +304 -0
  107. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +273 -0
  108. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +283 -0
  109. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +275 -0
  110. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +444 -0
  111. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +662 -0
  112. kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +7 -0
  113. kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +7 -0
  114. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +12 -0
  115. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +142 -0
  116. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +121 -0
  117. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +148 -0
  118. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +150 -0
  119. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +666 -0
  120. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +122 -0
  121. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +209 -0
  122. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +140 -0
  123. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +886 -0
  124. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +122 -0
  125. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +239 -0
  126. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +148 -0
  127. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +1 -0
  128. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +376 -0
  129. kuavo_humanoid_sdk-1.2.0.dist-info/METADATA +291 -0
  130. kuavo_humanoid_sdk-1.2.0.dist-info/RECORD +132 -0
  131. kuavo_humanoid_sdk-1.2.0.dist-info/WHEEL +6 -0
  132. kuavo_humanoid_sdk-1.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ from kuavo_humanoid_sdk.kuavo.core.audio import KuavoRobotAudioCore
4
+
5
+ class KuavoRobotAudio:
6
+ """Kuavo 机器人音频系统接口,用于控制音频播放功能。
7
+
8
+ 提供音乐文件播放功能。
9
+ """
10
+
11
+ def __init__(self):
12
+ """初始化音频系统。"""
13
+ self.audio = KuavoRobotAudioCore()
14
+
15
+ def play_audio(self, file_name: str, volume: int = 100, speed: float = 1.0) -> bool:
16
+ """播放指定的音频文件。
17
+
18
+ Args:
19
+ file_name (str): 要播放的音频文件名
20
+
21
+ Returns:
22
+ bool: 如果播放请求成功发送返回True,否则返回False
23
+ """
24
+ return self.audio.play_audio(file_name, volume, speed)
25
+
26
+ def stop_music(self):
27
+ """停止当前正在播放的音频。"""
28
+ return self.audio.stop_music()
29
+
30
+ def text_to_speech(self, text: str, volume: float = 0.5) -> bool:
31
+ """将指定文本合成并播放。
32
+
33
+ Args:
34
+ text (str): 要播放的文本
35
+
36
+ Returns:
37
+ bool: 如果播放请求成功发送返回True,否则返回False
38
+ """
39
+ return self.audio.text_to_speech(text, volume)
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ import math
4
+ from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
5
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
6
+
7
+ class KuavoRobotHead:
8
+ """机器人头部控制类"""
9
+ def __init__(self):
10
+ self._kuavo_core = KuavoRobotCore()
11
+
12
+ def control_head(self, yaw: float, pitch: float)->bool:
13
+ """控制机器人头部。
14
+
15
+ Args:
16
+ yaw (float): 头部偏航角,单位为弧度,范围 [-1.396, 1.396] (-80度 到 80度)。
17
+ pitch (float): 头部俯仰角,单位为弧度,范围 [-0.436, 0.436] (-25度 到 25度)。
18
+
19
+ Returns:
20
+ bool: 如果控制成功返回True,否则返回False。
21
+ """
22
+ # Check yaw limits (-80 to 80 degrees)
23
+ if yaw < -math.pi*4/9 or yaw > math.pi*4/9: # -80 to 80 degrees in radians
24
+ SDKLogger.warn(f"[Robot] yaw {yaw} exceeds limit [-{math.pi*4/9:.3f}, {math.pi*4/9:.3f}] radians (-80 to 80 degrees), will be limited")
25
+ limited_yaw = min(math.pi*4/9, max(-math.pi*4/9, yaw))
26
+
27
+ # Check pitch limits (-25 to 25 degrees)
28
+ if pitch < -math.pi/7.2 or pitch > math.pi/7.2: # -25 to 25 degrees in radians
29
+ SDKLogger.warn(f"[Robot] pitch {pitch} exceeds limit [-{math.pi/7.2:.3f}, {math.pi/7.2:.3f}] radians (-25 to 25 degrees), will be limited")
30
+ limited_pitch = min(math.pi/7.2, max(-math.pi/7.2, pitch))
31
+ return self._kuavo_core.control_robot_head(yaw=limited_yaw, pitch=limited_pitch)
32
+
33
+ def enable_head_tracking(self, target_id: int)->bool:
34
+ """启用头部跟踪功能,在机器人运动过程中,头部将始终追踪指定的 Apriltag ID
35
+
36
+ Args:
37
+ target_id (int): 目标ID。
38
+
39
+ Returns:
40
+ bool: 如果启用成功返回True,否则返回False。
41
+ """
42
+ return self._kuavo_core.enable_head_tracking(target_id)
43
+
44
+ def disable_head_tracking(self)->bool:
45
+ """禁用头部跟踪功能。
46
+
47
+ Returns:
48
+ bool: 如果禁用成功返回True,否则返回False。
49
+ """
50
+ return self._kuavo_core.disable_head_tracking()
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ from typing import Tuple
4
+ from kuavo_humanoid_sdk.interfaces.robot_info import RobotInfoBase
5
+ from kuavo_humanoid_sdk.kuavo.core.ros.param import RosParameter, make_robot_param
6
+
7
+ class KuavoRobotInfo(RobotInfoBase):
8
+ def __init__(self, robot_type: str = "kuavo"):
9
+ super().__init__(robot_type=robot_type)
10
+
11
+ # Load robot parameters from ROS parameter server
12
+ kuavo_ros_param = make_robot_param()
13
+ self._ros_param = RosParameter()
14
+
15
+ self._robot_version = kuavo_ros_param['robot_version']
16
+ self._end_effector_type = kuavo_ros_param['end_effector_type']
17
+ self._arm_joint_dof = kuavo_ros_param['arm_dof']
18
+ self._joint_dof = kuavo_ros_param['arm_dof'] + kuavo_ros_param['leg_dof'] + kuavo_ros_param['head_dof']
19
+ self._joint_names = kuavo_ros_param['joint_names']
20
+ self._end_frames_names = kuavo_ros_param['end_frames_names']
21
+ self._head_joint_dof = kuavo_ros_param['head_dof']
22
+ self._head_joint_names = self._joint_names[-2:]
23
+ self._arm_joint_names = self._joint_names[12:self._arm_joint_dof + 12]
24
+ @property
25
+ def robot_version(self) -> str:
26
+ """返回 Kuavo 机器人的版本。
27
+
28
+ Returns:
29
+ str: 机器人版本号,例如 "42"、"45" 等。
30
+ """
31
+ return self._robot_version
32
+
33
+ @property
34
+ def end_effector_type(self) -> str:
35
+ """返回 Kuavo 机器人末端执行器的类型。
36
+
37
+ Returns:
38
+ str: 末端执行器类型,其中:
39
+ - ``qiangnao`` 表示普通灵巧手
40
+ - ``lejuclaw`` 表示乐聚二指夹爪
41
+ - ``qiangnao_touch`` 表示触觉灵巧手
42
+ - ...
43
+ """
44
+ return self._end_effector_type
45
+
46
+ @property
47
+ def joint_names(self) -> list:
48
+ """返回 Kuavo 机器人所有关节的名称。
49
+
50
+ Returns:
51
+ list: 包含所有关节名称的列表。
52
+ """
53
+ return self._joint_names
54
+
55
+ @property
56
+ def joint_dof(self) -> int:
57
+ """返回 Kuavo 机器人的总关节数。
58
+
59
+ Returns:
60
+ int: 总关节数,例如 28。
61
+ """
62
+ return self._joint_dof
63
+
64
+ @property
65
+ def arm_joint_dof(self) -> int:
66
+ """返回 Kuavo 机器人双臂的关节数。
67
+
68
+ Returns:
69
+ int: 双臂的关节数,例如 14。
70
+ """
71
+ return self._arm_joint_dof
72
+
73
+ @property
74
+ def arm_joint_names(self) -> list:
75
+ """返回 Kuavo 机器人双臂关节的名称。
76
+
77
+ Returns:
78
+ list: 包含双臂关节名称的列表。
79
+ """
80
+ return self._arm_joint_names
81
+
82
+ @property
83
+ def head_joint_dof(self) -> int:
84
+ """返回 Kuavo 机器人头部的关节数。
85
+
86
+ Returns:
87
+ int: 头部的关节数,例如 2。
88
+ """
89
+ return self._head_joint_dof
90
+
91
+ @property
92
+ def head_joint_names(self) -> list:
93
+ """返回 Kuavo 机器人头部关节的名称。
94
+
95
+ Returns:
96
+ list: 包含头部关节名称的列表。
97
+ """
98
+ return self._head_joint_names
99
+
100
+ @property
101
+ def eef_frame_names(self) -> Tuple[str, str]:
102
+ """返回 Kuavo 机器人末端执行器坐标系的名称。
103
+
104
+ Returns:
105
+ Tuple[str, str]: 包含末端执行器坐标系名称的元组,其中:\n
106
+ - 第一个元素是左手坐标系名称\n
107
+ - 第二个元素是右手坐标系名称\n
108
+ 例如 ("zarm_l7_link", "zarm_r7_link") \n
109
+ """
110
+ return self._end_frames_names[1], self._end_frames_names[2]
111
+
112
+ def __str__(self) -> str:
113
+ return f"KuavoRobotInfo(robot_type={self.robot_type}, robot_version={self.robot_version}, end_effector_type={self.end_effector_type}, joint_names={self.joint_names}, joint_dof={self.joint_dof}, arm_joint_dof={self.arm_joint_dof})"
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ from kuavo_humanoid_sdk.interfaces.data_types import (
4
+ KuavoJointCommand, KuavoTwist)
5
+ from kuavo_humanoid_sdk.kuavo.core.ros.observation import KuavoRobotObservationCore
6
+
7
+ class KuavoRobotObservation:
8
+ """用于访问机器人观测数据的类。
9
+
10
+ 该类提供了一个高级接口来访问机器人的观测数据,包括关节命令、速度命令和姿态命令。
11
+ """
12
+
13
+ def __init__(self, robot_type: str = "kuavo"):
14
+ """初始化机器人观测接口
15
+
16
+ Args:
17
+ robot_type (str): 机器人类型。默认为"kuavo"
18
+ """
19
+ self._obs_core = KuavoRobotObservationCore()
20
+
21
+ @property
22
+ def joint_command(self) -> KuavoJointCommand:
23
+ """获取当前关节控制命令
24
+
25
+ Returns:
26
+ KuavoJointCommand: 包含所有机器人关节的位置、速度和力矩命令的对象。
27
+ """
28
+ return self._obs_core.joint_command
29
+
30
+ @property
31
+ def cmd_vel(self) -> KuavoTwist:
32
+ """获取当前 cmd_vel 速度控制命令
33
+
34
+ Returns:
35
+ KuavoTwist: 包含线速度(m/s)和角速度(rad/s)命令的对象。
36
+ """
37
+ return self._obs_core.cmd_vel
38
+
39
+ @property
40
+ def cmd_pose(self) -> KuavoTwist:
41
+ """获取当前 cmd_pose 姿态控制命令
42
+
43
+ Returns:
44
+ KuavoTwist: 包含线性姿态命令(m)和角度姿态命令(rad)的对象。
45
+ """
46
+ return self._obs_core.cmd_pose
47
+
48
+ @property
49
+ def arm_position_command(self) -> list:
50
+ """获取手臂关节的位置控制命令
51
+
52
+ Returns:
53
+ list: 手臂关节(索引12-25)的位置命令,单位为弧度。
54
+ """
55
+ return self._obs_core.arm_position_command
56
+
57
+ @property
58
+ def head_position_command(self) -> list:
59
+ """获取头部关节的位置控制命令
60
+
61
+ Returns:
62
+ list: 头部关节(索引26-27)的位置命令,单位为弧度。
63
+ """
64
+ return self._obs_core.head_position_command
@@ -0,0 +1,299 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ import time
4
+ import copy
5
+ from typing import Tuple
6
+ from kuavo_humanoid_sdk.interfaces.data_types import (
7
+ KuavoImuData, KuavoJointData, KuavoOdometry, KuavoArmCtrlMode,EndEffectorState,
8
+ KuavoManipulationMpcControlFlow, KuavoManipulationMpcCtrlMode, KuavoManipulationMpcFrame)
9
+ from kuavo_humanoid_sdk.kuavo.core.ros.state import KuavoRobotStateCore
10
+
11
+ class KuavoRobotState:
12
+ def __init__(self, robot_type: str = "kuavo"):
13
+ self._rs_core = KuavoRobotStateCore()
14
+
15
+ @property
16
+ def imu_data(self) -> KuavoImuData:
17
+ """获取 Kuavo 机器人IMU数据。
18
+
19
+ 获取机器人当前的 IMU 传感器数据,包括陀螺仪、加速度计、自由加速度和方向四元数测量值。
20
+
21
+ Returns:
22
+ :class:`KuavoImuData`: IMU数据包含:
23
+ * gyro (:obj:`tuple` of :obj:`float`): 陀螺仪测量值 (x, y, z),单位rad/s
24
+ * acc (:obj:`tuple` of :obj:`float`): 加速度计测量值 (x, y, z),单位m/s^2
25
+ * free_acc (:obj:`tuple` of :obj:`float`): 自由加速度 (x, y, z),单位m/s^2
26
+ * quat (:obj:`tuple` of :obj:`float`): 方向四元数 (x, y, z, w)
27
+ """
28
+ return self._rs_core.imu_data
29
+
30
+ @property
31
+ def joint_state(self) -> KuavoJointData:
32
+ """获取 Kuavo 机器人关节数据。
33
+
34
+ 获取机器人关节数据,包括关节位置、速度、扭矩和加速度。
35
+
36
+ 数据包括:
37
+ - 关节位置(角度),单位为弧度
38
+ - 关节速度,单位为弧度/秒
39
+ - 关节扭矩/力矩,单位为牛顿米、安培
40
+ - 关节加速度
41
+
42
+ Returns:
43
+ KuavoJointData: 包含以下关节状态数据的字典:
44
+ * position (list[float]): 关节位置,长度 = joint_dof(28)
45
+ * velocity (list[float]): 关节速度,长度 = joint_dof(28)
46
+ * torque (list[float]): 关节扭矩,长度 = joint_dof(28)
47
+ * acceleration (list[float]): 关节加速度,长度 = joint_dof(28)
48
+ """
49
+ return self._rs_core.joint_data
50
+
51
+ @property
52
+ def com_height(self)->float:
53
+ """获取机器人质心高度。
54
+
55
+ Returns:
56
+ float: 机器人质心高度,单位为米。
57
+ """
58
+ return self._rs_core.com_height
59
+
60
+ @property
61
+ def odometry(self) -> KuavoOdometry:
62
+ """获取 Kuavo 机器人里程计数据。
63
+
64
+ 获取机器人当前的里程计数据,包括位置、方向、线速度和角速度测量值。
65
+
66
+ Returns:
67
+ KuavoOdometry: 包含以下里程计数据的字典:
68
+ * position (tuple): 位置 (x, y, z),单位为米
69
+ * orientation (tuple): 方向四元数 (x, y, z, w)
70
+ * linear (tuple): 线速度 (x, y, z),单位为m/s
71
+ * angular (tuple): 角速度 (x, y, z),单位为rad/s
72
+ """
73
+ return self._rs_core.odom_data
74
+
75
+
76
+ def robot_position(self) -> Tuple[float, float, float]:
77
+ """返回 Kuavo 机器人在世界坐标系中的位置。
78
+
79
+ Returns:
80
+ Tuple[float, float, float]: 位置 (x, y, z),单位为米。
81
+ """
82
+ return tuple(self._rs_core.odom_data.position)
83
+
84
+ def robot_orientation(self) -> Tuple[float, float, float, float]:
85
+ """返回 Kuavo 机器人在世界坐标系中的方向。
86
+
87
+ Returns:
88
+ Tuple[float, float, float, float]: 方向四元数 (x, y, z, w)。
89
+ """
90
+ return tuple(self._rs_core.odom_data.orientation)
91
+
92
+ def linear_velocity(self) -> Tuple[float, float, float]:
93
+ """返回 Kuavo 机器人在世界坐标系中的线速度。
94
+
95
+ Returns:
96
+ Tuple[float, float, float]: 线速度 (x, y, z),单位为m/s。
97
+ """
98
+ return tuple(self._rs_core.odom_data.linear)
99
+
100
+
101
+ def angular_velocity(self) -> Tuple[float, float, float]:
102
+ """返回 Kuavo 机器人在世界坐标系中的角速度。
103
+
104
+ Returns:
105
+ Tuple[float, float, float]: 角速度 (x, y, z)。
106
+ """
107
+ return tuple(self._rs_core.odom_data.angular)
108
+
109
+ def arm_joint_state(self) -> KuavoJointData:
110
+ """获取 Kuavo 机器人手臂关节的当前状态。
111
+
112
+ 获取 Kuavo 机器人手臂关节的当前状态,包括:
113
+ - 关节位置(角度),单位为弧度
114
+ - 关节速度,单位为弧度/秒
115
+ - 关节扭矩/力矩,单位为牛顿米、安培
116
+ - 关节加速度
117
+
118
+ Returns:
119
+ KuavoJointData: 手臂关节数据包含:
120
+ * position: list[float] * arm_dof(14)
121
+ * velocity: list[float] * arm_dof(14)
122
+ * torque: list[float] * arm_dof(14)
123
+ * acceleration: list[float] * arm_dof(14)
124
+ """
125
+ # Get arm joint states from index 12 to 25 (14 arm joints)
126
+ arm_joint_indices = range(12, 12+14)
127
+ return KuavoJointData(
128
+ position=[self._rs_core.joint_data.position[i] for i in arm_joint_indices],
129
+ velocity=[self._rs_core.joint_data.velocity[i] for i in arm_joint_indices],
130
+ torque=[self._rs_core.joint_data.torque[i] for i in arm_joint_indices],
131
+ acceleration=[self._rs_core.joint_data.acceleration[i] for i in arm_joint_indices]
132
+ )
133
+
134
+ def arm_control_mode(self) -> KuavoArmCtrlMode:
135
+ """获取 Kuavo 机器人手臂的当前控制模式。
136
+
137
+ Returns:
138
+ KuavoArmCtrlMode: 当前手臂控制模式:
139
+ * ArmFixed: 0 - 机器人手臂处于固定位置。
140
+ * AutoSwing: 1 - 机器人手臂处于自动摆动模式。
141
+ * ExternalControl: 2 - 机器人手臂由外部控制。
142
+ * None - 机器人手臂处于未知状态。
143
+ """
144
+ return KuavoArmCtrlMode(self._rs_core.arm_control_mode)
145
+
146
+ def manipulation_mpc_ctrl_mode(self) -> KuavoManipulationMpcCtrlMode:
147
+ """获取 Kuavo 机器人 Manipulation MPC 的当前控制模式。
148
+
149
+ Returns:
150
+ KuavoManipulationMpcCtrlMode: 当前 Manipulation MPC 控制模式。
151
+ """
152
+ return self._rs_core.manipulation_mpc_ctrl_mode
153
+
154
+ def manipulation_mpc_control_flow(self) -> KuavoManipulationMpcControlFlow:
155
+ """获取 Kuavo 机器人 Manipulation MPC 的当前控制流。
156
+
157
+ Returns:
158
+ KuavoManipulationMpcControlFlow: 当前 Manipulation MPC 控制流。
159
+ """
160
+ return self._rs_core.manipulation_mpc_control_flow
161
+
162
+ def manipulation_mpc_frame(self) -> KuavoManipulationMpcFrame:
163
+ """获取机器人操作MPC的当前帧。
164
+
165
+ Returns:
166
+ KuavoManipulationMpcFrame: 末端执行器 Manipulation MPC 坐标系
167
+ """
168
+ return self._rs_core.manipulation_mpc_frame
169
+
170
+ def head_joint_state(self) -> KuavoJointData:
171
+ """获取机器人头部关节的当前状态。
172
+
173
+ 获取机器人头部关节的当前状态数据,包括位置、速度、扭矩和加速度值。
174
+
175
+ Returns:
176
+ KuavoJointData: 包含头部关节状态的数据结构:
177
+ * position (list[float]): 关节位置,单位为弧度,长度=head_dof(2)
178
+ * velocity (list[float]): 关节速度,单位为rad/s,长度=head_dof(2)
179
+ * torque (list[float]): 关节扭矩,单位为Nm,长度=head_dof(2)
180
+ * acceleration (list[float]): 关节加速度,单位为rad/s^2,长度=head_dof(2)
181
+
182
+ 关节顺序为 [偏航角, 俯仰角]。
183
+ """
184
+ # Get head joint states from last 2 indices
185
+ head_joint_indices = range(len(self._rs_core.joint_data.position)-2, len(self._rs_core.joint_data.position))
186
+ return KuavoJointData(
187
+ position=[self._rs_core.joint_data.position[i] for i in head_joint_indices],
188
+ velocity=[self._rs_core.joint_data.velocity[i] for i in head_joint_indices],
189
+ torque=[self._rs_core.joint_data.torque[i] for i in head_joint_indices],
190
+ acceleration=[self._rs_core.joint_data.acceleration[i] for i in head_joint_indices]
191
+ )
192
+
193
+ def eef_state(self)->Tuple[EndEffectorState, EndEffectorState]:
194
+ """获取机器人末端执行器的当前状态。
195
+
196
+ Returns:
197
+ Tuple[EndEffectorState, EndEffectorState]: 包含左右末端执行器状态的元组。
198
+ 每个EndEffectorState包含:
199
+ - position: (float, float, float) ,XYZ位置,单位为米
200
+ - orientation: (float, float, float, float) ,四元数方向
201
+ - state: EndEffectorState.GraspingState ,当前抓取状态 (UNKNOWN, OPEN, CLOSED)
202
+ """
203
+ return copy.deepcopy(self._rs_core.eef_state)
204
+
205
+ def gait_name(self)->str:
206
+ """获取机器人的当前步态名称。
207
+
208
+ Returns:
209
+ str: 当前步态的名称,例如 'trot'、'walk'、'stance'、'custom_gait'。
210
+ """
211
+ return self._rs_core.gait_name()
212
+
213
+
214
+ def is_stance(self) -> bool:
215
+ """检查机器人当前是否处于站立模式。
216
+
217
+ Returns:
218
+ bool: 如果机器人处于站立模式返回True,否则返回False。
219
+ """
220
+ return self._rs_core.is_gait('stance')
221
+
222
+ def is_walk(self) -> bool:
223
+ """检查机器人当前是否处于行走模式。
224
+
225
+ Returns:
226
+ bool: 如果机器人处于行走模式返回True,否则返回False。
227
+ """
228
+ return self._rs_core.is_gait('walk')
229
+
230
+ def is_step_control(self) -> bool:
231
+ """检查机器人当前是否处于单步控制模式。
232
+
233
+ Returns:
234
+ bool: 如果机器人处于单步控制模式返回True,否则返回False。
235
+ """
236
+ return self._rs_core.is_gait('custom_gait')
237
+
238
+ def wait_for_stance(self, timeout:float=5.0)->bool:
239
+ """等待机器人进入站立模式。
240
+
241
+ Args:
242
+ timeout (float): 等待机器人进入站立状态的最长时间,单位为秒。
243
+
244
+ Returns:
245
+ bool: 如果机器人在指定超时时间内进入站立状态返回True,否则返回False。
246
+ """
247
+ wait_time = 0
248
+ while not self._rs_core.is_gait('stance') and wait_time < timeout:
249
+ time.sleep(0.1)
250
+ wait_time += 0.1
251
+ return self._rs_core.is_gait('stance')
252
+
253
+ def wait_for_trot(self, timeout:float=5.0)->bool:
254
+ """等待机器人进入踏步状态。
255
+
256
+ Args:
257
+ timeout (float): 等待机器人进入踏步状态的最长时间,单位为秒。
258
+
259
+ Returns:
260
+ bool: 如果机器人在指定超时时间内进入踏步状态返回True,否则返回False。
261
+ """
262
+ return self.wait_for_walk(timeout=timeout)
263
+
264
+ def wait_for_walk(self, timeout:float=5.0)->bool:
265
+ """等待机器人进入行走模式。
266
+
267
+ Args:
268
+ timeout (float): 等待机器人进入行走状态的最长时间,单位为秒。
269
+
270
+ Returns:
271
+ bool: 如果机器人在指定超时时间内进入行走状态返回True,否则返回False。
272
+ """
273
+ wait_time = 0
274
+ while not self._rs_core.is_gait('walk') and wait_time < timeout:
275
+ time.sleep(0.1)
276
+ wait_time += 0.1
277
+ return self._rs_core.is_gait('walk')
278
+
279
+ def wait_for_step_control(self, timeout:float=5.0)->bool:
280
+ """等待机器人进入单步控制模式。
281
+
282
+ Args:
283
+ timeout (float): 等待机器人进入单步控制模式的最长时间,单位为秒。
284
+
285
+ Returns:
286
+ bool: 如果机器人在指定超时时间内进入单步控制模式返回True,否则返回False。
287
+ """
288
+ wait_time = 0
289
+ while not self._rs_core.is_gait('custom_gait') and wait_time < timeout:
290
+ time.sleep(0.1)
291
+ wait_time += 0.1
292
+ return self._rs_core.is_gait('custom_gait')
293
+
294
+ # if __name__ == "__main__":
295
+ # state = KuavoRobotState()
296
+ # print(state.manipulation_mpc_frame())
297
+ # print(state.manipulation_mpc_control_flow())
298
+ # print(state.manipulation_mpc_ctrl_mode())
299
+ # print(state.arm_control_mode())
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env python3
2
+ # coding: utf-8
3
+ import math
4
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
5
+ from kuavo_humanoid_sdk.interfaces.data_types import (PoseQuaternion, HomogeneousMatrix)
6
+ from kuavo_humanoid_sdk.kuavo.core.ros.tools import KuavoRobotToolsCore
7
+ from typing import Union, Tuple
8
+
9
+ class KuavoRobotTools:
10
+ """机器人工具类,提供坐标系转换接口。
11
+
12
+ 该类封装了不同机器人坐标系之间的坐标变换查询功能,支持多种返回数据格式。
13
+ """
14
+
15
+ def __init__(self):
16
+ self.tools_core = KuavoRobotToolsCore()
17
+
18
+ def get_tf_transform(self, target_frame: str, source_frame: str,
19
+ return_type: str = "pose_quaternion") -> Union[PoseQuaternion, HomogeneousMatrix, None]:
20
+ """获取指定坐标系之间的变换。
21
+
22
+ Args:
23
+ target_frame (str): 目标坐标系名称
24
+ source_frame (str): 源坐标系名称
25
+ return_type (str, optional): 返回数据格式类型。有效值: \n
26
+ - "pose_quaternion" : 四元数姿态格式, \n
27
+ - "homogeneous" : 齐次矩阵格式。默认为"pose_quaternion"。\n
28
+
29
+ Returns:
30
+ Union[PoseQuaternion, HomogeneousMatrix, None]:
31
+ 指定格式的变换数据,如果失败则返回None
32
+
33
+ Raises:
34
+ ValueError: 如果提供了无效的 return_type
35
+ """
36
+ return self.tools_core._get_tf_tree_transform(target_frame, source_frame, return_type=return_type)
37
+
38
+ def get_base_to_odom(self, return_type: str = "pose_quaternion") -> Union[PoseQuaternion, HomogeneousMatrix, None]:
39
+ """获取从base_link到odom坐标系的变换。
40
+
41
+ Args:
42
+ return_type (str, optional): 返回格式类型。与get_tf_transform相同,默认为"pose_quaternion"。
43
+
44
+ Returns:
45
+ Union[PoseQuaternion, HomogeneousMatrix, None]: 变换数据或 None
46
+ """
47
+ return self.get_tf_transform("odom", "base_link", return_type)
48
+
49
+ def get_camera_to_base(self, return_type: str = "homogeneous") -> Union[PoseQuaternion, HomogeneousMatrix, None]:
50
+ """获取从camera_link到base_link坐标系的变换。
51
+
52
+ Args:
53
+ return_type (str, optional): 返回格式类型。与get_tf_transform相同,默认为"homogeneous"。
54
+
55
+ Returns:
56
+ Union[PoseQuaternion, HomogeneousMatrix, None]: 变换数据或None
57
+ """
58
+ return self.get_tf_transform("base_link", "camera_link", return_type)
59
+
60
+ def get_link_position(self, link_name: str, reference_frame: str = "base_link") -> Union[Tuple[float, float, float], None]:
61
+ """获取指定机械臂关节链接的位置
62
+
63
+ Args:
64
+ link_name (str): 关节链接名称,如"zarm_l1_link"
65
+ reference_frame (str): 参考坐标系,默认为base_link
66
+
67
+ Returns:
68
+ Tuple[float, float, float] | None: 三维位置坐标(x,y,z),失败返回None
69
+ """
70
+ try:
71
+ # 获取从参考坐标系到目标链接的变换
72
+ transform = self.tools_core._get_tf_tree_transform(
73
+ reference_frame,
74
+ link_name,
75
+ return_type="pose_quaternion"
76
+ )
77
+ if transform:
78
+ return transform.position
79
+ return None
80
+ except Exception as e:
81
+ SDKLogger.error(f"获取{link_name}位置失败: {str(e)}")
82
+ return None