Прежде всего, нам нужно установить, как работает ваша программа.
Выполняет ли он одну команду, ждет, затем выполняет следующую команду? Или он выполняет команды одновременно? (например, двигаться и делать что-то еще)
Я предполагаю, что вы захотите, чтобы он выполнял команды последовательно, а не какие-то сложные потоки, которые ваша двигательная система может не поддерживать.
Чтобы заставить вашего робота двигаться медленно, я бы предложил создать метод Move(), который принимает параметр, количество времени, которое вы хотите, чтобы он двигался, например:
public void Move(int numberOfSeconds)
{
while (numberOfSeconds > 0)
{
myRobot.MotorOn();
Thread.Sleep(2000);
myRobot.MotorOff();
Thread.Sleep(500);
numberOfSeconds -= 2;
}
}
Это не точно, но это один из способов сделать это.
Если вы затем вызовете, например, Move(10), ваш робот будет двигаться в течение 10 секунд и останавливаться каждые 2 секунды на полсекунды.
Что касается ваших вопросов по ходу программы, вы можете думать об этом как о списке инструкций:
ДВИГАТЬСЯ ВПЕРЕД СТОП ПРОВЕРИТЬ ОБЪЕКТ ПОВЕРНУТЬ, ЧТОБЫ НАВЕЛИЧИТЬСЯ НА ОБЪЕКТ ДВИГАТЬСЯ ВПЕРЕД СТОП
и т. д.
Таким образом, в вашем основном цикле управления программой, предполагая, что вызовы синхронны (т.е. ваша программа останавливается во время выполнения команды, как в приведенном выше методе Move), вы можете просто иметь набор операторов IF (или переключатель)
public void Main()
{
// What calculations should the robot do?
If (someCalculations == someValue)
{
// Rotate the robot to face the object
robot.RotateRight(10);
}
else if (someOtherCalculation == someValue)
{
// We are on course, so move forward
Move(10);
}
}
Это может помочь вам начать.
Однако, если ваш робот асинхронный, то есть код продолжает работать, пока робот что-то делает (например, вы постоянно получаете обратную связь от датчиков движения), вам придется структурировать свою программу по-другому. Метод Move() может по-прежнему работать, но поток вашей программы должен немного отличаться. Вы можете использовать переменную для отслеживания состояния:
public enum RobotStates
{
Searching,
Waiting,
Hunting,
Busy,
}
Затем в вашем основном цикле вы можете проверить состояние:
if (myRobotState != RobotStates.Busy)
{
// Do something
}
Не забудьте изменить состояние, когда ваши действия завершены.
Вполне возможно, что вам придется использовать многопоточность для асинхронного решения, поэтому ваш метод, который получает обратную связь от вашего датчика, не застревает в ожидании движения робота, а может продолжать опрос. Тем не менее, потоки выходят за рамки этого ответа, но существует множество ресурсов.
person
NibblyPig
schedule
10.05.2010