3

我想让球体向前移动给定的厘米数,但到目前为止我还没有设法让任何东西正常工作这是我现在拥有的代码:

EditText distanceText = (EditText) findViewById(R.id.distanceText);
int inputMSec = Integer.parseInt(distanceText.getText().toString());
int time = (inputMSec - inputMSec/2);

    // The ball is given the RollCommand at half speed.
    RollCommand.sendCommand(mRobot, heading,0.5f);

    // A handler is created to delay the Stop command.
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable(){

        @Override
        public void run() {
            // Makes the ball stop
            RollCommand.sendStop(mRobot);
        }
        // The variable 'time' defines how long the ball rolls until it is told to stop.
    }, time);

我可以向球发送任何其他命令而不是 RollCommand 吗?或者任何人都可以找出如何处理来自 EditText 的输入以使距离正确吗?

4

1 回答 1

6

没有 API 命令可以直接提供驱动给定距离的能力。我现在唯一的方法是使用定位器的迭代策略,它提供有关球的位置信息。

以下是该策略的概述。如果您需要更多详细信息,请告诉我。

  1. 打开数据流并请求定位器位置数据。您现在应该有一些回调,为您提供 Sphero 位置约 20x 秒。位置是地板上的 (x, y) 坐标,以厘米为单位。
  2. 记录小球的起始位置 (x0, y0)。
  3. 在每个时间点,使用勾股定理/距离公式计算球到目前为止已经行进的距离。
  4. 用它来计算球还剩多远。将此距离称为 D。
  5. 给出一个滚动命令,其中速度由 D 计算。

最大的问题是:你如何根据 D 决定命令的速度?我用这样的策略取得了一些成功:(毫无疑问,你可以更好地调整它)。

  1. 如果剩余距离 D > 100cm,则命令全速。
  2. 在 D = 10cm 和 D = 100cm 之间,命令功率范围从 30% 到 100%(线性)。
  3. 如果 D < 10cm,命令零速使 Sphero 停止。

这工作得很好。它会开车,减速,然后在最后几英寸处停下来。该算法的问题包括:

  1. 您必须对其进行调整以防止过冲/下冲。
  2. 当您想命令球仅移动很短的距离时,它效果不佳,因此您可能必须对其进行调整以涵盖这些情况。

祝你好运!

于 2013-05-22T13:35:54.097 回答