我正在尝试使用基本的DrakeVisualizer在Drake中构建一个简单的多体植物系统。但是,对于我的用例,我还希望能够通过物理模拟自动跟踪导数,所以我使用的是AutoDiffXd版本的system:
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类似乎只接受大量使用浮点标量的系统。所以我被困住了-要么我可以回到floats (但失去我最初想要的autodiff可微模拟功能),要么继续使用autodiffxd系统(但完全无法可视化我的模拟中发生了什么)。
有没有办法把我错过的这两件事都找回来?
发布于 2021-01-06 02:04:26
给您带来痛苦和不便,我深表歉意。你的描述和评估都很准确。大多数可视化机制都是仅float的,并且在其当前状态下,可视化AutoDiff图的尝试将失败。
您有几个选择(这两个选项都不吸引人):
使用上面描述的结果之一进行
AutoDiff逻辑示意图,在Drake要素请求中没有vis或没有derivatives).我可以想出一些老生常谈的变通方法(甚至不能立即确定是否有效)。因此,如果您迫切需要衍生工具和可视化工具,可以对其进行探索。但是,最终,功能请求和正式的Drake解决方案将是最好的长期解决方案。
=====================================
重大更新。从#14569开始,DrakeVisualizer类现在被模板化在标量类型上(上面列表中的第2项)。这有两个含义:
AutoDiffXd-valued图(如您的示例所示),或者double-valued图并对其进行标量转换(例如,将diagram.ToAutoDiffXd()转换为AutoDiffXd-valued图。https://stackoverflow.com/questions/65583969
复制相似问题