Sphero:如何让它移动一定长度

时间:2013-05-20 12:13:42

标签: distance sphero-api

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

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中找到对输入做什么,以便距离变得正确吗?

1 个答案:

答案 0 :(得分:6)

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

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

  1. 启用数据流并请求定位器位置数据。你现在应该有一些回调给你Sphero位置〜每秒20次。位置是地板上的(x,y)坐标,单位为厘米。
  2. 记录球的起始位置(x0,y0)。
  3. 在每个时间点,使用毕达哥拉斯定理/距离公式计算球到目前为止的距离。
  4. 用这个来计算球离开的距离。称这个距离为D。
  5. 发出滚动命令,其中速度从D。
  6. 计算

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

    1. 如果剩余距离D> 100厘米,指挥全速。
    2. 在D = 10cm和D = 100cm之间,指令功率范围从30%到100%(线性)。
    3. 如果D< 10厘米,命令零速度使Sphero停止。
    4. 这很好用。它会开车,减速,并在最后几英寸处停下来。该算法存在的问题包括:

      1. 您必须对其进行调整以防止过冲/下冲。
      2. 当你想让球只移动很短的距离时它不能正常工作,所以你可能需要调整它来覆盖这些情况。
      3. 祝你好运!