visualization - 在 PyDrake 中可视化 AutoDiff MultibodyPlant
问题描述
我正在尝试使用基本的在DrakeDrakeVisualizer
中构建一个简单的多体植物系统。但是,对于我的用例,我还希望能够通过物理模拟自动跟踪导数,所以我使用的是 AutoDiffXd 版本的系统:
timestep = 1e-3
builder = DiagramBuilder_[AutoDiffXd]()
plant = MultibodyPlant(timestep)
scene_graph = SceneGraph_[AutoDiffXd]()
brick_file = FindResourceOrThrow("drake/examples/manipulation_station/models/061_foam_brick.sdf")
parser = Parser(plant)
brick = parser.AddModelFromFile(brick_file, model_name="brick")
plant.Finalize()
plant_ad = plant.ToAutoDiffXd()
plant_ad.RegisterAsSourceForSceneGraph(scene_graph)
scene_graph.AddRenderer("renderer", MakeRenderEngineVtk(RenderEngineVtkParams()))
DrakeVisualizer.AddToBuilder(builder, scene_graph)
builder.AddSystem(plant_ad)
builder.AddSystem(scene_graph)
builder.Connect(plant_ad.get_geometry_poses_output_port(), scene_graph.get_source_pose_port(plant_ad.get_source_id()))
builder.Connect(scene_graph.get_query_output_port(), plant_ad.get_geometry_query_input_port())
diagram = builder.Build()
context = diagram.CreateDefaultContext()
simulator = Simulator_[AutoDiffXd](diagram, context)
simulator.AdvanceTo(2.0)
但是,当我运行它时,我收到以下错误:
File "/home/craig/Repos/drake-exps/autoDiffExperiment.py", line 102, in auto_phys
DrakeVisualizer.AddToBuilder(builder, scene_graph)
TypeError: AddToBuilder(): incompatible function arguments. The following argument types are supported:
1. (builder: pydrake.systems.framework.DiagramBuilder_[float], scene_graph: drake::geometry::SceneGraph<double>, lcm: pydrake.lcm.DrakeLcmInterface = None, params: pydrake.geometry.DrakeVisualizerParams = <pydrake.geometry.DrakeVisualizerParams object at 0x7ff6274e14b0>) -> pydrake.geometry.DrakeVisualizer
2. (builder: pydrake.systems.framework.DiagramBuilder_[float], query_object_port: pydrake.systems.framework.OutputPort_[float], lcm: pydrake.lcm.DrakeLcmInterface = None, params: pydrake.geometry.DrakeVisualizerParams = <pydrake.geometry.DrakeVisualizerParams object at 0x7ff627736730>) -> pydrake.geometry.DrakeVisualizer
Invoked with: <pydrake.systems.framework.DiagramBuilder_[AutoDiffXd] object at 0x7ff65654f8f0>, <pydrake.geometry.SceneGraph_[AutoDiffXd] object at 0x7ff656562130>
从这个错误来看,DrakeVisualizer 类似乎只接受专门使用浮点标量的系统。所以我被困住了——要么我可以回到浮点数(但失去了我最初追求的 autodiff 可微分模拟功能),要么继续使用 autodiffxd 系统(但完全无法想象我的模拟)。
有没有办法让我错过的两个?
解决方案
很抱歉给您带来的痛苦和不便。您的描述和评估都是正确的。大多数可视化机制float
只是并且在其当前状态下,尝试可视化AutoDiff
图表将失败。
你有几个选择(这两个都不吸引人):
- 选择您上面描述的结果之一(没有可见或没有衍生物)。
- 提出 Drake 功能请求,以便能够将可视化工具附加到
AutoDiff
图表。
我可以想出一些 hacky 的解决方法(这些方法还不是很清楚甚至会起作用)。因此,如果您迫切需要衍生品和可视化,可以探索它们。但是,最终,功能请求和正式的 Drake 解决方案将是最好的长期解决方案。
======================================
大更新。从#14569 开始,DrakeVisualizer
该类现在以标量类型为模板(上面列表中的第 2 项)。这有两个含义:
- 您可以构建一个
AutoDiffXd
带有可视化器的 -valued 图(如您的示例中所示),或者 - 您可以创建一个
double
-valued 图并对其进行标量转换(即,diagram.ToAutoDiffXd()
转换为AutoDiffXd
-valued 图。
推荐阅读
- gradle - Gitlab CI Runner get stuck, ssh not responding
- python - 从文件加载值的配置模块的单元测试
- wordpress - WordPress Gutenberg: This block contains unexpected or invalid content
- wordpress - 具有高级自定义字段的 Elementor
- html - How to make table td full width in mobile?
- search - SAPUI5 Block searchfield while request is running
- java - Gradle 构建未使用的依赖项
- java - 缺少字符串资源 ID
- android - Custom Preference with AndroidX Preference
- javascript - eslint 警告 Unexpected unnamed async function ,无论如何要摆脱它?