gpt4 book ai didi

drake - 对pydrake中的物体施加外力

转载 作者:行者123 更新时间:2023-12-04 00:20:10 36 4
gpt4 key购买 nike

此问题与 adding-forces-to-body-post-finalize 密切相关

我希望能够对 pydrake 中的简单几何图元施加外力。
这是为了对 body 之间的相互作用进行评估。

我目前的实现:


builder = DiagramBuilder()
plant = builder.AddSystem(MultibodyPlant(0.001))
parser = Parser(plant)
cube_instance = parser.AddModelFromFile('cube.urdf', model_name='cube')

plant.Finalize()

force = builder.AddSystem(ConstantVectorSource(np.zeros(6)))
builder.Connect(force.get_output_port(0), plant.get_applied_spatial_force_input_port())

diagram = builder.Build()

但是,当我运行它时,出现以下错误:

builder.Connect(force.get_output_port(0), plant.get_applied_spatial_force_input_port())
RuntimeError: DiagramBuilder::Connect: Cannot mix vector-valued and abstract-valued ports while connecting output port y0 of System drake/systems/ConstantVectorSource@0000000002db5aa0 to input port applied_spatial_force of System drake/multibody/MultibodyPlant@0000000003118680

我有一种倾向,我必须实现一个 LeafSystem,它实现了工厂上的抽象值端口。

根据建议更新

使用:AbstractValue 和 ConstantValueSource

value = AbstractValue.Make([np.zeros(6)])
force = builder.AddSystem(ConstantValueSource(value))

ref_vector_externally_applied_spatial_force = plant.get_applied_spatial_force_input_port()
builder.Connect(force.get_output_port(0), ref_vector_externally_applied_spatial_force)

我收到以下错误:

RuntimeError: DiagramBuilder::Connect: Mismatched value types while connecting
output port y0 of System drake/systems/ConstantValueSource@0000000002533a30 (type pybind11::object) to
input port applied_spatial_force of System drake/multibody/MultibodyPlant@0000000002667760 (type std::vector<drake::multibody::ExternallyAppliedSpatialForce<double>,std::allocator<drake::multibody::ExternallyAppliedSpatialForce<double>>>)

这是有意义的输入输出端口的类型应该匹配。
预期的类型似乎是 ExternallyAppliedSpatialForce 的向量。

然后我更改了 Abstract 类型,如下所示:

value = AbstractValue.Make(ExternallyAppliedSpatialForce())

RuntimeError: DiagramBuilder::Connect: Mismatched value types while connecting
output port y0 of System drake/systems/ConstantValueSource@0000000002623980 (type drake::multibody::ExternallyAppliedSpatialForce<double>)
to input port applied_spatial_force of System drake/multibody/MultibodyPlant@00000000027576b0 (type std::vector<drake::multibody::ExternallyAppliedSpatialForce<double>,std::allocator<drake::multibody::ExternallyAppliedSpatialForce<double>>>)

我越来越近了。但是,我无法发送 ExternallyAppliedSpatialForce 的向量。如果我尝试将它作为列表发送,我会收到提示它无法腌制对象。我在 AbstractValue 示例中没有看到如何创建这样的对象向量。

任何额外的帮助将不胜感激。

解决方案是使用类型 VectorExternallyAppliedSpatialForced

完整的解决方案稍后发布。

最佳答案

以下是对刚性物体施加外部静力的工作示例:

sim_time_step = 0.001
builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, sim_time_step)
object_instance = Parser(plant).AddModelFromFile('box.urdf')
scene_graph.AddRenderer("renderer", MakeRenderEngineVtk(RenderEngineVtkParams()))
ConnectDrakeVisualizer(builder, scene_graph)

plant.Finalize()

force_object = ExternallyAppliedSpatialForce()
force_object.body_index = plant.GetBodyIndices(object_instance).pop()
force_object.F_Bq_W = SpatialForce(tau=np.zeros(3), f=np.array([0., 0., 10.]))

forces = VectorExternallyAppliedSpatialForced()
forces.append(force_object)

value = AbstractValue.Make(forces)
force_system = builder.AddSystem(ConstantValueSource(value))

builder.Connect(force_system.get_output_port(0), plant.get_applied_spatial_force_input_port())

diagram = builder.Build()
simulator = Simulator(diagram)

context = simulator.get_mutable_context()

plant.SetPositions(context, object_instance, [0, 0, 0, 1, 0, 0, 0])

time_ = 0
while True:
time_ += sim_time_step
simulator.AdvanceTo(time_)
time.sleep(sim_time_step)


但是,之后我无法在模拟循环中更改外部施加的力。

为了实现这一点,我必须制作一个 LeafSystem。

可以在 here 中找到允许您随时间更改施加到刚性对象的力的实现。

静态和动态示例均可在 here 中找到.

关于drake - 对pydrake中的物体施加外力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61271126/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com