Сервис сервер с ардуино
В данном разделе будет рассмотрен второй тип связи в ros, а именно service server. ::
#include <ros.h> #include <std_msgs/String.h> #include <rosserial_arduino/Test.h>
ros::NodeHandle nh; using rosserial_arduino::Test;
int i; void callback(const Test::Request & req, Test::Response & res){ if((i++)%2) { res.output = "led on"; digitalWrite(13,HIGH); } else { res.output = "led off"; digitalWrite(13,LOW); } }
ros::ServiceServer<Test::Request, Test::Response> server("test_srv",&callback);
void setup() { pinMode(13,OUTPUT); nh.initNode(); nh.advertiseService(server); }
void loop() { nh.spinOnce(); delay(10); }
После загрузки данного кода в Arduino требуется подключить ее к одноплатному компьютеру с помощью провода USB и найти название устройства в папке /dev/ на одноплатном компьютере. Чаще всего к Arduino присваиваются названия /dev/ttyACM0 и /dev/ttyUSB0. Проверить это можно командой:
ls /dev/tty*Далее необходимо запустить на одноплатном компьютере узел-приемник сообщений от Arduino:
roscore
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 _baud:=57600Команда roscore должна выполняться в отдельной консоли. Чтобы посмотреть, что отправляется с Arduino на одноплатный компьютер, требуется в новой консоли ввести команду:
rosservice listВ консоли должно отобразиться название сервиса, который создает ардуино --- test_srv.
В отличие от топиков, сервис не надо вызывать с постоянной частотой, достаточно вызвать его один раз для совершения действия. Например, представленный выше код при вызове сервиса включит или выключит светодиод. Сделать это можно командой:
rosservice call /test_srv "switch light"Как и в топиках, в сервисах используются свои типы сообщений, каждое сообщение состоит из двух частей: запроса и ответа. Запрос может содержать переменные, которые будут отправлены в сервис и обработаны им. В данном случае запрос содержит одну переменную типа string, следовательно в сервис нужно отправить строковое значение («switch light»). Ответ сервера тоже может содержать в себе переменные, в данном случае ответ также соддержит переменную типа string, в которую будет записано состояние светодиода («led on» или «led off») и возвращено в программу, из которой вызывался сервис.
Чтобы узнать тип сообщения сервиса следует воспользоваться командой:
rosservice info /test_srvЧтобы узнать, какие переменные в себе содержит сообщение, следует воспользоваться поиском по roswiki, где описаны все стандартные сообщения сервисов из различных библиотек.