微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

记录多个Meshcat可视化工具

如何解决记录多个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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。