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

Chr*_*sen 3 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);
Run Code Online (Sandbox Code Playgroud)

有没有其他命令我可以发送到球而不是RollCommand?或者任何人都可以从EditText中找到对输入做什么,以便距离变得正确?

Fiz*_*zzy 6

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

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

  1. 打开数据流并请求定位器位置数据.你现在应该有一些回调给你Sphero位置〜每秒20次.位置是地板上的(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. 当你想命令球只移动很短的距离时它不能正常工作,所以你可能不得不调整它来覆盖这些情况.

祝好运!