Добавлять силы в тело после финализации? - PullRequest
1 голос
/ 10 июля 2019

Я настраиваю простую симуляцию, в которой я хочу, чтобы тело (коробка) падало в поле силы тяжести на полсекунды, а затем поднималось из-за силы, прилагаемой к нему, которая преодолевала гравитацию.

Я пытался реализовать эту силу, используя три метода, используя AddInForce, AddInForceInWorld и AddForceElement.Поскольку это вызывается во время симуляции, AddForceElement выдало ошибку, как и ожидалось.С остальными двумя, однако, не было выдано никаких ошибок или предупреждений, но на коробке явно нет новой силы, действующей на нее.

Я проверил на новый элемент силы тоже с num_force_elements(), но нет

Вот мой цикл для синхронизации этого события:

    while( current_time < FLAGS_duration && !terminate){
        if (current_time > 0.5 && !forced) {

            std::cout << "\nAdding Force of type " << FLAGS_box_f << " at 0.5 seconds...\n";

            // Add Rising Force to box
            auto forces = drake::multibody::MultibodyForces<double>(plant);
            drake::multibody::SpatialForce<double> forceup(Vector3d::Zero(), Vector3d(0, 0, 100));

            if (FLAGS_box_f == "spring") {
                plant.AddForceElement<LinearSpringDamper>(
                    plant.GetBodyByName("Box"), Vector3d::Zero(),
                    plant.world_body(), Vector3d(0, 0, 1),
                    0., 10., 1.);

            } else if (FLAGS_box_f == "world") {
                plant.GetBodyByName("Box").AddInForceInWorld(
                    plant_context,
                    forceup,
                    &forces);

            } else {
                plant.GetBodyByName("Box").AddInForce(
                    plant_context,
                    Vector3d::Zero(),
                    forceup,
                    plant.GetBodyByName("Box").body_frame(),
                    &forces);
            }

            plant.CalcForceElementsContribution(plant_context, &forces);
            std::cout << "Plant: " << plant.num_force_elements() << " force_elements\n";
            forced = true;
        }

        simulator.StepTo(current_time + time_delta);
        current_time = simulator_context.get_time();
    }

Я не уверен, правильно ли я выполняю движения, и также все еще не понимаю оченьну, объект MultibodyForces, в котором я храню силы в вызовах.

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

@ Хоакин Хиральдо,

Способ добавить внешние силы к вашей модели с помощью входной силы.Все в Drake являются портами ввода / вывода.В этом случае вы должны использовать MultibodyPlant::get_applied_spatial_force_input_port().В файле multibody/plant/test/externally_applied_spatial_force_test.cc приведен пример того, как это сделать.

1 голос
/ 11 июля 2019

Краткое примечание: вам нужен элемент силы, который присутствует всегда , но его выходная мощность изменяется в зависимости от времени.Ни один из встроенных не ведет себя так, поэтому вам придется написать один.

...