kuavo-humanoid-sdk 1.2.1b3323__20250918212129-py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kuavo-humanoid-sdk might be problematic. Click here for more details.

Files changed (186) hide show
  1. kuavo_humanoid_sdk/__init__.py +6 -0
  2. kuavo_humanoid_sdk/common/logger.py +45 -0
  3. kuavo_humanoid_sdk/interfaces/__init__.py +4 -0
  4. kuavo_humanoid_sdk/interfaces/data_types.py +288 -0
  5. kuavo_humanoid_sdk/interfaces/end_effector.py +62 -0
  6. kuavo_humanoid_sdk/interfaces/robot.py +22 -0
  7. kuavo_humanoid_sdk/interfaces/robot_info.py +56 -0
  8. kuavo_humanoid_sdk/kuavo/__init__.py +16 -0
  9. kuavo_humanoid_sdk/kuavo/core/audio.py +32 -0
  10. kuavo_humanoid_sdk/kuavo/core/core.py +666 -0
  11. kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +114 -0
  12. kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +67 -0
  13. kuavo_humanoid_sdk/kuavo/core/llm_doubao.py +608 -0
  14. kuavo_humanoid_sdk/kuavo/core/microphone.py +192 -0
  15. kuavo_humanoid_sdk/kuavo/core/navigation.py +70 -0
  16. kuavo_humanoid_sdk/kuavo/core/ros/audio.py +110 -0
  17. kuavo_humanoid_sdk/kuavo/core/ros/camera.py +105 -0
  18. kuavo_humanoid_sdk/kuavo/core/ros/control.py +1524 -0
  19. kuavo_humanoid_sdk/kuavo/core/ros/microphone.py +38 -0
  20. kuavo_humanoid_sdk/kuavo/core/ros/navigation.py +217 -0
  21. kuavo_humanoid_sdk/kuavo/core/ros/observation.py +94 -0
  22. kuavo_humanoid_sdk/kuavo/core/ros/param.py +201 -0
  23. kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +103 -0
  24. kuavo_humanoid_sdk/kuavo/core/ros/state.py +652 -0
  25. kuavo_humanoid_sdk/kuavo/core/ros/tools.py +220 -0
  26. kuavo_humanoid_sdk/kuavo/core/ros/vision.py +234 -0
  27. kuavo_humanoid_sdk/kuavo/core/ros_env.py +238 -0
  28. kuavo_humanoid_sdk/kuavo/core/sdk_deprecated.py +41 -0
  29. kuavo_humanoid_sdk/kuavo/demo_climbstair.py +249 -0
  30. kuavo_humanoid_sdk/kuavo/dexterous_hand.py +238 -0
  31. kuavo_humanoid_sdk/kuavo/leju_claw.py +235 -0
  32. kuavo_humanoid_sdk/kuavo/logger_client.py +80 -0
  33. kuavo_humanoid_sdk/kuavo/robot.py +646 -0
  34. kuavo_humanoid_sdk/kuavo/robot_arm.py +411 -0
  35. kuavo_humanoid_sdk/kuavo/robot_audio.py +39 -0
  36. kuavo_humanoid_sdk/kuavo/robot_blockly.py +1154 -0
  37. kuavo_humanoid_sdk/kuavo/robot_climbstair.py +1607 -0
  38. kuavo_humanoid_sdk/kuavo/robot_head.py +95 -0
  39. kuavo_humanoid_sdk/kuavo/robot_info.py +134 -0
  40. kuavo_humanoid_sdk/kuavo/robot_microphone.py +19 -0
  41. kuavo_humanoid_sdk/kuavo/robot_navigation.py +135 -0
  42. kuavo_humanoid_sdk/kuavo/robot_observation.py +64 -0
  43. kuavo_humanoid_sdk/kuavo/robot_speech.py +24 -0
  44. kuavo_humanoid_sdk/kuavo/robot_state.py +310 -0
  45. kuavo_humanoid_sdk/kuavo/robot_tool.py +109 -0
  46. kuavo_humanoid_sdk/kuavo/robot_vision.py +81 -0
  47. kuavo_humanoid_sdk/kuavo_strategy/__init__.py +2 -0
  48. kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +1325 -0
  49. kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +106 -0
  50. kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +340 -0
  51. kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +215 -0
  52. kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +25 -0
  53. kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +331 -0
  54. kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +504 -0
  55. kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +40 -0
  56. kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +88 -0
  57. kuavo_humanoid_sdk/msg/__init__.py +4 -0
  58. kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +7 -0
  59. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +306 -0
  60. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +437 -0
  61. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AudioReceiverData.py +122 -0
  62. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_FTsensorData.py +260 -0
  63. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +191 -0
  64. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +199 -0
  65. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_MmDetectionMsg.py +264 -0
  66. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +112 -0
  67. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +323 -0
  68. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TaskPoint.py +175 -0
  69. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +62 -0
  70. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +160 -0
  71. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +161 -0
  72. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
  73. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +168 -0
  74. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +171 -0
  75. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +178 -0
  76. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +229 -0
  77. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +256 -0
  78. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +227 -0
  79. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +123 -0
  80. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6D.py +123 -0
  81. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +320 -0
  82. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +301 -0
  83. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +136 -0
  84. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +231 -0
  85. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +149 -0
  86. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.py +149 -0
  87. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +258 -0
  88. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +147 -0
  89. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +218 -0
  90. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +149 -0
  91. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +136 -0
  92. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +145 -0
  93. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +171 -0
  94. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +140 -0
  95. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +165 -0
  96. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +201 -0
  97. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +390 -0
  98. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +205 -0
  99. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_kuavoModeSchedule.py +224 -0
  100. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +320 -0
  101. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +341 -0
  102. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +122 -0
  103. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfo.py +143 -0
  104. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +220 -0
  105. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +120 -0
  106. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +121 -0
  107. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +177 -0
  108. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotBodyMatrices.py +332 -0
  109. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +225 -0
  110. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +128 -0
  111. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +222 -0
  112. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +655 -0
  113. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +200 -0
  114. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +216 -0
  115. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +162 -0
  116. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +273 -0
  117. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +316 -0
  118. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
  119. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
  120. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +251 -0
  121. kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +168 -0
  122. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_CreatePath.py +581 -0
  123. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +281 -0
  124. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetAllMaps.py +241 -0
  125. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetCurrentMap.py +225 -0
  126. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +298 -0
  127. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_InitialPoseWithTaskPoint.py +281 -0
  128. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_LoadMap.py +281 -0
  129. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_NavigateToTaskPoint.py +281 -0
  130. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +373 -0
  131. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetInitialPose.py +394 -0
  132. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +282 -0
  133. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +468 -0
  134. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode_free.py +289 -0
  135. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +270 -0
  136. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_TaskPointOperation.py +536 -0
  137. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +43 -0
  138. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_adjustZeroPoint.py +277 -0
  139. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +275 -0
  140. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +236 -0
  141. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +299 -0
  142. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +274 -0
  143. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +408 -0
  144. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +304 -0
  145. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +395 -0
  146. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +426 -0
  147. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +409 -0
  148. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +339 -0
  149. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +257 -0
  150. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +418 -0
  151. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +253 -0
  152. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +299 -0
  153. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorZeroPoints.py +286 -0
  154. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +330 -0
  155. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +302 -0
  156. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +422 -0
  157. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +490 -0
  158. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +268 -0
  159. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +304 -0
  160. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +273 -0
  161. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +283 -0
  162. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +275 -0
  163. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +444 -0
  164. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
  165. kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +664 -0
  166. kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +7 -0
  167. kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +7 -0
  168. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +12 -0
  169. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +142 -0
  170. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +121 -0
  171. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +148 -0
  172. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +150 -0
  173. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +666 -0
  174. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +122 -0
  175. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +209 -0
  176. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +140 -0
  177. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +886 -0
  178. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +122 -0
  179. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +239 -0
  180. kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +148 -0
  181. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +1 -0
  182. kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +376 -0
  183. kuavo_humanoid_sdk-1.2.1b3323.dist-info/METADATA +297 -0
  184. kuavo_humanoid_sdk-1.2.1b3323.dist-info/RECORD +186 -0
  185. kuavo_humanoid_sdk-1.2.1b3323.dist-info/WHEEL +6 -0
  186. kuavo_humanoid_sdk-1.2.1b3323.dist-info/top_level.txt +1 -0
