Продолжим эксперименты с нашей черепахой. На этот раз напишем две программы, одна будет публиковать случайное значение скорости (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. Хотя здесь мы использовали для передачи и приёма разные файлы, ничто не мешает объединить их в одной ноде, если такая необходимость возникнет.
Комментариев нет:
Отправить комментарий