«Этот метод поддерживает только T = double» при создании LQR для MultibodyPlant <double> - PullRequest
1 голос
/ 01 апреля 2019

Я создаю контроллер LQR с кодом ниже:

systems::controllers::LinearQuadraticRegulator(
            plant, context, Q, R,
            Eigen::Matrix<double, 0, 0>::Zero() /* No cross state/control costs */,
            actuation_port_index); 
  • plant является ссылкой типа MultibodyPlant<double>
  • context является ссылкойтип Context<double>
  • Q относится к типу Eigen::Matrix<double, 6, 6>
  • R относится к типу Vector1d

Отладка с помощью GDB показывает, что ошибкаисходит от multibody_plant.cc

MultibodyPlant<T>::CalcPointPairPenetrations

Я не уверен, почему он не использует MultibodyPlant<double>::CalcPointPairPenetrations

В случае, если это имеет значение, мой объект plant был загружен из файла sdfсо следующими строками

    auto pair = AddMultibodyPlantSceneGraph(&builder, std::make_unique<MultibodyPlant<double>>(FLAGS_time_step));

    MultibodyPlant<double>& plant = pair.plant;

    const std::string model_filename = getSrcDir() + "/../res/plant.sdf";
    Parser(&plant, &scene_graph).AddModelFromFile(model_filename);

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Хотя я согласен с тем, что сообщение об ошибке немного глупо, я подозреваю, что проблема реальная ... Готов поспорить, что вы моделируете систему, которая имеет динамику контактов (возможно, случайно), а LQR не знает, какиметь дело с негладкой механикой.

Когда вы передаете System<double> методу LQR, он преобразует его в ToAutoDiffXd(), а затем оценивает динамику (чтобы получить линеаризацию).Вот почему ошибка составляет около MultibodyPlant<AutoDiffXd> (не double).Для вашей системы динамика требует вызова механизма столкновений, который не полностью дифференцируем (пока), чтобы выдавалось сообщение об ошибке.

Установка time_step=0 изменения от модели с пошаговым переходом на непрерывное времямоделирует и действительно меняет взаимодействие с двигателем столкновения.Поэтому возможно, что это может помочь в некоторых случаях.

Но решение, я думаю, состоит в том, чтобы решить, включаете ли вы элементы столкновения только случайно (через SDF) - например, вы на самом деле не пытаетесьреализовать физику.Если да, попробуйте закомментировать их в вашем SDF, чтобы обойти это.Возможно, мы могли бы / должны предложить некоторые опции, которые облегчат LQR игнорировать их.

ОБНОВЛЕНИЕ: я открыл https://github.com/RobotLocomotion/drake/issues/11120, чтобы сделать это немного лучше.

0 голосов
/ 01 апреля 2019

У меня такое же поведение, когда FLAGS_time_step больше нуля.

Установка FLAGS_time_step на 0.0 решает проблему для меня.

Думаю, это похоже на ошибку.

...