Я реализую симуляцию двухзвенного акробота с использованием pydrake и хотел бы установить ограничения на соединения, чтобы предотвратить столкновение нижней ссылки с верхней. Я добавил совместные ограничения в URDF и анализирую этот URDF для создания объекта acrobot multibodyplant. Я использовал функции для успешной проверки того, что совместный предел анализируется (position_lower_limits (), position_upper_limits ()), но моя симуляция не реагирует на эти ограничения. Я бы очень признателен за помощь в определении, почему это может быть.
Я создаю и моделирую многотельную установку acrobot следующим образом:
plt_is_interactive = SetupMatplotlibBackend()
builder = DiagramBuilder()
# instantiate the pendulum and the scene graph
double_pendulum, scene_graph = AddMultibodyPlantSceneGraph(
builder,
time_step=0.01 # discrete update period
)
# parse the urdf
urdf_path = 'double_pendulum_no_shoulder.urdf'
Parser(double_pendulum).AddModelFromFile(urdf_path)
double_pendulum.Finalize()
#Simulation Set-Up
# Set the constant torque
torque_system = builder.AddSystem(ConstantVectorSource([[0.]]))
builder.Connect(torque_system.get_output_port(0), double_pendulum.get_input_port(3))
visualizer = builder.AddSystem(
PlanarSceneGraphVisualizer(scene_graph, xlim=[-10., 10.], ylim=[-10., 10.], show=plt_is_interactive))
builder.Connect(scene_graph.get_pose_bundle_output_port(),
visualizer.get_input_port(0))
diagram = builder.Build()
simulator = Simulator(diagram)
context = simulator.get_mutable_context()
plant_context = diagram.GetMutableSubsystemContext(double_pendulum, context)
double_pendulum.SetPositionsAndVelocities(plant_context, [2, 0, 0, 0])
# Simulate
duration = 10.0 if get_ipython() else 0.1 # sets a shorter duration during testing
context.SetTime(0.0)
AdvanceToAndVisualize(simulator, visualizer, duration)
и мой URDF содержит следующую строку в связанном суставе, чтобы попытаться обеспечить соблюдение совместных ограничений.
<limit lower="-2.35" upper="2.35"/>