воскресенье, 9 июля 2017 г.

ROS. "Hello, World!"

Попробуем создать собственный пакет и добавить туда первую ноду - программу, которая будет печатать на экране традиционное "Hello, World!". Прежде всего понадобится настроить окружение, т.е. директории, в которых будет лежать пакет. Для этого в новых версиях ROS используется группа программ catkin. Допустим, наш пакет будет лежать в папке my_ros_ws. Тогда для создания окружения нужно выполнить следующие команды:

   mkdir -p ~/my_ros_ws/src
   cd ~/my_ros_ws/
   catkin_make

Первая команда создаёт директории my_ros_ws и src, вторая делает my_ros_src текущей папкой, а третья создаёт само окружение, т.е. заполняет пространство необходимыми файлами и директориями. Команда ls может это подтвердить.

Теперь создадим пакет, который будет называться ros_test, для этого выполним следующие команды:

   cd src/
   catkin_create_pkg ros_test std_msgs rospy

Первая строка просто позволяет перейти в директорию src, а во второй мы с помощью catkin создаём пакет ros_test и объявляем для него зависимости от пакетов std_msgs (понадобится в дальнейшем для обмена сообщениями) и rospy (для написания программ на Python). Можно не указывать здесь зависимости и выполнить команду 

   catkin_create_pkg ros_test

В этом случае необходимо вручную дописать их в файл ros_test/package.xml: для пакетов, необходимых во время компиляции, с тегами <build_depend></build_depend>,  а во время выполнения - <run_depend></run_depend>.

Вообще, узнать зависимости какого-либо пакета в ROS можно с помощью команд

   rospack depends1 имя_пакета
   rospack depends   имя_пакета

Разница между ними заключается в том, что depends1 находит зависимости только для требуемого пакета, в то время как depends учитывает также зависимости его зависимостей...

Вернёмся к файлу ros_test/package.xml. Можно оставить его без изменений, но хорошим тоном будет внесение информации о пакете и разработчике. Для этого откройте файл в любом текстовом редакторе, можно воспользоваться консольным вариантом, например, nano:

   nano ros_test/package.xml

Редактор nano относительно прост в использовании. Навигация осуществляется "стрелками", для сохранения изменений нажмите Ctrl+O и Enter, для выхода - Ctrl+X

В моём случае после редактирования первая часть файла package.xml выглядит следующим образом.

   <name>ros_test</name>
   <version>0.0.1</version>
   <description>Мой первый пакет в ROS.</description>
   <maintainer email="camis.dat@gmail.com>Stas</maintainer>
   <license>BSD</license>

Остальное оставляем без изменения.

Теперь создадим первую ноду. Если вы в директории src, перейдите в ros_test:

   cd ros_test/

Код на Python должен лежать в папке scripts

   mkdir scripts

Создадим файл hello.py в scripts и откроем его в текстовом редакторе. В случае nano:

   nano scripts/hello.py

Файл должен содержать следующий текст.

Первая строка здесь говорит оболочке, через какую программу необходимо запускать данный файл. Затем импортируется модуль для взаимодействия с ROS. Основную работу выполняет функция helloWorld(). Сначала мы инициализируем ноду с именем 'hello', а также говорим, что если такое имя уже занято, система может заменить его на что-нибудь другое (anonymous=True). Затем определяется частота, с которой сообщение будет выводиться на экран, в данном случае это 1 Гц, т.е. 1 раз в секунду. Отображение сообщения происходит в цикле с помощью функции rospy.loginfo(), после чего программа "засыпает" на указанное время. Отличие rate.sleep() от стандартной функции sleep() заключается в том, что первая будет поддерживать строго заданную частоту независимо от того, как долго выполнялось тело цикла. Сам цикл будет выполняться, пока нода не получит сигнал об остановке (например, пользователь нажмёт Ctrl+C). Вторая часть программы запускает определённую выше функцию и отслеживает в ней возможные ошибки.

После того, как файл сохранён, нужно сделать его исполняемым:

   chmod +x scripts/hello.py

Теперь переходим в корневой каталог нашего окружения и собираем пакет.

   cd ~/my_ros_ws/
   catkin_make

Если всё прошло успешно, сообщение о сборке будет заканчиваться словами "Configurating done", "Generating done" и т.п. Однако, чтобы ROS узнал о новом пакете, его ещё нужно добавить в список ресурсов

   source devel/setup.bash

К сожалению, данная команда распространяется только на текущий терминал, если вы откроете новый, то для работы с пакетом в нём также нужно будет выполнить 
  
   source ~/my_ros_ws/devel/setup.bash

Как вариант, можно прописать данную команду в  файл .bashrc.

Осталось проверить, работает ли программа. В разных терминалах выполните следующие команды (если вторая выдаст ошибку об отсутствии файла, возможно, вы не прописали ресурсы, либо не сделали файл исполняемым).

   roscore
   rosrun ros_test hello.py

В результате вы должны увидеть надпись со словами "Hello, World", которая появляется с частотой 1 раз в секунду.

P.S. Ещё несколько слов о редактировании файлов. Для упрощения работы с файлами в ROS имеется команда

   rosed имя_пакета имя_файла

которая открывает исходный код в текстовом редакторе. По-умолчанию используется vim, можно поменять настройки в ~/.bashrc. Например, для работы с nano нужно добавить следующую строку:

   export EDITOR='nano -w'
   

Комментариев нет:

Отправить комментарий