手机照片变机器人仿真资产:scan2usd 把最难的活留给了碰撞体

一只杯子放进仿真器,外观看起来八九不离十。机械手伸向杯口,却被一层看不见的“盖子”挡住。问题多半不在渲染:如果碰撞体是包住整个杯子的单个凸包,中空的杯口会被当作实体。开源项目 scan2usd 选这个例子展示自己的路线:用手机照片重建物体,再为网格补上尺度、碰撞、质量和材质信息,导出可供仿真软件读取的 OpenUSD 资产。

手机照片变机器人仿真资产:scan2usd 把最难的活留给了碰撞体:封面(概念示意)

这条路线值得工业软件团队看,但看的重点不是“照片一键变数字孪生”。项目 README 把 COLMAP、CoACD、USD 导出和多种验证脚本接成了一条相当完整的实验链;里面醒目的精度与抓取数字,主要来自作者自测。真正能迁入工程流程的,是它把视觉上好看、物理上能用、结果可以复测三件事拆开处理。若企业需要给机器人训练场景批量做物件,恰好可以借这个项目设计自己的验收表。

一条流水线,两个完全不同的网格

项目首先用 COLMAP 官方教程描述的摄影测量路径:有重叠的照片经特征匹配恢复相机位置和稀疏结构,再由多视图立体生成稠密信息。scan2usd 接着找桌面、分离物体、重建表面、修补网格和烘焙纹理,最后生成 USD 与 glTF。README 列出的主要模块包括 reconstruct.py、mesh_ops.py、physics.py、usd_io.py;它还提供捕捉引导、资产库、抓取标注及不确定性标记。其工作量明显不只是在两种文件格式之间转换。

渲染网格负责让物体被看见,碰撞网格负责回答“机械手到底碰到哪里”。为碰撞求解直接塞进数十万面照片网格,效率和稳定性都可能出问题;用一个凸包虽省事,却容易填平杯口、把手、挂钩等凹陷。scan2usd 调用 CoACD 做近似凸分解,给模拟器一组较简化的碰撞形状。CoACD 项目说明它的设计目标是以较少部件保留碰撞条件;这是一种速度和接触细节的取舍,不是把真实表面无损复制一遍。

README 里的 Franka Panda 夹取杯沿示例很直观:手指需要伸入杯口。作者报告,同一计划配单凸包会失败,改用分解碰撞体可以在 Isaac Sim 中完成夹取。作为工程师,你要顺手追问两个问题:换一个内径更窄的杯子会怎样?一组更细的碰撞块是否导致仿真步长和算力成本大幅上升?单个视频能提出问题,不能代替一批样本的接触测试。

尺寸也是容易在画面里被忽略的物理量。摄影测量恢复的物体通常缺少绝对尺度:一只九厘米的杯子和一只九米的杯子,若只看投影,可能对应相似的照片。scan2usd 允许用已知高度指定尺度,也提供 ColorChecker 色卡网格间距估算。它的基准文档对六个物件报告色卡估尺度误差 0.35%—1.43%;但几何评分使用的是一项已知高度做缩放,色卡尺度另列测试。项目提供的 --scale-to、--mass 参数很朴素,倒符合生产现场:有尺就量,有秤就称,不要把从照片推断的数字伪装成测量值。

OpenUSD 的 UsdPhysics 规范为刚体、质量分布、惯量、碰撞体、材料和关节定义了共用表达。scan2usd 在 stage 中采用 Z 向上、米和千克的单位设置,并将渲染网格、多个凸碰撞块及材质分别放在资产层级里。它还可以把铰链对象拆成多个刚体并写入旋转关节。这样导出的是可交换的物理描述,接收方仍得检查导入器怎样解释材料和关节;相同 USD 文件跨引擎打开,不会自动产生相同的摩擦和接触结果。

读数字时,把拍摄条件一起读

