如何不运行物理仿真使用VTKRenderer可视化物体新位姿
无物理仿真下VTK位姿可视化更新方案
问题原因
你当前的代码修改了plant_context中的关节位姿后,没有完成状态同步与渲染触发的完整流程:
- 单独调用
scene_graph.Publish时,scene_graph读取的还是上一次缓存的姿态输入,不会自动同步plant中更新的状态 - 没有更新上下文时间戳,渲染系统会将相同时间的帧判定为重复内容,跳过渲染更新
simulator.AdvanceTo会自动完成状态传递、时间更新、发布全流程,所以只有调用仿真器时才会看到画面更新
解决代码
from pydrake.geometry import MakeRenderEngineVtk, RenderEngineVtkParams, DrakeVisualizer from pydrake.multibody.plant import AddMultibodyPlantSceneGraph from pydrake.multibody.parsing import Parser from pydrake.systems.framework import DiagramBuilder builder = DiagramBuilder() plant, scene_graph = AddMultibodyPlantSceneGraph(builder, 0.0) parser = Parser(plant) # 此处添加你自己的模型加载逻辑,例如 parser.AddModels("your_model.sdf") plant.Finalize() renderer_name = "renderer" renderer = MakeRenderEngineVtk(RenderEngineVtkParams()) scene_graph.AddRenderer(renderer_name, renderer) # 必须添加可视化器到Diagram中,才会触发VTK窗口渲染 DrakeVisualizer.AddToBuilder(builder, scene_graph) diagram = builder.Build() diagram_context = diagram.CreateDefaultContext() plant_context = plant.GetMyMutableContextFromRoot(diagram_context) # 遍历你的位姿序列 for idx, position in enumerate(positions): # 更新关节位姿 obj_joints[idx].set_translation(plant_context, position) # 关键1:更新上下文时间戳,每次递增即可,避免重复帧被丢弃 diagram_context.SetTime(diagram_context.get_time() + 1/30) # 关键2:调用Diagram强制发布,自动完成状态同步和渲染触发 diagram.ForcedPublish(diagram_context)
注意事项
- 不要单独调用plant或scene_graph的Publish方法,直接调用Diagram的
ForcedPublish会自动处理plant到scene_graph的状态传递,无需手动操作端口 - 时间步可以根据你的需要调整,只要保证每次修改位姿后时间戳是递增的即可
- 如果需要控制渲染停留时长,可以在每次
ForcedPublish后加time.sleep()实现停留效果
内容的提问来源于stack exchange,提问作者user3180
相关产品推荐
相关产品推荐

