最终完成后为身体增加力量了吗?

时间:2019-07-10 19:38:24

标签: drake

我正在建立一个简单的模拟,我希望一个物体(一个盒子)在重力场中下落半秒,然后由于克服了重力的作用力而上升。

我尝试使用AddInForceAddInForceInWorldAddForceElement这三种方法来实现这种力量。由于在运行模拟时调用此方法,因此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 个答案:

答案 0 :(得分:2)

@Joaquin Giraldo,

向模型添加外力的方法是输入力。 Drake中的所有内容都是输入/输出端口。在这种情况下,您必须使用this.document.status。 有关如何执行此操作的示例,请参见文件MultibodyPlant::get_applied_spatial_force_input_port()

答案 1 :(得分:1)

快速说明:您需要的是一直存在的力元素,但会根据时间改变其力输出。内置的代码都不会有这种行为,因此您必须编写一个。