机器人轨迹说明:挑战,方法和质量标准
如何注释机器人示范数据 <unk>语言标签,成功/失败标签,接触事件和准备训练的数据集质量标准.
部分: [机器人数据收集指南]
运行数据不是训练数据.注释将轨迹转化为结构化标签,实际上教导了政策.
记载为什么重要
机器人远程操作会产生轨迹:时间索引的联合状态,摄像头框架和终端效应器姿势.这是物理意义上的数据,但它还不是大多数政策学习算法所要求的训练数据. 算法如ACT,扩散政策和行为克隆需要知道哪些集成功 (训练) 和哪些失败 (排除或减重).基础模型细节调整需要描述机器人正在做什么的语言说明.阶段条件的政策需要细节界限. 接触学习算法需要第一次接触,稳定掌握和释放事件的时间标签.
标注是添加这些结构化信息的过程.它耗费时间,需要人为判断,并且很容易以降低政策质量的方式做错误. 有不一致的成功标签的数据集将产生学习模仿一些失败的政策. 含含糊不清的语言指令的数据集将产生无法在推断时将其通用到指令的政策.
五种注释类型
- **1.任务成功/失败:**二进制通过/失败是最小的.为培训目的,二进制通常足够,但0
100部分信用评分增加了信息:成功但缓慢和 尬的把握与快速和清洁的不同. 部分信用评分为0 30 (明显失败),31 69 (部分/边缘),70 100 (具有质量梯度的成功) 为课程学习和数据权重提供更好的信号. - 2. 语言指导:"拿起红杯"比"拿起物体"更好. "从它的体体中拿起圆形红色塑料杯,而不是边缘,并将其立在白色托盘上"对于细粒度的工作更好. 指示中应指定与任务相关的对象属性 (颜色,形状,相关的材料),如果具体的话,所需的抓取策略和目标状态. 避免用于基础模型细节调节的数据集的仅仅对象名称指令 ("挑取杯").
- 3. 段标签: 分为各个节目阶段 (到达,抓住,运输,地点) 实现了阶段条件的政策和更为针对性的数据分析.标准的选择地点任务至少需要四个阶段. 组装任务可能需要8
12个段. 段界应在视频框架水平上标记,而不仅仅是行动指数. - **4.接触事件时间标签:**对于接触学习任务 (插入,组装,接下来表面),对第一次接触 (抓住者触摸对象),稳定的抓住 (接触力稳定在门
以上),以及释放 (抓住者打开,对象免费) 对于学习接触条件的行为至关重要. 接触时间 上的手动注释错误应为 <5个 (167ms/s30fps).在可用的情况下,最好自动检测F/T传感器数据. - **5.质量分数:**除了成功/失败之外,每节目质量指标在训练期间提供了数据权重.
标注方法的比较
| Method | Accuracy | Cost | Throughput | Best For |
|---|---|---|---|---|
| Expert labeler (domain knowledge) | Highest (95%+) | High ($40–60/hr) | 20–40 episodes/hr | Ground truth, gold standard, contact events |
| Trained crowdsource (MT, Scale) | Medium (80–90%) | Medium ($5–15/episode) | 100–500/hr at scale | Success/failure, language, segment labels |
| Naive crowdsource (MTurk open) | Lower (70–80%) | Low ($1–5/episode) | High | Simple success/failure on clear tasks only |
| Trained classifier (CNN/LSTM) | Medium-high (88–93%) | Very low (compute only) | Thousands/hr | Success/failure at scale, auto-annotation |
| Active learning loop | High (improves with data) | Decreasing per label | High after warmup | Large datasets with expert budget constraint |
报告员间协议
科恩的卡帕是标记者之间的协议的标准标准, 调整为偶然的协议.
- **Kappa > 0.8 (强烈同意):**任务定义和注释协议是足够明确的,以至于注释人员将它们贯彻地应用.这是生产注释管道的目标.大多数简单的成功/失败任务在适当的培训下达到这个水平.
- **Kappa 0.6
0.8 (温和协议):**需要注意.强制调整会议,注释者讨论不一致的案件,并更新协议,直到边缘案件的定义明确.不要在没有调整的情况下运送这个范围内的卡帕数据集. - **Kappa <0.6 (不良协议):**任务定义模糊.停止注释,重新设计协议以更清晰的成功标准,并从零开始重新注释.使用kappa <0.6注释的数据进行训练会产生非常难调整的不一致行为.
自动注释
两个自动注释方法已经准备好生产:
- 成功分类器 CNN: 精细调节的ResNet-50在每个集的最后10个框架,二进制成功/失败输出.RCSV的内部分类器在标准操纵任务中实现了92%的准确性.需要100多个标记的例子每项任务以可靠地训练.在建立了人类标记的训练集后,用于大型数据集.
- ** 分段探测器 (HMM 联合速度+F/T):**隐藏的马科夫模型使用联合速度配置文件和F/T读数来检测相界限.它没有任何视觉处理,使其快速和强
于摄像头问题.在标准的选择位置任务上,在±3个框架内实现大约 85% 的段界限精度.
语句复杂性按任务类型
| Task Type | Annotation Types Needed | Time per 情节 | Difficulty |
|---|---|---|---|
| Simple pick-place | Success/fail + language | 30-60 sec | Low |
| Multi-step assembly | Success/fail + segments (8-12) + contact events + language | 3-5 min | High |
| 精度 insertion | Success/fail + contact events + quality score + F/T annotation | 2-4 min | High |
| Drawer/cabinet opening | Success/fail + segments (4-6) + language | 1-2 min | Medium |
| Cloth/deformable manipulation | Partial credit (0-100) + segments + quality score + language | 3-6 min | Very high |
| Bimanual coordination | Success/fail + per-arm segments + synchronization labels + language | 4-8 min | Very high |
从简单的选用地点到双手注释的成本乘法大约是8倍.根据其简单任务预算注释时间,然后转向更复杂的任务的团队总是惊
时间标签配合的挑战
机器人示范数据来自多个异步来源:摄像头30-60fps,联合状态读数100-500Hz,F/T传感器500-1000Hz,和变速的抓住状态.将这些流与一个共同的时间线进行配合是有意义的注释的先决条件. 如果相机相应的相机框架距离实际接触50ms的偏移,则接触事件时刻标签是无用的,因为相机和联合状态钟漂移.
标准方法是硬件触发的同步:一个主钟生成一个触发脉冲,同时触发摄像头框架捕捉和时间
需要注意的常见配列陷
标记失败案例:部分成功和几乎失败
双重成功/失败注释是最小的,但它忽略了关于如何和为什么事件失败的关键信息. 只有基于二进制过
操作任务的实际部分成功类别:
- **0-20分 (完全失败):**机器人没有接近对象或完全走向错误区域.
- **21-40分 (正确的方法,抓不到):**机器人达到正确的区域,但无法建立稳定的抓不到.
- **分数41-60 (抓获成功,任务失败):**机器人抓获物体,但在运输,放置或后续阶段失败.
- ** 61-80 分 (任务大多完整,不精确):**机器人完成任务,但质量差 - 放置在大致正确的区域,但不精确的物体,或完成任务缓慢,运动
. 加入减重 (0.7x) 或用于质量意识的训练. - **81-100分 (质量梯度的成功):**任务成功完成.较高的分数表明执行更顺利,更快,更精确.包括全重.
在RCSV的实验中,在一个数据集中,有30%的部分失败的数据集中进行的权重训练产生了比仅在最高分数的70%节目中训练的政策强度高达8-12%.
质量门:何时拒绝注释
定义引发重新注释或事件排除的明确质量门:
- **如果:**注释器在标签之前看不到80%的节目视频 (通过注释工具分析可检测).
- **如果:**注释时间低于预期最低的60% (速度运行注释不可靠 - - 在5秒内审查的30秒集没有得到适当的评估)
- **拒绝如果:**成功/失败标签与自动分类器输出不同,且注释符没有标记事件为边界线 (表明不注意,不是真正的不同意见).
- **如果:**语言指令不符合视频中可见的任务 (一般复印粘贴标签与众源注释是令人惊
的常见的). - 如果: 缺少任何阶段的段子边界注释 (不完整的注释比没有注释更糟,因为它们创造了训练文物).
- **如果:**两个注释者对成功/失败的意见不同,则可重新审核.
在RCSV,大约8-12%的初始注释失败了质量门,然后重新注释.这种拒绝率是正常的,健康的 - - 这表明质量门正在运作. 0%的拒绝率意味着门太宽容.
标注工具的比较
| Tool | Type | Robot-Specific Features | Cost |
|---|---|---|---|
| Label Studio | Open-source | Video timeline annotation; custom label schemas; Python SDK for automation | Free / Enterprise |
| CVAT | Open-source | Frame-level annotation; interpolation; multi-track timeline | Free |
| Scale AI | Managed service | Trained annotator workforce; quality management; custom ontologies | $5-15/episode |
| Supervisely | Cloud platform | Video annotation; neural network-assisted labeling; team management | Free tier / paid |
| RCSV Platform | Integrated | Robot-native: synchronized multi-camera + joint state + F/T playback; auto-classifier pre-labels; kappa tracking | Included with data services |
对于机器人特定的注释,一般用途工具 (标签工作室,CVAT) 需要大量的定制来处理同步的多模数据.一般工具中缺失的关键功能是同步播放视频,联合状态图片和F/T传感器数据在一个共同的时间线上.RCSV的注释接口专门为此使用情况构建.
时间标志同步:实际实施
对于使用ROS2作为数据收集中间件的团队来说,以下是推
# sync_recorder.py -- ROS2 message_filters for synchronized recording
import rclpy
from rclpy.node import Node
from message_filters import ApproximateTimeSynchronizer, Subscriber
from sensor_msgs.msg import Image, JointState
from geometry_msgs.msg import WrenchStamped
import h5py, numpy as np
class SyncRecorder(Node):
def __init__(self):
super().__init__('sync_recorder')
# Subscribe to all sensor topics
self.cam_sub = Subscriber(self, Image, '/camera/color/image_raw')
self.joint_sub = Subscriber(self, JointState, '/joint_states')
self.ft_sub = Subscriber(self, WrenchStamped, '/ft_sensor/wrench')
# ApproximateTimeSynchronizer: 50ms slop tolerance
self.sync = ApproximateTimeSynchronizer(
[self.cam_sub, self.joint_sub, self.ft_sub],
queue_size=10,
slop=0.05 # 50ms max allowed timestamp difference
)
self.sync.registerCallback(self.synced_callback)
self.episode_data = []
def synced_callback(self, img_msg, joint_msg, ft_msg):
"""Called only when all three messages have near-matching timestamps."""
timestamp = img_msg.header.stamp.sec + img_msg.header.stamp.nanosec * 1e-9
self.episode_data.append({
'timestamp': timestamp,
'image': np.frombuffer(img_msg.data, dtype=np.uint8).reshape(480, 640, 3),
'joint_positions': np.array(joint_msg.position),
'joint_velocities': np.array(joint_msg.velocity),
'wrench': np.array([
ft_msg.wrench.force.x, ft_msg.wrench.force.y, ft_msg.wrench.force.z,
ft_msg.wrench.torque.x, ft_msg.wrench.torque.y, ft_msg.wrench.torque.z
]),
})
执行重点注意事项: (1) 软件同步系统使用50ms斜率的
扩大质量门:生产注释管道
除了基本质量门外,生产注释管道还应实施这些额外检查.
| Quality Gate | Check Method | Threshold | Action if Failed |
|---|---|---|---|
| Timestamp alignment | Max camera-joint offset per episode | < 50ms (software) / < 10ms (hardware) | Discard episode; debug sync pipeline |
| Frame drops | Count gaps > 2x expected frame interval | < 3% of frames dropped | Interpolate if < 3 consecutive; discard episode if > 3 consecutive |
| Joint limit violation | Any joint within 2 deg of hard limit | Flag for review | Include if task succeeded; exclude if triggered safety stop |
| 情节 duration outlier | Duration > 3 sigma from task mean | Flag for review | Review video; may indicate operator hesitation or unusual strategy |
| Language label uniqueness | Detect identical labels on visually different episodes | > 20% unique labels in batch | Re-annotate batch; suspect copy-paste |
| 夹爪 state consistency | Verify gripper open at start, closed during transport | Match expected phase sequence | Flag episodes where gripper sequence is anomalous |
| F/T spike detection | Force exceeds 2x task maximum | Flag for review | May indicate collision or unsafe contact; exclude from training |
| Camera image quality | Laplacian variance (blur detection) | Variance > 100 (focused image) | Discard blurry episodes; re-focus camera |
通过这些质量门作为数据管道中的自动检查,在人类审查之前可以捕获70-80%的数据质量问题.剩余的20-30%需要人类判断,并且通过标准的注释质量检查过程来处理.RCSV在注释开始之前自动执行所有这些检查.
通过F/T数据自动检测接触事件
接触事件时间
# contact_detector.py -- Automated contact event detection from F/T data
import numpy as np
from scipy.signal import savgol_filter
class ContactEventDetector:
"""Detect first contact, stable grasp, and release from F/T readings."""
def __init__(self, force_threshold=2.0, stable_window=10, release_threshold=0.5):
self.force_threshold = force_threshold # Newtons
self.stable_window = stable_window # frames
self.release_threshold = release_threshold # Newtons
def detect_events(self, ft_data, timestamps):
"""
Args:
ft_data: (N, 6) array of [fx, fy, fz, tx, ty, tz]
timestamps: (N,) array of timestamps in seconds
Returns:
dict with 'first_contact', 'stable_grasp', 'release' timestamps
"""
force_magnitude = np.linalg.norm(ft_data[:, :3], axis=1)
# Smooth to remove sensor noise
force_smooth = savgol_filter(force_magnitude, window_length=7, polyorder=2)
events = {}
# First contact: force exceeds threshold for the first time
contact_mask = force_smooth > self.force_threshold
if contact_mask.any():
idx = np.argmax(contact_mask)
events['first_contact'] = timestamps[idx]
# Stable grasp: force stays above threshold for stable_window frames
for i in range(idx, len(force_smooth) - self.stable_window):
if all(force_smooth[i:i+self.stable_window] > self.force_threshold):
events['stable_grasp'] = timestamps[i]
break
# Release: force drops below release_threshold after stable grasp
if 'stable_grasp' in events:
grasp_idx = np.searchsorted(timestamps, events['stable_grasp'])
post_grasp = force_smooth[grasp_idx:]
release_mask = post_grasp < self.release_threshold
if release_mask.any():
rel_idx = grasp_idx + np.argmax(release_mask)
events['release'] = timestamps[rel_idx]
return events
对于安装任务,将
标签 管道架构
机器人数据的生产注释管道应遵循此架构,从收集到训练准备的输出:
- 集层: 通过硬件时间
印将所有模式 (摄像头,联合状态,F/T,抓住器) 记录到集 HDF5文件中. - 自动预处理: 运行自动化质量门 (时间标签对齐,框架落地检测,模糊检测) 和自动化分类器 (CNN成功/失败,接触事件检测器).
- **第1级注释 (自动化+现场检查):**对于具有高自动化分类器精度 (>90%) 的简单任务,接受自动标签,以10%的人类现场检查.自动标签和人类之间的分歧将进入第二级.
- **二级注释 (人初级):**对于复杂任务,边界案例和语言注释.每个节目由两个独立注释者审查.
- 调和: 调解者不同意的事件由高级调解员审查. 如果不同意度显示了模糊性,则会更新协议.调解标签是最终的.
- 出口: 备考的节目,出口为训练准备的格式 (LeRobot HDF5或RLDS) 含备考的元数据 (该批次的注释器ID,注释时间,信任,卡帕分数).
**失败分析注释:**对于失败的示范,添加预定义分类的结构性失败原因标签: (a) 感知失败 (物体未被检测或未被错误定位), (b) 抓住失败 (物体滑落或未获得), (c) 运输失败 (物体在运动过程中落下), (d) 放置失败 (物体放置在错误位置或方向), (e) 时间延期 (任务未在时间限内完成). 由于这种失败类别,可以自动分析收集质量和针对数据的回忆.例如,如果40%的失败是抓取失败,运营商需要重新培训抓取技术,而不是更多的展示完整任务.
这种层次的方法可以减少人为注释成本60-70%,而与完整的人类注释相比,同时保持质量.RCSV为所有数据收集任务运行该管道,自动化层处理常规注释,人为注释器专注于需要判断的案件.
语言注释最佳做法
语言注释对于VLA细节调整和语言条件的政策培训至关重要.语言标签的质量直接影响了政策在部署时遵循指令的能力.
- 至少要指定两个属性的对象."拿起杯子"是不够的. "拿起红色塑料杯子"是最少的. "从桌子左边拿起高的红色塑料杯子"是多个对象场景的理想选择.
- ** 包含相关的空间引用.** "盘上的位置"是模糊的. "白盘的中心位置"或"盘上的位置,碗左边"提供了空间地定,帮助政策学习空间推理.
- 自然使用不同的语言. 不用相同的模板用于每个集.在同一行动中,切换"取","抓","抓","取"和"取".使用"放下"和"放置".这种变化教导了政策在推断时处理自然语言多样性.
- 大多数任务的标签是任务级别,而不是阶段级别."拿起红杯,把它放在托盘上"是选用地点的单个任务说明. 阶段级标签 ("到达杯,"""紧握器","升起","右转","开握器") 仅用于细节条件的政策.
- ** 使用模板验证.** 定义对您的任务的有效物体名称,颜色和空间引用. 检查所有注释与这个词汇库.拼写错误和不一致的命名 (在某些注释中使用"mug"和其他中使用"cup"用于同一物体) 为语言编码器产生了不必要的噪音.
- **包括负面指示.**对于多对象场景,包括指令,说明哪个对象不应该挑选 ("挑选红杯,而不是蓝杯").使用负面指示训练提高了政策对类似对象的分歧的能力,与仅积极的指令相比,多对象场景的成功率提高了8-12%.
- **在收集后注释,而不是在收集期间.***一些团队要求操作员在远程操作期间发出任务指示.这将操作员的注意力分开,降低示范质量. 专用注释器观看节目视频可以写出更好的指令 (更具体,更一致),而不是操作员在远程操作中多任务.
按任务复杂性划分说明成本
分析成本与任务复杂性以及需要的说明细节程度都会有很大的不同.
| Annotation Type | Time per 情节 | Cost per 情节 | Automation Potential | Required For |
|---|---|---|---|---|
| Binary success/failure | 5-10 seconds | $0.10-0.25 | 90%+ (CNN classifier) | All training pipelines |
| Language instruction label | 15-30 seconds | $0.25-0.75 | 50-70% (template + VLM) | VLA fine-tuning, language-conditioned policies |
| Phase segmentation (4 phases) | 30-60 seconds | $0.50-1.50 | 60-80% (contact detector + heuristics) | Segment-conditioned training, curriculum learning |
| Partial credit scoring (0-100) | 30-90 seconds | $0.75-2.00 | 20-40% (requires judgment) | Weighted BC training, reward shaping |
| Object 6-DOF pose per frame | 5-15 min | $5-20 | 70-85% (FoundationPose + refinement) | Object-centric policy training, grasp analysis |
| Full semantic scene graph | 10-30 min | $10-40 | 30-50% (VLM + manual review) | Scene understanding, task planning research |
对于大多数模仿学习项目,二进制成功/失败标签加上语言指导标签是最小可行的注释集.这每集的成本为0.35-1.00美元,其中60-80%的注释是自动化的.阶段分类为课程学习方法增加了价值,但翻了注释成本. 对于标准政策培训,它对更便宜的注释类型提供了最小的好处.
通过VLM进行扩展注释:使用GPT-4V和Gemini用于机器人数据
视觉语言模型 (VLM) 越来越有用,以自动化以前需要人为判断的注释任务.RCSV如何将VLM集成到注释管道中.
语言指令生成. 发送一集的第一和最后一个框到GPT-4V或双胞胎,并提示:"描述这些前/后图像中所示的操纵任务.具体说明对象 (颜色,材料,形状) 和执行的操作.使用10-15字. "VLM在标准选择位置任务上产生了85-90%的自然语言指令. 人类评论员每集每秒5-10秒内纠正剩余的10-15% (检查比从零开始写作更快).
成功/失败验证. 发送最后一个框架到VLM,提示:"机器人被要求执行任务指令.根据最后的场景,任务是否成功完成? 通过信任分数回答是否或不".VLM在选择和堆叠任务中获得88-93%的二进制成功分类准确性,而在视觉微妙的插入和组装任务中降至75-82%.
**失败模式分类.**对于失败事件,VLM可以分类失败类型:"机器人 (a) 没有抓住对象, (b) 在运输过程中丢掉对象, (c) 将对象放置在错误的位置,或 (d) 其他?"这种分类为指导目标数据收集的失败分析提供了
成本影响: VLM辅助的注释减少了语言标签的每节目人类注释时间40-60%,二元标签的70-80%.目前的API定价 (GPT-4V为每张图片对0.01美元,双子在0.005美元),与节省的人类时间相比,VLM推断成本是微不足道的.净效果是每节目总注释成本的30%-50%的降低.
质量保证指标: 什么要追踪和什么要目标
这些指标是RCSV每次数据收集任务的监测量,目标门
- ** 语文标签:使用句子-BERT嵌入式计算注释符描述之间的语义相似性; 目标共数相似性 > 0.85. 阶段界限: 目标相似性在+/- 3个框架内 (100ms以30fps).
- **注释吞吐量.**每注释器每小时注释的跟踪节目. 平均预期速度的80%以下的吞吐量 (基于注释类型复杂性) 表示需要协议澄清的任务模糊性或需要休息的注释器疲劳.
- ** 校正率.** 追踪人类审查者对VLM生成的标签的部分. 20%以上的校正率表明VLM提示需要进行精炼或任务太复杂,无法自动注释.10%以下的数据表明人类审查可以采样而不是完全.
- 下游培训影响. 最终的质量指标:培训一个政策,以注释数据和测量成功率.如果增加更多的注释 (例如阶段界限) 不提高政策至少3%,额外的注释成本不合理.
苏联联联证券交易所
根据RCSV的数据收集服务,所有收集的集集都包括注释.所有集中的集集都收到:双重成功/失败标签 (自动化+人为检查边界病例),语言指令标签 (每个任务按协议定义),四阶段段段界限 (到达/抓取/运输/地点),以及F/T传感器存在的接触事件时间标签. 其他类型的注释 (部分信用评分,扩展的细分组,质量评分) 作为附加值可提供.
所有注释都附加于注释者间协议指标 (每注释类型的kappa分数) 和记录的相容记录.查看我们的 [数据服务页面]
机器人数据的注释工具要求
现货图像注释工具 (标签盒,CVAT,标签工作室) 设计用于单个图像分类和边界框任务.机器人节目注释具有特定的要求,大多数一般工具都不支持.
- 多模拟同步. 注释工具必须与自觉时间系列 (关角,F/T读数) 和行动信号一起显示多摄像头的同步视频.注释器需要看到整个文本 - 手腕摄像头,自觉数据,有时空头摄像头同时可见抓紧器闭幕事件.
- **时间注释.**与标签单个框架的图像注释不同,机器人注释需要通过视频时间线扫描标记时间界限 (阶段开始/结束,接触事件).该工具必须支持30-50fps分辨率的框架准确的时间注释.
- **事件级的元数据.***每个集都需要结构化元数据:成功/失败,任务指令,质量分数,操作员ID,收集条件.该工具应该支持可定制的元数据方案,每个任务都会发生变化.
- 批评工作流. 审查员应该能够根据自动化质量分数,标志分歧和批量批准批量进行分类.
对于构建自己的注释工具的团队来说,有自定义前端扩展的标签工作室是最灵活的开源起点 - - 预算 2-4 周的前端开发,以添加多模拟同步和时段标记功能.
相关阅读
- [机器人模仿学习:从示范到部署]
- [机器人学习:每次示范分析的成本]
- [LeRobot框架:开始指南]
- [机器人政策概括:为什么机器人在新物体上失败]
- [开放的X-体:改变了一切的机器人数据集]
- [RCSV数据收集服务]
- [RCSV数据平台]
准备训练的注释数据集
根据RCSV的规定,在使用机器人进行测试,
[查看数据服务]







