简体   繁体   中英

URDF model keeps disappearing whenever I add intertial properties to a link? How can I resolve this issue?

I am trying to simulate a simple pendulum using pydrake and am having a couple of issues creating the urdf file to creat the model for the pendulum. I have no background knowledge on urdf or drake and am open to any suggestions to resolve this issue.

This is the code I have so far:

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)

This code gives me a blanck meshcat screen. But when I remove the inertia tags in the base link I can see a model of the pendulum. Please let me know what I am doing wrong. Also if you can reccomend some resources to learn about urdf and drake that would be really helpful.

Thank you very much.

I believe that the problem is that you have no mass in the arm, so when you go to simulate it, the simulation is ill-defined (probably you get NaNs in the state variables).

If you want to check just the visualization, I'd recommend doing

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

instead of the simulator step.

I have started working on a proper tutorial for precisely this. It's very much a draft right now, but in case it helps you can find it here . I intend for this to be one of the real Drake tutorials soon.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM