Meshcat轨迹可视化报错:C++对象所有权问题及替代方案咨询
错误原因
你遇到的RuntimeError是因为最初创建的scene_graph已经被第一个DiagramBuilder构建的diagram接管了所有权,PyBind11不再拥有它的控制权,所以没法再把它加到新的DiagramBuilder里。
两种可视化轨迹的替代方法
方法1:直接回放轨迹到原Diagram
不用重新搭建系统,直接用原有的diagram和scene_graph,遍历轨迹的每个状态并渲染:
trajectory = dircol.ReconstructStateTrajectory(result) times = trajectory.get_segment_times() states = trajectory.vector_values(times) # 初始化原场景的可视化器 visualizer = PlanarSceneGraphVisualizer( scene_graph, xlim=[-4, 4], ylim=[-2, 2], show=True ) context = diagram.CreateDefaultContext() # 逐个时间点更新状态并绘制 for t, x in zip(times, states.T): diagram.get_mutable_context(context).SetTime(t) plant.get_mutable_state_input_port().FixValue(context, x) visualizer.draw(context)
方法2:重新构建Plant和SceneGraph
既然原scene_graph不能复用,就重新建一套相同的Plant和SceneGraph来加载模型,再连接轨迹源:
trajectory = dircol.ReconstructStateTrajectory(result) # 重新构建Multibody Plant和SceneGraph builder = DiagramBuilder() plant_new, scene_graph_new = AddMultibodyPlantSceneGraph(builder=builder, time_step=0) parser = Parser(plant_new) ConfigureParser(parser) parser.AddModelsFromString(minigolf_urdf, 'urdf') plant_new.Finalize() # 轨迹源连接到姿态转换模块 source = builder.AddSystem(TrajectorySource(trajectory)) pos_to_pose = builder.AddSystem( MultibodyPositionToGeometryPose(plant_new, input_multibody_state=True) ) builder.Connect(source.get_output_port(0), pos_to_pose.get_input_port()) builder.Connect( pos_to_pose.get_output_port(), scene_graph_new.get_source_pose_port(plant_new.get_source_id()), ) # 添加可视化器并运行 visualizer = builder.AddSystem( PlanarSceneGraphVisualizer( scene_graph_new, xlim=[-4, 4], ylim=[-2, 2], show=True ) ) builder.Connect(scene_graph_new.get_query_output_port(), visualizer.get_input_port(0)) diagram_new = builder.Build() context_new = diagram_new.CreateDefaultContext() diagram_new.ForcedPublish(context_new) visualizer.run()
内容的提问来源于stack exchange,提问作者Ben Kang
相关产品推荐
相关产品推荐

