среда, 12 июля 2017 г.

ROS. Публикация и приём сообщений

Продолжим эксперименты с нашей черепахой. На этот раз напишем две программы, одна будет публиковать случайное значение скорости (publisher), а другая - принимать текущие координаты (subscriber).

Для создания следующей программы вы можете полностью написать новый файл set_velocity.py, либо скопировать и переименовать hello.py, а затем добавить в него недостающие строки. Результат должен выглядеть следующим образом:


Рассмотрим отличия от файла hello.py. Для сообщений о скорости нода turtlesim использует формат Twist, т.е. наша программа тоже должна его использовать. Чтобы иметь доступ к данному формату, он должен быть импортирован из geometry_msgs. Кроме того, мы импортируем функцию random() из модуля random для генерации случайных чисел от 0 до 1. 

Строка 

   pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)

говорит о том, что сообщения будут публиковаться в топик turtle1/cmd_vel в формате Twist. А если turtlesim не будет успевать обрабатывать сообщения, по мере поступления они сформируют очередь, рассчитанную максимум на 10 элементов.

Для работы с сообщениями используется элемент msg класса Twist. В каждой итерации цикла обновляются его значения линейной (msg.linear.x) и угловой (msg.angular.z) скоростей, после чего сообщение публикуется методом publish(msg) объекта rospy.Publisher (элемент pub).

Осталось сделать файл исполняемым 

   chmod +x set_velocity.py

обновить список ресурсов
   
   source ~/my_ros_ws/devel/setup.bash
 
и запустить

   roscore
   rosrun turtlesim turtlesim_node
   rosrun ros_test set_velocity.py

Если сообщений об ошибках не возникло, черепашка начнёт плутать по своему синему полю.

Теперь оформим подписку на данные о позиции, для этого создадим файл get_position.py

На этот раз формат сообщения поменялся и определяется классом Pose модуля turtlesim.msg. Полученное сообщение будет обрабатываться функцией callback(), в данном случае она просто выводит координаты и направление черепахи. 

Строка 

   rospy.Subscriber('turtle1/pose', Pose, callback)

оформляет подписку на топик turtle1/pose и указывает, что при получении новых сообщений они будут преобразованы в объект Pose и переданы для обработки функции callback(). Метод rospy.spin() не даёт программе завершиться до тех пор, пока не будет получена соответствующая команда.

Опять же, сделаем файл исполняемым

   chmod +x get_position.py

и запустим его

   rosrun ros_test get_position.py

В результате, можно увидеть данные о текущем положении черепахи. 

P.S. Хотя здесь мы использовали для передачи и приёма разные файлы, ничто не мешает объединить их в одной ноде, если такая необходимость возникнет.
   


Комментариев нет:

Отправить комментарий