Добрый день, уважаемые хабравчане!
Что же такое LabView и с чем его едят?
LabView – кросплатформенная графическая среда разработки фирмы National Instruments. LabView широко используется в системах сбора данных, а так же для управления техническими объектами и технологическими процессами.
Отличительной особенностью LabView является «заточенность» среды для разработки под «железо». Большое количество библиотек, разработанных для взаимодействия с оборудованием различных производителей, позволяет очень быстро и комфортно прототипировать решения различных задач, в том числе для управлениям роботами и системами машинного зрения. Помимо официального LabVIEW Robotics Module, предлагаемым National Instruments, и содержащим библиотеки для взаимодействия с различными робототехническими компонентами, энтузиасты сами разрабатывают большое количество библиотек и, что самое ценное, распространяют их бесплатно. На сегодняшний день можно увидеть большое количество решений в робототехнике с иcпользованием LabView – в нашей стране одним из самых ярких за последнее время — Автономный робот команды НАМТ на «Робокросс-2013» и «Eurathlon 2013».
С чего все началось.
Я являюсь выпускником МГТУ им. Н.Э.Баумана и увлекаюсь робототехникой, хотя основным направлением моей деятельности является промышленная автоматизация. Познакомившись с LabView несколько лет назад, я влюбился в эту среду, и с тех пор пытаюсь использовать ее везде, где только можно. В настоящее время, помимо использования LabView в различных проектах, я занимаюсь проведением факультативных занятий и лабораторных работ для студентов, связанных с применением LabView в системах сбора данных. С недавнего времени, благодаря нашему роботоцентру, мне удалось получать робототехнические наборы для использования их в различных научных целях. В связи с этим, я бы хотел опубликовать цикл работ, связанных с использованием LabView в робототехнике, причем основной упор будет делаться на реализации простейших примеров, для дальнейшего использования их при проведения лабораторных работ для студентов. Не так давно, мне предложили разобраться с робототехническим конструктором от корейской фирмы Robotis и разработать несколько простейших примеров на LabView для взаимодействия с этим конструктором. Особый интерес представляло то, что обмен данными необходимо было организовать через беспроводной интерфейс Zigbee. В качестве опытных образцов ко мне попали наборы OLLO BUG и Bioloid STEM.
Состав набора OLLO BUG
Состав набора Bioloid STEM
Отличительной особенностью OLLO являются более «простые» комплектующие по сравнению с Bioloid. В частности, в состав набора OLLO входит контроллер CM-100, тогда как с набором Bioloid поставляется CM-530.
СМ-100
СМ-530
Для организации беспроводного интерфейса была использована связка из «родных» адаптеров, поставляемых Robotis:
1. ZIG-100/110A — подключается к контроллеру (тот, который с хвостом) и устанавливается на переходник (который выполнен в виде чипа).
ZIG-100/110A
2. ZIG2Serial — платка, по сути представляющая собой переходник с zigbee модуля на стандартный rs-232.
ZIG2Serial
3. USB2Dynamixel — очень интересная и полезная вещь. Может работать в 3х режимах — TTL, RS485, RS232 — наш вариант. Мы используем данный адаптер как переходник с USB на RS232.
USB2Dynamixel
В результате получилась вот такая конструкция:
Дело осталось за малым — установить связь между двумя «половинками» ZIG-100/110A и перейти собственно к
Для того, чтобы наши контроллеры понимали, что к ним подключен ZigBee модуль и вели обмен данными между ним и подключенной к ним периферией потребовалось написать для них соответствующую прошивку. Прошивка писалась с помощью родной RoboPlus Task. Процесс написания прошивки выглядит следующим образом:
Поскольку из RoboPlus Task невозможно вытащить код прошивки в приятном для глаза виде и компактной форме, то я не буду в дальнейшем выкладывать скрины прошивок. Тем более что сам процесс разработки довольно интуитивен и особых проблем не вызывает. Если кого-то заинтересуют сами прошивки — я добавлю их в формате .tsk.
Первоначально подразумевалось, что придется самому разрабатывать библиотеку для работы с ZIG2Serial, но покопавшись, на официальном сайте Robotis я обнаружил Zigbee SDK, который без проблем интегрировался в LabView через классический Import Shared Library (.dll). Данный процесс я провел на LV2010 и LV2012 — проблем при интеграции обнаружено не было. В результате у нас появилась еще одна палитра в User Libraries:
Для демонстрации возможностей LabView было принято решение в качестве обучающих примеров реализовать следующее:
1. Отправка управляющих команд на контроллер через Zigbee интерфейс.
2. Опрос массива инфракрасных сенсоров, подключенных к контроллеру.
3. Опрос инфракрасных сенсоров.
4. Взаимодействие с сервоприводами Dynamixel.
Итак, начнем по-порядку:
1. Отправка управляющих команд на контроллер через Zigbee интерфейс.
Под управляющими командами в данном примере я подразумеваю команды, которые контроллер воспринимает как команды, отправленные с пульта управления RC-100, но ничто не запрещает нам отправлять любые другие — просто в этом случае нам пришлось бы дополнительно модифицировать прошивку.
Схема пульта RC-100 и соответствующие каждой кнопке коды
Принцип работы в данном случае следующий — подключается по com-порту к адаптеру, и передаем данные на контроллер. Контроллер их интерпретирует и отправляет соответствующие команды на сервоприводы робота.
Процесс разработки vi
Реализуем данную программу в несколько этапов.
1. Создадим новую блок-диаграмму. Поместим на нее 2 структуры Case Structure, Round LED индикатор с именем ZGB_Connected, и Square LED индикатор с именем TxD_LED. Создадим кнопку OK Button с названием ZGB_Connect и соединим ее со входом Case Selector первой структуры. Установим поведение этой кнопки Mechanical Action в позицию Switch Until Released. Поместим внутрь данной структуры в окне True структуру Flat Sequence с тремя окнами (Frame).
2. Поместим внутрь первого окна функцию zgb_terminate.vi из библиотеки Zigbee. Это необходимо сделать для закрытия сессии работы с COM портом, в случае когда предыдущая сессия не была корректно завершена. Так же в это окно поместим локальную переменную ZGB_Connected и присвоим ей значение FALSE.
3. В следующее окно поместим функцию zgb_initialize.vi вход которой соединим с numeric контролом COM Port, а выход, сравнив со значением «0», отправим на вход Enable express-vi Display Msg. В окно Message to Display напишем Initialization Failed. В этом окне будет происходить инициализация соединения с COM портом, к которому подключен модуль ZIG-100 с помощью ZIG2Serial и USB2Dinamixel. В случае успешной инициализации соединения функция zgb_initialize.vi вернет значение 1, а в случае не успешной – значение 0 и сообщение о неуспешной инициализации.
4. В последнее окно поместим структуру Case Structure, соединив вход которой с выходом OK express-vi Display Msg. В окно True поместим константу False, а в окно False – константу True и соединим их с индикатором ZGB_Connected.
5. Создадим кнопку OK Button с названием Transmit. Установим поведение этой кнопки Mechanical Action в позицию Switch Until Released.Теперь перейдем ко второй из двух созданных вначале структур Case Structure. Подадим на вход структуры значение переменной ZGB_Connected с помощью локальной переменной. Внутрь окна True поместим цикл While Loop. Внутрь цикла поместим структуру Case Structure, вход которой соединим с кнопкой Transmit.
6. Внутрь структуры поместим функцию zgb_tx_data.vi, вход которой соединим с numeric контролом data to transmit, а выход, сравнив со значением «0», отправим на вход Enable express-vi Display Msg, расположенный вне структуры. В окно Message to Display напишем Transmission Failed. Так же внутри окна True текущей структуры Case Structure присвоим локальной переменной TxD_LED значение true. Этот этап необходим для отправки данных по Zigbee интерфейсу
7. В окне False текущей структуры Case Structure поместим еще одну структуру Case Structure, подав ей на вход значение локальной переменной TxD_LED, и в ее окне True поместим функцию zgb_tx_data.vi, с поданным на вход значением «0». Это необходимо для фильтрации повторной отправки команд.
8. Создадим цикл While Loop и поместим внутрь него всю нашу блок диаграмму. Создадим кнопку Stop и установим ее поведение в позицию Switch When Released. Соединим кнопку Stop и Loop Condition последнего созданного цикла While Loop. Также внутри текущего цикла While Loop располагаем структуру Case Structure в ее окне True размещаем функцию zgb_terminate.vi. Соединяем вход структуры с кнопкой Stop.
9. Вернемся к первому созданному циклу While Loop. Объединив локальные переменные stop и ZGB_Connect логической операцией OR соединим результат операции с Loop Condition данного цикла.
1. Создадим новую блок-диаграмму. Поместим на нее 2 структуры Case Structure, Round LED индикатор с именем ZGB_Connected, и Square LED индикатор с именем TxD_LED. Создадим кнопку OK Button с названием ZGB_Connect и соединим ее со входом Case Selector первой структуры. Установим поведение этой кнопки Mechanical Action в позицию Switch Until Released. Поместим внутрь данной структуры в окне True структуру Flat Sequence с тремя окнами (Frame).
2. Поместим внутрь первого окна функцию zgb_terminate.vi из библиотеки Zigbee. Это необходимо сделать для закрытия сессии работы с COM портом, в случае когда предыдущая сессия не была корректно завершена. Так же в это окно поместим локальную переменную ZGB_Connected и присвоим ей значение FALSE.
3. В следующее окно поместим функцию zgb_initialize.vi вход которой соединим с numeric контролом COM Port, а выход, сравнив со значением «0», отправим на вход Enable express-vi Display Msg. В окно Message to Display напишем Initialization Failed. В этом окне будет происходить инициализация соединения с COM портом, к которому подключен модуль ZIG-100 с помощью ZIG2Serial и USB2Dinamixel. В случае успешной инициализации соединения функция zgb_initialize.vi вернет значение 1, а в случае не успешной – значение 0 и сообщение о неуспешной инициализации.
4. В последнее окно поместим структуру Case Structure, соединив вход которой с выходом OK express-vi Display Msg. В окно True поместим константу False, а в окно False – константу True и соединим их с индикатором ZGB_Connected.
5. Создадим кнопку OK Button с названием Transmit. Установим поведение этой кнопки Mechanical Action в позицию Switch Until Released.Теперь перейдем ко второй из двух созданных вначале структур Case Structure. Подадим на вход структуры значение переменной ZGB_Connected с помощью локальной переменной. Внутрь окна True поместим цикл While Loop. Внутрь цикла поместим структуру Case Structure, вход которой соединим с кнопкой Transmit.
6. Внутрь структуры поместим функцию zgb_tx_data.vi, вход которой соединим с numeric контролом data to transmit, а выход, сравнив со значением «0», отправим на вход Enable express-vi Display Msg, расположенный вне структуры. В окно Message to Display напишем Transmission Failed. Так же внутри окна True текущей структуры Case Structure присвоим локальной переменной TxD_LED значение true. Этот этап необходим для отправки данных по Zigbee интерфейсу
7. В окне False текущей структуры Case Structure поместим еще одну структуру Case Structure, подав ей на вход значение локальной переменной TxD_LED, и в ее окне True поместим функцию zgb_tx_data.vi, с поданным на вход значением «0». Это необходимо для фильтрации повторной отправки команд.
8. Создадим цикл While Loop и поместим внутрь него всю нашу блок диаграмму. Создадим кнопку Stop и установим ее поведение в позицию Switch When Released. Соединим кнопку Stop и Loop Condition последнего созданного цикла While Loop. Также внутри текущего цикла While Loop располагаем структуру Case Structure в ее окне True размещаем функцию zgb_terminate.vi. Соединяем вход структуры с кнопкой Stop.
9. Вернемся к первому созданному циклу While Loop. Объединив локальные переменные stop и ZGB_Connect логической операцией OR соединим результат операции с Loop Condition данного цикла.
В итоге, для данного примера блок-диаграмма выглядит следующим образом:
и лицевая панель:
2. Опрос массива инфракрасных сенсоров, подключенных к контроллеру.
К контроллеру CM-530 возможно подключение массива сенсоров IR SENSOR ARRAY.
IR SENSOR ARRAY
В качестве примера мы будем опрашивать интересующий нас сенсор по требованию.
Принцип работы в данном случае следующий — подключается по com-порту к адаптеру, отправляем на контроллер номер интересующего нас сенсора — в ответ получаем с него значение.
Процесс разработки vi
Для выполнения данного упражнения модифицируем предыдущий vi следующим способом:
1. Очистим первый созданный нами цикл While Loop от содержимого.
2. Создадим внутри него структуру Case Structure и элемент управления (контрол) с именем Запрос. Соединим данный элемент управления со входом структуры Case Structure.
3. В окне True разместим структуру Flat Sequence с тремя окнами (Frame). Поместим внутрь первого окна функцию zgb_tx_data.vi из библиотеки Zigbee. В данном случае эта функция отсылает на контроллер номер интересующего нас сенсора из массива. Поэтому создадим элемент управления (контрол) с именем Номер сенсора и индикатор с именем Код ошибки запроса и соединим их соответственно со входом и выходом данной функции.
4. Внутрь второго окна поместим функцию zgb_rx_data.vi. Эта функция отвечает за получение данным компьютером по интерфейсу Zigbee. Создадим индикатор с именем результат и соединим его с выходом функции, пройдя через 3е окно структуры Flat Sequence. В третье окно поместим функцию zgb_rx_check.vi. Данная функция отвечает за вывод результатов. Создадим так же индикатор Код ошибки получения и соединим его с выходом данной функции.
1. Очистим первый созданный нами цикл While Loop от содержимого.
2. Создадим внутри него структуру Case Structure и элемент управления (контрол) с именем Запрос. Соединим данный элемент управления со входом структуры Case Structure.
3. В окне True разместим структуру Flat Sequence с тремя окнами (Frame). Поместим внутрь первого окна функцию zgb_tx_data.vi из библиотеки Zigbee. В данном случае эта функция отсылает на контроллер номер интересующего нас сенсора из массива. Поэтому создадим элемент управления (контрол) с именем Номер сенсора и индикатор с именем Код ошибки запроса и соединим их соответственно со входом и выходом данной функции.
4. Внутрь второго окна поместим функцию zgb_rx_data.vi. Эта функция отвечает за получение данным компьютером по интерфейсу Zigbee. Создадим индикатор с именем результат и соединим его с выходом функции, пройдя через 3е окно структуры Flat Sequence. В третье окно поместим функцию zgb_rx_check.vi. Данная функция отвечает за вывод результатов. Создадим так же индикатор Код ошибки получения и соединим его с выходом данной функции.
В результате блок-диаграмма выглядит следующим образом:
и лицевая панель:
3. Опрос инфракрасных сенсоров.
Помимо массива ик-сенсоров к контролерам можно подключить отдельные IR Sensor.
IR Sensor
Реализация данного примера существенно не отличается от реализации предыдущего, поэтому я позволю себе не останавливаться на процессе разработки, просто покажу что в итоге получилось.
Блок-диаграмма выглядит следующим образом:
лицевая панель:
4. Взаимодействие с сервоприводами Dynamixel.
В состав набора Bioloid STEM входит 2 сервопривода Dynamixel AX-12A, причем с ними можно работать в 2х режимах — Joint и Wheel. В режиме Wheel сервопривод выступает в роли вращающегося мотора, основным показателем является скорость вращения. В режиме Joint сервопривод выполняет роль шарнира, основным показателем которого является отклонение на некоторую величину от своего начального положения. Режимы работы переключаются через RoboPlus Manager. Отличительной особенностью данного примера является непрерывный обмен с контроллером по Zigbee интерфейсу. Для этого в блок диаграмму были добавлены параллельно работающие циклы While Loop. После выбора режима работы (вращение приводов или контроль их отклонения) на контроллер непрерывно отправляются данные, представляющие собой целочисленные значения от 1 до 1023. Для режима Wheel эти данные являются значением скорости, а для режима Joint – величиной отклонения положения привода от нулевого.
Блок-диаграмма выглядит следующим образом:
лицевая панель:
В итоге данные примеры вошли в курсы обучения основам робототехники, предлагаемые нами.
Заключение.
Ну и в заключении хочется сказать что разработкой достаточно примитивных примеров дело не закончилось. Для «быстрого» ознакомления с наборами было разработано демонстрационное приложение, включающее в себя «доведенные до ума» возможности, основанные на приведенных выше примерах, а так же расширенные возможности по управлению и настройке сервоприводов в «проводном» режиме работы.
Основным источником информации при разработке являлся www.robotis.com — официальный сайт производителя.