Санкт-Петербургский государственный университет
Опубликован: 14.07.2013 | Доступ: свободный | Студентов: 509 / 178 | Длительность: 06:03:00
Специальности: Программист
Самостоятельная работа 4:

Разработка приложения по управлению мобильным роботом

< Лекция 4 || Самостоятельная работа 4 || Лекция 5 >
Аннотация: Разработка примеров программ для мобльного робота на примере nxtOSEK C/C++ API.

8.4.1. Цель лабораторной работы

Научиться использовать ОСРВ nxtOSEK для управления автономным движущимся устройством (роботом). Целью работы также является сравнения результов различных математических алгоритмов для одной и той же задачи.

8.4.2. Инструкция по выполнению лабораторной работы

8.4.1. Подготовка

Для выполнения данной лабороторной работы потребуются инструменты, установка которых была проведена в предыдущей лабораторной.

8.4.2. Выполнение работы

Решим следующую задачу: имея автономное движущееся устройство с ультрозвуковым сенсором, написать программу для его движения вдоль стенки. За основу будующей программы возьмем пример, использованный в самостоятельной работе предыдущей лабораторной работы - sonartest.

Откройте c-файл, который находится в ../cygwin/nxtOSEK/samples_C/sonartest. Все изменения необходимо делать в блоке

TASK(Task1)
{
}

Для начала сделаем движение вдоль стены, используя релейный регулятор, псевдокод которого выглядет так:

Если S1 < L // L - заданное расстояние
    // S1 - значение с датчика
{        
  R_MOTOR = 0;
  L_MOTOR = Speed;
}
Иначе 
{
  R_MOTOR = Speed;
  L_MOTOR = 0;
}

Для реализации данной программы потребуются знание только двух функций ecrobot_get_sonar_sensor(номер_порта_датчика) и ecrobot_set_motor_speed(номер_порта_мотора, скорость).

В верхней части программы уже прописано определение порта для датчика (при желании можно заменить на собственный S1-S4).

#define PORT_IN_USE NXT_PORT_S4

Добавим сюда еще определение портов для моторов:

#define L_MOTOR NXT_PORT_A
#define R_MOTOR NXT_PORT_C

Теперь напишем само тело задачи:

if (ecrobot_get_sonar_sensor(PORT_IN_USE) < 50) 
{        
  ecrobot_set_motor_speed(R_MOTOR,0);
ecrobot_set_motor_speed(R_MOTOR,100);
}
else 
{
  ecrobot_set_motor_speed(R_MOTOR,0);
ecrobot_set_motor_speed(R_MOTOR,100);
}

Теперь собираем и заливаем программу на устройство. Датчик на устройстве должен быть подключен к порту 4 и устанавлен на левом боку (причем не под прямым углом, а где-то 45 градусов). Моторы должны быть подключены к портам A и С, левый и правый соответствено. После запуска программы, робот должен двигаться вдоль стены.

Недостатки данного алгоритма заметны уже после первого запуска: робот дергается, а иногда вовсе уходит от стенки.

На замену предложенному выше алгоритму приходит П-регулятор, псевдокод которого:

U = K*(S1 - L) // регулятор
        // L - заданное расстояние
     // S1 - считанное значение с               // датчика расстояния
     // K - пропорциональный коэффициент
R_MOTOR = Speed - U;
L_MOTOR = Speed + U;

Давайте вернемся с небес на землю - датчики не точны. Перед конечным запуском требуется каллибровка. Коэффициент K может принимать значения от 2 до 20 включительно.

Используя предложенный алгоритм, напишите и запустите программу для автономного движущегося устройства.

8.4.3. Задания для самостоятельной работы

Напишите и протестируйте программу, используя ПД регулятор:

U = K1*(S1 - L) + K2*(S1-SensorOld)
// SensorOld - предыдущее значение датчик

Сравните полученные алгоритмы.

< Лекция 4 || Самостоятельная работа 4 || Лекция 5 >