Хотя я согласен с тем, что сообщение об ошибке немного глупо, я подозреваю, что проблема реальная ... Готов поспорить, что вы моделируете систему, которая имеет динамику контактов (возможно, случайно), а LQR не знает, какиметь дело с негладкой механикой.
Когда вы передаете System<double>
методу LQR, он преобразует его в ToAutoDiffXd()
, а затем оценивает динамику (чтобы получить линеаризацию).Вот почему ошибка составляет около MultibodyPlant<AutoDiffXd>
(не double
).Для вашей системы динамика требует вызова механизма столкновений, который не полностью дифференцируем (пока), чтобы выдавалось сообщение об ошибке.
Установка time_step=0
изменения от модели с пошаговым переходом на непрерывное времямоделирует и действительно меняет взаимодействие с двигателем столкновения.Поэтому возможно, что это может помочь в некоторых случаях.
Но решение, я думаю, состоит в том, чтобы решить, включаете ли вы элементы столкновения только случайно (через SDF) - например, вы на самом деле не пытаетесьреализовать физику.Если да, попробуйте закомментировать их в вашем SDF, чтобы обойти это.Возможно, мы могли бы / должны предложить некоторые опции, которые облегчат LQR игнорировать их.
ОБНОВЛЕНИЕ: я открыл https://github.com/RobotLocomotion/drake/issues/11120, чтобы сделать это немного лучше.