Acrobot 在 Linearization/LQR 期间显示的可视化错误,但双摆不显示
Visualization Error Shown during Linearization/LQR for Acrobot but not for Double Pendulum
我正在尝试将我为双摆制作的脚本移植到杂技机器人(朝着更欠驱动的方向发展)。在执行此操作时,我看到 LQR 控制器脚本(主要灵感来自欠驱动课程的 this notebook)在 linearization/creating LQR 控制器期间出错。除了单个执行器而不是 2 个执行器的更改外,代码是相同的。
奇怪的是,在Linearization/creating LQR命令中连接几何端口的错误在使用双摆时不会出现。 linearization/LQR期间给出的错误是:
RuntimeError: The geometry query input port (see MultibodyPlant::get_geometry_query_input_port()) of this MultibodyPlant is not connected. Please connect thegeometry query output port of a SceneGraph object (see SceneGraph::get_query_output_port()) to this plants input port in a Diagram.
我认为既然脚本适用于双摆,它也适用于杂技机器人,但我想我似乎可能犯了一个错误。注释掉 LQR 的线条及其在图中的连接会使模拟 运行 具有给定的初始条件,这让我更加困惑。我无法检查图表可视化,因为在我可以 运行 builder.Build()
.
之前出现错误
一个google重现错误的colab笔记本可以看到here。第一部分包含带有错误的 acrobot 脚本,第二部分是双摆的相同脚本,运行 符合预期。
编辑:我试过但没有用的另一种方法:
builder = DiagramBuilder()
scene_graph = builder.AddSystem(SceneGraph())
plant = builder.AddSystem(MultibodyPlant(0.001))
plant.RegisterAsSourceForSceneGraph(scene_graph)
# Load the Acrobot description from URDF file
parser = Parser(plant)
# parser = Parser(plant, scene_graph)
parser.AddModelFromFile("Acrobot.urdf")
# # Reduce/remove gravity
plantGravityField = plant.gravity_field()
plantGravityField.set_gravity_vector([0,0,0])
plant.Finalize()
assert plant.geometry_source_is_registered()
builder.Connect(scene_graph.get_query_output_port(), plant.get_geometry_query_input_port())
builder.Connect(plant.get_geometry_poses_output_port(), scene_graph.get_source_pose_port(plant.get_source_id()))
在这里,我明确地将植物的几何查询输入端口连接到场景图的查询输出端口,但在线性化过程中仍然出现相同的错误。
我的问题的一个解决方案是从 urdf 文件中删除碰撞几何体。使用 Linearize
或 LinearQuadraticRegulator
函数线性化成功。
更新:我现在明白了一点:
Drake 使用 scene_graph 进行碰撞 checking/simulation,因此如果在 urdf 中使用碰撞几何,scene_graph 需要连接到几何查询输入端口以传达有关碰撞的信息到工厂。对于 Linearization/LQR,如果碰撞几何体在 urdf 中,它希望连接此端口进行模拟(自然)。但由于只有植物被传递到 Linearization/LQR 函数,它不知道这一点,因为 scene_graph 不存在。
对于我的用例,在我想 Linearize/control 使用 LQR 的点上没有任何冲突(另外,通常在涉及冲突时使用 LQR 可能不是一个好主意)。因此,由于没有模拟碰撞,我只是删除了 urdf 中用于线性化的碰撞几何部分。我将它们用于其他目的,例如轨迹优化和模拟。
我正在尝试将我为双摆制作的脚本移植到杂技机器人(朝着更欠驱动的方向发展)。在执行此操作时,我看到 LQR 控制器脚本(主要灵感来自欠驱动课程的 this notebook)在 linearization/creating LQR 控制器期间出错。除了单个执行器而不是 2 个执行器的更改外,代码是相同的。
奇怪的是,在Linearization/creating LQR命令中连接几何端口的错误在使用双摆时不会出现。 linearization/LQR期间给出的错误是:
RuntimeError: The geometry query input port (see MultibodyPlant::get_geometry_query_input_port()) of this MultibodyPlant is not connected. Please connect thegeometry query output port of a SceneGraph object (see SceneGraph::get_query_output_port()) to this plants input port in a Diagram.
我认为既然脚本适用于双摆,它也适用于杂技机器人,但我想我似乎可能犯了一个错误。注释掉 LQR 的线条及其在图中的连接会使模拟 运行 具有给定的初始条件,这让我更加困惑。我无法检查图表可视化,因为在我可以 运行 builder.Build()
.
一个google重现错误的colab笔记本可以看到here。第一部分包含带有错误的 acrobot 脚本,第二部分是双摆的相同脚本,运行 符合预期。
编辑:我试过但没有用的另一种方法:
builder = DiagramBuilder()
scene_graph = builder.AddSystem(SceneGraph())
plant = builder.AddSystem(MultibodyPlant(0.001))
plant.RegisterAsSourceForSceneGraph(scene_graph)
# Load the Acrobot description from URDF file
parser = Parser(plant)
# parser = Parser(plant, scene_graph)
parser.AddModelFromFile("Acrobot.urdf")
# # Reduce/remove gravity
plantGravityField = plant.gravity_field()
plantGravityField.set_gravity_vector([0,0,0])
plant.Finalize()
assert plant.geometry_source_is_registered()
builder.Connect(scene_graph.get_query_output_port(), plant.get_geometry_query_input_port())
builder.Connect(plant.get_geometry_poses_output_port(), scene_graph.get_source_pose_port(plant.get_source_id()))
在这里,我明确地将植物的几何查询输入端口连接到场景图的查询输出端口,但在线性化过程中仍然出现相同的错误。
我的问题的一个解决方案是从 urdf 文件中删除碰撞几何体。使用 Linearize
或 LinearQuadraticRegulator
函数线性化成功。
更新:我现在明白了一点:
Drake 使用 scene_graph 进行碰撞 checking/simulation,因此如果在 urdf 中使用碰撞几何,scene_graph 需要连接到几何查询输入端口以传达有关碰撞的信息到工厂。对于 Linearization/LQR,如果碰撞几何体在 urdf 中,它希望连接此端口进行模拟(自然)。但由于只有植物被传递到 Linearization/LQR 函数,它不知道这一点,因为 scene_graph 不存在。
对于我的用例,在我想 Linearize/control 使用 LQR 的点上没有任何冲突(另外,通常在涉及冲突时使用 LQR 可能不是一个好主意)。因此,由于没有模拟碰撞,我只是删除了 urdf 中用于线性化的碰撞几何部分。我将它们用于其他目的,例如轨迹优化和模拟。