Skip to main content
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
More concise title
Source Link
Lucas Walter
  • 3.4k
  • 1
  • 14
  • 20

ROS2 Humble--Converting Converting a color rawros2 bag file to a series of consecutivecolor raw images to image files or a video in Ubuntu 22.04 and native Python 3.10

This is using ros2 Humble in Ubuntu 22.04 and native Python 3.10

ROS2 Humble--Converting a color raw bag file to a series of consecutive images or a video in Ubuntu 22.04 and native Python 3.10

Converting a ros2 bag of color raw images to image files or video

This is using ros2 Humble in Ubuntu 22.04 and native Python 3.10

edited title
Link
Lucas Walter
  • 3.4k
  • 1
  • 14
  • 20

ROS2 Humble--Converting a color raw bag file to a series of consecutive images or a video in Ubuntu 22.0104 and native Python 3.10

Source Link
Mona Jalal
  • 203
  • 2
  • 10

ROS2 Humble--Converting a color raw bag file to a series of consecutive images or a video in Ubuntu 22.01 and native Python 3.10

Eventual goal: capturing depth aligned RGB and Depth streams from Intel RealSense D435 camera and converting them to RGB and Depth videos. Example script for ros (v1) is provided below but need a tool/script for ros2. In order to debug this problem, I did try to reduce it to only dealing with color raw topic.

I have created a bag file for this topic /camera/camera/color/image_raw and I want to convert the capture that I did with Intel RealSense D435 camera to a series of consecutive photos or preferably a video without the loss to the quality of captured data.

I have inspected my bag file and there is no problem in it. I also have used the ros2 echo command and I am able to see there is content in it.

Initially, I used the ros2bag2video.py script from this git repo but it gets stuck after running the command while echoing the bag doesn't get stuck. I also came across solution for ros1 for doing this but since I am new to ros2 I don't know how to do it for this version.

(base) mona@ada:~/rosbag2video$ /usr/bin/python3.10 ros2bag2video.py -v -t /camera/camera/color/image_raw ~/ros2bagmona/
Using  25  FPS
FPS (int) =  25
Rate (float) =  1.0
Topic (str) =  /camera/camera/color/image_raw
Output File (str) =  output.mp4
Verbose (bool) =  True
Reading info from bag file: /home/mona/ros2bagmona/
ROS Message name =  sensor_msgs/msg/Image
Image count =  198
msgtype =  <class 'sensor_msgs.msg._image.Image'>
AJB: subscribing to msg:  <class 'sensor_msgs.msg._image.Image'> on topic:  /camera/camera/color/image_raw
Starting ROS bag playback...
[INFO] [1699041025.599860882] [rosbag2_storage]: Opened database '/home/mona/ros2bagmona/ros2bagmona_0.db3' for READ_ONLY.
[INFO] [1699041025.599920787] [rosbag2_player]: Set rate to 1
[INFO] [1699041025.602356503] [rosbag2_player]: Adding keyboard callbacks.
[INFO] [1699041025.602398298] [rosbag2_player]: Press SPACE for Pause/Resume
[INFO] [1699041025.602405008] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message
[INFO] [1699041025.602410516] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10%
[INFO] [1699041025.602414936] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10%
[INFO] [1699041025.602892229] [rosbag2_storage]: Opened database '/home/mona/ros2bagmona/ros2bagmona_0.db3' for READ_ONLY.

^^^ gets stuck executing the command after READ_ONLY message.

This is despite being able to play the bag with no problem:

(base) mona@ada:~$  ros2 bag play ros2bagmona/
[INFO] [1699041088.759139678] [rosbag2_storage]: Opened database 'ros2bagmona/ros2bagmona_0.db3' for READ_ONLY.
[INFO] [1699041088.759203803] [rosbag2_player]: Set rate to 1
[INFO] [1699041088.762416056] [rosbag2_player]: Adding keyboard callbacks.
[INFO] [1699041088.762461205] [rosbag2_player]: Press SPACE for Pause/Resume
[INFO] [1699041088.762468691] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message
[INFO] [1699041088.762474209] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10%
[INFO] [1699041088.762478606] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10%
[INFO] [1699041088.762974737] [rosbag2_storage]: Opened database 'ros2bagmona/ros2bagmona_0.db3' for READ_ONLY.
(base) mona@ada:~$ 

So, either can you show a solution for how to correctly use ros2bag2video.py for converting a bag file of raw color to rgb video or a series of consecutive photos using any other method that would be compatible with ros2 humble bags?

Also, I am not sure if there are certain version of opencv-python that are compatible with cv-bridge package, but here's the package versions I have:

(base) mona@ada:~$ /usr/bin/pip show cv-bridge
Name: cv-bridge
Version: 3.2.1
Summary: UNKNOWN
Home-page: UNKNOWN
Author: 
Author-email: 
License: UNKNOWN
Location: /opt/ros/humble/local/lib/python3.10/dist-packages
Requires: 
Required-by: 

and

