记录多个Meshcat可视化工具

问题描述

我想记录多个具有不同前缀ID的Meshcat可视化工具,以便最终将它们保存到一个HTML文件中,以便以后与之交互。我希望不同的可视化可以相互叠加,并能够选择/取消选择不同的可视化。

这里是问题的最小重复。我希望有两个相互重叠的可视化可视化。但是,我最终只看到其中一个被记录了。当我播放录音时,另一个障碍似乎停留在终点位置

import meshcat
from pydrake.common import FindResourceOrThrow
​
from pydrake.multibody.plant import (
    AddMultibodyPlantSceneGraph)
from pydrake.multibody.parsing import Parser
from pydrake.systems.analysis import Simulator
from pydrake.systems.framework import DiagramBuilder
from pydrake.systems.meshcat_visualizer import (
    ConnectMeshcatVisualizer,)
​
v = meshcat.Visualizer()
file_name = FindResourceOrThrow(
    "drake/examples/multibody/cart_pole/cart_pole.sdf")
builder = DiagramBuilder()
cart_pole,scene_graph = AddMultibodyPlantSceneGraph(builder,0.0)
Parser(plant=cart_pole).AddModelFromFile(file_name)
cart_pole.Finalize()
​
vis = ConnectMeshcatVisualizer(builder=builder,prefix="vis",scene_graph=scene_graph,open_browser=False)
​
vis2 = ConnectMeshcatVisualizer(
    builder=builder,prefix="vis2",open_browser=False)
vis2.set_name("vis2")
​
diagram = builder.Build()
diagram_context = diagram.CreateDefaultContext()
​
cart_pole_context = diagram.GetMutableSubsystemContext(
    cart_pole,diagram_context)
cart_pole.get_actuation_input_port().FixValue(cart_pole_context,.02)
​
simulator = Simulator(diagram,diagram_context)
simulator.set_publish_every_time_step(False)
vis.start_recording()
vis2.start_recording()
simulator.Advanceto(100)
vis.stop_recording()
vis2.stop_recording()
​
vis.publish_recording()
vis2.publish_recording()
​
# f = open("saved.html","w")
# f.write(v.static_html())
# f.close()

解决方法

这是一种解决方案。我不喜欢它,但是它实现了既定目标。注意更改:

  1. 仅保存和发布一个动画
  2. MultibodyPlant中为模型命名,为每个模拟用户使用不同的名称
  3. 设置delete_prefix_on_load=False,以免清除旧的几何图形
import meshcat
from pydrake.common import FindResourceOrThrow

from pydrake.multibody.plant import (AddMultibodyPlantSceneGraph)
from pydrake.multibody.parsing import Parser
from pydrake.systems.analysis import Simulator
from pydrake.systems.framework import DiagramBuilder
from pydrake.systems.meshcat_visualizer import (
    ConnectMeshcatVisualizer,)

animation = None

for i in range(3):
    file_name = FindResourceOrThrow(
        "drake/examples/multibody/cart_pole/cart_pole.sdf")
    builder = DiagramBuilder()
    cart_pole,scene_graph = AddMultibodyPlantSceneGraph(builder,0.0)
    Parser(plant=cart_pole).AddModelFromFile(file_name,f"plant{i}")
    cart_pole.Finalize()

    vis = ConnectMeshcatVisualizer(builder=builder,scene_graph=scene_graph,delete_prefix_on_load=False,open_browser=False)
    if animation:
        vis._animation = animation

    diagram = builder.Build()
    diagram_context = diagram.CreateDefaultContext()

    cart_pole_context = diagram.GetMutableSubsystemContext(
        cart_pole,diagram_context)
    cart_pole.get_actuation_input_port().FixValue(cart_pole_context,.02)

    simulator = Simulator(diagram,diagram_context)
    simulator.set_publish_every_time_step(False)
    vis.start_recording()
    simulator.AdvanceTo(10)
    vis.stop_recording()
    animation = vis._animation

vis.publish_recording()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...