项目的 基准表很适合拿来练习读测试报告。评价指标还要和用途相配:平均表面距离容易被大量平整区域拉低,而机械手是否能插入一个狭窄孔位,常常取决于孔边缘几毫米范围的最大偏差。该表另列 p95、2 毫米阈值下的 F-score、体积误差与颜色差;这几项考察的分别是尾部几何偏差、表面覆盖、封闭体积和外观。企业做抓取,优先量接触边界;做视觉识别,再看颜色与留出场景的检出结果。六种物体分别在 Blender 中渲染 78 张仿手机拍摄的图片,再用 COLMAP 重建、与原始模型对齐评分。狮子摆件的平均表面误差为 0.60 毫米,带斑点的陶杯是 0.78 毫米;打印图案的咖啡杯达到 2.00 毫米,陶碗为 3.03 毫米。只摘“亚毫米”会漏掉同一张表里更难处理的对象。

尤其该看体积。打印咖啡杯的体积误差被作者报为 +191.5%,陶碗为 +82.0%。照片拍不到的碗底与单色内壁需要算法补面,封口方式改变了体积,也会影响按密度计算的质量与惯量。对摆设场景,这可能只是藏在外观之下的缺陷;对插装、倾倒、堆叠或夹取,误差会进入动力学。项目允许人工指定实测质量,并把部分未观测区域与属性区间写入 USD。密度预设可以帮一批道具快速占位,却不宜替代带空腔、配重或异材质组合的称重。惯量是围绕质心的质量分布;即使总质量相同,封住杯腔与实际空心杯在快速转动时也可能表现不同。若任务只测试静态视觉定位,先把它标成“未校准”即可;若涉及翻转与抛放,测量与动力学比对就该进入验收。对工业现场来说,这个“承认不知道”的设计,比外观误差再降几分之一毫米更实用。

基准文档还列出一个按照片数量拆分的试验:同一对象用 12 张图时仅 8 张完成注册,表面平均误差 8.05 毫米;20 张注册 19 张,降到 0.80 毫米;39 张全部注册,为 0.61 毫米。这个结果提示拍摄覆盖和匹配质量可能比张数更重要。测试对象仍是同一个合成场景;车间里有反光或遮挡的物料,采集张数要单独测。COLMAP 官方建议高重叠、充足纹理、光照相近,并避免强反光和仅原地转动相机;金属、黑色橡胶与透明件需要另做专门试验。

手机照片变机器人仿真资产:scan2usd 把最难的活留给了碰撞体:正文信息图(概念示意)

README 还有真实手机拍摄的控制器与底座实验。作者先分别拍物件,再拍合在一起的组合,用后者估计真实摆放位置;MuJoCo 中物件落入底座的 12 次测试均成功,中位位置偏差 9.1 毫米,Isaac Sim PhysX 中为 11/12。这样的配对实验比孤立的漂亮网格更接近应用问题,因为它把接触和位置误差放在同一张成绩单上。它仍是作者选择的物体、拍摄和求解设置,不宜延伸成零件装配通用精度。README 也坦白:当底座只用单凸包,落入测试为 0/12。

项目另一条“67/67、10/10”的材料要原样标注任务定义:作者称,用 Isaac Sim 渲染图训练的检测器,在 67 张真实照片中找到了目标,并驱动 see-locate-pick 循环完成 10/10 次拾取。这是项目所报告的小样本闭环结果,既没有独立复现,也没有披露足以推断工厂长期稳定性的样本范围。尤其不能直接写成现实产线机械手抓取成功率 100%。README 安装说明中的 python -m pytest # 109 tests 是作者给出的测试数量;本文没有安装依赖并运行整套测试。项目内 validate 对写出的资产有 33 项检查,基准文档明确说文件检查的 pass/warn 与真实几何误差各算各的:封口失真的杯子也可能是有效 USD 文件。

哪些资产值得拍,哪些还得用 CAD

照片天然擅长记录已经存在的外形和表面颜色。零件图纸却还包含孔公差、配合关系、材料牌号和制造意图。如果企业本来就有受控 CAD 及重量清单,拿手机绕着零件拍一圈,反而可能把精准曲面换成带噪声的三角面。拍摄更适合那些没有可用 CAD、频繁换型且形状相对可见的夹具、包装、日常物件;对安全相关的连接件与小间隙装配,应优先沿用设计源数据,再按需要拍实物补纹理、缺陷或者磨损。决定资产来源时记录“设计值”与“实物测量值”的区别,供应链换批次后也方便定位偏差。

