Запуск ROS пакета
Чтобы работать с пакетами нам необходим интрумент catkin
Установка catkin выполняется через apt-get install python3-catkin-tools
❓ Важно!!! Мы будем пользоваться catkin build вместо catkin_make не смотря на то, что во всех туториалах предлагается catkin_make !!! В чем отличие? Основное отличие — изолированная среда, которую вы получаете при сборке Catkin. Это делает всю конфигурацию сборки более разделенной и устойчивой к изменениям в конфигурации (добавление/удаление пакета, изменение переменной cmake и т. д.). Кроме того, мы получаем более структурированный и легко читаемый цветной вывод командной строки, что намного приятнее. Также вместе с catkin
мы получаем много полезных команд, таких как catkin clean
для очистки build
, devel
, install
, catkin list
и т.д. Ну и catkin buildработает в любом месте рабочего пространства, не только в верхнеуровневой директории + можно собирать пакеты по отдельности, не только все сразу.
Обязательным требованием является наличие src папки внутри рабочего пространства! Если вы один раз использовали catkin_make то в дальнейшем нельзя будет просто воспользоваться catkin build!
Пример создания окружения в папке catkin_ws
mkdir catkin_ws
cd catkin_ws
mkdir src
catkin init
catkin build
Для справок по catkin: https://catkin-tools.readthedocs.io/en/latest/index.html
Справочник команд по catkin: https://catkin-tools.readthedocs.io/en/latest/cheat_sheet.html
💡 После каждой сборки необходимо обновить файл запуска пакета source devel/setup.bash
catkin config
- покажет параметры catkin workspace
-
Самый простой способ создания пакета, это скачать исходный код пакета в наш workspace
сделаем клон репозитория и скопируем из папки
practice_1
подпапкуmy_robot_controller
git clone [https://github.com/likerobotics/ros_course_tutorials.git](https://github.com/likerobotics/ros_course_tutorials.git)
Теперь нам предстоит его изучить и исправить в соответствии с заданием.
- Исследование пакета
В нашем минимально жизнеспособном пакете мы увидим 2 папки и два файла:
- scripts
- src
- CMakeLists.txt
- package.xml
В папке scripts мы найдем .py файлы
Нас интересует файл my_node.py содержащий необходимый минимум:
- окружение и версия python
- импорт библиотеки для работы python
- инициализация ноды
- задаем частоту обновления
- и запускаем бесконечный цикл средствами ROS
Таким образом, наш пакет содержит ноду, которая публикует в терминал сообщения с заданной частотой.
Если файл не является исполняемым, то вы получите сообщение об ошибке… тогда делаем этот файл исполняемым при помощи chmod +x my_node.py
- Запускаем наш исполняемый файл
rosrun my_robot_controller my_node.py
💡 А все ли получилось?
Теперь было бы здорово остановить его, сделать это можно через CTRL+C или при помощи команды rosnode kill test_node_1
Обратите внимание, что название исполняемого файла и название ноды могут не совпадать!
Для вывода информации в терминале мы можем воспользоваться rospy.loginfo("Информация я вывода в терминале")
- Создание Паблишера
Создадим своего паблишера, который будет управлять черепашкой (публиковать сообщения “правильного” типа в “правильный” топик.
- Создаем новый файл с названием my_publisher.py
- Копируем из файла нашей ноды все, и меняем название ноды.
- Импортируем библиотеку из пакета geometry_msgs, и из него нужный нам класс.
-
Все внешние пакеты и модули должны быть указаны в package.xml поэтому добавляем этот пакет туда + turtlesim который мы будем использовать.
<build_depend>geometry_msgs</build_depend> <build_depend>turtlesim</build_depend> <exec_depend>turtlesim</exec_depend> <exec_depend>geometry_msgs</exec_depend>
-
перед входом в бесконечный цикл создаем объект класса Publisher, передаем в него название топика, в который будет публиковать, тип сообщений и размер очереди.
pub = rospy.Publisher("/turtle1/cmd_vel", Twist, queue_size=10)
-
также создаем экземпляр класса Twist, который по сути будет нашим сообщением, который и будем отправлять в топик.
msg = Twist()
-
Внутри бесконечного цикла мы можем менять значение параметров экземпляра класса и публиковать его с частотой, который мы задали в Rate.
pub.publish(msg)
-
Создание Сабскрайбера
- При создании сабскрайбера используется немного другой механизм, тут мы не входим в бесконечный цикл, вместо этого используем rospy.spin()
- Создаем новый файл my_subscriber.py
-
Создаем функцию callback_function принимает на вход один параметр msg и выводит в лог консоли.
def pose_callback(msg):
…..
-
В инициализации main меняем название ноды на pose_subscriber
-
После этого создаем экзепляр класса Subscriber и передаем туда название топика, который будем слушать, тип сообщений, и указываем callback функцию.
subscriber = rospy.Subscriber("/turtle1/pose", Pose, callback=pose_callback)
-
Чтобы callback вызывался постоянно, необходимо указать
rospy.spin()
Запускаем в отдельных консолях Паблишер и Сабскрайбер.
Запускаем еще в отдельной консоли rqt_graph и посмотрим на наши ноды и топики.
Оставить комментарий