3

我正在尝试使用 pydrake 模拟一个简单的钟摆,并且在创建 urdf 文件以创建钟摆模型时遇到了一些问题。我对 urdf 或 drake 没有背景知识,并且愿意接受任何解决此问题的建议。

这是我到目前为止的代码:

import os
from tempfile import mkdtemp

from pydrake.all import (
    AddMultibodyPlantSceneGraph,
    DiagramBuilder,
    Meshcat,
    MeshcatVisualizerCpp,
    Parser,
    Simulator,
)

from manipulation.meshcat_cpp_utils import (
  StartMeshcat, MeshcatJointSlidersThatPublish)


# Start the visualizer.
meshcat = StartMeshcat()


tmp_dir = mkdtemp()
model_file = os.path.join(tmp_dir, "test_model.urdf")


model_text = f"""\
<?xml version="1.0"?>
<robot name="materials">

  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>

  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>

  <material name="green">
    <color rgba="0.0 0.8 0.0 1.0"/>
  </material>

 <link name="base">
    <visual>
      <geometry>
        <box size="0.5 0.5 0.1"/>
      </geometry>
    </visual>
    <inertial>
      <mass value="1"/>
    </inertial>
  </link>

  <joint name="world_2_base" type="fixed">
    <parent link="world"/>
    <child link="base"/>
     <origin xyz="0 0 0.5"/>
  </joint>

 <link name="arm">
    <visual>
      <geometry>
        <cylinder length="0.5" radius="0.01"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>


  <joint name="base" type="revolute">
    <parent link="base"/>
    <child link="arm"/>
    <axis xyz="1 0 0"/>
    <origin xyz="0 0 -0.3"/>
  </joint>

 <link name="ball">
    <visual>
      <geometry>
        <sphere radius="0.1"/>
      </geometry>
      <material name="green"/>
    </visual>
  </link>

  <joint name="base2" type="fixed">
    <parent link="arm"/>
    <child link="ball"/>
    <origin xyz="0 0 -0.35"/>
  </joint>


</robot>
"""


# Write temporary file.
with open(model_file, "w") as f:
    f.write(model_text)


builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=0.0)

# Add pendulum model.
model = Parser(plant, scene_graph).AddModelFromFile(model_file)
# - Weld base at origin.
base_link = plant.GetBodyByName("base", model)
#plant.WeldFrames(plant.world_frame(), base_link.body_frame())

plant.Finalize()
visualizer = MeshcatVisualizerCpp.AddToBuilder(builder, scene_graph, meshcat)
diagram = builder.Build()


simulator = Simulator(diagram)
simulator.set_target_realtime_rate(1.0)
simulator.AdvanceTo(5.0)

这段代码给了我一个空白的meshcat屏幕。但是当我删除基本链接中的惯性标签时,我可以看到钟摆的模型。请让我知道我做错了什么。另外,如果您可以推荐一些资源来了解 urdf 和 drake,那将非常有帮助。

非常感谢。

4

1 回答 1

1

我认为问题在于你的手臂没有质量,所以当你去模拟它时,模拟是不明确的(可能你在状态变量中得到 NaN)。

如果您只想检查可视化,我建议您这样做

context = diagram.CreateDefaultContext()
diagram.Publish(context)

而不是模拟器步骤。

我已经开始为此编写适当的教程。它现在只是一个草稿,但如果它对你有帮助,你可以在这里找到它。我打算很快成为真正的 Drake 教程之一。

于 2022-01-06T03:09:55.820 回答