kuavo-humanoid-sdk 1.2.1b3319__20250917064014-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 +288 -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 +16 -0
- kuavo_humanoid_sdk/kuavo/core/audio.py +32 -0
- kuavo_humanoid_sdk/kuavo/core/core.py +666 -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/llm_doubao.py +608 -0
- kuavo_humanoid_sdk/kuavo/core/microphone.py +192 -0
- kuavo_humanoid_sdk/kuavo/core/navigation.py +70 -0
- kuavo_humanoid_sdk/kuavo/core/ros/audio.py +110 -0
- kuavo_humanoid_sdk/kuavo/core/ros/camera.py +105 -0
- kuavo_humanoid_sdk/kuavo/core/ros/control.py +1524 -0
- kuavo_humanoid_sdk/kuavo/core/ros/microphone.py +38 -0
- kuavo_humanoid_sdk/kuavo/core/ros/navigation.py +217 -0
- kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
- kuavo_humanoid_sdk/kuavo/core/ros/param.py +201 -0
- kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
- kuavo_humanoid_sdk/kuavo/core/ros/state.py +652 -0
- kuavo_humanoid_sdk/kuavo/core/ros/tools.py +220 -0
- kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
- kuavo_humanoid_sdk/kuavo/core/ros_env.py +238 -0
- kuavo_humanoid_sdk/kuavo/core/sdk_deprecated.py +41 -0
- kuavo_humanoid_sdk/kuavo/demo_climbstair.py +249 -0
- kuavo_humanoid_sdk/kuavo/dexterous_hand.py +238 -0
- kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
- kuavo_humanoid_sdk/kuavo/logger_client.py +80 -0
- kuavo_humanoid_sdk/kuavo/robot.py +561 -0
- kuavo_humanoid_sdk/kuavo/robot_arm.py +411 -0
- kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
- kuavo_humanoid_sdk/kuavo/robot_blockly.py +1154 -0
- kuavo_humanoid_sdk/kuavo/robot_climbstair.py +1607 -0
- kuavo_humanoid_sdk/kuavo/robot_head.py +95 -0
- kuavo_humanoid_sdk/kuavo/robot_info.py +134 -0
- kuavo_humanoid_sdk/kuavo/robot_microphone.py +19 -0
- kuavo_humanoid_sdk/kuavo/robot_navigation.py +135 -0
- kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
- kuavo_humanoid_sdk/kuavo/robot_speech.py +24 -0
- kuavo_humanoid_sdk/kuavo/robot_state.py +310 -0
- kuavo_humanoid_sdk/kuavo/robot_tool.py +109 -0
- kuavo_humanoid_sdk/kuavo/robot_vision.py +81 -0
- kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
- kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1325 -0
- kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +106 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +340 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +215 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +25 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +331 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +504 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +40 -0
- kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +88 -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/_AudioReceiverData.py +122 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_FTsensorData.py +260 -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/_MmDetectionMsg.py +264 -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/_TaskPoint.py +175 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +62 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +160 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +161 -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 +171 -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/_footPose6D.py +123 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +320 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +136 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +231 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.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/_kuavoModeSchedule.py +224 -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/_picoPoseInfo.py +143 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +220 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -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/_robotBodyMatrices.py +332 -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 +655 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +216 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +273 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +316 -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/_CreatePath.py +581 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetAllMaps.py +241 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetCurrentMap.py +225 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +298 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_InitialPoseWithTaskPoint.py +281 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_LoadMap.py +281 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_NavigateToTaskPoint.py +281 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetInitialPose.py +394 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +468 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode_free.py +289 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_TaskPointOperation.py +536 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +43 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_adjustZeroPoint.py +277 -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 +395 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +426 -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/_getMotorZeroPoints.py +286 -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 +422 -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 +664 -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.1b3319.dist-info/METADATA +297 -0
- kuavo_humanoid_sdk-1.2.1b3319.dist-info/RECORD +186 -0
- kuavo_humanoid_sdk-1.2.1b3319.dist-info/WHEEL +6 -0
- kuavo_humanoid_sdk-1.2.1b3319.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) # 等待底层初始化完成
|