Издатель команд для робота
Last updated
Last updated
В отличие от прошлой программы, где наши сигналы не несли какой-то технической смысловой нагрузки и были просто сообщениями “Hello ROS”, сейчас мы будем отправлять реальные команды для робота. Однако как вы увидите, принципы построения программы при этом останутся такими же. Для сохранения преемственности мы даже используем нашу прошлую программу Издатель (publisher.py) в качестве заготовки.
Писать новую программу вы можете как на компьютере в ранее созданной папке /ros_course или же используя расширение Remote-SSH подключиться к файловой системе робота, создать там папку /ros_course и писать программу там.
Назовем нашу программу: publisher_for_robot.py и перейдем непосредственно к программированию.
Сформулируем нашу задачу - заставим робота двигаться вперед в течение 1 секунды со скоростью 5 сантиметров в секунду, затем поворачивать направо в течение 2-х секунд с угловой скоростью 0.5 радиана в секунду, и дальше двигаться налево по дуге с угловой скоростью 1 радиан в секунду и линейной скоростью 10 сантиметров в секунду.
Итак, как мы и говорили давайте возьмем программу Издатель из нашего прошлого занятия и немного ее модифицируем:
Импорт библиотеки rospy - остается. Это неизменный атрибут любой программы под ROS.
А вот вместо String, который мы использовали, чтобы публиковать “Hello ROS”, мы будем импортировать структуру данных для управления скоростями - Twist:
Для создания ноды мы используем стандартный метод init_node(), но давайте назовем ее, например - moving_node:
Ну а раз управляем параметрами угловой скорости мы через публикацию структуры данных Twist в топик /cmd_vel, то и Издатель сконфигурируем на этот топик и эту структуру данных. Вот так:
Теперь вместо объекта String, создадим объект Twist, который и будем публиковать:
Мы не будем использовать стандартный цикл while not rospy.is_shutdown(): потому что хотим, чтобы робот произвел последовательность передвижений только один раз, а не повторял ее бесконечно. Так что цикл - стираем.
А вот дальше, построчно, мы будем заполнять нашу структуру данных - vel, значениями угловых и линейных скоростей и публиковать ее при помощи созданного нами Издателя pub с той временной задержкой, которая нам нужна.
Заставим робота двигаться вперед в течение 1 секунды со скоростью 5 сантиметров в секунду. Перед тем, как поехать, сделаем небольшую задержку в 1 секунду. Заполним значение линейной скорости по Х нашей структуры данных vel, значением 0.05. Опубликуем ее и сделаем паузу на 1 секунду:
Теперь, дадим роботу команду поворачивать направо в течение 2-х секунд с угловой скоростью 0.5 радиана в секунду. Обратите внимание, что нам надо обнулить линейное значение скорости, иначе оно останется равным 0.05 и робот поедет по дуге, а не будет разворачиваться на месте как мы этого хотим. Снова опубликуем vel при помощи того же паблишера pub и сделаем паузу на 2 секунды:
И последнее - дуга налево.
Линейная скорость по Х: 0,1 метр в секунду, а угловая по Z: 1 радиан в секунду. Заполняем значения и публикуем.
Теперь остановим нашего робота и выйдем из программы. Чтобы остановить робота, надо обнулить значения угловой и линейной скорости, а затем опубликовать нашу структуру данных:
Вот и все, сохраним нашу программу. Теперь нам надо запустить это все на роботе и посмотреть как оно будет работать.
В случае, если вы сохранили программу на компьютере, то вам необходимо перенести её на робота. Для этого можно воспользоваться командой scp:
scp /home/$USER/ros_course/publisher_for_robot.py pi@turtlebro37.local:/home/pi/ros_course/publisher_for_robot.py
При копировании файла робот запросит пароль, по умолчанию, на наших роботах пароль brobro
Теперь зайдем на самого робота и запустим файл. Перед запуском убедитесь, что перед роботом достаточно места и он не стоит на столе.
Все работает так как мы хотели !