kuavo-humanoid-sdk 1.2.2__20250922181216-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 +276 -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 +11 -0
- kuavo_humanoid_sdk/kuavo/core/audio.py +32 -0
- kuavo_humanoid_sdk/kuavo/core/core.py +612 -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/ros/audio.py +92 -0
- kuavo_humanoid_sdk/kuavo/core/ros/control.py +1309 -0
- kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
- kuavo_humanoid_sdk/kuavo/core/ros/param.py +183 -0
- kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
- kuavo_humanoid_sdk/kuavo/core/ros/state.py +605 -0
- kuavo_humanoid_sdk/kuavo/core/ros/tools.py +219 -0
- kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
- kuavo_humanoid_sdk/kuavo/core/ros_env.py +237 -0
- kuavo_humanoid_sdk/kuavo/dexterous_hand.py +201 -0
- kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
- kuavo_humanoid_sdk/kuavo/robot.py +465 -0
- kuavo_humanoid_sdk/kuavo/robot_arm.py +210 -0
- kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
- kuavo_humanoid_sdk/kuavo/robot_head.py +50 -0
- kuavo_humanoid_sdk/kuavo/robot_info.py +113 -0
- kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
- kuavo_humanoid_sdk/kuavo/robot_state.py +299 -0
- kuavo_humanoid_sdk/kuavo/robot_tool.py +82 -0
- kuavo_humanoid_sdk/kuavo/robot_vision.py +83 -0
- kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
- kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1126 -0
- kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +104 -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/_JoySticks.py +191 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +199 -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/__init__.py +48 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +160 -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 +151 -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/_footPoseTargetTrajectories.py +301 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.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/_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/_planArmState.py +120 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_questJoySticks.py +191 -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/_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 +495 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +272 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +315 -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/_ExecuteArmAction.py +281 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +29 -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 +394 -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/_handForceLevel.py +330 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
- kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +421 -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 +662 -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.2.dist-info/METADATA +291 -0
- kuavo_humanoid_sdk-1.2.2.dist-info/RECORD +137 -0
- kuavo_humanoid_sdk-1.2.2.dist-info/WHEEL +6 -0
- kuavo_humanoid_sdk-1.2.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,465 @@
|
|
|
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
|
+
pitch (float): 机器人躯干的俯仰角,单位弧度,范围[-0.4, 0.4]。
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
bool: 如果蹲姿控制成功返回True,否则返回False。
|
|
166
|
+
"""
|
|
167
|
+
# Limit height range
|
|
168
|
+
MAX_HEIGHT = 0.0
|
|
169
|
+
MIN_HEIGHT = -0.35
|
|
170
|
+
MAX_PITCH = 0.4
|
|
171
|
+
MIN_PITCH = -0.4
|
|
172
|
+
|
|
173
|
+
limited_height = min(MAX_HEIGHT, max(MIN_HEIGHT, height))
|
|
174
|
+
|
|
175
|
+
# Check if height exceeds limits
|
|
176
|
+
if height > MAX_HEIGHT or height < MIN_HEIGHT:
|
|
177
|
+
SDKLogger.warn(f"[Robot] height {height} exceeds limit [{MIN_HEIGHT}, {MAX_HEIGHT}], will be limited")
|
|
178
|
+
# Limit pitch range
|
|
179
|
+
limited_pitch = min(MAX_PITCH, max(MIN_PITCH, pitch))
|
|
180
|
+
|
|
181
|
+
# Check if pitch exceeds limits
|
|
182
|
+
if abs(pitch) > MAX_PITCH:
|
|
183
|
+
SDKLogger.warn(f"[Robot] pitch {pitch} exceeds limit [{MIN_PITCH}, {MAX_PITCH}], will be limited")
|
|
184
|
+
|
|
185
|
+
return self._kuavo_core.squat(limited_height, limited_pitch)
|
|
186
|
+
|
|
187
|
+
def step_by_step(self, target_pose:list, dt:float=0.4, is_left_first_default:bool=True, collision_check:bool=True)->bool:
|
|
188
|
+
"""单步控制机器人运动。
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
target_pose (list): 机器人的目标位姿[x, y, z, yaw],单位m,rad。
|
|
192
|
+
dt (float): 每步之间的时间间隔,单位秒。默认为0.4秒。
|
|
193
|
+
is_left_first_default (bool): 是否先迈左脚。默认为True。
|
|
194
|
+
collision_check (bool): 是否进行碰撞检测。默认为True。
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
bool: 如果运动成功返回True,否则返回False。
|
|
198
|
+
|
|
199
|
+
Raises:
|
|
200
|
+
RuntimeError: 如果在尝试控制步态时机器人不在stance状态。
|
|
201
|
+
ValueError: 如果target_pose长度不为4。
|
|
202
|
+
|
|
203
|
+
Note:
|
|
204
|
+
你可以调用 :meth:`KuavoRobotState.wait_for_step_control` 来等待机器人进入step-control模式。
|
|
205
|
+
你可以调用 :meth:`KuavoRobotState.wait_for_stance` 来等待step-control完成。
|
|
206
|
+
"""
|
|
207
|
+
if len(target_pose) != 4:
|
|
208
|
+
raise ValueError(f"[Robot] target_pose length must be 4 (x, y, z, yaw), but got {len(target_pose)}")
|
|
209
|
+
|
|
210
|
+
return self._kuavo_core.step_control(target_pose, dt, is_left_first_default, collision_check)
|
|
211
|
+
|
|
212
|
+
def control_command_pose(self, target_pose_x: float, target_pose_y: float, target_pose_z: float, target_pose_yaw: float) -> bool:
|
|
213
|
+
"""在base_link坐标系下控制机器人姿态。
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
target_pose_x (float): 目标x位置,单位米。
|
|
217
|
+
target_pose_y (float): 目标y位置,单位米。
|
|
218
|
+
target_pose_z (float): 目标z位置,单位米。
|
|
219
|
+
target_pose_yaw (float): 目标偏航角,单位弧度。
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
bool: 如果命令发送成功返回True,否则返回False。
|
|
223
|
+
|
|
224
|
+
Raises:
|
|
225
|
+
RuntimeError: 如果在尝试控制姿态时机器人不在stance状态。
|
|
226
|
+
|
|
227
|
+
Note:
|
|
228
|
+
此命令会将机器人状态改变为'command_pose'。
|
|
229
|
+
"""
|
|
230
|
+
return self._kuavo_core.control_command_pose(target_pose_x, target_pose_y, target_pose_z, target_pose_yaw)
|
|
231
|
+
|
|
232
|
+
def control_command_pose_world(self, target_pose_x: float, target_pose_y: float, target_pose_z: float, target_pose_yaw: float) -> bool:
|
|
233
|
+
"""在odom(世界)坐标系下控制机器人姿态。
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
target_pose_x (float): 目标x位置,单位米。
|
|
237
|
+
target_pose_y (float): 目标y位置,单位米。
|
|
238
|
+
target_pose_z (float): 目标z位置,单位米。
|
|
239
|
+
target_pose_yaw (float): 目标偏航角,单位弧度。
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
bool: 如果命令发送成功返回True,否则返回False。
|
|
243
|
+
|
|
244
|
+
Raises:
|
|
245
|
+
RuntimeError: 如果在尝试控制姿态时机器人不在stance状态。
|
|
246
|
+
|
|
247
|
+
Note:
|
|
248
|
+
此命令会将机器人状态改变为'command_pose_world'。
|
|
249
|
+
"""
|
|
250
|
+
return self._kuavo_core.control_command_pose_world(target_pose_x, target_pose_y, target_pose_z, target_pose_yaw)
|
|
251
|
+
|
|
252
|
+
def control_head(self, yaw: float, pitch: float)->bool:
|
|
253
|
+
"""控制机器人的头部。
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
yaw (float): 头部的偏航角,单位弧度,范围[-1.396, 1.396](-80到80度)。
|
|
257
|
+
pitch (float): 头部的俯仰角,单位弧度,范围[-0.436, 0.436](-25到25度)。
|
|
258
|
+
|
|
259
|
+
Returns:
|
|
260
|
+
bool: 如果头部控制成功返回True,否则返回False。
|
|
261
|
+
"""
|
|
262
|
+
return self._robot_head.control_head(yaw=yaw, pitch=pitch)
|
|
263
|
+
|
|
264
|
+
def enable_head_tracking(self, target_id: int)->bool:
|
|
265
|
+
"""启用头部跟踪 April Tag"""
|
|
266
|
+
return self._robot_head.enable_head_tracking(target_id)
|
|
267
|
+
|
|
268
|
+
def disable_head_tracking(self)->bool:
|
|
269
|
+
"""禁用头部跟踪。"""
|
|
270
|
+
return self._robot_head.disable_head_tracking()
|
|
271
|
+
|
|
272
|
+
""" Robot Arm Control """
|
|
273
|
+
def arm_reset(self)->bool:
|
|
274
|
+
"""手臂归位
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
bool: 如果手臂归位成功返回True,否则返回False。
|
|
278
|
+
"""
|
|
279
|
+
return self._robot_arm.arm_reset()
|
|
280
|
+
|
|
281
|
+
def manipulation_mpc_reset(self)->bool:
|
|
282
|
+
"""重置机器人手臂。
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
bool: 如果手臂重置成功返回True,否则返回False。
|
|
286
|
+
"""
|
|
287
|
+
return self._robot_arm.manipulation_mpc_reset()
|
|
288
|
+
|
|
289
|
+
def control_arm_joint_positions(self, joint_positions:list)->bool:
|
|
290
|
+
"""通过关节位置角度控制手臂
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
joint_positions (list): 手臂的目标关节位置,单位弧度。
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
bool: 如果手臂控制成功返回True,否则返回False。
|
|
297
|
+
|
|
298
|
+
Raises:
|
|
299
|
+
ValueError: 如果关节位置列表长度不正确。
|
|
300
|
+
ValueError: 如果关节位置超出[-π, π]范围。
|
|
301
|
+
RuntimeError: 如果在尝试控制手臂时机器人不在stance状态。
|
|
302
|
+
"""
|
|
303
|
+
if len(joint_positions) != self._robot_info.arm_joint_dof:
|
|
304
|
+
print("The length of the position list must be equal to the number of DOFs of the arm.")
|
|
305
|
+
return False
|
|
306
|
+
|
|
307
|
+
return self._robot_arm.control_arm_joint_positions(joint_positions)
|
|
308
|
+
|
|
309
|
+
def control_arm_joint_trajectory(self, times:list, q_frames:list)->bool:
|
|
310
|
+
"""控制机器人手臂的目标轨迹。
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
times (list): 时间间隔列表,单位秒。
|
|
314
|
+
q_frames (list): 关节位置列表,单位弧度。
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
bool: 如果控制成功返回True,否则返回False。
|
|
318
|
+
|
|
319
|
+
Raises:
|
|
320
|
+
ValueError: 如果times列表长度不正确。
|
|
321
|
+
ValueError: 如果关节位置列表长度不正确。
|
|
322
|
+
ValueError: 如果关节位置超出[-π, π]范围。
|
|
323
|
+
RuntimeError: 如果在尝试控制手臂时机器人不在stance状态。
|
|
324
|
+
|
|
325
|
+
Warning:
|
|
326
|
+
异步接口,函数在发送命令后立即返回,用户需要自行等待运动完成。
|
|
327
|
+
"""
|
|
328
|
+
return self._robot_arm.control_arm_joint_trajectory(times, q_frames)
|
|
329
|
+
|
|
330
|
+
def set_fixed_arm_mode(self) -> bool:
|
|
331
|
+
"""固定/冻结机器人手臂。
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
bool: 如果手臂固定/冻结成功返回True,否则返回False。
|
|
335
|
+
"""
|
|
336
|
+
return self._robot_arm.set_fixed_arm_mode()
|
|
337
|
+
|
|
338
|
+
def set_auto_swing_arm_mode(self) -> bool:
|
|
339
|
+
"""机器人手臂自动摆动。
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
bool: 如果切换手臂自动摆动模式成功返回True,否则返回False。
|
|
343
|
+
"""
|
|
344
|
+
return self._robot_arm.set_auto_swing_arm_mode()
|
|
345
|
+
|
|
346
|
+
def set_external_control_arm_mode(self) -> bool:
|
|
347
|
+
"""切换手臂控制模式到外部控制模式。
|
|
348
|
+
|
|
349
|
+
Returns:
|
|
350
|
+
bool: 如果切换手臂控制模式到外部控制模式成功返回True,否则返回False。
|
|
351
|
+
"""
|
|
352
|
+
return self._robot_arm.set_external_control_arm_mode()
|
|
353
|
+
|
|
354
|
+
def set_manipulation_mpc_mode(self, ctrl_mode: KuavoManipulationMpcCtrlMode) -> bool:
|
|
355
|
+
"""
|
|
356
|
+
设置 Manipulation MPC 模式。
|
|
357
|
+
Returns:
|
|
358
|
+
bool: 如果 Manipulation MPC 模式设置成功返回True,否则返回False。
|
|
359
|
+
"""
|
|
360
|
+
return self._robot_arm.set_manipulation_mpc_mode(ctrl_mode)
|
|
361
|
+
|
|
362
|
+
def set_manipulation_mpc_control_flow(self, control_flow: KuavoManipulationMpcControlFlow) -> bool:
|
|
363
|
+
"""
|
|
364
|
+
设置 Manipulation MPC 控制流。
|
|
365
|
+
Returns:
|
|
366
|
+
bool: 如果 Manipulation MPC 控制流设置成功返回True,否则返回False。
|
|
367
|
+
"""
|
|
368
|
+
return self._robot_arm.set_manipulation_mpc_control_flow(control_flow)
|
|
369
|
+
|
|
370
|
+
def set_manipulation_mpc_frame(self, frame: KuavoManipulationMpcFrame) -> bool:
|
|
371
|
+
"""
|
|
372
|
+
设置 Manipulation MPC 坐标系。
|
|
373
|
+
Returns:
|
|
374
|
+
bool: 如果 Manipulation MPC 坐标系设置成功返回True,否则返回False。
|
|
375
|
+
"""
|
|
376
|
+
return self._robot_arm.set_manipulation_mpc_frame(frame)
|
|
377
|
+
|
|
378
|
+
""" Arm Forward kinematics && Arm Inverse kinematics """
|
|
379
|
+
def arm_ik(self,
|
|
380
|
+
left_pose: KuavoPose,
|
|
381
|
+
right_pose: KuavoPose,
|
|
382
|
+
left_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
|
|
383
|
+
right_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
|
|
384
|
+
arm_q0: list = None,
|
|
385
|
+
params: KuavoIKParams=None) -> list:
|
|
386
|
+
"""机器人手臂逆向运动学求解
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
left_pose (KuavoPose): 左手臂目标姿态,包含xyz位置和四元数方向
|
|
390
|
+
right_pose (KuavoPose): 右手臂目标姿态,包含xyz位置和四元数方向
|
|
391
|
+
left_elbow_pos_xyz (list): 左肘部位置。如果为[0.0, 0.0, 0.0],则忽略
|
|
392
|
+
right_elbow_pos_xyz (list): 右肘部位置。如果为[0.0, 0.0, 0.0],则忽略
|
|
393
|
+
arm_q0 (list, optional): 初始关节位置,单位为弧度。如果为None,则忽略
|
|
394
|
+
params (KuavoIKParams, optional): 逆向运动学参数。如果为None,则忽略,包含:
|
|
395
|
+
- major_optimality_tol: 主要最优性容差 \n
|
|
396
|
+
- major_feasibility_tol: 主要可行性容差 \n
|
|
397
|
+
- minor_feasibility_tol: 次要可行性容差 \n
|
|
398
|
+
- major_iterations_limit: 主要迭代次数限制 \n
|
|
399
|
+
- oritation_constraint_tol: 方向约束容差 \n
|
|
400
|
+
- pos_constraint_tol: 位置约束容差,当pos_cost_weight==0.0时生效 \n
|
|
401
|
+
- pos_cost_weight: 位置代价权重。设为0.0可获得高精度 \n
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
list: 关节位置列表,单位为弧度。如果计算失败返回None
|
|
405
|
+
|
|
406
|
+
Warning:
|
|
407
|
+
此函数需要在初始化SDK时设置 :attr:`KuavoSDK.Options.WithIK` 选项。
|
|
408
|
+
"""
|
|
409
|
+
return self._robot_arm.arm_ik(left_pose, right_pose, left_elbow_pos_xyz, right_elbow_pos_xyz, arm_q0, params)
|
|
410
|
+
|
|
411
|
+
def arm_fk(self, q: list) -> Tuple[KuavoPose, KuavoPose]:
|
|
412
|
+
"""机器人手臂的正运动学求解
|
|
413
|
+
|
|
414
|
+
Args:
|
|
415
|
+
q (list): 关节位置列表,单位弧度。
|
|
416
|
+
|
|
417
|
+
Returns:
|
|
418
|
+
Tuple[KuavoPose, KuavoPose]: 左手臂和右手臂的位姿元组,
|
|
419
|
+
如果正运动学失败则返回(None, None)。
|
|
420
|
+
|
|
421
|
+
Warning:
|
|
422
|
+
此函数需要使用 :attr:`KuavoSDK.Options.WithIK` 选项初始化SDK。
|
|
423
|
+
"""
|
|
424
|
+
return self._robot_arm.arm_fk(q)
|
|
425
|
+
|
|
426
|
+
def control_robot_end_effector_pose(self, left_pose: KuavoPose, right_pose: KuavoPose, frame: KuavoManipulationMpcFrame)->bool:
|
|
427
|
+
"""通过手臂末端执行器的位姿控制机器人手臂
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
left_pose (KuavoPose): 左手臂的位姿,包含xyz和四元数。
|
|
431
|
+
right_pose (KuavoPose): 右手臂的位姿,包含xyz和四元数。
|
|
432
|
+
frame (KuavoManipulationMpcFrame): 手臂的坐标系。
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
bool: 如果控制成功返回True,否则返回False。
|
|
436
|
+
"""
|
|
437
|
+
return self._robot_arm.control_robot_end_effector_pose(left_pose, right_pose, frame)
|
|
438
|
+
|
|
439
|
+
def change_motor_param(self, motor_param:list)->Tuple[bool, str]:
|
|
440
|
+
"""更改电机参数
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
motor_param (list): :class:`kuavo_humanoid_sdk.interfaces.data_types.KuavoMotorParam` 对象列表,包含:
|
|
444
|
+
- Kp (float): 位置控制比例增益
|
|
445
|
+
- Kd (float): 速度控制微分增益
|
|
446
|
+
- id (int): 电机ID
|
|
447
|
+
Returns:
|
|
448
|
+
Tuple[bool, str]: 成功标志和消息的元组
|
|
449
|
+
"""
|
|
450
|
+
return self._kuavo_core.change_motor_param(motor_param)
|
|
451
|
+
|
|
452
|
+
def get_motor_param(self)->Tuple[bool, list]:
|
|
453
|
+
"""获取电机参数
|
|
454
|
+
|
|
455
|
+
Returns:
|
|
456
|
+
Tuple[bool, list]: 成功标志和 :class:`kuavo_humanoid_sdk.interfaces.data_types.KuavoMotorParam` 对象列表的元组
|
|
457
|
+
"""
|
|
458
|
+
return self._kuavo_core.get_motor_param()
|
|
459
|
+
|
|
460
|
+
if __name__ == "__main__":
|
|
461
|
+
robot = KuavoRobot()
|
|
462
|
+
robot.set_manipulation_mpc_mode(KuavoManipulationMpcCtrlMode.ArmOnly)
|
|
463
|
+
robot.set_manipulation_mpc_control_flow(KuavoManipulationMpcControlFlow.DirectToWbc)
|
|
464
|
+
robot.set_manipulation_mpc_frame(KuavoManipulationMpcFrame.WorldFrame)
|
|
465
|
+
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)
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# coding: utf-8
|
|
3
|
+
|
|
4
|
+
import math
|
|
5
|
+
from typing import Tuple
|
|
6
|
+
from kuavo_humanoid_sdk.interfaces.data_types import KuavoArmCtrlMode, KuavoIKParams, KuavoPose, KuavoManipulationMpcFrame, KuavoManipulationMpcCtrlMode, KuavoManipulationMpcControlFlow
|
|
7
|
+
from kuavo_humanoid_sdk.kuavo.core.core import KuavoRobotCore
|
|
8
|
+
from kuavo_humanoid_sdk.kuavo.robot_info import KuavoRobotInfo
|
|
9
|
+
|
|
10
|
+
class KuavoRobotArm:
|
|
11
|
+
"""Kuavo机器人手臂控制类。
|
|
12
|
+
|
|
13
|
+
提供了控制机器人手臂的各种接口,包括关节位置控制、轨迹控制、末端执行器姿态控制等。
|
|
14
|
+
"""
|
|
15
|
+
def __init__(self):
|
|
16
|
+
self._kuavo_core = KuavoRobotCore()
|
|
17
|
+
self._robot_info = KuavoRobotInfo(robot_type="kuavo")
|
|
18
|
+
|
|
19
|
+
def arm_reset(self)-> bool:
|
|
20
|
+
"""重置机器人手臂。
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
bool: 重置成功返回True,否则返回False。
|
|
24
|
+
"""
|
|
25
|
+
return self._kuavo_core.robot_arm_reset()
|
|
26
|
+
|
|
27
|
+
def manipulation_mpc_reset(self)-> bool:
|
|
28
|
+
"""重置机器人 Manipulation MPC 控制器。
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
bool: 重置成功返回True,否则返回False。
|
|
32
|
+
"""
|
|
33
|
+
return self._kuavo_core.robot_manipulation_mpc_reset()
|
|
34
|
+
|
|
35
|
+
def control_arm_joint_positions(self, joint_position:list)->bool:
|
|
36
|
+
"""控制机器人手臂关节位置。
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
joint_position (list): 关节位置列表,单位为弧度
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
ValueError: 如果关节位置列表长度不正确
|
|
43
|
+
ValueError: 如果关节位置超出[-π, π]范围
|
|
44
|
+
RuntimeError: 如果在控制手臂时机器人不在站立状态
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
bool: 控制成功返回True,否则返回False
|
|
48
|
+
"""
|
|
49
|
+
if len(joint_position) != self._robot_info.arm_joint_dof:
|
|
50
|
+
raise ValueError("Invalid position length. Expected {}, got {}".format(self._robot_info.arm_joint_dof, len(joint_position)))
|
|
51
|
+
|
|
52
|
+
# Check if joint positions are within ±180 degrees (±π radians)
|
|
53
|
+
for pos in joint_position:
|
|
54
|
+
if abs(pos) > math.pi:
|
|
55
|
+
raise ValueError(f"Joint position {pos} rad exceeds ±π rad (±180 deg) limit")
|
|
56
|
+
|
|
57
|
+
return self._kuavo_core.control_robot_arm_joint_positions(joint_data=joint_position)
|
|
58
|
+
|
|
59
|
+
def control_arm_joint_trajectory(self, times:list, joint_q:list)->bool:
|
|
60
|
+
"""控制机器人手臂关节轨迹。
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
times (list): 时间间隔列表,单位为秒
|
|
64
|
+
joint_q (list): 关节位置列表,单位为弧度
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
ValueError: 如果times列表长度不正确
|
|
68
|
+
ValueError: 如果关节位置列表长度不正确
|
|
69
|
+
ValueError: 如果关节位置超出[-π, π]范围
|
|
70
|
+
RuntimeError: 如果在控制手臂时机器人不在站立状态
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
bool: 控制成功返回True,否则返回False
|
|
74
|
+
"""
|
|
75
|
+
if len(times) != len(joint_q):
|
|
76
|
+
raise ValueError("Invalid input. times and joint_q must have thesame length.")
|
|
77
|
+
|
|
78
|
+
# Check if joint positions are within ±180 degrees (±π radians)
|
|
79
|
+
q_degs = []
|
|
80
|
+
for q in joint_q:
|
|
81
|
+
if any(abs(pos) > math.pi for pos in q):
|
|
82
|
+
raise ValueError("Joint positions must be within ±π rad (±180 deg)")
|
|
83
|
+
if len(q) != self._robot_info.arm_joint_dof:
|
|
84
|
+
raise ValueError("Invalid position length. Expected {}, got {}".format(self._robot_info.arm_joint_dof, len(q)))
|
|
85
|
+
# Convert joint positions from radians to degrees
|
|
86
|
+
q_degs.append([(p * 180.0 / math.pi) for p in q])
|
|
87
|
+
|
|
88
|
+
return self._kuavo_core.control_robot_arm_joint_trajectory(times=times, joint_q=q_degs)
|
|
89
|
+
|
|
90
|
+
def control_robot_end_effector_pose(self, left_pose: KuavoPose, right_pose: KuavoPose, frame: KuavoManipulationMpcFrame)->bool:
|
|
91
|
+
"""控制机器人末端执行器姿态。
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
left_pose (KuavoPose): 左手臂姿态,包含xyz位置和四元数方向
|
|
95
|
+
right_pose (KuavoPose): 右手臂姿态,包含xyz位置和四元数方向
|
|
96
|
+
frame (KuavoManipulationMpcFrame): 末端执行器姿态的坐标系
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
bool: 控制成功返回True,否则返回False
|
|
100
|
+
"""
|
|
101
|
+
return self._kuavo_core.control_robot_end_effector_pose(left_pose, right_pose, frame)
|
|
102
|
+
|
|
103
|
+
def set_fixed_arm_mode(self) -> bool:
|
|
104
|
+
"""固定/冻结机器人手臂。
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
bool: 固定/冻结成功返回True,否则返回False
|
|
108
|
+
"""
|
|
109
|
+
return self._kuavo_core.change_robot_arm_ctrl_mode(KuavoArmCtrlMode.ArmFixed)
|
|
110
|
+
|
|
111
|
+
def set_auto_swing_arm_mode(self) -> bool:
|
|
112
|
+
"""设置手臂自动摆动模式。
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
bool: 设置成功返回True,否则返回False
|
|
116
|
+
"""
|
|
117
|
+
return self._kuavo_core.change_robot_arm_ctrl_mode(KuavoArmCtrlMode.AutoSwing)
|
|
118
|
+
|
|
119
|
+
def set_external_control_arm_mode(self) -> bool:
|
|
120
|
+
"""设置手臂外部控制模式。
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
bool: 设置成功返回True,否则返回False
|
|
124
|
+
"""
|
|
125
|
+
return self._kuavo_core.change_robot_arm_ctrl_mode(KuavoArmCtrlMode.ExternalControl)
|
|
126
|
+
|
|
127
|
+
def set_manipulation_mpc_mode(self, ctrl_mode: KuavoManipulationMpcCtrlMode) -> bool:
|
|
128
|
+
"""设置 Manipulation MPC 控制模式。
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
bool: 设置成功返回True,否则返回False
|
|
132
|
+
"""
|
|
133
|
+
return self._kuavo_core.change_manipulation_mpc_ctrl_mode(ctrl_mode)
|
|
134
|
+
|
|
135
|
+
def set_manipulation_mpc_control_flow(self, control_flow: KuavoManipulationMpcControlFlow) -> bool:
|
|
136
|
+
"""设置 Manipulation MPC 控制流。
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
bool: 设置成功返回True,否则返回False
|
|
140
|
+
"""
|
|
141
|
+
return self._kuavo_core.change_manipulation_mpc_control_flow(control_flow)
|
|
142
|
+
|
|
143
|
+
def set_manipulation_mpc_frame(self, frame: KuavoManipulationMpcFrame) -> bool:
|
|
144
|
+
"""设置 Manipulation MPC 坐标系。
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
bool: 设置成功返回True,否则返回False
|
|
148
|
+
"""
|
|
149
|
+
return self._kuavo_core.change_manipulation_mpc_frame(frame)
|
|
150
|
+
|
|
151
|
+
""" 手臂正向运动学和逆向运动学 """
|
|
152
|
+
def arm_ik(self,
|
|
153
|
+
left_pose: KuavoPose,
|
|
154
|
+
right_pose: KuavoPose,
|
|
155
|
+
left_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
|
|
156
|
+
right_elbow_pos_xyz: list = [0.0, 0.0, 0.0],
|
|
157
|
+
arm_q0: list = None,
|
|
158
|
+
params: KuavoIKParams=None) -> list:
|
|
159
|
+
"""机器人手臂逆向运动学求解
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
left_pose (KuavoPose): 左手臂目标姿态,包含xyz位置和四元数方向
|
|
163
|
+
right_pose (KuavoPose): 右手臂目标姿态,包含xyz位置和四元数方向
|
|
164
|
+
left_elbow_pos_xyz (list): 左肘部位置。如果为[0.0, 0.0, 0.0],则忽略
|
|
165
|
+
right_elbow_pos_xyz (list): 右肘部位置。如果为[0.0, 0.0, 0.0],则忽略
|
|
166
|
+
arm_q0 (list, optional): 初始关节位置,单位为弧度。如果为None,则忽略
|
|
167
|
+
params (KuavoIKParams, optional): 逆向运动学参数。如果为None,则忽略,包含:
|
|
168
|
+
- major_optimality_tol: 主要最优性容差 \n
|
|
169
|
+
- major_feasibility_tol: 主要可行性容差 \n
|
|
170
|
+
- minor_feasibility_tol: 次要可行性容差 \n
|
|
171
|
+
- major_iterations_limit: 主要迭代次数限制 \n
|
|
172
|
+
- oritation_constraint_tol: 方向约束容差 \n
|
|
173
|
+
- pos_constraint_tol: 位置约束容差,当pos_cost_weight==0.0时生效 \n
|
|
174
|
+
- pos_cost_weight: 位置代价权重。设为0.0可获得高精度 \n
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
list: 关节位置列表,单位为弧度。如果计算失败返回None
|
|
178
|
+
|
|
179
|
+
Warning:
|
|
180
|
+
此函数需要在初始化SDK时设置 :attr:`KuavoSDK.Options.WithIK` 选项。
|
|
181
|
+
"""
|
|
182
|
+
return self._kuavo_core.arm_ik(left_pose, right_pose, left_elbow_pos_xyz, right_elbow_pos_xyz, arm_q0, params)
|
|
183
|
+
|
|
184
|
+
def arm_fk(self, q: list) -> Tuple[KuavoPose, KuavoPose]:
|
|
185
|
+
"""机器人手臂正向运动学求解
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
q (list): 关节位置列表,单位为弧度
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Tuple[KuavoPose, KuavoPose]: 左右手臂姿态的元组,
|
|
192
|
+
如果计算失败返回(None, None)
|
|
193
|
+
|
|
194
|
+
Warning:
|
|
195
|
+
此函数需要在初始化SDK时设置 :attr:`KuavoSDK.Options.WithIK` 选项。
|
|
196
|
+
"""
|
|
197
|
+
if len(q) != self._robot_info.arm_joint_dof:
|
|
198
|
+
raise ValueError("Invalid position length. Expected {}, got {}".format(self._robot_info.arm_joint_dof, len(q)))
|
|
199
|
+
|
|
200
|
+
result = self._kuavo_core.arm_fk(q)
|
|
201
|
+
if result is None:
|
|
202
|
+
return None, None
|
|
203
|
+
return result
|
|
204
|
+
|
|
205
|
+
# if __name__ == "__main__":
|
|
206
|
+
# arm = KuavoRobotArm()
|
|
207
|
+
# arm.set_manipulation_mpc_mode(KuavoManipulationMpcCtrlMode.ArmOnly)
|
|
208
|
+
# arm.set_manipulation_mpc_control_flow(KuavoManipulationMpcControlFlow.DirectToWbc)
|
|
209
|
+
# arm.set_manipulation_mpc_frame(KuavoManipulationMpcFrame.WorldFrame)
|
|
210
|
+
# arm.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)
|