You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drake平面力控制Demo中Meshcat无法加载饼干盒PNG纹理

问题:Pydrake本地pip安装(v1.8.0)后YCB饼干盒纹理无法加载

本地通过pip安装pydrake v1.8.0后,运行改写的力控制Demo时,饼干盒显示为白色,纹理加载失败,控制台输出以下警告:

WARNING:drake:Ignoring Meshcat http request for /003_cracker_box_textured.png

SDF文件加载正常,文件引用链完整:SDF指向OBJ文件,OBJ指向MTL文件,MTL指向PNG纹理文件,所有文件均存在于路径.../site-packages/pydrake/share/drake/manipulation/models/ycb/meshes中。询问:是否需要移动这些网格文件到其他位置?

最小复现脚本

from pydrake.common import FindResourceOrThrow
from pydrake.systems.framework import DiagramBuilder
from pydrake.multibody.parsing import Parser
from pydrake.multibody.plant import AddMultibodyPlantSceneGraph
from pydrake.multibody.meshcat import JointSliders
from pydrake.math import RigidTransform
from pydrake.geometry import StartMeshcat, MeshcatVisualizer


meshcat = StartMeshcat()

builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=0.005)
parser = Parser(plant)

box = parser.AddModelFromFile(FindResourceOrThrow('drake/manipulation/models/ycb/sdf/003_cracker_box.sdf'))
    
plant.WeldFrames(plant.world_frame(), 
                plant.GetFrameByName("base_link_cracker", box),
                RigidTransform.Identity())

plant.Finalize()

MeshcatVisualizer.AddToBuilder(builder, scene_graph, meshcat)
sliders = builder.AddSystem(JointSliders(meshcat, plant))
diagram = builder.Build()
sliders.Run(diagram, None)

input('press any key to stop...')

相关文件内容

003_cracker_box_textured.obj 关键片段

# Generated by Katamari OBJ encoder.
# Vertices: 8194
# Faces: 16384
mtllib 003_cracker_box_textured.mtl
v -0.046666 -0.079014 0.089823
v -0.046390 -0.081674 0.083110
v -0.045613 -0.091869 0.086920
... <文件其余几何内容>

完整003_cracker_box_textured.mtl文件

newmtl material_0
# shader_type beckmann
map_Kd 003_cracker_box_textured.png 

解决方案

不需要移动网格文件,问题出在模型加载时的相对路径解析错误:Drake的Parser默认以当前脚本目录作为工作目录,导致无法找到OBJ/MTL引用的纹理文件。可通过以下方法解决:

方法1:设置Parser工作目录为SDF文件所在目录

在加载SDF前,获取SDF文件的路径,将Parser的工作目录设置为该文件所在目录,确保相对路径解析正确。修改后的关键代码如下:

import os  # 新增导入

# 获取SDF文件路径并设置工作目录
sdf_path = FindResourceOrThrow('drake/manipulation/models/ycb/sdf/003_cracker_box.sdf')
parser.SetWorkingDirectory(os.path.dirname(sdf_path))
box = parser.AddModelFromFile(sdf_path)

方法2:手动添加Meshcat资源路径

如果方法1无效,可直接将纹理文件所在目录添加到Meshcat的资源搜索路径中,让Meshcat能定位到纹理文件:

import os

# 获取纹理文件所在目录
meshes_dir = os.path.join(os.path.dirname(os.path.dirname(sdf_path)), "meshes")
meshcat.AddResourcePath(meshes_dir)

内容的提问来源于stack exchange,提问作者SwappyG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:10:34