You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中使用Drake Visualizer可视化关节框架?

在C++中使用DrakeVisualizer显示关节框架

要通过你已启动的meldis(即DrakeVisualizer)显示关节框架,可借助FrameVisualizer组件实现,步骤如下:

  • 确保你的Drake构建包含可视化模块,链接drake_visualization相关库
  • 在DiagramBuilder中添加FrameVisualizer,注册需要显示的关节框架,并将其输出连接到SceneGraph

示例代码:

#include <drake/geometry/drake_visualizer.h>
#include <drake/geometry/frame_visualizer.h>
#include <drake/multibody/plant/multibody_plant.h>
#include <drake/systems/framework/diagram_builder.h>

int main() {
  systems::DiagramBuilder<double> builder;

  // 初始化MultibodyPlant与SceneGraph(根据你的实际场景调整)
  auto& plant = *builder.AddSystem<multibody::MultibodyPlant<double>>(0.0);
  auto& scene_graph = *builder.AddSystem<geometry::SceneGraph<double>>();
  plant.RegisterAsSourceForSceneGraph(&scene_graph);

  // 添加DrakeVisualizer并连接到SceneGraph
  auto visualizer = builder.AddSystem<geometry::DrakeVisualizer<double>>(&scene_graph);
  builder.Connect(
      scene_graph.get_pose_bundle_output_port(),
      visualizer.get_input_port(0)
  );

  // 创建FrameVisualizer用于显示关节框架
  auto frame_visualizer = builder.AddSystem<geometry::FrameVisualizer<double>>(&scene_graph);
  // 遍历所有关节,将子关节对应的Frame加入可视化列表
  for (const auto& joint : plant.GetJoints()) {
    const auto& joint_frame = joint.frame_on_child();
    frame_visualizer->AddFrame(joint_frame);
  }
  // 将FrameVisualizer的输出连接到SceneGraph
  builder.Connect(
      frame_visualizer->get_pose_bundle_output_port(),
      scene_graph.get_source_pose_port(frame_visualizer->source_id())
  );

  // 构建Diagram并执行模拟(省略模拟初始化与运行细节)
  auto diagram = builder.Build();
  auto context = diagram->CreateDefaultContext();
  // ... 后续模拟逻辑
}

FrameVisualizer会将指定的关节框架以坐标系轴的形式发送到SceneGraph,meldis即可在界面中显示这些框架。

解决Meshcat可视化无内容的问题

你提供的Meshcat代码存在拼写错误,且缺少必要的初始化步骤,修正后的实现如下:

常见问题与修正

  1. 拼写错误:MeshcatVisualizerd应为MeshcatVisualizer(多余的后缀d会导致组件无法正确创建)
  2. 缺少必要连接:确保MultibodyPlant已注册为SceneGraph的数据源,且Meshcat实例正确传递
  3. 未打开Meshcat网页:运行程序后需在浏览器打开终端输出的Meshcat URL(通常为http://localhost:7000)

修正后的示例代码:

#include <drake/geometry/meshcat_visualizer.h>
#include <drake/multibody/plant/multibody_plant.h>
#include <drake/systems/framework/diagram_builder.h>
#include <drake/systems/analysis/simulator.h>

int main() {
  systems::DiagramBuilder<double> builder;

  // 初始化MultibodyPlant与SceneGraph
  auto& plant = *builder.AddSystem<multibody::MultibodyPlant<double>>(0.0);
  auto& scene_graph = *builder.AddSystem<geometry::SceneGraph<double>>();
  plant.RegisterAsSourceForSceneGraph(&scene_graph);
  // 此处需加载URDF/SDF模型,否则场景为空无内容显示
  // plant.LoadModelFromFile("your_model.urdf");
  plant.Finalize();

  // 创建Meshcat实例,默认启动本地服务器并打印访问URL
  auto meshcat = std::make_shared<geometry::Meshcat>();
  // 将MeshcatVisualizer添加到构建器
  geometry::MeshcatVisualizer<double>::AddToBuilder(
      &builder, scene_graph, meshcat
  );

  // 构建Diagram并初始化模拟
  auto diagram = builder.Build();
  auto context = diagram->CreateDefaultContext();
  plant.SetDefaultContext(context->GetMutableSubsystemContext(plant));

  // 运行模拟
  systems::Simulator<double> simulator(*diagram, std::move(context));
  simulator.Initialize();
  simulator.AdvanceTo(10.0);
}

额外检查点

  • 确认已加载几何模型(如URDF/SDF),否则场景本身为空,Meshcat无内容显示
  • 查看终端输出的Meshcat URL,确保浏览器打开的是正确地址
  • 若连接异常,可尝试指定端口启动:auto meshcat = std::make_shared<geometry::Meshcat>(std::nullopt, 7001);

内容的提问来源于stack exchange,提问作者Yaashia Gautam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:41:35