Enregistrement et lecture de données avec rosbag en utilisant le pont ROS 1

Ce didacticiel fait suite à la démonstration * Communication Bridge entre ROS 1 et ROS 2 *, que vous pouvez trouver ici, et dans ce qui suit, il est supposé que vous avez déjà terminé ce didacticiel.

Le ros1_bridge peut être installé à partir de packages binaires ou construit à partir de la source ; les deux fonctionnent pour ces exemples.

Ce qui suit est une série d’exemples supplémentaires, comme ceux qui viennent à la fin de la démonstration susmentionnée Communication de pont entre ROS 1 et ROS 2.

Enregistrement des données de sujet avec rosbag et ROS 1 Bridge

Dans cet exemple, nous allons utiliser le programme de démonstration cam2image fourni avec ROS 2 et un script Python pour émuler les données d’un capteur de robot de type tortue afin que nous puissions le relier à ROS 1 et utiliser rosbag pour enregistrer il.

Nous allons d’abord exécuter un roscore ROS 1 dans un nouveau shell :

# Shell A:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
roscore

Ensuite, nous exécuterons le dynamic_bridge ROS 1 <=> ROS 2 avec l’option --bridge-all-topics (afin que nous puissions faire rostopic list et les voir) dans un autre shell :

# Shell B:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

N’oubliez pas de remplacer <workspace-with-bridge> par le chemin d’accès à l’endroit où vous avez extrait le binaire ROS 2 ou à l’endroit où vous avez construit ROS 2 à partir de la source.


Nous pouvons maintenant démarrer les programmes ROS 2 qui émuleront notre robot ressemblant à un robot-tortue. Nous allons d’abord exécuter le programme cam2image avec l’option -b pour qu’il ne nécessite pas de caméra pour fonctionner :

# Shell C:
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
ros2 run image_tools cam2image -- -b

À FAIRE : utiliser des noms de sujet avec espace de noms

Ensuite, nous exécuterons un simple script Python pour émuler les sujets odom et imu_data à partir d’une base Kobuki. J’utiliserais le nom de sujet plus précis ~sensors/imu_data pour les données imu, mais nous n’avons pas encore de support d’espace de noms dans ROS 2 (ça arrive !). Placez ce script dans un fichier appelé 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())

Vous pouvez exécuter ce script Python dans un nouveau shell ROS 2 :

# Shell D:
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
python3 emulate_kobuki_node.py

Maintenant que toutes les sources de données et le pont dynamique fonctionnent, nous pouvons examiner les rubriques disponibles dans un nouveau shell ROS 1 :

# Shell E:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
rostopic list

Vous devriez voir quelque chose comme ceci :

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

Nous pouvons maintenant enregistrer ces données avec rosbag record dans le même shell :

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

Après quelques secondes, vous pouvez Ctrl-c la commande rosbag et faire un ls -lh pour voir la taille du fichier, vous pourriez voir quelque chose comme ceci :

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

Bien que le nom du fichier soit différent pour votre sac (puisqu’il est dérivé de la date et de l’heure).

Lecture des données de sujet avec rosbag et ROS 1 Bridge

Maintenant que nous avons un fichier sac, vous pouvez utiliser n’importe lequel des outils ROS 1 pour introspecter le fichier sac, comme rosbag info <bag file>, rostopic list -b <bag file>, ou `` rqt_bag <fichier sac>``. Cependant, nous pouvons également lire les données du sac dans ROS 2 en utilisant rosbag play et le ROS 1 <=> ROS 2 dynamic_bridge.

Fermez d’abord tous les shells que vous avez ouverts pour le didacticiel précédent, en arrêtant tous les programmes en cours d’exécution.

Ensuite, dans un nouveau shell, lancez le roscore :

# Shell P:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
roscore

Exécutez ensuite le dynamic_bridge dans un autre shell :

# Shell Q:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

Ensuite, rejouez les données du sac avec rosbag play dans un autre nouveau shell, en utilisant l’option --loop afin que nous n’ayons pas à le redémarrer pour les sacs courts :

# Shell R:
. /opt/ros/kinetic/setup.bash
# Or, on OSX, something like:
# . ~/ros_catkin_ws/install_isolated/setup.bash
rosbag play --loop path/to/bag_file

Assurez-vous de remplacer path/to/bag_file par le chemin du fichier bag que vous souhaitez lire.


Maintenant que les données sont lues et que le pont fonctionne, nous pouvons voir les données arriver dans ROS 2.

# Shell S:
. /opt/ros/ardent/setup.bash
# Or, if building ROS 2 from source:
# . <workspace-with-bridge>/install/setup.bash
ros2 topic list
ros2 topic echo /odom

Vous devriez voir quelque chose comme :

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

Vous pouvez également voir l’image en cours de lecture depuis le sac en utilisant l’outil showimage :

ros2 run image_tools showimage