Создание Action Server & Client в ROS
Я пытаюсь настроить сервер и клиент ROS Action для обработки отправки изображений (закодированных в виде 64-битных строк) между Python и ROS (с целью сделать изображение тем, что другие сценарии могут извлечь из ROS). Будучи очень новым для всего этого (Python, Ubuntu, Bash, ROS и т. Д.), Мне очень трудно определить, КАК именно это сделать. Я думаю, что отчасти это связано с тем, что вики-учебники / документация по ROS линейны до ошибки, и этот процесс просто выглядит запутанным и чрезвычайно сложным. Кто-нибудь знает какие-либо учебные пособия, не связанные с ROS-вики, которые помогут мне понять это? Или вы можете создать краткое пошаговое руководство по созданию этой системы? Я не смог найти много чего-нибудь конкретно касающегося этой темы - что заставляет меня думать, что это либо очень необычное использование, либо это супер просто, и я просто еще не достиг этого уровня.
Моя попытка найти решение, по сути, сводится к потере информации. Я хочу, чтобы Python мог читать изображение, преобразовывать его в байты (используя b64encode) и отправлять его в ROS для публикации в качестве действия. (Таким образом, поток изображений может быть отправлен без паузы, как было бы сделано со службой, если я правильно понимаю.) Все, что подписано на узел (или сервер, однако это работает, я выясню это, когда получу там) затем можно увидеть изображения и вытащить их с сервера действий.
Теперь мне говорят, что действие - лучший способ сделать это. Лично я не понимаю, почему службы не будет достаточно (и я, по крайней мере, заставил одного из них работать).
Еще раз спасибо за любую помощь, которую вы все можете предоставить!
Изменить: конечное приложение здесь для потокового видео. Сервер будет захватывать видео в реальном времени, преобразовывать его в изображения, изменять их в байтовые строки и передавать их клиенту, который затем опубликует их на сервере действий ROS.
1 ответ
Я думаю, вы слишком усложняете это. Я бы не стал реализовывать его как сервер actionlib, хотя это один из подходов. Я создал несколько подобных систем, и вот как я их структурировал:
- Напишите свой узел, который транслирует видео, публикуя изображения по теме. Вы можете реализовать это как сервер actionlib, но это не обязательно. В моем случае я использовал ранее существовавший raspicam_node для чтения камеры Raspberry Pi. Если вы хотите реализовать это в Python, прочитайте учебник по созданию издателя.
- Создайте узел, который подписывается на тему вашего изображения, а затем считывает изображение из сообщения темы. Опять же, учебник показывает, как создать подписчика. Основное отличие состоит в том, что вы бы использовали либо
CompressedImage
или жеImage
отsensor_msgs.msg
как тип вашего сообщения.
Для стороны подписчика, вот пример Python ROS-узла, который я написал, который реализует стример MJPEG. Он подписывается на тему, читает данные изображения и повторно публикует их с помощью потокового HTTP-ответа. Несмотря на то, что это "медленный Python", у меня задержка составляет менее 1 секунды.