
Drake 更新后,IllustrationProperties 中的 Phong 材质属性(如 "phong", "diffuse")不再默认存在,直接调用 GetProperty() 会抛出 RuntimeError;需改用 GetPropertyOrDefault() 并提供默认 Rgba 值,或提前为几何体显式设置材质属性。
drake 更新后,`illustrationproperties` 中的 phong 材质属性(如 `"phong", "diffuse"`)不再默认存在,直接调用 `getproperty()` 会抛出 runtimeerror;需改用 `getpropertyordefault()` 并提供默认 `rgba` 值,或提前为几何体显式设置材质属性。
在 Drake 的较新版本(特别是 v1.20+)中,SceneGraph 对 IllustrationRole 几何体的材质属性管理发生了重要变更:几何体的 IllustrationProperties 不再自动包含 "phong" 组及其 "diffuse" 属性,除非显式设置。这导致原代码中依赖 inspector.GetIllustrationProperties(geometry_id).GetProperty("phong", "diffuse") 的逻辑失效,并触发 RuntimeError: GetProperty(): Trying to read property ('phong', 'diffuse'), but the group does not exist.。
✅ 正确做法是使用安全获取 + 默认值策略。将原 helper 函数中第 124 行:
phong = properties.GetProperty("phong", "diffuse")
替换为:
from pydrake.geometry import Rgba
# 安全获取 diffuse 属性,若不存在则返回默认白色(含 alpha=1.0)
default_diffuse = Rgba(1.0, 1.0, 1.0, 1.0)
phong = properties.GetPropertyOrDefault("phong", "diffuse", default_diffuse)
# 更新 alpha 通道,保持 RGB 不变
phong.set(phong.r(), phong.g(), phong.b(), alpha)
properties.UpdateProperty("phong", "diffuse", phong)
⚠️ 注意事项:
-
GetPropertyOrDefault()是推荐的健壮访问方式,避免因缺失属性组而崩溃; - 若模型在仿真前未渲染过(例如未调用
AddRenderer或未触发首次可视化),其IllustrationProperties可能完全为空,此时必须提供合理的默认值; - 如需统一控制所有模型外观,建议在构建
MultibodyPlant后、调用scene_graph.RegisterSource()前,通过plant.RegisterVisualGeometry()显式传入带透明度的Rgba,例如:plant.RegisterVisualGeometry( body, X_BG, shape, name, Rgba(0.5, 0.5, 0.5, transparency) ) -
transparency=0.3表示 30% 不透明(即 70% 透明),确保该值在[0.0, 1.0]范围内。
? 总结:Drake 的 API 演进强调显式性与健壮性。放弃对隐式默认属性的假设,改用 GetPropertyOrDefault() 配合合理默认值,是兼容新版 Drake 可视化透明度设置的关键实践。










