1. Создание ROS msg и srv
Описание: В этом уроке рассказывается, как создавать и собирать файлы сообщений (msg) и сервисов (srv), а также про инструменты командной строки: rosmsg, rossrv, roscp и rosmake.
1.1 Введение в msg и srv
* msg: файлы сообщений (msg) — это простые текстовые файлы, которые описывают поля ROS-сообщения. Они используются для генерации исходного кода для сообщений на разных языках.
* srv: srv файл описывает сервис. Он состоит из двух частей: запрос и ответ.
Файлы msg хранятся в директории msg каталога пакета, а srv файлы, соответственно, хранятся в директории srv.
msg файлы — это простые текстовые файлы с полем типа и полем имени в строке. Типы полей, которые можно использовать:
* int8, int16, int32, int64 (plus uint*) * float32, float64 * string * time, duration * other msg files * variable-length array[] and fixed-length array[C]
Существует также специальный тип в ROS: Заголовок(Header), заголовок содержит временные метки и координационную информацию, которая обычно используются в ROS. Вы часто будете встречать, что в первой строчке msg-файла идёт Header header.
Пример msg, который использует использует Заголовок(Header), строчный примитив и два других msg-файла:
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
srv файлы такие же, как и msg файлы, но они состоят из двух частей: запрос и ответ. Две части, разделяются линией ‘—‘. Пример srv файла:
int64 A int64 B --- int64 Sum
В приведенном выше примере, A и В — это запрос, а Sum — это ответ.
1.2 Создание msg
Давайте создадим новый msg в пакете, который был создан на предыдущем уроке.
$ roscd beginner_tutorials $ mkdir msg $ echo "int64 num" > msg/Num.msg
Теперь, нам необходимо убедиться, что msg-файл превращается в исходный код на C++, Python-е и других языках:
Для этого, откройте CMakeLists.txt в вашем любимом текстовом редакторе и удалите # ,чтобы раскомментировать следующую строчку:
#rosbuild_genmsg()
1.3 rosmsg
Вот и всё, что нужно сделать, чтобы создать msg. Давайте удостоверимся, что ROS может видеть его с помощью команды rosmsg show.
Использование:
$ rosmsg show [message type]
Пример:
$ rosmsg show beginner_tutorials/Num
Вы должны увидеть:
int64 num
В этом примере, передаваемый параметр сообщения состоит из двух частей:
* beginner_tutorials — пакет, в котором определено сообщение
* Num — Имя сообщения
Если вы не можете вспомнить, в каком пакете содержится нужное сообщение (msg), то можно просто опустить имя пакета. Например:
$ rosmsg show Num
Результат:
[beginner_tutorials/Num]: int64 num
1.4 Создание srv
Теперь, в этом же пакете, попробуем создать сервис (srv):
$ roscd beginner_tutorials $ mkdir srv
Вместо того, чтобы создавать определения нового сервиса (srv) вручную, мы можем скопировать существующие определения сервиса из другого пакета.
1.5 roscp
roscp — это очень полезная утилита командной строки для копирования файлов из одного пакета в другой.
Использование:
$ roscp [package_name] [file_to_copy_path] [copy_path]
Попробуем скопировать определение сервисов из пакета rospy_tutorials:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
Теперь, нам необходимо убедиться, что srv файл превращаются в исходный код на C++, Python-е и других языках:
Для этого, откройте CMakeLists.txt в вашем любимом текстовом редакторе и удалите # ,чтобы раскомментировать следующую строчку:
#rosbuild_gensrv()
1.6 rossrv
Вот и всё, что нужно сделать, чтобы создать сервис (srv). Давайте удостоверимся, что ROS может его видеть, с помощью команды rossrv show.
Использование:
$ rossrv show
Пример:
$ rossrv show beginner_tutorials/AddTwoInts
Вы увидите:
int64 a int64 b --- int64 sum
Теперь, когда мы внесли изменения в наш пакет, необходимо, собрать наш пакет снова
$ rosmake beginner_tutorials
1.7 Получение справки
Мы уже познакомились с некоторыми утилитами ROS. Запоминать какие аргументы требуются разным командам — трудно и не нужно. Большинство утилит ROS содержат небольшую справочную информацию по использованию.
Попробуйте:
$ rosmsg -h
Вы должны увидеть список различных подкоманд rosmsg:
Commands: rosmsg show Show message description rosmsg md5 Display message md5sum rosmsg package List messages in a package rosmsg packages List packages that contain messages
Также можно получить справку по подкомандам:
$ rosmsg show -h
Пример, аргументов, которые необходимы для rosmsg show:
Usage: rosmsg show [options]Options: -h, --help show this help message and exit -r, --raw show raw message text, including comments
1.8 Обзор
Перечислим команды, с которыми мы познакомились:
* rospack = ros+pack(age) : предоставляет информацию, связанную с пакетами ROS
* rosstack = ros+stack : предоставляет информацию, связанную со стеками ROS
* roscd = ros+cd : изменения текущего каталога пакета или стека
* rosls = ros+ls : показывает список файлов в ROS пакете
* roscp = ros+cp : копирует файлы из/в пакет ROS
* rosmsg = ros+msg : предоставляет информацию, связанную с определениями сообщений ROS
* rossrv = ros+srv : предоставляет информацию, связанную с определения сервисов ROS
* rosmake = ros+make : собирает (компилирует) пакет ROS
Ссылки
http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv