1. Запись и воспроизведение данных
Описание: Этот урок научит вас, как записывать данные из работающей системы ROS в .bag-файл, а затем воспроизводить данные для воспроизведения поведения работающей системы.
1.1 Запись данных (создание bag-файла)
Этот раздел урока научит вас, как записывать данные тем(topic) из работающей системы ROS. Данные тем будут накапливаться в bag-файле.
Во-первых, выполните следующие две команды:
rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key
Это приведет к запуску двух узлов — визуализатора turtlesim и узла, позволяющего контролировать turtlesim с помощью стрелок на клавиатуре. Если выбрать окно терминала, из которого вы запустили turtle_teleop_key, вы должны увидеть что-то вроде:
Reading from keyboard --------------------------- Use arrow keys to move the turtle.
Нажатие клавиш со стрелками должно вызывать перемещение черепахи по экрану. Обратите внимание, что управление движением черепахи вы должны установить активным терминал с которого вы запустили turtle_teleop_key, а не окно turtlesim.
1.1.1 Запись всех опубликованных тем
Сначала, изучим полный список тем, которые в настоящее время опубликованы в работающей системе. Для этого, откройте новый терминал и выполните команду:
rostopic list -v
Должна появиться информация вроде:
Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher * /rosout [rosgraph_msgs/Log] 2 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber * /rosout [rosgraph_msgs/Log] 1 subscriber
Это список опубликованных тем с типом сообщений, которые потенциально могут быть записаны в лог-файл данных, так как записываются только опубликованные сообщения. Темы /turtle1/command_velocity — это командные сообщения, опубликованные turtle_telelop, которые принимаются в качестве входных данных в процессе turtlesim. Сообщение /turtle1/color_sensor и /turtle1/pose — это выводимые сообщения, публикуемые turtlesim.
Теперь запишем публикуемые данные. Откройте новое окно терминала. В этом окне выполните следующие команды:
mkdir ~/bagfiles cd ~/bagfiles rosbag record -a
Здесь мы просто создаём временный каталог для записи данных, а затем запускаем rosbag record с опцией -a, которая указывает, что все опубликованные темы должны быть накоплены в bag-файле.
Вернитесь в окно терминала с turtle_teleop и подвигайте черепаху в течении 10 секунд (или около того).
Вернитесь в окно запуска rosbag record и нажмите Ctrl-C. Теперь, проверьте содержимое каталога ~/bagfiles. Вы должны увидеть файл с именем, которое начинается с года, даты, времени и суффиксом .bag. Это и есть bag-файл, содержащий все темы опубликованные любым узлом за время, пока программа rosbag record была запущен.
1.2 Проверка и проигрывание bag-файла
Теперь, когда мы записали bag-файл, используя rosbag record, мы можем изучить и воспроизвести его, используя команды rosbag info и rosbag play. Сначала, посмотрим, что за данные записаны в bag-файле. Для этого, мы должны вызвать подкоманду info — это подкоманда проверяет содержимое bag-файла без его воспроизведения. Выполните следующую команду из каталога ~/bagfiles:
rosbag info
Вы должны увидеть что-то вроде:
path: 2011-12-29-10-03-17.bag version: 2.0 duration: 13.8s start: Dec 29 2011 10:03:18.31 (1325142198.31) end: Dec 29 2011 10:03:32.13 (1325142212.13) size: 120.1 KB messages: 1594 compression: none [1/1 chunks] types: rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb] turtlesim/Color [353891e354491c51aabe32df673fb446] turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9] turtlesim/Velocity [9d5c2dcd348ac8f76ce2a4307bd63a13] topics: /rosout 4 msgs : rosgraph_msgs/Log (2 connections) /turtle1/color_sensor 790 msgs : turtlesim/Color /turtle1/command_velocity 10 msgs : turtlesim/Velocity /turtle1/pose 790 msgs : turtlesim/Pose
Это говорит нам об именах тем и типах их сообщений, а также число (count) сообщений каждой темы, содержащейся в bag-файле. Мы видим, что из опубликованных тем, которые мы видели в выдаче rostopic, только четыре из пяти были опубликованы во время нашей записи. Так как мы запустили rosbag record с флагом -a, то были записаны все опубликованные сообщения узлов.
Следующим шагом этого урока, является проигрывание bag-файла, служащее для воспроизведения поведения работающей ROS-системы. Сначала завершите работу программы teleop, которая была запущена в предыдущем разделе этого урока — для этого выполните Ctrl-C в терминале, где вы запустили turtle_teleop_key. Однако, оставьте работать узел turtlesim. В окне терминала, перейдите в каталог с вашим bag-файлом и выполните следующую команду:
rosbag play
В этом окне, вы сразу же должны увидеть что-то вроде:
[ INFO] [1325142297.920774361]: Opening 2011-12-29-10-03-17.bag Waiting 0.2 seconds after advertising topics... done. Hit space to toggle paused, or 's' to step.
В стандартном режиме rosbag play будет ждать определенный период ожидания (0.2 секунды) после представления(advertising) каждого типа сообщений перед тем как начать публиковать содержимое bag-файла. Это ожидание позволяет уведомить всех подписчиков(subscriber) сообщений, , о том, что скоро могут последовать сообщения. Если rosbag play публикует сообщения сразу после представления, то подписчики(subscribers) могут не получить несколько первых опубликованных сообщений. Период ожидания может быть задан опцией -d .
Наконец, сообщения в теме /turtle1/command_velocity будут опубликованы и черепаха должна начать движение в окне turtlesim, причём движения будут походить на команды ручного управления, которые вы выполняли самостояятельно из программы teleop. Продолжительность между запущенными rosbag play и движением черепахи должно быть примерно равно времени между стартом rosbag record и выдачей команд с клавиатуры в первой части урока. Вы можете запустить проигрывание rosbag play не с начала bag-файла, а с определённого промежутка времени, используя опцию -s . Ещё одна опция, которая может представлять интерес — это опция -r , которая позволяет изменять скорость публикации сообщений на указанный фактор. Если вы выполните:
rosbag play -r 2
Вы должны увидеть, что черепаха черепахи выполняет движение по несколько иной траектории — это траектория, которая возникла бы, если бы вы выдавали команды с клавиатуры в два раза быстрее.
1.3 Запись подмножества данных
При работе сложных систем, например, таких как пакет программного обеспечения pr2, могут публиковаться сотни различных тем, причём, некоторые темы, такие как потоки изображений с камер, публикуют огромные объемы данных. В таких системах, зачастую слишком непрактично записывать на диск лог-файлы, содержащие все темы в один bag-файл. Поэтому, команда rosbag record поддерживает журналирование отдельных тем в bag-файл, тем самым позволяя пользователям записывать только интересующие их темы.
Снова запустим узел turtlesim и узел управления с клавиатуры — teleop:
rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key
В каталоге bagfiles, выполните следующую команду:
rosbag record -O subset /turtle1/command_velocity /turtle1/pose
опция -O задаёт rosbag record два аргумента: имя лог-файла — subset.bag, и название тем. В результате rosbag record подписывается только на эти две темы. Подвигайте черепаху в течение нескольких секунд при помощи клавиш со стрелками на клавиатуре, а затем остановите rosbag record нажатием Ctrl-C.
Теперь проверьте содержимое получившегося bag-файла ( rosbag info subset.bag ). Вы должны увидеть, что bag-файл содержит , только указанные темы:
path: subset.bag version: 2.0 duration: 20.7s start: Dec 29 2011 10:06:25.47 (1325142385.47) end: Dec 29 2011 10:06:46.13 (1325142406.13) size: 98.2 KB messages: 1223 compression: none [1/1 chunks] types: turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9] turtlesim/Velocity [9d5c2dcd348ac8f76ce2a4307bd63a13] topics: /turtle1/command_velocity 17 msgs : turtlesim/Velocity /turtle1/pose 1206 msgs : turtlesim/Pose
1.4 Ограничения rosbag record/play
В предыдущем разделе вы могли отметить, что путь черепахи, возможно, не совсем точно соответствует оригинальному вводу с клавиатуры — форма должна быть примерно та же, но черепаха, возможно, не совсем точно отслеживает путь. Причина этого заключается в том, что путь отображаемый turtlesim очень чувствителен к небольшим изменениям системы времени, а rosbag ограничен в своей способности точно дублировать поведение работающей системы с точки зрения, когда сообщения записываются и обрабатываются rosrecord, и когда сообщения создаются и обрабатываются при использовании rosplay. Для узлов, таких как turtlesim, где небольшие изменения во времени, приводят к изменениям команды обработки сообщений, пользователь не должен ожидать, отличной имитации поведения.
Ссылки
http://www.ros.org/wiki/ROS/Tutorials/Recording and playing back data