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.
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/PKG-INFO +1 -1
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/README.md +1 -42
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/data_types.py +12 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/core.py +32 -10
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/control.py +168 -24
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/state.py +30 -1
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/tools.py +3 -2
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros_env.py +1 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot.py +49 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_arm.py +38 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_head.py +1 -1
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_state.py +8 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_tool.py +29 -2
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_vision.py +0 -2
- {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
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +5 -3
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +340 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +215 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +25 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +331 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +504 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +40 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +88 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AudioReceiverData.py +122 -0
- 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
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_MmDetectionMsg.py +264 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +16 -1
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +160 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +171 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6D.py +123 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +301 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +136 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +231 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.py +149 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfo.py +143 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +220 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotBodyMatrices.py +332 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +216 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +338 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +299 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +298 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +468 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +4 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +410 -0
- kuavo_humanoid_sdk-1.2.1b1675/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +716 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/PKG-INFO +1 -1
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/SOURCES.txt +27 -1
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/setup.py +5 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/common/logger.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/end_effector.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/robot.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/robot_info.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/audio.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/audio.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/observation.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/param.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/vision.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/dexterous_hand.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/leju_claw.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_audio.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_info.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_observation.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +0 -0
- {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
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +0 -0
- {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
- {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
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +0 -0
- {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
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/dependency_links.txt +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/requires.txt +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk.egg-info/top_level.txt +0 -0
- {kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/setup.cfg +0 -0
|
@@ -77,49 +77,8 @@ chmod +x ./gen_docs.sh
|
|
|
77
77
|

|
|
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
|
-

|
|
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节点参数的数据类。"""
|
{kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/core.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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('/
|
|
386
|
-
change_arm_ctrl_mode_srv = rospy.ServiceProxy('/
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
637
|
-
(self.
|
|
638
|
-
(self.
|
|
639
|
-
(self.
|
|
640
|
-
(self.
|
|
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
|
-
|
|
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
|
|
42
|
-
SDKLogger.error("
|
|
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,
|
{kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros_env.py
RENAMED
|
@@ -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}")
|
{kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot.py
RENAMED
|
@@ -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)
|
{kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_arm.py
RENAMED
|
@@ -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)
|
{kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_head.py
RENAMED
|
@@ -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)
|
{kuavo_humanoid_sdk-1.2.1 → kuavo_humanoid_sdk-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_state.py
RENAMED
|
@@ -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
|
|