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