(base) mona@ada:~$ /usr/bin/pip show opencv-python
Name: opencv-python
Version: 4.5.5.62
Summary: Wrapper package for OpenCV python bindings.
Home-page: https://github.com/skvark/opencv-python
Author: 
Author-email: 
License: MIT
Location: /home/mona/.local/lib/python3.10/site-packages
Requires: numpy, numpy, numpy, numpy
Required-by: 

(base) mona@ada:~$ ros2 wtf
/opt/ros/humble/lib/python3.10/site-packages/ros2doctor/api/package.py: 112: UserWarning: joy has been updated to a new version. local: 3.1.0 < latest: 3.3.0
/opt/ros/humble/lib/python3.10/site-packages/ros2doctor/api/package.py: 112: UserWarning: sdl2_vendor has been updated to a new version. local: 3.1.0 < latest: 3.3.0

All 5 checks passed

Also, I have seen this script but not sure what's the equivalent for ros2. Is there a tool for converting code written for ros to ros2?

import os
import sys
import yaml
from rosbag.bag import Bag
import cv2

import roslib;   #roslib.load_manifest(PKG)
import rosbag
import rospy
import cv2
import numpy as np
import argparse
import os

from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError

class ImageCreator():
    def __init__(self, bagfile, rgbpath, depthpath, rgbstamp, depthstamp):
        self.bridge = CvBridge()
        with rosbag.Bag(bagfile, 'r') as bag:
            for topic,msg,t in bag.read_messages():
                print(topic)
                if topic == "/camera/color/image_raw": #图像的topic;
                    # try:
                    cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                    # except CvBridgeError as e:
                    #     print(e)
                    timestr = "%.6f" %  msg.header.stamp.to_sec()
                    #%.6f表示小数点后带有6位,可根据精确度需要修改;
                    image_name = timestr+ ".png" #图像命名:时间戳.png
                    # cv2.imshow("color", cv_image)
                    cv2.waitKey(1);
                    cv2.imwrite(rgbpath + image_name, cv_image)  #保存;

                    # #写入时间戳
                    # with open(rgbstamp, 'a') as rgb_time_file:
                    #     rgb_time_file.write(timestr+" rgb/"+image_name+"\n")
                elif topic == "/camera/aligned_depth_to_color/image_raw": #图像的topic;
                    # try:
                    cv_image = self.bridge.imgmsg_to_cv2(msg,"16UC1")
                    # except CvBridgeError as e:
                    #     print(e)
                    timestr = "%.6f" %  msg.header.stamp.to_sec()
                    #%.6f表示小数点后带有6位,可根据精确度需要修改;
                    image_name = timestr+ ".png" #图像命名:时间戳.png
                    
                    # cv2.imwrite(depthpath + image_name, cv_image)  #保存;
                    cv2.imwrite(depthpath + image_name, (cv_image).astype(np.uint16))

                    # #写入时间戳
                    # with open(depthstamp, 'a') as depth_time_file:
                    #     depth_time_file.write(timestr+" depth/"+image_name+"\n")

if __name__ == '__main__':
    ImageCreator('cheezit_new_2.bag', "/home/sc19zx/rgb/", "/home/sc19zx/depth/", 1, 1)

^^^ From https://github.com/NVlabs/BundleSDF/issues/82#issuecomment-1792602336

(base) mona@ada:~$ /usr/bin/python3.10
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux

(base) mona@ada:~$ /usr/bin/pip --version
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)

(base) mona@ada:~$ uname -a
Linux ada 6.2.0-36-generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct  9 15:34:04 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
(base) mona@ada:~$ lsb_release -a
LSB Version:    core-11.1.0ubuntu4-noarch:security-11.1.0ubuntu4-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:    22.04
Codename:   jammy

I have checked both depth and color in rviz2 and am able to see them. Further, I have done depth aligned capture.

(base) mona@ada:~$ ros2 bag info ros2bagmona/

Files:             ros2bagmona_0.db3
Bag size:          174.2 MiB
Storage id:        sqlite3
Duration:          13.142s
Start:             Nov  2 2023 11:52:10.972 (1698940330.972)
End:               Nov  2 2023 11:52:24.115 (1698940344.115)
Messages:          198
Topic information: Topic: /camera/camera/color/image_raw | Type: sensor_msgs/msg/Image | Count: 198 | Serialization Format: cdr
(base) mona@ada:~$ ls ros2bagmona/
total 175M
-rw-r--r--  1 mona mona 175M Nov  2 11:52 ros2bagmona_0.db3
drwxrwxr-x  2 mona mona 4.0K Nov  2 11:52 .
-rw-rw-r--  1 mona mona 1005 Nov  2 11:52 metadata.yaml
drwxr-x--- 61 mona mona 4.0K Nov  3 15:44 ..

In case it may be important, I am using this version of package:

(base) mona@ada:~/rosbag2video$ git log
commit 13b4e064eb0ad748f3d4e20eb88353bdf76acd21 (HEAD -> master, origin/master, origin/HEAD)
Merge: 44d1637 14a7d26
Author: mlaiacker <[email protected]>
Date:   Mon Sep 18 20:11:28 2023 +0200

    Merge branch 'pipebots-humble-dev-joey'

and I have made a git issue here.