diff --git a/ros2/src/arm_control_msgs/srv/MovePose.srv b/ros2/src/arm_control_msgs/srv/MovePose.srv index 4e0ec31..03bd8a5 100644 --- a/ros2/src/arm_control_msgs/srv/MovePose.srv +++ b/ros2/src/arm_control_msgs/srv/MovePose.srv @@ -4,12 +4,14 @@ float64 y # 目标 Y 坐标 (mm) float64 z # 目标 Z 坐标 (mm) float64 phi # 目标偏航角 (度) bool elbow_up # 是否使用肘部向上解 -uint8 gripper_state # 夹爪状态: 0=保持, 1=打开, 2=闭合 -bool grip # 是否抓取 -bool release # 是否释放 +bool up # 夹爪朝上(z4=-100) +bool down # 夹爪朝下(z4=55) +bool grip # 是否抓取(J6=-5) +bool release # 是否释放(J6=80) float64 duration # 运动时长 (秒,0 表示使用默认值) -# 夹爪状态常量 +# 已废弃:使用 up/down 代替 +uint8 gripper_state # 夹爪状态: 0=保持, 1=打开, 2=闭合 uint8 GRIPPER_KEEP = 0 uint8 GRIPPER_OPEN = 1 uint8 GRIPPER_CLOSED = 2 diff --git a/ros2/src/udp_teleop/udp_teleop/arm_control.py b/ros2/src/udp_teleop/udp_teleop/arm_control.py index 02f1eb7..1edeb09 100644 --- a/ros2/src/udp_teleop/udp_teleop/arm_control.py +++ b/ros2/src/udp_teleop/udp_teleop/arm_control.py @@ -604,14 +604,17 @@ class ArmControlNode(Node): phi_deg=request.phi ) - # 解析夹爪状态 - if request.gripper_state == SetGripper.Request.GRIPPER_OPEN: - j5 = J5_OPEN - elif request.gripper_state == SetGripper.Request.GRIPPER_CLOSED: - j5 = J5_CLOSED + # 解析 z4:优先级 up/down > 自动选择 + if request.up: + z4 = Z4_CLOSED # 夹爪朝上,z4=-100 + elif request.down: + z4 = Z4_OPEN # 夹爪朝下,z4=55 else: - j5 = self.current_state.j5 + # 自动选择:根据目标 z 坐标 + j5_auto = resolve_j5_from_z(target_pose.z) + z4 = resolve_z4_from_j5(j5_auto) + # 解析夹爪开合(J6:grip/release) if request.grip: j6 = GRIP_ANGLE elif request.release: @@ -619,10 +622,8 @@ class ArmControlNode(Node): else: j6 = self.current_state.j6 - # 根据目标 z 坐标自动选择 J5 和 z4 - if request.gripper_state == MovePose.Request.GRIPPER_KEEP: - j5 = resolve_j5_from_z(target_pose.z) - z4 = resolve_z4_from_j5(j5) + # 根据 z4 反推 J5(用于 UDP 命令) + j5 = J5_CLOSED if z4 == Z4_CLOSED else J5_OPEN # 逆运动学 math_state = inverse_kinematics( @@ -679,16 +680,16 @@ class ArmControlNode(Node): pose = forward_kinematics(self.geometry, math_state, z4) response.success = True - response.x = pose.x - response.y = pose.y - response.z = pose.z - response.phi = pose.phi_deg - response.height = self.current_state.height - response.j2 = self.current_state.j2 - response.j3 = self.current_state.j3 - response.j4 = self.current_state.j4 - response.j5 = self.current_state.j5 - response.j6 = self.current_state.j6 + response.x = float(pose.x) + response.y = float(pose.y) + response.z = float(pose.z) + response.phi = float(pose.phi_deg) + response.height = int(self.current_state.height) + response.j2 = int(self.current_state.j2) + response.j3 = int(self.current_state.j3) + response.j4 = int(self.current_state.j4) + response.j5 = int(self.current_state.j5) + response.j6 = int(self.current_state.j6) except Exception as e: response.success = False @@ -760,10 +761,10 @@ class ArmControlNode(Node): pose_msg = TCPPose() pose_msg.header.stamp = self.get_clock().now().to_msg() - pose_msg.x = pose.x - pose_msg.y = pose.y - pose_msg.z = pose.z - pose_msg.phi = pose.phi_deg + pose_msg.x = float(pose.x) + pose_msg.y = float(pose.y) + pose_msg.z = float(pose.z) + pose_msg.phi = float(pose.phi_deg) self.pub_tcp_pose.publish(pose_msg) except Exception as e: