Здесь я постараюсь ответить на вопросы по использованию библиотек навигации.
Итак, если Вы желаете управлять моделью, анализируя изображение с видеокамеры, вам понадобиться: радиоуправляемая модель, видеокамера с радиопередатчиком и приёмником, аккумулятор (для видеокамеры), USB TV тюнер (для оцифровки сигнала от видеокамеры) общей стоимостью всего 150$.
Если кто-то не знает, как подключить радиоуправление моделью к компьютеру, тогда вот подробное описание:
Как из дешевого китайского танчика (радиоуправляемая модель) сделать робоплатформу для проекта "Автономная навигация робота"
Программный пакет «Navigator»
Проект состоит из трех частей: драйвер управления роботом, приложение распознавания образов (GUI), и динамической библиотеки «Навигатор». Для компиляции приложения распознавания образов понадобится wxWidgets-2.8.x и OpenCV_1.0. Если у кого-то нет желания разбираться с GUI, то в проекте уже есть скомпилированный EXE-шник распознавателя и вам будет достаточно скомпилировать Navigator.dll, которая содержит алгоритм навигации. Для компиляции Navigator.dll необходима только библиотека OpenCV_1.0. Сборка проекта возможна компилятором Microsoft Visual C++ 6.0 (папка vc6.prj) и компилятором Microsoft Visual Studio 2008 (папка vc9.prj).
После инсталляции (и компиляции) библиотек wxWidgets-2.8.x и OpenCV_1.0 необходимо указать дополнительные папки для компилятора:
Options/Directories/Include files:
<Install_Dir>\OPENCV\CV\INCLUDE
<Install_Dir>\OPENCV\CVAUX\INCLUDE
<Install_Dir>\OPENCV\CXCORE\INCLUDE
<Install_Dir>\OPENCV\OTHERLIBS\HIGHGUI
<Install_Dir>\OPENCV\OTHERLIBS\CVCAM\INCLUDE
<Install_Dir>\WXWIDGETS-2.8.10\LIB
<Install_Dir>\WXWIDGETS-2.8.10\LIB\VC_LIB\MSW
<Install_Dir>\WXWIDGETS-2.8.10\LIB\VC_LIB\MSWD
<Install_Dir>\WXWIDGETS-2.8.10\INCLUDE
<Install_Dir>\WXWIDGETS-2.8.10\INCLUDE\MSVC
Options/Directories/Library files:
<Install_Dir>\OPENCV\LIB
<Install_Dir>\WXWIDGETS-2.8.10\LIB
<Install_Dir>\WXWIDGETS-2.8.10\LIB\VC_LIB
Исходные тексты «Навигатора» можно скачать здесь:
http://edv-detail.narod.ru/Navigator_src.zip
Программный пакет «Navigator Tool Kit»
Состав (на 21.09.09):
Navigator_Tool_Kit\samples\LocationTree - пример нахождения траектории движения по визуальным ориентирам;
Navigator_Tool_Kit\samples\LocationSearching - пример определения текущего местоположения по контрастным «пятнам»;
Navigator_Tool_Kit\samples\BeaconsTest - пример использования AVM для поиска и прослеживания естественных маяков;
Navigator_Tool_Kit\samples\RcgExample - пример использования AVM для распознавания образов;
Navigator_Tool_Kit\samples\IdString - пример использования шаблонов «строк идентификаторов» из модуля «ListInterface.h».
Пакет «Navigator Tool Kit» можно скачать здесь:
http://edv-detail.narod.ru/Navigator_Tool_Kit.zip
Всё что касается программных пакетов «Navigator» и «Navigator Tool Kit» представлено исходными текстами программ, с примерами, и подробными комментариями на русском языке.
Исключением является только «закрытая» технология AVM, которая представлена в бинарном виде (библиотека). Но для любителей развивать свои собственные алгоритмы распознавания я предоставляю альтернативный «распознаватель образов» в исходниках.
Алгоритм «Классификации контрастных пятен»:
Navigator_Tool_Kit\include\ImageIdentification.h
Пример:
http://edv-detail.narod.ru/Navigator_Tool_Kit.zip
Navigator_Tool_Kit\samples\LocationSearching
====- 01.10.2009 -===
Для компиляции исходных текстов можно использовать "MS Visual C++ 2008 Express Edition" (я подправил "Navigator_src.zip" так что уже всё компилируется).
Для начала инсталляции, нужно внизу найти "Visual C++ 2008 Express Edition", (выбрать язык Русский по желанию) и нажать Download. Скачается инсталлятор на пару метров, который продолжит инсталляцию через инет (вытянет еще около ~50-70m). Все это официальное и бесплатное.
====- 21.10.2009 -===
Для тех, кто пожелает подключиться к экспериментам по навигации, решил написать небольшую инструкцию по переделки драйвера «Navigator\src\RobotController»:
Всё просто: приложение Recognition.exe взаимодействует с «драйвером робота» через общий участок памяти (gpKeyArray). Всё что нужно сделать - это по таймеру (метод CMainWnd::OnTimer) отправлять команды из «gpKeyArray» вашему роботу.
- Код: Выделить всё • Развернуть
// Коды команд робота
enum {
cmLEFT = 0, // Влево
cmBACKWARDS, // Назад
cmFORWARD, // Вперёд
cmRIGHT, // Вправо
cmTURRET_RIGHT, // Башня вправо
cmFIRE, // Залп
cmTURRET_LEFT, // Башня влево
cmPOWER // Включить/выключить питание
};
При запуске режима навигации передается цепочка команд на включение робота (cmFIRE, cmPOWER), соответственно при отключении режима навигации команда на отключение (cmPOWER).
Ну и самое главное: команды cmLEFT и cmRIGHT не должны сами по себе вызывать повороты корпуса робота а только в сочетании с командами «вперёд», «назад» (cmFORWARD, cmBACKWARDS).
Приложение Recognition.exe после старта устанавливает разрешение камеры 640x480, так что перед стартом режима навигации нужно переключить разрешение на 320x240 (главное меню: Настройки \ Формат захвата изображения). Ещё необходимо скачать архив Go.zip распечатать «Иди сюда.doc», и загрузить «Go.dat» и теперь можно включать режим навигации.
В общем последовательность такая:
1) стартуем Recognition.exe;
2) загружаем «Go.dat» (главное меню: Распознавание \ Загрузить данные с диска);
3) устанавливаем разрешение 320x240 (главное меню: Настройки \ Формат захвата изображения);
4) включаем запись демонстрационного ролика (по желанию, главное меню: Распознавание \ Записать демонстрацию в AVI файл);
5) ну и наконец, запуск режима навигации (главное меню: Распознавание \ Режим навигации);
6) дальше показываем маркер «Иди сюда» в кадре, и следим за управлением (индикатор команд в левом нижнем углу).
Пример модифицированного драйвера управления роботом: RobotController_s1.zip
В COM порт каждые 50ms посылается массив из восьми байт, индицирующий текущее состояние команд роботу:
- Код: Выделить всё • Развернуть
// Обработчик таймера
void CMainWnd::OnTimer(wxTimerEvent& WXUNUSED(event))
{
// Коды команд робота
enum {
cmLEFT = 0, // Влево
cmBACKWARDS, // Назад
cmFORWARD, // Вперёд
cmRIGHT, // Вправо
cmTURRET_RIGHT, // Башня вправо
cmFIRE, // Залп
cmTURRET_LEFT, // Башня влево
cmPOWER // Включить/выключить питание
};
/*
for(int i=0; i<cKeyTotal; i++) {
if(gpKeyArray->Key[i]) {
switch(i) {
case cmFORWARD:
break;
case cmBACKWARDS:
break;
case cmTURRET_LEFT:
break;
case cmTURRET_RIGHT:
break;
case cmFIRE:
break;
case cmPOWER:
break;
}
}
}
*/
// Послать массив нажатых кнопок в COM порт
CP_WriteCOMPort(mhCOMPort, gpKeyArray->Key, sizeof(TKeyArray));
mpIndicator->SetKeyArray(gpKeyArray);
}
====- 22.10.2009 -===
При записи демонстрационного ролика, видео кодируется кодеком "XviD". Если этот кодек у вас не установлен, скачать пакет с кодаками можно здесь:
K-Lite Codec Pack Full 5.2.0
====- 07.12.2009 -===
Навигация из пункта «А» в пункт «Б» по визуальным ориентирам
Для навигации сначала указываются визуальные ориентиры «ворота», которые показывают, в каком направлении должен двигаться робот. Перед началом заезда, пользователю необходимо вдоль всей трассы расставить ворота, по которым робот будет продвигаться к конечному пункту назначения - цели. В качестве цели может быть использован любой образ, на который ранее был обучен «Навигатор».
Я обновил пакет «Навигатор»:
Что бы расставить «ворота» выберите из главного меню: «Распознавание/Режим установки ворот». Далее управляя роботом клавишами «вперёд», «назад», «влево», «вправо» и нажимая кнопку «Поставить ворота» расставляем визуальные ориентиры для продвижения робота. Для создания цели, необходимо выполнить обучение (пункт меню «Распознавание/Изучить объект») хотя бы на один объект, которые и будет конечной целью навигации.
====- 05.01.2010 -===
Навигация по контрольным точкам (checkpoints)
Итак, что показано в ролике
Устанавливаем робота в контрольной точке №2 и даём указание следовать в точку №1. Робот начинает осматриваться по сторонам, и когда видит ворота, которые соответствуют маршруту №1, начинает двигаться по коридору из «ворот» до контрольной точки №1. В контрольной точке №1 робот останавливается. Тогда роботу даётся указание следовать в контрольную точку №2, робот опять начинает осматриваться, находит ворота соответствующие маршруту №2 и возвращается обратно в точку №2.
Процедура обучения на маршрут
Для обучения необходимо в режиме установки ворот выбрать маршрут, на который будет обучаться робот и медленно (местами катаясь назад - вперёд), управляя роботом вручную, показать маршрут (ворота устанавливаются автоматически). В конце маршрута необходимо нажать на кнопку «контрольная точка» и робот, вращаясь несколько раз на одном месте, пометит текущее местоположение как контрольную точку.
Обновил программный пакет «Навигатор», так что если кому интересно, можете сами попробовать:
http://edv-detail.narod.ru/Navigator_src.zip
=======================================================================================================
=======================================================================================================
=======================================================================================================