2013-05-20 1 views
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, чтобы расстояние оказалось правильным?

ответ

6

Нет команды API, которая напрямую обеспечивает возможность управлять данным расстоянием. Единственный способ, которым я теперь располагаю, с итеративной стратегией, использующей локатор, который предоставляет информацию о положении мяча.

Вот краткий обзор стратегии. Дайте мне знать, если вам нужно больше деталей.

  1. Включите передачу данных и запросите данные о местоположении локатора. Теперь у вас должен быть обратный вызов, дающий вам положение Sphero ~ 20x в секунду. Положения представляют собой (x, y) координаты на полу в сантиметрах.
  2. Запишите исходное положение шарика (x0, y0).
  3. В каждый момент времени вычислите расстояние, пройденное шаром до сих пор, используя формулу Пифагора/формулу расстояния.
  4. Используйте это, чтобы выяснить, как далеко мяч ушел. Вызов это расстояние D.
  5. Дайте команду рулонной где скорость вычисляется из D.

Большой вопрос: как вы решаете, какую скорость команды на основе D? У меня был некоторый успех со стратегией, что-то вроде этого: (несомненно, вы можете настроить его намного лучше).

  1. Если оставшееся расстояние D> 100 см, выполните команду полной скорости.
  2. Между D = 10 см и D = 100 см, мощность команды от 30% до 100% (линейно).
  3. Если D < 10 см, введите нулевую скорость, чтобы остановить Sphero.

Это работало очень хорошо. Он будет двигаться, замедляться и преодолевать последние несколько дюймов до остановки. Проблемы с этим алгоритмом включают в себя:

  1. Вы должны настроить его, чтобы предотвратить превышение/недокус.
  2. Если вы хотите, чтобы мяч двигался только на очень короткое расстояние, он не работает хорошо, поэтому вам, возможно, придется настроить его, чтобы покрыть эти случаи.

Удачи вам!