共计 1392 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
6D 位姿(位置 + 旋转)标注是机器人抓取、AR/VR 等场景的核心任务。新手常遇到以下问题:

- 坐标系混淆:未区分物体坐标系、相机坐标系和世界坐标系,导致转换矩阵错误
- 遮挡处理不当:对部分遮挡物体的关键点标注缺乏一致性标准
- 旋转表示混乱:混合使用欧拉角(易产生万向锁)和四元数(推荐用于计算)
- 尺度缺失:未标注物体实际尺寸,导致位姿估计无法还原真实物理尺度
工具对比
| 工具名称 | 安装难度 | 6D 标注支持 | 扩展性 | 适合场景 |
|---|---|---|---|---|
| LabelFusion | ★★☆ | 完整 CAD 模型 | 高 | 机械臂抓取 |
| Supervisely | ★☆☆ | 基础立方体 | 中 | 快速原型开发 |
| CVAT | ★★☆ | 需插件扩展 | 低 | 2D/3D 混合标注 |
| MeshLab | ★★★ | 手动调整 | 高 | 点云数据处理 |
推荐选择策略:
- 研究场景优先选 LabelFusion(支持 URDF 模型导入)
- 快速验证可用 Supervisely 的立方体标注
- 需要定制化开发建议基于 OpenCV 自建工具链
实战演示
关键点投影计算
import cv2
import numpy as np
# 物体 3D 关键点(单位:毫米)obj_points = np.array([[0, 0, 0], # 中心点
[50, 0, 0], # X 轴端点
[0, 50, 0] # Y 轴端点
], dtype=np.float32)
# 相机内参矩阵
K = np.array([[800, 0, 320],
[0, 800, 240],
[0, 0, 1]])
# 位姿矩阵(旋转向量 + 平移向量)rvec = np.array([0.2, 0.3, 0.1])
tvec = np.array([100, 200, 500])
# 3D 点投影到 2D 图像
img_points, _ = cv2.projectPoints(obj_points, rvec, tvec, K, None)
PnP 位姿求解
# 已知 2D-3D 对应点求解位姿
ret, rvec, tvec = cv2.solvePnP(
obj_points,
img_points,
K,
None,
flags=cv2.SOLVEPNP_ITERATIVE)
# 转换为 4x4 变换矩阵
def pose_to_matrix(rvec, tvec):
R, _ = cv2.Rodrigues(rvec)
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = tvec.flatten()
return T
精度优化
主要误差来源及解决方案:
- 相机标定误差
- 使用棋盘格多次标定取平均值
-
验证重投影误差应 <0.5 像素
-
关键点模糊
- 对低纹理物体粘贴标记点
-
采用 SIFT/SURF 特征辅助定位
-
遮挡处理
- 建立遮挡等级标准(如:可见面积 >30%)
-
使用 CAD 模型生成合成数据补充
-
旋转表示漂移
- 避免直接优化欧拉角参数
- 使用李代数(Lie Algebra)进行优化
避坑指南
- 采集阶段:使用机械臂带动物体多视角运动,确保至少 3 个正交视角
- 标注校验:对同一物体进行多人标注,剔除偏离均值±2σ 的数据
- 格式统一 :强制规定使用
(x,y,z,qx,qy,qz,qw)的四元数存储格式 - 环境控制:保持恒定光照,避免反光 / 阴影影响纹理特征
- 工具链验证:定期用已知位姿的虚拟数据测试标注流程
延伸思考
未来优化方向:
- 半自动标注:
- 先人工标注少量帧,再用光流法传播到其他帧
-
用 ICP 算法对齐 CAD 模型与点云
-
主动学习:
- 训练初始位姿估计模型
-
自动选择信息量最大的帧请求人工标注
-
多模态融合:
- 结合 RGB 图像与深度图进行联合优化
- 利用 IMU 数据辅助旋转估计
建议从 LabelFusion+ 机械臂的标准化采集开始,逐步过渡到自动化标注流水线。
正文完
