单标签定位不够可靠,特别是在以下情况:

  1. 正对标签时 Z 轴不准:当相机光轴接近垂直于标签平面时,深度估计(Z 方向)会很不稳定
  2. 单一视角限制:只能看到一个标签时,缺乏冗余信息来验证和改善估计
  3. 边缘情况:标签部分遮挡、角度过大、距离过远时精度下降

🎯 更可靠的定位方案

1. 多标签融合定位(推荐)

使用所有可见标签进行联合优化,而不是只用一个

2. 业界成熟方案和库

库/方案特点推荐度
ViSP (Visual Servoing Platform)• 专业的视觉伺服库
vpPoseVector::computeRobustPose() 支持多标签融合
• 鲁棒估计器(M-estimator)
⭐⭐⭐⭐⭐
Kalibr (ETH Zurich)• 多相机 -IMU 标定工具
• 使用 AprilTag 进行时空标定
• 基于优化的多标签位姿估计
⭐⭐⭐⭐⭐
tagSLAM• ROS 包,专为 AprilTag SLAM 设计
• 支持多标签地图构建和定位
• 基于因子图优化
⭐⭐⭐⭐
apriltag_ros• ROS 官方 AprilTag 包
• 支持多标签 bundle 检测
continuous_detection 节点可发布相机位姿
⭐⭐⭐⭐
OpenCV ArUco (cv2.aruco.Board)• 内置的多标签板支持
estimatePoseBoard() 函数
• 轻量级,易于集成
⭐⭐⭐⭐

3. 推荐改进方案:使用 ArUco Board

OpenCV 内置了 ArUco Board 功能,专门用于多标签定位:

# 定义一个 ArUco Board(你的立方体就是一个 custom board)
board = cv2.aruco.Board(
    objPoints=[
        # 每个标签的4个角点在世界坐标系中的位置
        tag0_corners_3d,
        tag1_corners_3d,
        tag2_corners_3d,
        tag3_corners_3d,
    ],
    dictionary=aruco_dict,
    ids=np.array([[0], [1], [2], [3]]),
)
 
# 一次性估计相机位姿(自动使用所有可见标签)
retval, rvec, tvec = cv2.aruco.estimatePoseBoard(
    corners=detected_corners,  # 所有检测到的角点
    ids=detected_ids,
    board=board,
    cameraMatrix=K,
    distCoeffs=D,
    rvec=None,
    tvec=None,
)

优势:

  • 自动融合多个标签
  • 更鲁棒的 Z 轴估计
  • OpenCV 原生支持,无需额外依赖
  • 即使只看到部分标签也能工作

4. 是否要我实现改进版?

我可以帮你:

  1. 修改 test_aruco_location.py

    • 使用 cv2.aruco.Board + estimatePoseBoard()
    • 显示可见标签数量和融合状态
    • 对比单标签 vs 多标签结果
  2. 创建新脚本:展示多标签融合的优势(精度对比、Z 轴稳定性)

  3. 推荐生产级方案:如果需要更高精度,可以考虑:

    • 添加 Kalman 滤波(平滑轨迹)
    • 集成 IMU 数据(如果有的话)
    • 使用 ViSP 或 tagSLAM