kuavo-humanoid-sdk 1.2.1__tar.gz → 1.2.1b1675__tar.gz

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 (163) hide show
  1. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/PKG-INFO +1 -1
  2. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/README.md +1 -42
  3. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/data_types.py +12 -0
  4. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/core.py +32 -10
  5. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/control.py +168 -24
  6. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/state.py +30 -1
  7. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/tools.py +3 -2
  8. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros_env.py +1 -0
  9. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot.py +49 -0
  10. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_arm.py +38 -0
  11. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_head.py +1 -1
  12. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_state.py +8 -0
  13. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_tool.py +29 -2
  14. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_vision.py +0 -2
  15. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +333 -134
  16. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +5 -3
  17. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +340 -0
  18. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +215 -0
  19. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +25 -0
  20. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +331 -0
  21. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +504 -0
  22. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +40 -0
  23. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +88 -0
  24. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AudioReceiverData.py +122 -0
  25. kuavo_humanoid_sdk-1.2.1/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_questJoySticks.py → kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +4 -4
  26. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_MmDetectionMsg.py +264 -0
  27. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +16 -1
  28. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +160 -0
  29. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
  30. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6D.py +123 -0
  31. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +301 -0
  32. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +136 -0
  33. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +231 -0
  34. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.py +149 -0
  35. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfo.py +143 -0
  36. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +220 -0
  37. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotBodyMatrices.py +332 -0
  38. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +216 -0
  39. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
  40. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
  41. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +298 -0
  42. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +468 -0
  43. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +4 -0
  44. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +410 -0
  45. kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
  46. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/PKG-INFO +1 -1
  47. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/SOURCES.txt +27 -1
  48. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/setup.py +5 -0
  49. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/__init__.py +0 -0
  50. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/common/logger.py +0 -0
  51. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/__init__.py +0 -0
  52. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/end_effector.py +0 -0
  53. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/robot.py +0 -0
  54. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/robot_info.py +0 -0
  55. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/__init__.py +0 -0
  56. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/audio.py +0 -0
  57. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +0 -0
  58. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +0 -0
  59. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/audio.py +0 -0
  60. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/observation.py +0 -0
  61. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/param.py +0 -0
  62. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +0 -0
  63. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/vision.py +0 -0
  64. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/dexterous_hand.py +0 -0
  65. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/leju_claw.py +0 -0
  66. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_audio.py +0 -0
  67. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_info.py +0 -0
  68. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_observation.py +0 -0
  69. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/__init__.py +0 -0
  70. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/__init__.py +0 -0
  71. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +0 -0
  72. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +0 -0
  73. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +0 -0
  74. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +0 -0
  75. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +0 -0
  76. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +0 -0
  77. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +0 -0
  78. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +0 -0
  79. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +0 -0
  80. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +0 -0
  81. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +0 -0
  82. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +0 -0
  83. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +0 -0
  84. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +0 -0
  85. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +0 -0
  86. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +0 -0
  87. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +0 -0
  88. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +0 -0
  89. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +0 -0
  90. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +0 -0
  91. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +0 -0
  92. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +0 -0
  93. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +0 -0
  94. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +0 -0
  95. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +0 -0
  96. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +0 -0
  97. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +0 -0
  98. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +0 -0
  99. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +0 -0
  100. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +0 -0
  101. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +0 -0
  102. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +0 -0
  103. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +0 -0
  104. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +0 -0
  105. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +0 -0
  106. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +0 -0
  107. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +0 -0
  108. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +0 -0
  109. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +0 -0
  110. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +0 -0
  111. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +0 -0
  112. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +0 -0
  113. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +0 -0
  114. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +0 -0
  115. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +0 -0
  116. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +0 -0
  117. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +0 -0
  118. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +0 -0
  119. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +0 -0
  120. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +0 -0
  121. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +0 -0
  122. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +0 -0
  123. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +0 -0
  124. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +0 -0
  125. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +0 -0
  126. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +0 -0
  127. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +0 -0
  128. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +0 -0
  129. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +0 -0
  130. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +0 -0
  131. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +0 -0
  132. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +0 -0
  133. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +0 -0
  134. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +0 -0
  135. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +0 -0
  136. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +0 -0
  137. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +0 -0
  138. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +0 -0
  139. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +0 -0
  140. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +0 -0
  141. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +0 -0
  142. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +0 -0
  143. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +0 -0
  144. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +0 -0
  145. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +0 -0
  146. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +0 -0
  147. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +0 -0
  148. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +0 -0
  149. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +0 -0
  150. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +0 -0
  151. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +0 -0
  152. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +0 -0
  153. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +0 -0
  154. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +0 -0
  155. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +0 -0
  156. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +0 -0
  157. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +0 -0
  158. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +0 -0
  159. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +0 -0
  160. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/dependency_links.txt +0 -0
  161. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/requires.txt +0 -0
  162. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/top_level.txt +0 -0
  163. {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuavo_humanoid_sdk
3
- Version: 1.2.1
3
+ Version: 1.2.1b1675
4
4
  Summary: A Python SDK for kuavo humanoid robot.
5
5
  Home-page: https://gitee.com/leju-robot/kuavo-ros-opensource/
6
6
  Author: ['lejurobot']
@@ -77,49 +77,8 @@ chmod +x ./gen_docs.sh
77
77
  ![](docs/images/image.png)
78
78
 
79
79
  ## 搬箱子案例
80
- **编译**:
81
- ```
82
- catkin build humanoid_controllers kuavo_msgs gazebo_sim ar_control
83
- ```
84
-
85
- **运行**:
86
-
87
- ⚠️ 在运行之前, 需要确认机器人版本`ROBOT_VERSION=45`,否则会机器人末端控制会有问题
88
- ```
89
- # 启动gazebo场景
90
- roslaunch humanoid_controllers load_kuavo_gazebo_manipulate.launch joystick_type:=bt2pro
91
-
92
- # 启动ar_tag转换码操作和virtual操作
93
- roslaunch ar_control robot_strategies.launch
94
-
95
- # 运行搬箱子案例
96
- python3 grasp_box_example.py
97
- ```
98
-
99
- 🚨 第一次启动gazebo场景前需要修改tag尺寸:
100
-
101
- 在`/opt/ros/noetic/share/apriltag_ros/config/tags.yaml`文件中将tag的size尺寸修改为和立方体tag码的尺寸一致(只需做一次)
102
- ```
103
- standalone_tags:
104
- [
105
- {id: 0, size: 0.088, name: 'tag_0'},
106
- {id: 1, size: 0.088, name: 'tag_1'},
107
- {id: 2, size: 0.088, name: 'tag_2'},
108
- {id: 3, size: 0.088, name: 'tag_3'},
109
- {id: 4, size: 0.088, name: 'tag_4'},
110
- {id: 5, size: 0.088, name: 'tag_5'},
111
- {id: 6, size: 0.088, name: 'tag_6'},
112
- {id: 7, size: 0.088, name: 'tag_7'},
113
- {id: 8, size: 0.088, name: 'tag_8'},
114
- {id: 9, size: 0.088, name: 'tag_9'},
115
- ]
116
- ```
117
- 🚨 每次启动gazebo场景后需要手动打光:
118
-
119
- 需要在机器人腰部位置附近给个点光源,否则会找不到tag
120
-
121
- ![](docs/images/gazebo.jpg)
122
80
 
81
+ 请参阅 html 或 markdown 文档中,**策略模块/搬箱子示例**章节内容,获取更多信息。
123
82
 
124
83
  **测试**
125
84
  ```
@@ -129,6 +129,18 @@ class KuavoPose:
129
129
  position: Tuple[float, float, float] # x, y, z
130
130
  orientation: Tuple[float, float, float, float] # x, y, z, w
131
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
+
132
144
  @dataclass
133
145
  class KuavoIKParams:
134
146
  """表示IK节点参数的数据类。"""
@@ -410,6 +410,8 @@ class KuavoRobotCore:
410
410
  if self.state != 'stance':
411
411
  raise RuntimeError(f"[Core] control_robot_arm_joint_positions failed: robot must be in stance state, current state: {self.state}")
412
412
 
413
+ if self._control.is_arm_collision_mode() and self._control.is_arm_collision():
414
+ raise RuntimeError(f"Arm collision detected, cannot publish arm trajectory")
413
415
  # change to external control mode
414
416
  if self._arm_ctrl_mode != KuavoArmCtrlMode.ExternalControl:
415
417
  SDKLogger.debug("[Core] control_robot_arm_joint_positions, current arm mode != ExternalControl, change it.")
@@ -421,6 +423,9 @@ class KuavoRobotCore:
421
423
  def control_robot_arm_joint_trajectory(self, times:list, joint_q:list)->bool:
422
424
  if self.state != 'stance':
423
425
  raise RuntimeError("[Core] control_robot_arm_joint_trajectory failed: robot must be in stance state")
426
+
427
+ if self._control.is_arm_collision_mode() and self._control.is_arm_collision():
428
+ raise RuntimeError(f"Arm collision detected, cannot publish arm trajectory")
424
429
 
425
430
  if self._arm_ctrl_mode != KuavoArmCtrlMode.ExternalControl:
426
431
  SDKLogger.debug("[Core] control_robot_arm_joint_trajectory, current arm mode != ExternalControl, change it.")
@@ -445,6 +450,9 @@ class KuavoRobotCore:
445
450
 
446
451
  return self._control.control_robot_end_effector_pose(left_pose, right_pose, frame)
447
452
 
453
+ def control_hand_wrench(self, left_wrench: list, right_wrench: list) -> bool:
454
+ return self._control.control_hand_wrench(left_wrench, right_wrench)
455
+
448
456
  def change_manipulation_mpc_frame(self, frame: KuavoManipulationMpcFrame)->bool:
449
457
  timeout = 1.0
450
458
  count = 0
@@ -506,19 +514,15 @@ class KuavoRobotCore:
506
514
  return True
507
515
 
508
516
  def change_robot_arm_ctrl_mode(self, mode:KuavoArmCtrlMode)->bool:
509
- timeout = 1.0
517
+
518
+ if self._control.is_arm_collision_mode() and self.is_arm_collision():
519
+ SDKLogger.warn("[Core] change_robot_arm_ctrl_mode failed, arm collision detected!")
520
+ return False
521
+
510
522
  count = 0
511
- while self._rb_state.arm_control_mode != mode:
523
+ if self._rb_state.arm_control_mode != mode:
512
524
  SDKLogger.debug(f"[Core] Change robot arm control from {self._rb_state.arm_control_mode} to {mode}, retry: {count}")
513
525
  self._control.change_robot_arm_ctrl_mode(mode)
514
- if self._rb_state.arm_control_mode == mode:
515
- break
516
- if timeout <= 0:
517
- SDKLogger.warn("[Core] Change robot arm control mode timeout!")
518
- return False
519
- timeout -= 0.1
520
- time.sleep(0.1)
521
- count += 1
522
526
 
523
527
  if not hasattr(self, '_arm_ctrl_mode_lock'):
524
528
  self._arm_ctrl_mode_lock = threading.Lock()
@@ -576,6 +580,11 @@ class KuavoRobotCore:
576
580
  def arm_fk(self, q: list) -> Tuple[KuavoPose, KuavoPose]:
577
581
  return self._control.arm_fk(q)
578
582
 
583
+ """ ------------------------------------------------------------------------"""
584
+ """ Base Pitch Limit Control """
585
+ def enable_base_pitch_limit(self, enable: bool) -> Tuple[bool, str]:
586
+ return self._control.enable_base_pitch_limit(enable)
587
+ """ ------------------------------------------------------------------------"""
579
588
  """ Callbacks """
580
589
  def _humanoid_gait_changed(self, current_time: float, gait_name: str):
581
590
  if self.state != gait_name:
@@ -586,6 +595,19 @@ class KuavoRobotCore:
586
595
  # Call the transition method if it exists
587
596
  getattr(self, to_method)()
588
597
 
598
+ def is_arm_collision(self)->bool:
599
+ return self._control.is_arm_collision()
600
+
601
+ def release_arm_collision_mode(self):
602
+
603
+ self._control.release_arm_collision_mode()
604
+
605
+
606
+ def wait_arm_collision_complete(self):
607
+ self._control.wait_arm_collision_complete()
608
+
609
+ def set_arm_collision_mode(self, enable: bool):
610
+ self._control.set_arm_collision_mode(enable)
589
611
 
590
612
  if __name__ == "__main__":
591
613
  DEBUG_MODE = 0
@@ -18,9 +18,10 @@ from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import (gestureExecute, gestureExecut
18
18
  changeTorsoCtrlMode, changeTorsoCtrlModeRequest, setMmCtrlFrame, setMmCtrlFrameRequest,
19
19
  setTagId, setTagIdRequest, getMotorParam, getMotorParamRequest,
20
20
  changeMotorParam, changeMotorParamRequest)
21
- from kuavo_humanoid_sdk.msg.kuavo_msgs.msg import twoArmHandPoseCmd, ikSolveParam, armHandPose
21
+ from kuavo_humanoid_sdk.msg.kuavo_msgs.msg import twoArmHandPoseCmd, ikSolveParam, armHandPose, armCollisionCheckInfo
22
22
  from kuavo_humanoid_sdk.msg.kuavo_msgs.srv import twoArmHandPoseCmdSrv, fkSrv
23
23
  from std_srvs.srv import SetBool, SetBoolRequest
24
+ from std_msgs.msg import Float64MultiArray
24
25
 
25
26
 
26
27
 
@@ -187,34 +188,87 @@ class ControlEndEffector:
187
188
 
188
189
  class ControlRobotArm:
189
190
  def __init__(self):
191
+
192
+ # 带有碰撞检查的轨迹发布
193
+ self._pub_ctrl_arm_traj_arm_collision = rospy.Publisher('/arm_collision/kuavo_arm_traj', JointState, queue_size=10)
194
+ self._pub_ctrl_arm_target_poses_arm_collision = rospy.Publisher('/arm_collision/kuavo_arm_target_poses', armTargetPoses, queue_size=10)
195
+
196
+ # 判断当前是否发生碰撞
197
+ self._sub_arm_collision_info = rospy.Subscriber('/arm_collision/info', armCollisionCheckInfo, self.callback_arm_collision_info, queue_size=10)
198
+ self._is_collision = False
199
+ self.arm_collision_enable = False
200
+
201
+ # 正常轨迹发布
190
202
  self._pub_ctrl_arm_traj = rospy.Publisher('/kuavo_arm_traj', JointState, queue_size=10)
191
203
  self._pub_ctrl_arm_target_poses = rospy.Publisher('/kuavo_arm_target_poses', armTargetPoses, queue_size=10)
192
204
  self._pub_ctrl_hand_pose_cmd = rospy.Publisher('/mm/two_arm_hand_pose_cmd', twoArmHandPoseCmd, queue_size=10)
205
+ self._pub_hand_wrench = rospy.Publisher('/hand_wrench_cmd', Float64MultiArray, queue_size=10)
206
+
207
+ def is_arm_collision(self)->bool:
208
+ return self._is_collision
209
+
210
+ def is_arm_collision_mode(self)->bool:
211
+ return self.arm_collision_enable
212
+
213
+ def callback_arm_collision_info(self, msg: armCollisionCheckInfo):
214
+ self._is_collision = True
215
+ SDKLogger.info(f"Arm collision detected")
216
+
217
+ def set_arm_collision_mode(self, enable: bool):
218
+ """
219
+ Set arm collision mode
220
+ """
221
+ self.arm_collision_enable = enable
222
+ srv_set_arm_collision_mode_srv = rospy.ServiceProxy('/arm_collision/set_arm_moving_enable', SetBool)
223
+ req = SetBoolRequest()
224
+ req.data = enable
225
+ resp = srv_set_arm_collision_mode_srv(req)
226
+ if not resp.success:
227
+ SDKLogger.error(f"Failed to wait arm collision complete: {resp.message}")
228
+
229
+
230
+
231
+ def release_arm_collision_mode(self):
232
+ self._is_collision = False
233
+
234
+ def wait_arm_collision_complete(self):
235
+ if self._is_collision:
236
+ srv_wait_arm_collision_complete_srv = rospy.ServiceProxy('/arm_collision/wait_complete', SetBool)
237
+ req = SetBoolRequest()
238
+ req.data = True
239
+ resp = srv_wait_arm_collision_complete_srv(req)
240
+ if not resp.success:
241
+ SDKLogger.error(f"Failed to wait arm collision complete: {resp.message}")
193
242
 
194
243
  def connect(self, timeout:float=1.0)-> bool:
195
244
  start_time = rospy.Time.now()
196
245
  publishers = [
197
- (self._pub_ctrl_arm_traj, "arm trajectory publisher"),
198
- (self._pub_ctrl_arm_target_poses, "arm target poses publisher")
246
+ (self._pub_ctrl_arm_traj, "arm trajectory publisher", False),
247
+ (self._pub_ctrl_arm_target_poses, "arm target poses publisher", False)
199
248
  ]
200
249
 
201
250
  success = True
202
- for pub, name in publishers:
251
+ for pub, name, required in publishers:
203
252
  while pub.get_num_connections() == 0:
204
253
  if (rospy.Time.now() - start_time).to_sec() > timeout:
205
254
  SDKLogger.error(f"Timeout waiting for {name} connection, '{pub.name}'")
206
- success = False
255
+ if required:
256
+ success = False
207
257
  break
208
258
  rospy.sleep(0.1)
209
259
  return success
210
260
 
211
261
  def pub_control_robot_arm_traj(self, joint_q: list)->bool:
262
+
212
263
  try:
213
264
  msg = JointState()
214
265
  msg.name = ["arm_joint_" + str(i) for i in range(0, 14)]
215
266
  msg.header.stamp = rospy.Time.now()
216
267
  msg.position = 180.0 / np.pi * np.array(joint_q) # convert to degree
217
- self._pub_ctrl_arm_traj.publish(msg)
268
+ if self.arm_collision_enable:
269
+ self._pub_ctrl_arm_traj_arm_collision.publish(msg)
270
+ else:
271
+ self._pub_ctrl_arm_traj.publish(msg)
218
272
  return True
219
273
  except Exception as e:
220
274
  SDKLogger.error(f"publish robot arm traj: {e}")
@@ -227,7 +281,10 @@ class ControlRobotArm:
227
281
  for i in range(len(joint_q)):
228
282
  degs = [q for q in joint_q[i]]
229
283
  msg.values.extend(degs)
230
- self._pub_ctrl_arm_target_poses.publish(msg)
284
+ if self.arm_collision_enable:
285
+ self._pub_ctrl_arm_target_poses_arm_collision.publish(msg)
286
+ else:
287
+ self._pub_ctrl_arm_target_poses.publish(msg)
231
288
  return True
232
289
  except Exception as e:
233
290
  SDKLogger.error(f"publish arm target poses: {e}")
@@ -382,8 +439,8 @@ class ControlRobotArm:
382
439
 
383
440
  def srv_change_arm_ctrl_mode(self, mode: KuavoArmCtrlMode)->bool:
384
441
  try:
385
- rospy.wait_for_service('/arm_traj_change_mode', timeout=2.0)
386
- change_arm_ctrl_mode_srv = rospy.ServiceProxy('/arm_traj_change_mode', changeArmCtrlMode)
442
+ rospy.wait_for_service('/change_arm_ctrl_mode', timeout=2.0)
443
+ change_arm_ctrl_mode_srv = rospy.ServiceProxy('/change_arm_ctrl_mode', changeArmCtrlMode)
387
444
  req = changeArmCtrlModeRequest()
388
445
  req.control_mode = mode.value
389
446
  resp = change_arm_ctrl_mode_srv(req)
@@ -406,6 +463,32 @@ class ControlRobotArm:
406
463
  except Exception as e:
407
464
  SDKLogger.error(f"[Error] get arm ctrl mode: {e}")
408
465
  return None
466
+
467
+ def pub_hand_wrench_cmd(self, left_wrench, right_wrench):
468
+ """
469
+ 发布末端力控制命令
470
+ 参数:
471
+ left_wrench: 左手6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
472
+ right_wrench: 右手6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
473
+ Fx: 沿X轴的线性力
474
+ Fy: 沿Y轴的线性力
475
+ Fz: 沿Z轴的线性力
476
+ Tx: 绕X轴的力矩
477
+ Ty: 绕Y轴的力矩
478
+ Tz: 绕Z轴的力矩
479
+ """
480
+ if len(left_wrench) != 6 or len(right_wrench) != 6:
481
+ SDKLogger.error("Wrench data must be 6-dimensional")
482
+ return False
483
+
484
+ try:
485
+ msg = Float64MultiArray()
486
+ msg.data = list(left_wrench) + list(right_wrench)
487
+ self._pub_hand_wrench.publish(msg)
488
+ return True
489
+ except Exception as e:
490
+ SDKLogger.error(f"Publish hand wrench failed: {e}")
491
+ return False
409
492
 
410
493
  """ Control Robot Head """
411
494
  class ControlRobotHead:
@@ -415,13 +498,15 @@ class ControlRobotHead:
415
498
  def connect(self, timeout:float=1.0)->bool:
416
499
  start_time = rospy.Time.now()
417
500
  publishers = [
418
- # (self._pub_ctrl_robot_head, "robot head publisher") # not need check!
501
+ (self._pub_ctrl_robot_head, "robot head publisher", False) # not need check!
419
502
  ]
420
- for pub, name in publishers:
503
+ for pub, name, required in publishers:
421
504
  while pub.get_num_connections() == 0:
422
505
  if (rospy.Time.now() - start_time).to_sec() > timeout:
423
506
  SDKLogger.error(f"Timeout waiting for {name} connection, '{pub.name}'")
424
- return False
507
+ if required:
508
+ return False
509
+ break
425
510
  rospy.sleep(0.1)
426
511
  return True
427
512
  def pub_control_robot_head(self, yaw:float, pitch:float)->bool:
@@ -629,23 +714,25 @@ class ControlRobotMotion:
629
714
  self._pub_switch_gait = rospy.Publisher('/humanoid_switch_gait_by_name', switchGaitByName, queue_size=10)
630
715
  self._pub_step_ctrl = rospy.Publisher('/humanoid_mpc_foot_pose_target_trajectories', footPoseTargetTrajectories, queue_size=10)
631
716
 
632
- def connect(self, timeout:float=2.0)-> bool:
717
+ def connect(self, timeout:float=3.0)-> bool:
633
718
  start_time = rospy.Time.now()
634
719
  publishers = [
635
720
  # (self._pub_joy, "joy publisher"),
636
- (self._pub_cmd_vel, "cmd_vel publisher"),
637
- (self._pub_cmd_pose, "cmd_pose publisher"),
638
- (self._pub_step_ctrl, "step_ctrl publisher"),
639
- (self._pub_switch_gait, "switch_gait publisher"),
640
- (self._pub_cmd_pose_world, "cmd_pose_world publisher"),
721
+ # pub name required
722
+ (self._pub_cmd_vel, "cmd_vel publisher", False),
723
+ (self._pub_cmd_pose, "cmd_pose publisher", False),
724
+ (self._pub_step_ctrl, "step_ctrl publisher", False),
725
+ (self._pub_switch_gait, "switch_gait publisher", False),
726
+ (self._pub_cmd_pose_world, "cmd_pose_world publisher", False),
641
727
  ]
642
728
 
643
729
  success = True
644
- for pub, name in publishers:
730
+ for pub, name, required in publishers:
645
731
  while pub.get_num_connections() == 0:
646
732
  if (rospy.Time.now() - start_time).to_sec() > timeout:
647
733
  SDKLogger.error(f"Timeout waiting for {name} connection, '{pub.name}'")
648
- success = False
734
+ if required:
735
+ success = False
649
736
  break
650
737
  rospy.sleep(0.1)
651
738
  return success
@@ -974,6 +1061,40 @@ class KuavoRobotControl:
974
1061
  # SDKLogger.debug(f"[ROS] Control robot arm trajectory: {joint_data}")
975
1062
  return self.kuavo_arm_control.pub_control_robot_arm_traj(joint_data)
976
1063
 
1064
+ def is_arm_collision(self)->bool:
1065
+ """
1066
+ Check if arm collision is happening
1067
+ Returns:
1068
+ bool: True if collision is happening, False otherwise
1069
+ """
1070
+ return self.kuavo_arm_control.is_arm_collision()
1071
+
1072
+ def is_arm_collision_mode(self)->bool:
1073
+ """
1074
+ Check if arm collision mode is enabled
1075
+ Returns:
1076
+ bool: True if collision mode is enabled, False otherwise
1077
+ """
1078
+ return self.kuavo_arm_control.is_arm_collision_mode()
1079
+
1080
+ def release_arm_collision_mode(self):
1081
+ """
1082
+ Release arm collision mode
1083
+ """
1084
+ return self.kuavo_arm_control.release_arm_collision_mode()
1085
+
1086
+ def wait_arm_collision_complete(self):
1087
+ """
1088
+ Wait for arm collision to complete
1089
+ """
1090
+ return self.kuavo_arm_control.wait_arm_collision_complete()
1091
+
1092
+ def set_arm_collision_mode(self, enable: bool):
1093
+ """
1094
+ Set arm collision mode
1095
+ """
1096
+ return self.kuavo_arm_control.set_arm_collision_mode(enable)
1097
+
977
1098
  def control_robot_arm_joint_trajectory(self, times:list, joint_q:list)->bool:
978
1099
  """
979
1100
  Control robot arm joint trajectory
@@ -1175,11 +1296,34 @@ class KuavoRobotControl:
1175
1296
  SDKLogger.error(f"Service call failed: {e}")
1176
1297
  return False, None, 'failed'
1177
1298
 
1299
+ def control_hand_wrench(self, left_wrench: list, right_wrench: list) -> bool:
1300
+ return self.kuavo_arm_control.pub_hand_wrench_cmd(left_wrench, right_wrench)
1178
1301
 
1179
- """ ------------------------------------------------------------------------------"""
1180
-
1181
-
1182
-
1302
+ def enable_base_pitch_limit(self, enable: bool) -> Tuple[bool, str]:
1303
+ res_msg = 'failed'
1304
+ try:
1305
+ service_name = '/humanoid/mpc/enable_base_pitch_limit'
1306
+ rospy.wait_for_service(service=service_name, timeout=2.0)
1307
+ pitch_limit_service = rospy.ServiceProxy(service_name, SetBool)
1308
+
1309
+ # request
1310
+ request = SetBoolRequest()
1311
+ request.data = enable
1312
+ response = pitch_limit_service(request)
1313
+ if not response.success:
1314
+ SDKLogger.error(f"Failed to enable pitch limit: {response.message}")
1315
+ return False, response.message
1316
+ return True, 'success'
1317
+ except rospy.ServiceException as e:
1318
+ SDKLogger.error(f"Service call failed: {e}")
1319
+ res_msg = str(e)
1320
+ except rospy.ROSException as e:
1321
+ SDKLogger.error(f"Service call failed: {e}")
1322
+ res_msg = str(e)
1323
+ except Exception as e:
1324
+ SDKLogger.error(f"Service call failed: {e}")
1325
+ res_msg = str(e)
1326
+ return False, res_msg
1183
1327
 
1184
1328
  def euler_to_rotation_matrix(yaw, pitch, roll):
1185
1329
  # 计算各轴的旋转矩阵
@@ -4,6 +4,7 @@ import copy
4
4
  import rospy
5
5
  from std_msgs.msg import Float64
6
6
  from nav_msgs.msg import Odometry
7
+ from std_srvs.srv import SetBool, SetBoolRequest
7
8
  from sensor_msgs.msg import JointState
8
9
  from kuavo_humanoid_sdk.msg.kuavo_msgs.msg import sensorsData, lejuClawState, gaitTimeName, dexhandTouchState
9
10
  from kuavo_msgs.srv import changeArmCtrlMode, changeArmCtrlModeRequest, getCurrentGaitName, getCurrentGaitNameRequest
@@ -201,6 +202,14 @@ class KuavoRobotStateCore:
201
202
  self._manipulation_mpc_control_flow = flow
202
203
  return self._manipulation_mpc_control_flow
203
204
 
205
+ @property
206
+ def pitch_limit_enabled(self)->bool:
207
+ success, status = self._srv_get_pitch_limit_status()
208
+ if success:
209
+ return not ('disabled' in status)
210
+ else:
211
+ return False
212
+
204
213
  @property
205
214
  def eef_state(self)->Tuple[EndEffectorState, EndEffectorState]:
206
215
  return self._eef_state
@@ -596,7 +605,27 @@ class KuavoRobotStateCore:
596
605
  SDKLogger.error(f"Failed to get manipulation mpc wbc arm trajectory control mode: {e}")
597
606
  return KuavoManipulationMpcControlFlow.Error
598
607
 
599
-
608
+ def _srv_get_pitch_limit_status(self, )->Tuple[bool, str]:
609
+ try:
610
+ service_name = '/humanoid/mpc/pitch_limit_status'
611
+ rospy.wait_for_service(service_name, timeout=2.0)
612
+ get_pitch_limit_status_srv = rospy.ServiceProxy(service_name, SetBool)
613
+
614
+ req = SetBoolRequest()
615
+
616
+ resp = get_pitch_limit_status_srv(req)
617
+ if not resp.success:
618
+ SDKLogger.error(f"Failed to get pitch limit status: {resp.message}")
619
+ return False, 'unknown'
620
+ return resp.success, resp.message
621
+ except rospy.ServiceException as e:
622
+ SDKLogger.error(f"Service call to {service_name} failed: {e}")
623
+ except rospy.ROSException as e: # For timeout from wait_for_service
624
+ SDKLogger.error(f"Failed to connect to service {service_name}: {e}")
625
+ except Exception as e:
626
+ SDKLogger.error(f"Failed to get pitch limit status: {e}")
627
+ return False, 'unknown'
628
+
600
629
  if __name__ == "__main__":
601
630
  state = KuavoRobotStateCore()
602
631
  print(state.manipulation_mpc_frame)
@@ -38,8 +38,9 @@ class KuavoRobotToolsCore:
38
38
  self._transform_cache = {}
39
39
  self._initialized = True
40
40
  except Exception as e:
41
- SDKLogger.error(f"Failed to initialize tf2_web_republisher: {str(e)}")
42
- SDKLogger.error("Please make sure tf2_web_republisher node is running")
41
+ SDKLogger.error(f"Failed to initialize kuavo_tf2_web_republisher: {str(e)}")
42
+ SDKLogger.error(f"kuavo_tf2_web_republisher 节点未运行")
43
+ SDKLogger.error("请运行 `cd <kuavo_ros_application> && source devel/setup.bash && rosrun kuavo_tf2_web_republisher kuavo_tf2_web_republisher` 启动 kuavo_tf2_web_republisher 节点")
43
44
  raise
44
45
 
45
46
  def _get_tf_tree_transform(self, target_frame: str, source_frame: str,
@@ -228,6 +228,7 @@ class KuavoROSEnv:
228
228
  """
229
229
  try:
230
230
  nodes = subprocess.check_output(['rosnode', 'list']).decode('utf-8').split('\n')
231
+ # print(f"Debug: nodes: {nodes}")
231
232
  return node_name in nodes
232
233
  except subprocess.CalledProcessError as e:
233
234
  SDKLogger.error(f"Error checking if node {node_name} exists: {e}")
@@ -270,6 +270,21 @@ class KuavoRobot(RobotBase):
270
270
  return self._robot_head.disable_head_tracking()
271
271
 
272
272
  """ Robot Arm Control """
273
+ def control_hand_wrench(self, left_wrench: list, right_wrench: list) -> bool:
274
+ """控制机器人末端力/力矩
275
+
276
+ Args:
277
+ left_wrench (list): 左手臂6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
278
+ right_wrench (list): 右手臂6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
279
+ 单位:
280
+ Fx,Fy,Fz: 牛顿(N)
281
+ Tx,Ty,Tz: 牛·米(N·m)
282
+
283
+ Returns:
284
+ bool: 控制成功返回True, 否则返回False
285
+ """
286
+ return self._robot_arm.control_hand_wrench(left_wrench, right_wrench)
287
+
273
288
  def arm_reset(self)->bool:
274
289
  """手臂归位
275
290
 
@@ -456,7 +471,41 @@ class KuavoRobot(RobotBase):
456
471
  Tuple[bool, list]: 成功标志和 :class:`kuavo_humanoid_sdk.interfaces.data_types.KuavoMotorParam` 对象列表的元组
457
472
  """
458
473
  return self._kuavo_core.get_motor_param()
474
+
475
+ def enable_base_pitch_limit(self, enable: bool) -> Tuple[bool, str]:
476
+ """开启/关闭机器人 basePitch 限制
477
+
478
+ Note:
479
+ 该接口用于关闭或开启机器人 basePitch 保护功能,关闭状态下可以进行比较大幅度的前后倾动作而不会触发保护导致摔倒。
480
+
481
+ Args:
482
+ enable (bool): 开启/关闭
483
+ """
484
+ return self._kuavo_core.enable_base_pitch_limit(enable)
485
+
486
+ def is_arm_collision(self)->bool:
487
+ """判断当前是否发生碰撞
459
488
 
489
+ Returns:
490
+ bool: 发生碰撞返回True,否则返回False
491
+ """
492
+ return self._robot_arm.is_arm_collision()
493
+
494
+ def wait_arm_collision_complete(self):
495
+ """等待碰撞完成
496
+ """
497
+ self._robot_arm.wait_arm_collision_complete()
498
+
499
+ def release_arm_collision_mode(self):
500
+ """释放碰撞模式
501
+ """
502
+ self._robot_arm.release_arm_collision_mode()
503
+
504
+ def set_arm_collision_mode(self, enable: bool):
505
+ """设置碰撞模式
506
+ """
507
+ self._robot_arm.set_arm_collision_mode(enable)
508
+
460
509
  if __name__ == "__main__":
461
510
  robot = KuavoRobot()
462
511
  robot.set_manipulation_mpc_mode(KuavoManipulationMpcCtrlMode.ArmOnly)
@@ -202,6 +202,44 @@ class KuavoRobotArm:
202
202
  return None, None
203
203
  return result
204
204
 
205
+ def control_hand_wrench(self, left_wrench: list, right_wrench: list) -> bool:
206
+ """控制机器人末端力/力矩
207
+
208
+ Args:
209
+ left_wrench (list): 左手臂6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
210
+ right_wrench (list): 右手臂6维力控指令 [Fx, Fy, Fz, Tx, Ty, Tz]
211
+ 单位:
212
+ Fx,Fy,Fz: 牛顿(N)
213
+ Tx,Ty,Tz: 牛·米(N·m)
214
+
215
+ Returns:
216
+ bool: 控制成功返回True, 否则返回False
217
+ """
218
+ return self._kuavo_core.control_hand_wrench(left_wrench, right_wrench)
219
+
220
+ def is_arm_collision(self)->bool:
221
+ """判断当前是否发生碰撞
222
+
223
+ Returns:
224
+ bool: 发生碰撞返回True,否则返回False
225
+ """
226
+ return self._kuavo_core.is_arm_collision()
227
+
228
+ def release_arm_collision_mode(self):
229
+ """释放碰撞模式
230
+ """
231
+ self._kuavo_core.release_arm_collision_mode()
232
+
233
+ def wait_arm_collision_complete(self):
234
+ """等待碰撞完成
235
+ """
236
+ self._kuavo_core.wait_arm_collision_complete()
237
+
238
+ def set_arm_collision_mode(self, enable: bool):
239
+ """设置碰撞模式
240
+ """
241
+ self._kuavo_core.set_arm_collision_mode(enable)
242
+
205
243
  # if __name__ == "__main__":
206
244
  # arm = KuavoRobotArm()
207
245
  # arm.set_manipulation_mpc_mode(KuavoManipulationMpcCtrlMode.ArmOnly)
@@ -25,7 +25,7 @@ class KuavoRobotHead:
25
25
  limited_yaw = min(math.pi*4/9, max(-math.pi*4/9, yaw))
26
26
 
27
27
  # Check pitch limits (-25 to 25 degrees)
28
- if pitch < -math.pi/7.2 or pitch > math.pi/7.2: # -25 to 25 degrees in radians
28
+ if pitch < -math.pi/7.2 - 0.001 or pitch > math.pi/7.2 + 0.001: # -25 to 25 degrees in radians
29
29
  SDKLogger.warn(f"[Robot] pitch {pitch} exceeds limit [-{math.pi/7.2:.3f}, {math.pi/7.2:.3f}] radians (-25 to 25 degrees), will be limited")
30
30
  limited_pitch = min(math.pi/7.2, max(-math.pi/7.2, pitch))
31
31
  return self._kuavo_core.control_robot_head(yaw=limited_yaw, pitch=limited_pitch)
@@ -167,6 +167,14 @@ class KuavoRobotState:
167
167
  """
168
168
  return self._rs_core.manipulation_mpc_frame
169
169
 
170
+ def pitch_limit_enabled(self) -> bool:
171
+ """获取机器人 basePitch 限制状态, 如果开启则返回True,否则返回False。
172
+
173
+ Returns:
174
+ bool: 如果机器人 basePitch 限制开启返回True,否则返回False。
175
+ """
176
+ return self._rs_core.pitch_limit_enabled
177
+
170
178
  def head_joint_state(self) -> KuavoJointData:
171
179
  """获取机器人头部关节的当前状态。
172
180