Estás leyendo la documentación para una versión de desarrollo. Para la última versión publicada, por favor revisa Humble.

Grabación y reproducción de datos con rosbag utilizando ROS 1 bridge

Este tutorial es una continuación de la demostración de Comunicación puente entre ROS 1 y ROS 2 que se puede encontrar aquí , y en lo siguiente se supone que ya ha completado ese tutorial.

Para estos ejemplos ros1_bridge puede instalarse desde source.

Lo que sigue es una serie de ejemplos adicionales, como los que vienen al final de la demo antes mencionada Puente de comunicación entre ROS 1 y ROS 2.

Grabación de datos de topics con rosbag y ROS 1 Bridge

En este ejemplo, usaremos el programa de demostración cam2image que viene con ROS 2 y un script de Python para emular los datos del sensor de un robot similar a un robot tortuga simple para que podamos conectarlo a ROS 1 y usar rosbag para grabar eso.

Primero ejecutaremos un ROS 1 roscore en una nueva shell:

# Shell A:
. /opt/ros/kinetic/setup.bash
# O, en OSX, algo como:
# . ~/ros_catkin_ws/install_isolated/setup.bash
roscore

Luego ejecutaremos ROS 1 <=> ROS 2 dynamic_bridge con la opción --bridge-all-topics (para que podamos hacer rostopic list y verlos) en otra shell :

# Shell B:
. /opt/ros/kinetic/setup.bash
# O, en OSX, algo como:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# O, si compila ROS 2 desde fuentes:
# . <workspace-with-bridge>/install/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

Recuerda reemplazar <workspace-with-bridge> con la ruta a donde extrajo el binario ROS 2 o donde creó ROS 2 desde fuentes.


Ahora podemos iniciar los programas ROS 2 que emularán nuestro robot tipo tortuga. Primero ejecutaremos el programa cam2image con la opción -b para que no requiera una cámara para funcionar:

# Shell C:
. /opt/ros/ardent/setup.bash
# O, si compila ROS 2 desde fuentes:
# . <workspace-with-bridge>/install/setup.bash
ros2 run image_tools cam2image -- -b

TODO: usar nombres de topics con espacios de nombres

Luego, ejecutaremos un script de Python simple para emular los topics odom e imu_data desde una base de Kobuki. Usaría el nombre de tema ~sensors/imu_data más preciso para los datos de imu, pero todavía no tenemos soporte de espacio de nombres en ROS 2 (¡ya viene!). Coloca este script en un archivo llamado emulate_kobuki_node.py:

#!/usr/bin/env python3

import sys
import time

import rclpy

from nav_msgs.msg import Odometry
from sensor_msgs.msg import Imu

def main():
    rclpy.init(args=sys.argv)

    node = rclpy.create_node('emulate_kobuki_node')

    imu_publisher = node.create_publisher(Imu, 'imu_data')
    odom_publisher = node.create_publisher(Odometry, 'odom')

    imu_msg = Imu()
    odom_msg = Odometry()
    counter = 0
    while True:
        counter += 1
        now = time.time()
        if (counter % 50) == 0:
            odom_msg.header.stamp.sec = int(now)
            odom_msg.header.stamp.nanosec = int(now * 1e9) % 1000000000
            odom_publisher.publish(odom_msg)
        if (counter % 100) == 0:
            imu_msg.header.stamp.sec = int(now)
            imu_msg.header.stamp.nanosec = int(now * 1e9) % 1000000000
            imu_publisher.publish(imu_msg)
            counter = 0
        time.sleep(0.001)


if __name__ == '__main__':
    sys.exit(main())

Puedes ejecutar este script de python en una nueva shell de ROS 2:

# Shell D:
. /opt/ros/ardent/setup.bash
# O, si compila ROS 2 desde fuentes:
# . <workspace-with-bridge>/install/setup.bash
python3 emulate_kobuki_node.py

Ahora que todas las fuentes de datos y el puente dinámico se están ejecutando, podemos ver los topics disponibles en un nuevo shell de ROS 1:

# Shell E:
. /opt/ros/kinetic/setup.bash
# O, en OSX, algo como:
# . ~/ros_catkin_ws/install_isolated/setup.bash
rostopic list

Deberías ver algo como esto:

% rostopic list
/image
/imu_data
/odom
/rosout
/rosout_agg

Ahora podemos registrar estos datos con rosbag record en el mismo shell:

# Shell E:
rosbag record /image /imu_data /odom

Después de unos segundos, puedes Ctrl-c el comando rosbag y hacer ls -lh para ver qué tan grande es el archivo, es posible que veas algo como esto:

% ls -lh
total 0
-rw-rw-r-- 1 william william  12M Feb 23 16:59 2017-02-23-16-59-47.bag

Aunque el nombre del archivo será diferente para su bolso (ya que se deriva de la fecha y la hora).

Reproducción de datos de topics con rosbag y ROS 1 Bridge

Ahora que tenemos un archivo bag, puede usar cualquiera de las herramientas de ROS 1 para introspeccionar el archivo bag, como rosbag info <archivo bag>, rostopic list -b <archivo bag>, o `` rqt_bag <archivo de bolsa>``. Sin embargo, también podemos reproducir datos de bolsa en ROS 2 usando rosbag play y ROS 1 <=> ROS 2 dynamic_bridge.

Primero cierra todos los shells que abrió para el tutorial anterior, deteniendo cualquier programa en ejecución.

Luego, en una nueva shell, inicia roscore:

# Shell P:
. /opt/ros/kinetic/setup.bash
# O, en OSX, algo como:
# . ~/ros_catkin_ws/install_isolated/setup.bash
roscore

Luego ejecuta dynamic_bridge en otro shell:

# Shell Q:
. /opt/ros/kinetic/setup.bash
# O, en OSX, algo como:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# O, si compila ROS 2 desde fuentes:
# . <workspace-with-bridge>/install/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

Luego reproduzca los datos de la bolsa con rosbag play en otro shell nuevo, usando la opción --loop para que no tengamos que reiniciarlo continuamente para bolsas cortas:

# Shell R:
. /opt/ros/kinetic/setup.bash
# O, en OSX, algo como:
# . ~/ros_catkin_ws/install_isolated/setup.bash
rosbag play --loop path/to/bag_file

Asegúrate de reemplazar path/to/bag_file con la ruta al archivo de bolsa que desea reproducir.


Ahora que los datos se están reproduciendo y el puente se está ejecutando, podemos ver los datos que se encuentran en ROS 2.

# Shell S:
. /opt/ros/ardent/setup.bash
# O, si compila ROS 2 desde fuentes:
# . <workspace-with-bridge>/install/setup.bash
ros2 topic list
ros2 topic echo /odom

Deberías ver algo como:

% ros2 topic list
/clock
/image
/imu_data
/odom
/parameter_events

También puedes ver la imagen que se está reproduciendo desde la bolsa utilizando la herramienta showimage:

ros2 run image_tools showimage