kuavo-humanoid-sdk 1.2.1b3279__20250912160921-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/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/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 +299 -0
- kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
- kuavo_humanoid_sdk/kuavo/robot_blockly.py +1162 -0
- kuavo_humanoid_sdk/kuavo/robot_climbstair.py +1607 -0
- kuavo_humanoid_sdk/kuavo/robot_head.py +74 -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.1b3279.dist-info/METADATA +296 -0
- kuavo_humanoid_sdk-1.2.1b3279.dist-info/RECORD +184 -0
- kuavo_humanoid_sdk-1.2.1b3279.dist-info/WHEEL +6 -0
- kuavo_humanoid_sdk-1.2.1b3279.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from logging.handlers import RotatingFileHandler
|
|
5
|
+
def setup_logger():
|
|
6
|
+
logger = logging.getLogger('kuavo-humanoid-sdk')
|
|
7
|
+
logger.setLevel(logging.DEBUG)
|
|
8
|
+
log_suffix = f'log/kuavo_humanoid_sdk'
|
|
9
|
+
log_dir = f'/var/{log_suffix}'
|
|
10
|
+
try:
|
|
11
|
+
# Check if we have write permission for /var directory
|
|
12
|
+
if not os.access('/var/log/', os.W_OK):
|
|
13
|
+
log_dir = f'./{log_suffix}'
|
|
14
|
+
Path(log_dir).mkdir(parents=True, exist_ok=True)
|
|
15
|
+
except Exception as e:
|
|
16
|
+
# If creation in /var fails, create in current directory
|
|
17
|
+
log_dir = f'./{log_suffix}'
|
|
18
|
+
Path(log_dir).mkdir(parents=True, exist_ok=True)
|
|
19
|
+
log_file = f'{log_dir}/kuavo_humanoid_sdk.log'
|
|
20
|
+
|
|
21
|
+
print(f'kuavo-humanoid-sdk log_file: {log_file}')
|
|
22
|
+
|
|
23
|
+
fh = RotatingFileHandler(log_file, maxBytes=2*1024*1024, backupCount=5) # 每个日志文件最大 2 MB,保留 5 个备份文件
|
|
24
|
+
fh.setLevel(logging.DEBUG)
|
|
25
|
+
|
|
26
|
+
ch = logging.StreamHandler()
|
|
27
|
+
ch.setLevel(logging.DEBUG)
|
|
28
|
+
|
|
29
|
+
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
|
30
|
+
fh.setFormatter(formatter)
|
|
31
|
+
ch.setFormatter(formatter)
|
|
32
|
+
|
|
33
|
+
logger.addHandler(fh)
|
|
34
|
+
logger.addHandler(ch)
|
|
35
|
+
return logger
|
|
36
|
+
|
|
37
|
+
def disable_sdk_logging():
|
|
38
|
+
"""
|
|
39
|
+
Disable SDK logging.
|
|
40
|
+
"""
|
|
41
|
+
logging.disable()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
""" Logger """
|
|
45
|
+
SDKLogger = setup_logger()
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
from typing import Tuple
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class KuavoJointData:
|
|
8
|
+
"""表示机器人关节状态的数据类"""
|
|
9
|
+
position: list
|
|
10
|
+
"""关节位置(角度)列表,单位为弧度"""
|
|
11
|
+
velocity: list
|
|
12
|
+
"""关节速度列表,单位为弧度/秒"""
|
|
13
|
+
torque: list
|
|
14
|
+
"""关节扭矩/力矩列表,单位为牛顿·米或安培"""
|
|
15
|
+
acceleration:list
|
|
16
|
+
"""关节加速度列表,单位为弧度/秒²"""
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class KuavoImuData:
|
|
20
|
+
"""表示机器人IMU(惯性测量单元)数据的数据类"""
|
|
21
|
+
gyro : Tuple[float, float, float]
|
|
22
|
+
"""绕x、y、z轴的角速度,单位为弧度/秒"""
|
|
23
|
+
acc : Tuple[float, float, float]
|
|
24
|
+
"""x、y、z轴的线性加速度,单位为米/秒²"""
|
|
25
|
+
free_acc: Tuple[float, float, float]
|
|
26
|
+
"""自由加速度(重力补偿),x、y、z轴,单位为米/秒²"""
|
|
27
|
+
quat: Tuple[float, float, float, float]
|
|
28
|
+
"""方向四元数 (x, y, z, w)"""
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class KuavoOdometry:
|
|
32
|
+
"""表示机器人里程计数据的数据类"""
|
|
33
|
+
position: Tuple[float, float, float]
|
|
34
|
+
"""机器人在世界坐标系中的位置 (x, y, z),单位为米"""
|
|
35
|
+
orientation: Tuple[float, float, float, float]
|
|
36
|
+
"""机器人方向四元数 (x, y, z, w)"""
|
|
37
|
+
linear: Tuple[float, float, float]
|
|
38
|
+
"""世界坐标系中的线性速度 (x, y, z),单位为米/秒"""
|
|
39
|
+
angular: Tuple[float, float, float]
|
|
40
|
+
"""世界坐标系中的角速度 (x, y, z),单位为弧度/秒"""
|
|
41
|
+
|
|
42
|
+
class KuavoArmCtrlMode(Enum):
|
|
43
|
+
"""表示Kuavo机器人手臂控制模式的枚举类。"""
|
|
44
|
+
ArmFixed = 0
|
|
45
|
+
"""手臂固定(冻结)模式"""
|
|
46
|
+
AutoSwing = 1
|
|
47
|
+
"""自动摆臂模式"""
|
|
48
|
+
ExternalControl = 2
|
|
49
|
+
"""手臂由外部命令控制"""
|
|
50
|
+
|
|
51
|
+
class KuavoManipulationMpcFrame(Enum):
|
|
52
|
+
"""表示Kuavo机器人末端执行器 Manipulation MPC 坐标系的枚举类"""
|
|
53
|
+
KeepCurrentFrame = 0
|
|
54
|
+
"""保持当前坐标系"""
|
|
55
|
+
WorldFrame = 1
|
|
56
|
+
"""世界坐标系"""
|
|
57
|
+
LocalFrame = 2
|
|
58
|
+
"""本地坐标系"""
|
|
59
|
+
VRFrame = 3
|
|
60
|
+
"""VR坐标系"""
|
|
61
|
+
ManipulationWorldFrame = 4
|
|
62
|
+
"""操作世界坐标系"""
|
|
63
|
+
ERROR = -1
|
|
64
|
+
"""错误状态"""
|
|
65
|
+
|
|
66
|
+
class KuavoManipulationMpcCtrlMode(Enum):
|
|
67
|
+
"""表示Kuavo机器人 Manipulation MPC 控制模式的枚举类"""
|
|
68
|
+
NoControl = 0
|
|
69
|
+
"""无控制"""
|
|
70
|
+
ArmOnly = 1
|
|
71
|
+
"""仅控制手臂"""
|
|
72
|
+
BaseOnly = 2
|
|
73
|
+
"""仅控制底座"""
|
|
74
|
+
BaseArm = 3
|
|
75
|
+
"""同时控制底座和手臂"""
|
|
76
|
+
ERROR = -1
|
|
77
|
+
"""错误状态"""
|
|
78
|
+
|
|
79
|
+
class KuavoManipulationMpcControlFlow(Enum):
|
|
80
|
+
"""表示Kuavo机器人 Manipulation MPC 控制数据流的枚举类"""
|
|
81
|
+
ThroughFullBodyMpc = 0
|
|
82
|
+
"""控制数据通过全身MPC后进入WBC"""
|
|
83
|
+
DirectToWbc = 1
|
|
84
|
+
"""控制数据直接流向WBC,不经过全身MPC"""
|
|
85
|
+
Error = -1
|
|
86
|
+
"""无效的控制路径"""
|
|
87
|
+
|
|
88
|
+
@dataclass
|
|
89
|
+
class EndEffectorState:
|
|
90
|
+
"""表示末端执行器状态的数据类。
|
|
91
|
+
|
|
92
|
+
参数:
|
|
93
|
+
position (list): 浮点数,末端执行器位置,范围: [0, 100] \n
|
|
94
|
+
velocity (list): 浮点数,速度 \n
|
|
95
|
+
effort (list): 浮点数,力矩 \n
|
|
96
|
+
state (GraspingState): 夹爪抓取状态 \n
|
|
97
|
+
"""
|
|
98
|
+
position: list
|
|
99
|
+
velocity: list
|
|
100
|
+
effort: list
|
|
101
|
+
class GraspingState(Enum):
|
|
102
|
+
"""表示末端执行器抓取状态的枚举类。"""
|
|
103
|
+
|
|
104
|
+
ERROR = -1
|
|
105
|
+
"""错误状态"""
|
|
106
|
+
UNKNOWN = 0
|
|
107
|
+
"""未知状态"""
|
|
108
|
+
MOVING = 1
|
|
109
|
+
"""正在移动到目标位置"""
|
|
110
|
+
REACHED = 2
|
|
111
|
+
"""到达目标位置"""
|
|
112
|
+
GRABBED = 3
|
|
113
|
+
"""成功抓取物体"""
|
|
114
|
+
|
|
115
|
+
state: GraspingState
|
|
116
|
+
|
|
117
|
+
class EndEffectorSide(Enum):
|
|
118
|
+
"""表示末端执行器类型的枚举类。"""
|
|
119
|
+
LEFT = 'left'
|
|
120
|
+
"""左末端执行器"""
|
|
121
|
+
RIGHT = 'right'
|
|
122
|
+
"""右末端执行器"""
|
|
123
|
+
BOTH = 'both'
|
|
124
|
+
"""左右末端执行器"""
|
|
125
|
+
|
|
126
|
+
@dataclass
|
|
127
|
+
class KuavoPose:
|
|
128
|
+
"""表示机器人姿态的数据类。"""
|
|
129
|
+
position: Tuple[float, float, float] # x, y, z
|
|
130
|
+
orientation: Tuple[float, float, float, float] # x, y, z, w
|
|
131
|
+
|
|
132
|
+
def __str__(self) -> str:
|
|
133
|
+
"""Returns a formatted string representation of the pose.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
str: Formatted pose string with position and orientation
|
|
137
|
+
"""
|
|
138
|
+
return (
|
|
139
|
+
f"Position (x,y,z): ({self.position[0]:.3f}, {self.position[1]:.3f}, {self.position[2]:.3f})\n"
|
|
140
|
+
f"Orientation (x,y,z,w): ({self.orientation[0]:.3f}, {self.orientation[1]:.3f}, "
|
|
141
|
+
f"{self.orientation[2]:.3f}, {self.orientation[3]:.3f})"
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
@dataclass
|
|
145
|
+
class KuavoIKParams:
|
|
146
|
+
"""表示IK节点参数的数据类。"""
|
|
147
|
+
# snopt参数
|
|
148
|
+
major_optimality_tol: float = 1e-3
|
|
149
|
+
major_feasibility_tol: float = 1e-3
|
|
150
|
+
minor_feasibility_tol: float = 1e-3
|
|
151
|
+
major_iterations_limit: float = 100
|
|
152
|
+
# 约束和成本参数
|
|
153
|
+
oritation_constraint_tol: float = 1e-3
|
|
154
|
+
pos_constraint_tol: float = 1e-3 # 0.001m,当pos_cost_weight==0.0时生效
|
|
155
|
+
pos_cost_weight: float = 0.0 # 如果需要高精度,请将此值设为0.0!!!
|
|
156
|
+
|
|
157
|
+
@dataclass
|
|
158
|
+
class KuavoDexHandTouchState:
|
|
159
|
+
"""表示灵巧手触觉状态的数据类。"""
|
|
160
|
+
|
|
161
|
+
@dataclass
|
|
162
|
+
class KuavoTouchState:
|
|
163
|
+
"""表示灵巧手触觉状态的数据类"""
|
|
164
|
+
normal_force1: int # 法向力1
|
|
165
|
+
"""法向力1"""
|
|
166
|
+
normal_force2: int # 法向力2
|
|
167
|
+
"""法向力2"""
|
|
168
|
+
normal_force3: int # 法向力3
|
|
169
|
+
"""法向力3"""
|
|
170
|
+
tangential_force1: int # 切向力1
|
|
171
|
+
"""切向力1"""
|
|
172
|
+
tangential_force2: int # 切向力2
|
|
173
|
+
"""切向力2"""
|
|
174
|
+
tangential_force3: int # 切向力3
|
|
175
|
+
"""切向力3"""
|
|
176
|
+
tangential_direction1: int # 切向力方向1
|
|
177
|
+
"""切向力方向1"""
|
|
178
|
+
tangential_direction2: int # 切向力方向2
|
|
179
|
+
"""切向力方向2"""
|
|
180
|
+
tangential_direction3: int # 切向力方向3
|
|
181
|
+
"""切向力方向3"""
|
|
182
|
+
self_proximity1: int # 自电容接近传感器1
|
|
183
|
+
"""自电容接近传感器1"""
|
|
184
|
+
self_proximity2: int # 自电容接近传感器2
|
|
185
|
+
"""自电容接近传感器2"""
|
|
186
|
+
mutual_proximity: int # 互电容接近传感器
|
|
187
|
+
"""互电容接近传感器"""
|
|
188
|
+
status: int # 传感器状态
|
|
189
|
+
"""传感器状态"""
|
|
190
|
+
# 5个手指
|
|
191
|
+
data: Tuple[KuavoTouchState, KuavoTouchState, KuavoTouchState, KuavoTouchState, KuavoTouchState]
|
|
192
|
+
|
|
193
|
+
@dataclass
|
|
194
|
+
class AprilTagData:
|
|
195
|
+
"""表示检测到的AprilTag信息及姿态估计"""
|
|
196
|
+
id: list
|
|
197
|
+
"""检测到的AprilTag ID列表(整数)"""
|
|
198
|
+
size: list
|
|
199
|
+
"""标签物理尺寸列表,单位为米(浮点数)"""
|
|
200
|
+
pose: list
|
|
201
|
+
"""表示标签姿态的PoseQuaternion对象列表"""
|
|
202
|
+
|
|
203
|
+
@dataclass
|
|
204
|
+
class HomogeneousMatrix:
|
|
205
|
+
"""用于3D变换的4x4齐次变换矩阵。
|
|
206
|
+
|
|
207
|
+
表示3D空间中的旋转和平移。可用于坐标系变换和姿态合成。 \n
|
|
208
|
+
|
|
209
|
+
属性:
|
|
210
|
+
matrix (np.ndarray): 形状为(4, 4)的4x4 numpy数组,包含::
|
|
211
|
+
|
|
212
|
+
[[R, t],
|
|
213
|
+
[0, 1]]
|
|
214
|
+
|
|
215
|
+
其中R是3x3旋转矩阵,t是3x1平移向量
|
|
216
|
+
"""
|
|
217
|
+
matrix: np.ndarray # 形状(4,4)的齐次变换矩阵
|
|
218
|
+
|
|
219
|
+
@dataclass
|
|
220
|
+
class PoseQuaternion:
|
|
221
|
+
"""使用位置和四元数方向的3D姿态表示"""
|
|
222
|
+
position: Tuple[float, float, float]
|
|
223
|
+
"""XYZ坐标,单位为米"""
|
|
224
|
+
orientation: Tuple[float, float, float, float]
|
|
225
|
+
"""单位四元数,采用(x, y, z, w)格式,遵循ROS约定"""
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
@dataclass
|
|
229
|
+
class KuavoJointCommand:
|
|
230
|
+
"""表示机器人关节命令的数据类\n
|
|
231
|
+
"""
|
|
232
|
+
joint_q: list
|
|
233
|
+
"""关节位置命令列表,单位为弧度"""
|
|
234
|
+
joint_v: list
|
|
235
|
+
"""关节速度命令列表,单位为弧度/秒"""
|
|
236
|
+
"""关节扭矩/力矩命令列表,单位为牛顿·米或安培"""
|
|
237
|
+
tau: list
|
|
238
|
+
"""关节扭矩/力矩命令列表,单位为牛顿·米或安培"""
|
|
239
|
+
tau_max: list
|
|
240
|
+
"""每个关节的最大允许扭矩列表"""
|
|
241
|
+
tau_ratio: list
|
|
242
|
+
"""每个关节的扭矩比率(实际/最大)列表"""
|
|
243
|
+
joint_kp: list
|
|
244
|
+
"""位置控制比例增益列表"""
|
|
245
|
+
joint_kd: list
|
|
246
|
+
"""速度控制微分增益列表"""
|
|
247
|
+
control_modes: list
|
|
248
|
+
"""每个关节的控制模式整数列表"""
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
@dataclass
|
|
252
|
+
class KuavoTwist:
|
|
253
|
+
"""表示机器人扭转(速度)数据的数据类"""
|
|
254
|
+
linear: Tuple[float, float, float]
|
|
255
|
+
"""线性速度 (x, y, z),单位为米/秒"""
|
|
256
|
+
angular: Tuple[float, float, float]
|
|
257
|
+
"""角速度 (x, y, z),单位为弧度/秒"""
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@dataclass
|
|
261
|
+
class KuavoMotorParam:
|
|
262
|
+
"""表示机器人电机参数的数据类"""
|
|
263
|
+
Kp: float
|
|
264
|
+
"""位置控制比例增益"""
|
|
265
|
+
Kd: float
|
|
266
|
+
"""速度控制微分增益"""
|
|
267
|
+
id: int
|
|
268
|
+
"""电机ID"""
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
@dataclass
|
|
272
|
+
class AprilTagDetection:
|
|
273
|
+
"""表示AprilTag检测结果的数据类"""
|
|
274
|
+
@dataclass
|
|
275
|
+
class Point:
|
|
276
|
+
x: float
|
|
277
|
+
y: float
|
|
278
|
+
z: float
|
|
279
|
+
|
|
280
|
+
@dataclass
|
|
281
|
+
class Quaternion:
|
|
282
|
+
x: float
|
|
283
|
+
y: float
|
|
284
|
+
z: float
|
|
285
|
+
w: float
|
|
286
|
+
|
|
287
|
+
position: Point
|
|
288
|
+
orientation: Quaternion
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Tuple
|
|
3
|
+
from kuavo_humanoid_sdk.interfaces.data_types import EndEffectorSide, EndEffectorState
|
|
4
|
+
|
|
5
|
+
class EndEffector(ABC):
|
|
6
|
+
def __init__(self, joint_names: list):
|
|
7
|
+
self._joint_names = joint_names
|
|
8
|
+
|
|
9
|
+
def joint_names(self)->list:
|
|
10
|
+
"""Returns the joint names of the end effector.
|
|
11
|
+
|
|
12
|
+
Returns:
|
|
13
|
+
list: The joint names of the end effector.
|
|
14
|
+
"""
|
|
15
|
+
return self._joint_names
|
|
16
|
+
|
|
17
|
+
def joint_count(self) -> int:
|
|
18
|
+
"""Returns the total number of joints in the end effector.
|
|
19
|
+
|
|
20
|
+
The joint_names list contains joints for both left and right end effectors.
|
|
21
|
+
For a single end effector, the number of joints would be joint_names.size/2.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
int: The total number of joints in the end effector.
|
|
25
|
+
"""
|
|
26
|
+
return len(self._joint_names)
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def control(self, target_positions:list, target_velocities:list, target_torques:list)->bool:
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
@abstractmethod
|
|
33
|
+
def control_right(self, target_positions:list, target_velocities:list, target_torques:list)->bool:
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def control_left(self, target_positions:list, target_velocities:list, target_torques:list)->bool:
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def open(self, side:EndEffectorSide)->bool:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
@abstractmethod
|
|
45
|
+
def get_state(self)->Tuple[EndEffectorState, EndEffectorState]:
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
@abstractmethod
|
|
49
|
+
def get_position(self)->Tuple[list, list]:
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
@abstractmethod
|
|
53
|
+
def get_velocity(self)->Tuple[list, list]:
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def get_effort(self)->Tuple[list, list]:
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
@abstractmethod
|
|
61
|
+
def get_grasping_state(self)->Tuple[EndEffectorState.GraspingState, EndEffectorState.GraspingState]:
|
|
62
|
+
pass
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
|
|
4
|
+
class RobotBase(ABC):
|
|
5
|
+
def __init__(self, robot_type: str = "kuavo"):
|
|
6
|
+
self._robot_type = robot_type
|
|
7
|
+
|
|
8
|
+
@property
|
|
9
|
+
def robot_type(self) -> str:
|
|
10
|
+
return self._robot_type
|
|
11
|
+
|
|
12
|
+
@abstractmethod
|
|
13
|
+
def trot(self):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def stance(self):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def jump(self):
|
|
22
|
+
pass
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
class RobotInfoBase(ABC):
|
|
4
|
+
def __init__(self, robot_type: str = "kuavo"):
|
|
5
|
+
self._robot_type = robot_type
|
|
6
|
+
|
|
7
|
+
@property
|
|
8
|
+
def robot_type(self) -> str:
|
|
9
|
+
"""
|
|
10
|
+
Get the robot type, e.g. "kuavo"
|
|
11
|
+
"""
|
|
12
|
+
return self._robot_type
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
@abstractmethod
|
|
16
|
+
def robot_version(self) -> str:
|
|
17
|
+
"""
|
|
18
|
+
Get the robot version, e.g. "42", "43"
|
|
19
|
+
"""
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
@abstractmethod
|
|
24
|
+
def end_effector_type(self) -> str:
|
|
25
|
+
"""
|
|
26
|
+
Get the end effector type, e.g. "lejuclaw"...
|
|
27
|
+
"""
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def joint_names(self) -> list:
|
|
33
|
+
"""
|
|
34
|
+
Get the joint names, e.g. ["joint1", "joint2", ...]
|
|
35
|
+
"""
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def joint_dof(self) -> int:
|
|
41
|
+
"""
|
|
42
|
+
Get the joint degrees of freedom, e.g. 28
|
|
43
|
+
"""
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
@abstractmethod
|
|
48
|
+
def arm_joint_dof(self) -> int:
|
|
49
|
+
"""
|
|
50
|
+
Get the arm joint degrees of freedom, e.g. 14
|
|
51
|
+
"""
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
def __str__(self) -> str:
|
|
55
|
+
pass
|
|
56
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from .robot import KuavoSDK, KuavoRobot
|
|
2
|
+
from .robot_info import KuavoRobotInfo
|
|
3
|
+
from .robot_state import KuavoRobotState
|
|
4
|
+
from .robot_vision import KuavoRobotVision
|
|
5
|
+
from .robot_tool import KuavoRobotTools
|
|
6
|
+
from .robot_arm import KuavoRobotArm
|
|
7
|
+
from .robot_head import KuavoRobotHead
|
|
8
|
+
from .robot_audio import KuavoRobotAudio
|
|
9
|
+
from .dexterous_hand import DexterousHand, TouchDexterousHand
|
|
10
|
+
from .leju_claw import LejuClaw
|
|
11
|
+
from .robot_observation import KuavoRobotObservation
|
|
12
|
+
from .robot_blockly import RobotControlBlockly
|
|
13
|
+
from .robot_microphone import RobotMicrophone
|
|
14
|
+
from .robot_navigation import RobotNavigation
|
|
15
|
+
from .robot_speech import RobotSpeech
|
|
16
|
+
from .dexterous_hand import DexterousHand
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import math
|
|
3
|
+
import threading
|
|
4
|
+
import numpy as np
|
|
5
|
+
from typing import Tuple
|
|
6
|
+
from transitions import Machine, State
|
|
7
|
+
|
|
8
|
+
from kuavo_humanoid_sdk.common.logger import SDKLogger
|
|
9
|
+
from kuavo_humanoid_sdk.kuavo.core.ros.audio import Audio
|
|
10
|
+
|
|
11
|
+
class KuavoRobotAudioCore:
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.robot_audio = Audio()
|
|
14
|
+
|
|
15
|
+
def play_audio(self, music_number: str, volume: int = 100, speed: float = 1.0) -> bool:
|
|
16
|
+
"""
|
|
17
|
+
play music
|
|
18
|
+
"""
|
|
19
|
+
return self.robot_audio.play_audio(music_number, volume, speed)
|
|
20
|
+
|
|
21
|
+
def stop_music(self) -> bool:
|
|
22
|
+
"""
|
|
23
|
+
stop music
|
|
24
|
+
"""
|
|
25
|
+
return self.robot_audio.stop_audio()
|
|
26
|
+
|
|
27
|
+
def text_to_speech(self, text: str, volume: float = 0.5) -> bool:
|
|
28
|
+
"""
|
|
29
|
+
text to speech
|
|
30
|
+
"""
|
|
31
|
+
return self.robot_audio.text_to_speech(text, volume)
|
|
32
|
+
|