gpt4 book ai didi

drake - MultiBodyPlant 上下文中带有 nans 的额外主体在模拟时导致错误

转载 作者:行者123 更新时间:2023-12-04 08:29:29 25 4
gpt4 key购买 nike

导入 urdf 文件并创建 MultiBodyPlant 后,我​​看到一个额外的参数组 南斯 当我打印上下文时。可以看到完整的打印上下文here .我无法解释/理解的参数组是这个:

18 numeric parameter groups with
10 parameters
nan nan nan nan nan nan nan nan nan nan
如果我使用以下方法获得工厂拓扑: pydot.graph_from_dot_data(plant.GetTopologyGraphvizString())[0].write_svg("robot_topology.svg")我在制作 urdf 时看到了植物的拓扑结构(在 WorldBodyInstance 内有一个额外的 WorldBody)。拓扑图可见 here .
在连续时间模拟 (time_step=0.0) 期间,这个额外的主体似乎会导致以下错误: RuntimeError: Encountered singular articulated body hinge inertia for body node index 1. Please ensure that this body has non-zero inertia along all axes of motion.我尝试删除前 3 个伪链接,但上下文中的第一个参数组仍然是 nans。所有其他参数组都与 urdf 文件中的主体/关节正确对应。
这个错误可能与urdf文件的写入方式有关吗?
urdf文件可以在 here找到.
用于打印上下文的代码:
builder = DiagramBuilder()

plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=0.0)
Parser(plant, scene_graph).AddModelFromFile(SCpath)
# Remove gravity
plantGravityField = plant.gravity_field()
plantGravityField.set_gravity_vector([0,0,0])
plant.Finalize()

# Adds the MeshcatVisualizer and wires it to the SceneGraph.
meshcat = ConnectMeshcatVisualizer(builder, scene_graph, zmq_url=zmq_url, delete_prefix_on_load=True)

diagram = builder.Build()
context = diagram.CreateDefaultContext()
plant_context = plant.GetMyMutableContextFromRoot(context)
print(plant_context)
如果我运行离散时间模拟 (time_step=0.001),则模拟成功运行,但在使用以下几行向 base_roll 关节施加关节扭矩后,我看不到 meshcat 可视化器或打印的上下文后模拟的变化:
jointAcutation =  np.zeros((plant.num_actuators(),1))
jointAcutation[0] = 10
plant.get_actuation_input_port().FixValue(plant_context, jointAcutation)

simulator = Simulator(diagram, context)

meshcat.load()

meshcat.start_recording()
simulator.AdvanceTo(30.0)
meshcat.stop_recording()
meshcat.publish_recording()
print(plant_context)
因此,由于我无法从模型中解释的 nan,连续时间和离散时间模拟似乎都失败了(可能)。

最佳答案

NaN 你在参数组中看到的对应于世界体,虽然它们看起来很可疑,但我不认为它们是你问题的根源。世界体没有一组有效的惯性参数(因此它们被设置为 NaN),并且在代码中作为特殊情况处理。正如在当前实现中所写的,body 参数 API 对每个 body 都是普遍存在的。每个主体在上下文中都有一组参数,无论它们是否有效。这可能是特殊物体(“世界”)的争论点,所以我打开了 an issue讨论。
您现在遇到的问题是因为您的 base_main链接(以及您的整个机器人)是一个自由漂浮的 body 。您不允许将零质量链接的自由 float 树连接到另一个具有非零质量的链接的自由 float 树上,因为在连接它们的关节上施加的任何扭矩(在您的情况下为 Joint_base_yaw)都会导致内侧物体的无限加速度。要解决这个问题:

  • (选项1):在base_main之间添加一个固定接头和 world在您的 URDF 文件中。
    <joint name="base_main" type="fixed">
    <parent link="world"/>
    <child link="base_main"/>
    </joint>
  • (选项 2):焊接 base_main链接的 body 框架到代码中的世界框架。
    plant.WeldFrames(plant.world_frame(), plant.GetFrameByName("base_main"))
  • 关于drake - MultiBodyPlant 上下文中带有 nans 的额外主体在模拟时导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65093710/

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