diff --git a/src/openarm_camera/openarm_camera/stereo_hand_depth_node.py b/src/openarm_camera/openarm_camera/stereo_hand_depth_node.py index e5afd17..271f1a0 100644 --- a/src/openarm_camera/openarm_camera/stereo_hand_depth_node.py +++ b/src/openarm_camera/openarm_camera/stereo_hand_depth_node.py @@ -177,7 +177,10 @@ class StereoHandDepthNode(Node): ) msg_out = PoseStamped() if ids is not None: + detected_ids = ids.flatten().tolist() cv2.aruco.drawDetectedMarkers(left_rect, corners, ids) + if 0 in detected_ids: + self.get_logger().info("Detected ArUco id=0") # c = corners[0][0] # center = c.mean(axis=0) # u, v = int(center[0]), int(center[1]) @@ -188,43 +191,43 @@ class StereoHandDepthNode(Node): # left_gray, f"disp={d:.2f}", (u+5, v-5), # cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1 # ) - for e in corners: - ret, rvec, tvec = cv2.solvePnP( - objectPoints=np.array([ - [-self.marker_size/2, self.marker_size/2, 0], - [ self.marker_size/2, self.marker_size/2, 0], - [ self.marker_size/2, -self.marker_size/2, 0], - [-self.marker_size/2, -self.marker_size/2, 0] - ], dtype=np.float32), - imagePoints=e, - cameraMatrix=self.K1, - distCoeffs=self.D1 - ) - if(ret == True): - cv2.drawFrameAxes(left_rect, self.K1, self.D1, rvec, tvec, 0.1, 2) - R_cv, _ = cv2.Rodrigues(rvec) - R_cv_to_ros = np.array([ - [ 0, 0, -1], - [ 1, 0, 0], - [ 0, -1, 0] - ]) - R_ros = R_cv_to_ros @ R_cv - t_ros = R_cv_to_ros @ tvec.reshape(3) - # t_ros = tvec.reshape(3) - rot = R.from_matrix(R_ros) - - qx, qy, qz, qw = rot.as_quat() - roll, pitch, yaw = rot.as_euler('xyz') - # self.get_logger().info(f"quat: ({qx}, {qy}, {qz}, {qw})") - self.get_logger().info(f"euler: ({roll*180/3.14:.1f}, {pitch*180/3.14:.1f}, {yaw*180/3.14:.1f})") + for e in corners: + ret, rvec, tvec = cv2.solvePnP( + objectPoints=np.array([ + [-self.marker_size/2, self.marker_size/2, 0], + [ self.marker_size/2, self.marker_size/2, 0], + [ self.marker_size/2, -self.marker_size/2, 0], + [-self.marker_size/2, -self.marker_size/2, 0] + ], dtype=np.float32), + imagePoints=e, + cameraMatrix=self.K1, + distCoeffs=self.D1 + ) + if(ret == True): + cv2.drawFrameAxes(left_rect, self.K1, self.D1, rvec, tvec, 0.1, 2) + R_cv, _ = cv2.Rodrigues(rvec) + R_cv_to_ros = np.array([ + [ 0, 0, -1], + [ 1, 0, 0], + [ 0, -1, 0] + ]) + R_ros = R_cv_to_ros @ R_cv + t_ros = R_cv_to_ros @ tvec.reshape(3) + # t_ros = tvec.reshape(3) + rot = R.from_matrix(R_ros) + + qx, qy, qz, qw = rot.as_quat() + roll, pitch, yaw = rot.as_euler('xyz') + # self.get_logger().info(f"quat: ({qx}, {qy}, {qz}, {qw})") + self.get_logger().info(f"euler: ({roll*180/3.14:.1f}, {pitch*180/3.14:.1f}, {yaw*180/3.14:.1f})") - # 记录时间 - self.last_marker_time = time.time() + # 记录时间 + self.last_marker_time = time.time() - # 记录最后一次有效目标 - self.last_valid_pos = np.array([t_ros[0] + 0.7, t_ros[1], t_ros[2]]) - self.get_logger().info(f"Marker position (ROS frame): ({self.last_valid_pos[0]:.3f}, {self.last_valid_pos[1]:.3f}, {self.last_valid_pos[2]:.3f})") - self.last_valid_quat = np.array([qx, qy, qz, qw]) + # 记录最后一次有效目标 + self.last_valid_pos = np.array([t_ros[0] + 0.7, t_ros[1], t_ros[2]]) + self.get_logger().info(f"Marker position (ROS frame): ({self.last_valid_pos[0]:.3f}, {self.last_valid_pos[1]:.3f}, {self.last_valid_pos[2]:.3f})") + self.last_valid_quat = np.array([qx, qy, qz, qw]) # u = int(u * (w / 2)) # 注意这里是左图宽度 # v = int(v * h)