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