Детектирование объектов
Детектирование объектов позволяет роботу обнаруживать объекты на своём пути и предпринимать какие-либо действия, например, такие как уклонение от объекта. Мы выбрали термин признак (feature) чтоб описывать любой объект, а не только препятствие, потому что иногда "объект" - это нечто, что робот наоборот ищет, а не избегает (как, например, в случае с футбольным мячом). Мы не использовали слово "объект" потому что это могло внести путаницу термином "объект" в смысле объектно-ориентированного программирования.
Детекторы признаков
Класс FeatureDetector умеет детектировать объекты используя сенсоры, такие как сенсор прикосновения или ультразвуковой сенсор. Он является основным интерфейсом в пакете "object detection" из которого происходят все данные.
Есть очень много плюсов от использования класса FeatureDetector
- Автоматическое сканирование и предоставление результатов
- Интерфейс слушателя(listener interface) для разделения кода реакции робота от кода анализирующего произведённое воздействие ( в оригинале to segregate the "action-response" code)
- Позволяет одному участку кода отвечать на данные от разных сенсоров.
В настоящее время есть две реализации детектора признаков:
- RangeFeatureDetector - использует классы RangeFinder, такие как ультразвуковой сенсор LEGO.
- TouchFeatureDetector - использует классы Touch, такие как сенсор прикосновения LEGO.
Класс RangeFeatureDetector позволяет вам указать некоторые параметры для сенсора, такие как:
максимальный диапазон значений признака, в котором вы пытаетесь продетектировать этот признак и время между сканированиями.
Сконструируйте простой RangeFeatureDetector следующим образом:
int MAX_DISTANCE = 50; // In centimeters
int PERIOD = 500; // In milliseconds
UltrasonicSensor us = new UltrasonicSensor(SensorPort.S4);
FeatureDetector fd = new RangeFeatureDetector(us, MAX_DISTANCE, PERIOD);
Как только вы создали экземпляр класса FeatureDetector, вы можете начать сканирование и получение данных:
Feature result = fd.scan();
if(result != null)
System.out.println("Range: " + result.getRangeReading().getRange());
Внимание: Убедитесь, что возвращённый объект не null перед тем как пытаться считывать данные с возвращённого экземпляра класса Feature, иначе ваш код выбросит исключение из-за ошибочного нулевого указателя.
Основное преимущество использования класса FeatureDeteector - возможность автоматически уведомлять другие классы, когда происходит детектирование объекта через интерфейс listener. Следующий раздел содержит более детальные пояснения.
Feature Listeners
Как только вы создали экземпляр класса FeatureDetector, вы можете добавить к нему FeatureListener. Класс FeatureListener
будет уведомлён через метод FetureListener.featureDetected() как только будет обнаружен объект. Таким образом,
вы можете заставить вашего робота реагировать на обнаруженные объекты выполнением определённых действий. Следующий код покажет, как можно использовать FeatureListener:
import lejos.nxt.*;
import lejos.robotics.objectdetection.*;
public class ObjectDetect implements FeatureListener {
public static int MAX_DETECT = 80;
public static void main(String[] args) throws Exception {
ObjectDetect listener = new ObjectDetect();
UltrasonicSensor us = new UltrasonicSensor(SensorPort.S4);
RangeFeatureDetector fd = new RangeFeatureDetector(us, MAX_DETECT, 500);
fd.addListener(listener);
Button.ENTER.waitForPressAndRelease();
}
public void featureDetected(Feature feature, FeatureDetector detector) {
int range = (int)feature.getRangeReading().getRange();
Sound.playTone(1200 - (range * 10), 100);
System.out.println("Range:" + range);
}
}
Feature data
Самый главный класс, реализующий интерфейс Feature это класс RangeFeature. Этот класс является
контейнером данных, данные извлекаются из него с помощью таких методов:
- getRangeReading() - возвращает объект RangeReading
- getRangeReadings() - возвращает коллекцию RangeReadings
- getTimeStamp() - возвращает системное время (в мс), когда данные были собраны
Некоторые сканеры могут детектировать несколько объектов (как например, ультразвуковой сенсор LEGO).
Другие сенсоры могут детектировать только один объект.
В любом случае, и те и другие способны производить данные, при выполнении двух следующих методов:
Единичное считывание
Когда вызывается метод getRangeReading(), он возвращает ближайший продетектированный сканером объект, даже если он способен обнаружить несколько объектов за один раз.
Множественно считывание
Когда вызывается метод getRangeReadings(), он возвращает все продетектированные объекты. Если сканер способен вернуть только один, объект RangeReadings будет содержать только один результат RangeReading.
Детекторы множественных признаков
Возможно комбинировать несколько разных FeatureDetectors в один FeatureDetector
используя класс FusorDetector. Это полезно для роботов, у которых много сенсоров, находящихся на роботе (например, несколько бамперов в разных местах каждый со своим сенсором). Код для слияния нескольких FeatureDetectors выглядит так:
UltrasonicSensor us = new UltrasonicSensor(SensorPort.S4);
FeatureDetector detector1 = new RangeFeatureDetector(us, MAX_DETECT,RANGE_READING_DELAY);
Touch leftBump = new TouchSensor(SensorPort.S2);
FeatureDetector detector2 = new TouchFeatureDetector(leftBump, 10, TOUCH_Y_OFFSET);
Touch rightBump = new TouchSensor(SensorPort.S3);
FeatureDetector detector3 = new TouchFeatureDetector(rightBump, -10, TOUCH_Y_OFFSET);
FusorDetector fusion = new FusorDetector();
fusion.addDetector(detector1);
fusion.addDetector(detector2);
fusion.addDetector(detector3);
fusion.addListener(myFeatureListener);
Наверх страницы
|