@@ -0,0 +1,331 @@
1
+ from kuavo_humanoid_sdk.kuavo_strategy_v2.common.data_type import Pose, Tag, Frame
2
+ from kuavo_humanoid_sdk.kuavo_strategy_v2.utils.logger_setup import init_logging
3
+ from kuavo_humanoid_sdk.kuavo_strategy_v2.common.events.mobile_manipulate import (
4
+ EventArmMoveKeyPoint, EventPercep, EventWalkToPose, EventHeadMoveKeyPoint)
5
+ from kuavo_humanoid_sdk.kuavo_strategy_v2.common.robot_sdk import RobotSDK
6
+
7
+ import numpy as np
8
+ import os, sys
9
+ mother_dir = os.path.dirname(os.path.abspath(__file__))
10
+
11
+ log_path = init_logging(log_dir=os.path.join(mother_dir, "logs"), filename_prefix="grab_box_v2", enable=True)
12
+
13
+ from configs.config_sim import config
14
+ # from configs.config_real import config
15
+
16
+ from strategy import (
17
+ search_tag_with_head,
18
+ walk_approach_target_with_perception_loop,
19
+ grab_box_and_backward,
20
+ place_box_and_backward,
21
+ return_to_idle
22
+ )
23
+
24
+
25
+ def test_arm_only():
26
+ """
27
+ 测试仅使用手臂的功能。
28
+ """
29
+ robot_sdk = RobotSDK()
30
+
31
+ # 初始化事件
32
+ walk_event = EventWalkToPose(
33
+ robot_sdk=robot_sdk,
34
+ timeout=config.common.walk_timeout, # 走路事件的超时时间,单位秒
35
+ yaw_threshold=config.common.walk_yaw_threshold, # 走路事件的偏航角度阈值,单位弧度
36
+ pos_threshold=config.common.walk_pos_threshold, # 走路事件的位置阈值,单位米
37
+ control_mode='cmd_pos_world' # 使用世界坐标系的命令位置控制模式
38
+ )
39
+ head_event = EventHeadMoveKeyPoint(
40
+ robot_sdk=robot_sdk,
41
+ timeout=config.common.head_timeout, # 头部移动事件的超时时间,单位秒
42
+ )
43
+ percep_event = EventPercep(
44
+ robot_sdk=robot_sdk,
45
+ half_fov=config.common.half_fov, # 半视场角度,单位度
46
+ timeout=np.inf, # 头部移动事件的超时时间,单位秒
47
+ )
48
+ arm_event = EventArmMoveKeyPoint(
49
+ robot_sdk=robot_sdk,
50
+ timeout=config.common.arm_timeout, # 手臂移动事件的超时时间,单位秒
51
+ arm_control_mode=config.common.arm_control_mode, # 手臂控制模式
52
+ pos_threshold=config.common.arm_pos_threshold, # 手臂位置阈值,单位米
53
+ angle_threshold=config.common.arm_angle_threshold, # 手臂角度阈值,单位弧度
54
+ )
55
+
56
+ fake_target_tag = Tag(
57
+ id=config.pick.tag_id, # 假设目标箱子的ID为1
58
+ pose=Pose.from_euler(
59
+ pos=(0.3, 0.0, 0.96), # 初始位置猜测,单位米
60
+ euler=(90, 0, -90), # 初始姿态猜测,单位欧拉角(弧度)
61
+ frame=Frame.ODOM, # 使用里程计坐标系
62
+ degrees=True
63
+ )
64
+ )
65
+
66
+ success = grab_box_and_backward(
67
+ walk_event=walk_event,
68
+ arm_event=arm_event,
69
+ box_width=config.common.box_width,
70
+ box_behind_tag=config.pick.box_behind_tag, # 箱子在tag后面的距离,单位米
71
+ box_beneath_tag=config.pick.box_beneath_tag, # 箱子在tag下方的距离,单位米
72
+ box_left_tag=config.pick.box_left_tag, # 箱子在tag左侧的距离,单位米
73
+ tag=fake_target_tag,
74
+ step_back_distance=config.common.step_back_distance, # 搬起后向后平移的距离,单位米
75
+
76
+ box_mass=config.common.box_mass, # 假设箱子质量,单位kg,用来计算纵向wrench
77
+ force_ratio_z=config.pick.force_ratio_z, # 经验系数(根据1.5kg对应5N得出:5/(1.5*9.8)≈0.34
78
+ lateral_force=config.pick.lateral_force, # 侧向夹持力,单位N
79
+ )
80
+
81
+ def grab_one_box(user_input=True):
82
+ """
83
+ 执行抓取一个箱子的完整策略。
84
+
85
+ 参数:
86
+ user_input (bool): 是否等待用户输入以继续每个步骤。
87
+
88
+ 返回:
89
+ bool: 是否成功完成策略。
90
+ """
91
+ # 1. 尋找箱子
92
+
93
+ # 初始化机器人
94
+ robot_sdk = RobotSDK()
95
+
96
+ # 初始化事件
97
+ walk_event = EventWalkToPose(
98
+ robot_sdk=robot_sdk,
99
+ timeout=config.common.walk_timeout, # 走路事件的超时时间,单位秒
100
+ yaw_threshold=config.common.walk_yaw_threshold, # 走路事件的偏航角度阈值,单位弧度
101
+ pos_threshold=config.common.walk_pos_threshold, # 走路事件的位置阈值,单位米
102
+ control_mode='cmd_pos_world' # 使用世界坐标系的命令位置控制模式
103
+ )
104
+ head_event = EventHeadMoveKeyPoint(
105
+ robot_sdk=robot_sdk,
106
+ timeout=config.common.head_timeout, # 头部移动事件的超时时间,单位秒
107
+ )
108
+ percep_event = EventPercep(
109
+ robot_sdk=robot_sdk,
110
+ half_fov=config.common.half_fov, # 半视场角度,单位度
111
+ timeout=np.inf, # 头部移动事件的超时时间,单位秒
112
+ )
113
+ arm_event = EventArmMoveKeyPoint(
114
+ robot_sdk=robot_sdk,
115
+ timeout=config.common.arm_timeout, # 手臂移动事件的超时时间,单位秒
116
+ arm_control_mode=config.common.arm_control_mode, # 手臂控制模式
117
+ pos_threshold=config.common.arm_pos_threshold, # 手臂位置阈值,单位米
118
+ angle_threshold=config.common.arm_angle_threshold, # 手臂角度阈值,单位弧度
119
+ )
120
+
121
+ # 1. -------------------- 使用头部寻找目标位置 --------------------
122
+
123
+ success, target_tag = search_tag_with_head(
124
+ robot_sdk=robot_sdk,
125
+ walk_event=walk_event,
126
+ head_event=head_event,
127
+ percep_event=percep_event,
128
+
129
+ init_tag_guess=Tag(
130
+ id=config.pick.tag_id, # 假设目标箱子的ID为1
131
+ pose=Pose.from_euler(
132
+ pos=config.pick.tag_pos_world, # 初始位置猜测,单位米
133
+ euler=config.pick.tag_euler_world, # 初始姿态猜测,单位四元数
134
+ frame=Frame.ODOM, # 使用里程计坐标系
135
+ degrees=False
136
+ )
137
+ ),
138
+
139
+ head_search_yaws=config.common.head_search_yaws, # 头部搜索的偏航角度范围,单位度
140
+ head_search_pitchs=config.common.head_search_pitchs, # 头部搜索的俯仰角度范围,单位度
141
+ enable_head_tracking=config.common.enable_head_tracking, # 是否启用头部追踪
142
+ rotate_body=config.common.rotate_body, # 是否允许身体旋转以寻找目标
143
+ walk_use_cmd_vel=config.common.walk_use_cmd_vel
144
+ )
145
+
146
+ if not success:
147
+ print("未能找到目标箱子,退出策略。")
148
+ return False
149
+
150
+ ## 在这里添加键盘事件,按特定按键才能继续
151
+ print("======================================================")
152
+ print(f"找到目标Tag,ID: {target_tag.id}, 位置: {target_tag.pose}")
153
+ if user_input:
154
+ input("准备接近搬起Tag,按回车键继续... \n")
155
+
156
+ # 2. -------------------- 走路接近目标位置 --------------------
157
+
158
+ arm_event.arm_reset()
159
+ robot_sdk.control.control_arm_joint_positions(
160
+ joint_positions=[0.0] * 14 # 手臂站立位置的关节角度,单位弧度
161
+ )
162
+
163
+ success, latest_tag = walk_approach_target_with_perception_loop(
164
+ walk_event=walk_event,
165
+ percep_event=percep_event,
166
+ tag=target_tag,
167
+ stand_pose_in_tag=Pose.from_euler(
168
+ pos=config.pick.stand_in_tag_pos, # 站立位置在目标标签中的位置猜测,单位米
169
+ euler=config.pick.stand_in_tag_euler, # 站立位置在目标标签中的姿态猜测,单位欧拉角(弧度)
170
+ frame=Frame.TAG, # 使用标签坐标系
171
+ degrees=False
172
+ ),
173
+ enable_percep_when_walking=config.common.enable_percep_when_walking,
174
+ walk_use_cmd_vel=config.common.walk_use_cmd_vel
175
+ )
176
+
177
+ if not success:
178
+ print("未能接近目标箱子,退出策略。")
179
+ return False
180
+
181
+ ## 在这里添加键盘事件,按特定按键才能继续
182
+ print("======================================================")
183
+ print(f"已接近目标Tag,ID: {latest_tag.id}, 位置: {latest_tag.pose}")
184
+ if user_input:
185
+ input(" 准备搬框,按回车键继续... \n")
186
+
187
+ # 3. -------------------- 移动手臂搬框 --------------------
188
+
189
+ fake_target_tag = Tag(
190
+ id=config.pick.tag_id, # 假设目标箱子的ID为1
191
+ pose=Pose.from_euler(
192
+ pos=(0.3, 0.0, 0.96), # 初始位置猜测,单位米
193
+ euler=(90, 0, -90), # 初始姿态猜测,单位欧拉角(弧度)
194
+ frame=Frame.ODOM, # 使用里程计坐标系
195
+ degrees=True
196
+ )
197
+ )
198
+
199
+ success = grab_box_and_backward(
200
+ walk_event=walk_event,
201
+ arm_event=arm_event,
202
+ box_width=config.common.box_width,
203
+ box_behind_tag=config.pick.box_behind_tag, # 箱子在tag后面的距离,单位米
204
+ box_beneath_tag=config.pick.box_beneath_tag, # 箱子在tag下方的距离,单位米
205
+ box_left_tag=config.pick.box_left_tag, # 箱子在tag左侧的距离,单位米
206
+ tag=latest_tag,
207
+ step_back_distance=config.common.step_back_distance, # 搬起后向后平移的距离,单位米
208
+
209
+ box_mass=config.common.box_mass, # 假设箱子质量,单位kg,用来计算纵向wrench
210
+ force_ratio_z=config.pick.force_ratio_z, # 经验系数(根据1.5kg对应5N得出:5/(1.5*9.8)≈0.34
211
+ lateral_force=config.pick.lateral_force, # 侧向夹持力,单位N
212
+ walk_use_cmd_vel=config.common.walk_use_cmd_vel
213
+ )
214
+
215
+ if not success:
216
+ print("未能搬起来目标箱子,退出策略。")
217
+ return False
218
+
219
+ ## 在这里添加键盘事件,按特定按键才能继续
220
+ print("======================================================")
221
+ if user_input:
222
+ input("准备寻找放置地点,按回车键继续... \n")
223
+
224
+ # 4. -------------------- 尋找放置地點 --------------------
225
+
226
+ success, target_tag = search_tag_with_head(
227
+ robot_sdk=robot_sdk,
228
+ walk_event=walk_event,
229
+ head_event=head_event,
230
+ percep_event=percep_event,
231
+
232
+ init_tag_guess=Tag(
233
+ id=config.place.tag_id, # 假设目标箱子的ID为1
234
+ pose=Pose.from_euler(
235
+ pos=config.place.tag_pos_world, # 初始位置猜测,单位米
236
+ euler=config.place.tag_euler_world, # 初始姿态猜测,单位四元数
237
+ frame=Frame.ODOM, # 使用里程计坐标系
238
+ degrees=False
239
+ )
240
+ ),
241
+
242
+ head_search_yaws=config.common.head_search_yaws, # 头部搜索的偏航角度范围,单位度
243
+ head_search_pitchs=config.common.head_search_pitchs, # 头部搜索的俯仰角度范围,单位度
244
+ enable_head_tracking=config.common.enable_head_tracking, # 是否启用头部追踪
245
+ rotate_body=config.common.rotate_body, # 是否允许身体旋转以寻找目标
246
+ walk_use_cmd_vel=config.common.walk_use_cmd_vel
247
+ )
248
+
249
+ if not success:
250
+ print("未能找到目标箱子,退出策略。")
251
+ return False
252
+
253
+ ## 在这里添加键盘事件,按特定按键才能继续
254
+ print("======================================================")
255
+ print(f"找到目标Tag,ID: {target_tag.id}, 位置: {target_tag.pose}")
256
+ if user_input:
257
+ input("准备接近放置Tag,按回车键继续... \n")
258
+
259
+ # 5. -------------------- 走路接近放置位置 --------------------
260
+
261
+ success, latest_tag = walk_approach_target_with_perception_loop(
262
+ walk_event=walk_event,
263
+ percep_event=percep_event,
264
+ tag=target_tag,
265
+ stand_pose_in_tag=Pose.from_euler(
266
+ pos=config.place.stand_in_tag_pos, # 站立位置在目标标签中的位置猜测,单位米
267
+ euler=config.place.stand_in_tag_euler, # 站立位置在目标标签中的姿态猜测,单位欧拉角(弧度)
268
+ frame=Frame.TAG, # 使用标签坐标系
269
+ degrees=False
270
+ ),
271
+ enable_percep_when_walking=config.common.enable_percep_when_walking,
272
+ walk_use_cmd_vel=config.common.walk_use_cmd_vel
273
+ )
274
+
275
+ if not success:
276
+ print("未能接近目标地点,退出策略。")
277
+ return False
278
+
279
+ ## 在这里添加键盘事件,按特定按键才能继续
280
+ print("======================================================")
281
+ print(f"已接近目标Tag,ID: {latest_tag.id}, 位置: {latest_tag.pose}")
282
+ if user_input:
283
+ input("准备放框,按回车键继续... \n")
284
+
285
+ # 6. -------------------- 放下箱子并向后平移 --------------------
286
+ success = place_box_and_backward(
287
+ walk_event=walk_event,
288
+ arm_event=arm_event,
289
+ box_width=config.common.box_width,
290
+ box_behind_tag=config.place.box_behind_tag, # 箱子在tag后面的距离,单位米
291
+ box_beneath_tag=config.place.box_beneath_tag, # 箱子在tag下方的距离,单位米
292
+ box_left_tag=config.place.box_left_tag, # 箱子在tag左侧的距离,单位米
293
+ tag=latest_tag,
294
+ step_back_distance=config.common.step_back_distance, # 搬起后向后平移的距离,单位米
295
+
296
+ box_mass=config.common.box_mass, # 假设箱子质量,单位kg,用来计算纵向wrench
297
+ force_ratio_z=config.place.force_ratio_z, # 经验系数(根据1.5kg对应5N得出:5/(1.5*9.8)≈0.34
298
+ lateral_force=config.place.lateral_force, # 侧向夹持力,单位N,
299
+ walk_use_cmd_vel=config.common.walk_use_cmd_vel
300
+ )
301
+
302
+ if not success:
303
+ print("未能放下目标箱子,退出策略。")
304
+ return False
305
+
306
+ ## 在这里添加键盘事件,按特定按键才能继续
307
+ print("======================================================")
308
+ if user_input:
309
+ input("准备回到初始位置,按回车键继续...\n")
310
+
311
+ # end. -------------------- 回到初始位置 --------------------
312
+ # success = return_to_idle(
313
+ # walk_event=walk_event,
314
+ # )
315
+
316
+ # if not success:
317
+ # print("未能回到初始位置,退出策略。")
318
+ # return False
319
+ return True
320
+
321
+
322
+ if __name__ == "__main__":
323
+ for eps in range(10):
324
+ print(f"### 案例开始: {eps} ###")
325
+ res = grab_one_box(user_input=True)
326
+ print(f"### 案例结束: {eps} ###")
327
+
328
+ if not res:
329
+ break
330
+
331
+ # test_arm_only()