摄像机看不到的部分,项目提供观测、推断和封口等标记。它们有用,因为算法无法从物体正面的二十张清晰照片恢复杯底的真实空腔。物理属性的区间则可驱动敏感性试验:将摩擦、质量、尺度分别取测量上下界,观察同一抓取是否翻车。若只有一种理想参数才成功,资产即便外观再漂亮,也不适合作为策略上线的唯一依据。反过来,若任务对这些变化不敏感,团队就不必在无关紧要的背面花三天修网格。把误差预算分给接触区域,比所有地方一视同仁地追求高精度更省时。

README 还展示了同一物件在 MuJoCo、Isaac Sim 和 Unreal 中的使用。三者角色应分清:前两者可以承担动力学实验,后者在项目示例里展示渲染效果。同一场景的灯光帧率不是力学可信度,跨引擎出现分歧也不应立即归咎于哪个引擎“算错”。先核对碰撞几何、单位、关节轴、摩擦和控制器,再检查接触求解设置。作者在一个 Isaac Sim 抓取案例中提到给机械手指垫补入 MuJoCo 方案使用的扭转摩擦;这类参数迁移比复制场景文件更像真实工程工作。

企业若要试,用一箱物件替代一张宣传图

建议先选择一个具体任务,比如机械手从料箱取塑料盖、把控制器放入定位座。挑 20—30 件覆盖光滑、反光、深色、遮挡、薄壁和中空结构的样本,而非只挑易拍的纹理摆件;每件留一套量具读数和称重记录。为拍摄制定灯光、焦距、环绕高度、色卡摆位及命名规则。镜面与透明件先列为例外流程,不把失败图像藏起来。项目 README 指明照片重建环节需要带 CUDA 的 COLMAP;Python 运行环境为 3.10—3.12,企业还应把 GPU 驱动、COLMAP 版本、许可证和重建时长列入试点成本。

下一步才是资产验收。每件输出视觉网格和碰撞块的并排预览,记录面数、凸块数与是否封住功能孔洞;将实际尺寸、实测质量、推算惯量、摩擦试验条件逐项标注来源。挑两个物理引擎做同一落体、插入和接触测试,固定释放位置、重力、步长、摩擦、随机种子,并保存失败轨迹。把报告分成三栏:文件结构能否读、几何相对实物差多少、任务动作能否完成。三栏只要混成一个“通过率”,坏资产就容易混进库。

如果后续交给别的工位或供应商,资产包最好附原始照片清单、相机标定方式、标尺照片、实物测量记录、工具版本、重建参数和每次人工修补记录。USD 中的单位元数据可以帮助交换,双方仍应拿一个已知尺寸的校验块检查厘米与米的转换。对抓取目标,宁可接受外观略粗糙的杯子,也要先保住真正被手指接触的那段杯沿。

预算可以按两条路做 A/B 对比。A 路是原有人工建模或 CAD 净化流程,B 路是照片重建加人工修补;两路使用同一批真实物体、同一机器人任务和同一验收人员。记录每件的摄影时间、算力分钟、返工次数及最难修的区域,再看动作失败是否集中在某类物体。这样才能回答“自动化省的是谁的时间”:如果每件资产都需要资深工程师去重新画看不见的背面,单张图片导出速度再快,也未必降低总成本。

存档也别只保留 final.usd。一批资产经过几个月更新后,最难解释的是某个接触结果为什么和上版不同。原图的内容哈希、工作区参数、人工标尺记录、生成器版本、物理参数及引擎测试日志,至少要能反查到资产版本。检验脚本在持续集成中可自动阻止单位缺失、碰撞体空白或关节越界,但需另有实物抽检去发现几何真实性问题。文件可打开、模拟能运行、任务能复现,分别由不同检查证明。

scan2usd 给出一份可拆开的工程提案,后续仍需实物校验。照片解决“看到了什么”;标尺、秤和材料实验回答“它到底有多大、多重”;碰撞体决定仿真里“能不能碰进去”。试点是否划算,最后看单位资产从拍摄到验收的人工时、失败重做率,以及在目标动作上比现有建模流程省了多少工。

参考资料

项目结果、基准与演示均为作者提供;本文未独立复现实验。

两幅配图均为原创概念示意,不对应论文实验现场、真实产品界面或新闻现场。

分享到