ROS

Основная статья: http://wiki.ros.org

ROS – это широко используемый фреймворк для создания сложных и распределенных роботехнических систем.

Установка

Основная статья: http://wiki.ros.org/kinetic/Installation/Ubuntu

ROS уже установлен на образе для RPi.

Для использования ROS на компьютере рекомендуется ОС Ubuntu Linux (либо виртуальная машина, например Parallels Desktop Lite или VirtualBox).

Концепции

Ноды

Основная статья: http://wiki.ros.org/Nodes

ROS-нода – это специальная программа (обычно написанная на Python или C++), которая взаимодействует с другими нодами посредством ROS-топиков и ROS-сервисов. Разделение сложных роботехнических систем на изолированные ноды дает определеные преимущества: понижается связанность кода, повышается переиспользуемость и надежность.

Очень многие роботехнические библиотеки и драйвера выполнены именно в виде ROS-нод.

Для того, чтобы превратить обычную программу в ROS-ноду, необходимо подключить к ней библиотеку rospy или roscpp и добавить инициализирующий код.

Пример ROS-ноды на языке Python:

import rospy

rospy.init_node('my_ros_node')  # имя ROS-ноды

rospy.spin()  # входим в бесонечный цикл...

Топики

Основная статья: http://wiki.ros.org/Topics

Топик – это именованная шина данных, по которой ноды обмениваются сообщениями. Любая нода может опубликовать сообщение в произвольный топик, а также подписаться на произвольный топик.

Пример публикации сообщения типа std_msgs/String (строка) в топик /foo на языке Python:

from std_msgs.msg import String

# ...

foo_pub = rospy.Publisher('/foo', String, queue_size=1)  # создаем Publisher'а
foo_pub.publish(data='Hello, world!')  # публикуем сообщение

Пример подписки на топик /foo:

def foo_callback(msg):
    print msg.data

# Подписываемся. При получении сообщения в топик /foo будет вызвана функция foo_callback.
rospy.Subscriber('/foo', String, foo_callback)

Также, существует возможность работы с топиками с помощью утилиты rostopic. Например, с помощью следующей команды можно просматривать сообщения, публикуемые в топик /mavros/state:

rostopic echo /mavros/state

Сервисы

Основная статья: http://wiki.ros.org/Services

Сервис – это некоторый аналог функции, которая может быть вызвана из одной ноды, а обработана в другой. У сервиса есть имя, аналогичное имени топика, и 2 типа сообщений: тип запроса и тип ответа.

Пример вызова ROS-сервиса из языка Python:

from clever.srv import GetTelemetry

# ...

# Создаем обертку над сервисом get_telemetry пакета clever с типом GetTelemetry:
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)

# Вызываем сервис и получаем телеметрию квадрокоптера:
telemetry = get_telemetry()

С сервисами можно также работать при помощи утилиты rosservice. Так можно вызвать сервис /get_telemetry из командной строки:

rosservice call /get_telemetry "{frame_id: ''}"

Больше примеров использования сервисов для автономных полетов квадрокоптера Клевер можно посмотреть в документации ноды simple_offboard.

Работа на нескольких машинах

Преимуществом использования ROS явлется возможность распределения нод на несколько машин в сети. Например, ноду, осуществляющую распознование образом на изображении можно запустить на более мощном компьютере; ноду, управляющую коптером можно запустить непосредствено на Raspberry Pi, подключенном к полетому контроллеру и т. д.

Для запуска ноды

results matching ""

    No results matching ""