ros2 bag

About_work·2024년 4월 25일
0

ros2

목록 보기
32/41

1. 기초 사용법

  • ROS 2 bag는 ROS 메시지 데이터를 기록하고 재생하는 데 사용되는 도구

1.1. 데이터 기록하기

  1. ROS 2 환경 설정: source /opt/ros/<distro>/setup.bash 실행
  2. Bag 기록 시작: 다음 명령어를 사용하여 ROS 2 메시지 기록을 시작합니다.
ros2 bag record -o <bag_name> /topic1 /topic2
  • <bag_name>: 생성할 bag 파일의 이름입니다.
  • /topic1, /topic2: 기록하고 싶은 토픽 이름입니다. 필요한 모든 토픽을 나열할 수 있습니다.

기록된 데이터 재생하기

기록된 데이터를 재생하려면 다음 단계를 따르세요:

  1. 재생 명령 실행:
ros2 bag play <bag_name>
  • <bag_name>: 재생할 bag 파일의 이름입니다.

유용한 명령어

  • Bag 정보 확인: bag 파일에 대한 정보를 보려면 다음 명령어를 사용하세요:
ros2 bag info <bag_name>
  • 특정 토픽만 재생: 특정 토픽만 재생하려면 다음과 같이 실행합니다:
ros2 bag play <bag_name> -t /topic1

TF도 ros2 bag으로 로깅하는법!

  • tf2_ros.TransformBroadcaster를 사용하여 특정 RGBD 카메라의 위치 및 회전 데이터를 ROS 2 토픽에 발행하는 것을 보여줍니다.
  • 이 데이터를 레코드하려면 다음 단계를 따라야 합니다.

1. 토픽 확인

  • TransformBroadcaster는 일반적으로 /tf/tf_static 토픽에 데이터를 발행
  • 카메라의 pose가 발행되는 정확한 토픽 이름을 확인하려면 다음 명령어를 사용할 수 있습니다.
ros2 topic list

2. 데이터 레코딩

ros2 bag record /tf -o my_rosbag
  • 여기서 -o my_rosbag는 저장할 bag 파일의 이름을 my_rosbag로 설정합니다.
  • 특정 tf만 로깅할 순 없습니다.

4. Bag 파일 검사

  • 레코딩이 완료된 후, .db3 형식의 bag 파일이 생성됩니다. 이 파일 내에 어떤 데이터가 저장되었는지 확인하고 싶다면, 다음과 같은 명령어를 사용할 수 있습니다.
ros2 bag info my_rosbag

2. ros 2 bag을 python을 이용하여 저장하는 방법

중요

  • rosbag2_py 라이브러리가 ROS 2 Foxy 버전에 대해 바이너리 형태로 제공되지 않는다는 것을 설명하고 있습니다.
  • 즉, 이 라이브러리를 직접 사용하고 싶다면 소스 코드에서 직접 빌드해야 한다는 뜻입니다.
  • 또한, rosbag2_py의 리포지토리에는 Foxy 버전에 맞는 코드 브랜치가 존재한다고 언급하고 있습니다.

필요한 패키지 설치

  • 먼저, ROS 2 환경에서 Python과 함께 rosbag2_py 라이브러리를 사용할 수 있도록 설정해야 합니다.

Python 스크립트 예제

  1. Python 스크립트:
    • 이 스크립트는 rosbag2_py를 사용하여 특정 토픽을 로깅합니다.
import rosbag2_py

def record_bag(bag_name, topics):
    # Storage 옵션 설정
    storage_options = rosbag2_py.StorageOptions(uri=bag_name, storage_id='sqlite3')
    # Converter 옵션 설정
    converter_options = rosbag2_py.ConverterOptions(
        input_serialization_format='cdr',
        output_serialization_format='cdr'
    )
    
    # Writer 초기화
    writer = rosbag2_py.SequentialWriter()
    writer.open(storage_options, converter_options)

    # 토픽에 대한 타입 등록 (여기서는 예시로 std_msgs/msg/String 사용)
    # 실제 사용할 메시지 타입으로 변경해야 합니다.
    topic_info = rosbag2_py.TopicMetadata(
        name='topic1',
        type='std_msgs/msg/String',
        serialization_format='cdr'
    )
    writer.create_topic(topic_info)

    # 데이터 로깅 - 실제로는 적절한 데이터 소스에서 메시지를 받아와서 처리
    import time
    for i in range(10):  # 예시로 10개의 메시지를 기록
        msg = String()  # std_msgs.msg.String을 사용합니다.
        msg.data = f"Hello {i}"
        writer.write('topic1', msg, int(time.time() * 1e9))

    writer.close()

if __name__ == "__main__":
    record_bag('my_ros_bag', ['/topic1'])
  • 이 스크립트는 rosbag2_pySequentialWriter를 사용하여 topic1 토픽으로 몇 개의 메시지를 기록
  • SequentialWriter는 데이터를 순차적으로 bag 파일에 기록

3. 저장한 ros2 bag 파일의 특정 topic을 메모리에 불러오는 방법

  • ROS 2 bag 파일에서 특정 토픽의 데이터만 메모리에 읽어오려면 Python을 사용하여 rosbag2_py 라이브러리를 사용
  • 아래는 특정 토픽의 데이터를 읽어오는 방법에 대한 예제 코드입니다:

2.1. 예제 코드

import rosbag2_py

# Bag 파일 설정
bag_file_path = 'path/to/your/bagfile'
topic_name = '/example_topic'

# Reader 생성 및 설정
storage_options = rosbag2_py.StorageOptions(uri=bag_file_path, storage_id='sqlite3')
converter_options = rosbag2_py.ConverterOptions(
    input_serialization_format='cdr',
    output_serialization_format='cdr'
)
reader = rosbag2_py.SequentialReader()
reader.open(storage_options, converter_options)

# 특정 토픽 필터링
topic_filter = [topic_name]
reader.set_filter(topics=topic_filter)

# 데이터 읽기
while reader.has_next():
    (topic, data, timestamp) = reader.read_next()
    print(f"Topic: {topic}, Timestamp: {timestamp}, Data: {data}")
  • 위 스크립트는 path/to/your/bagfile 경로의 bag 파일에서 /example_topic 토픽의 데이터를 읽어와 출력
  • rosbag2_py.SequentialReader 객체를 사용하여 bag 파일을 순차적으로 읽음
  • set_filter 메소드를 통해 읽고자 하는 특정 토픽을 필터링

1. rosbag2_py.StorageOptions

  • StorageOptions 클래스는 ROS bag 파일의 저장소에 관련된 설정을 정의
  • 이 옵션을 통해 파일의 저장 위치와 사용할 저장소 플러그인의 유형을 지정할 수 있음
    주요 속성:
  • uri (string): bag 파일의 저장 위치 또는 읽기 위치
  • storage_id (string):
    • 사용할 저장소 백엔드의 식별자
    • 예를 들어, "sqlite3"는 SQLite를 사용한 데이터 저장을 의미

2. rosbag2_py.ConverterOptions

  • ConverterOptions 클래스는 메시지 데이터의 직렬화 및 역직렬화 포맷을 설정
  • 이는 메시지가 어떻게 인코딩되고 디코딩되어야 하는지를 정의
    주요 속성:
  • input_serialization_format (string):
    • 읽기 작업 시 사용할 데이터의 직렬화 포맷
    • 예를 들어, "cdr"는 Common Data Representation 포맷을 의미
  • output_serialization_format (string):
    • 쓰기 작업 시 사용할 데이터의 직렬화 포맷
    • 일반적으로 입력 포맷과 동일하게 설정

3. rosbag2_py.SequentialReader

  • SequentialReader 클래스는 bag 파일의 데이터를 순차적으로 읽는 데 사용
  • 이 클래스를 통해 데이터를 순차적으로 접근하고, 필요한 데이터를 필터링하여 읽을 수 있음
    주요 메서드:
  • open(storage_options, converter_options):
    • 주어진 StorageOptionsConverterOptions를 사용하여 bag 파일을 염
  • has_next():
    • 읽을 다음 메시지가 있는지 여부를 반환
    • 다음 메시지가 있으면 True, 없으면 False를 반환
  • read_next():
    • 현재 위치에서 다음 메시지를 읽어 반환
    • 반환 값은 튜플 형식이며, (topic_name, serialized_data, timestamp)로 구성
  • set_filter(topics):
    • 읽고자 하는 토픽을 필터링합니다. 이 메서드에 토픽 리스트를 전달하면, 해당 토픽에 대한 데이터만 읽을 수 있습니다.

4. rosbag2_py.BatchReader 사용 방법

BatchReader 클래스를 사용하면 데이터를 순차적으로 한 번에 하나씩 처리하는 것이 아니라, 한 번에 여러 메시지를 가져와 처리할 수 있습니다. 이는 특히 대량의 데이터를 빠르게 처리해야 할 때 유용합니다.

기본 사용 예제:

  1. 환경 설정 및 라이브러리 가져오기:
import rosbag2_py

# Bag 파일 설정
bag_file_path = 'path/to/your/bagfile'
  1. Storage와 Converter 옵션 설정:
storage_options = rosbag2_py.StorageOptions(uri=bag_file_path, storage_id='sqlite3')
converter_options = rosbag2_py.ConverterOptions(
    input_serialization_format='cdr',
    output_serialization_format='cdr'
)
  1. BatchReader 생성 및 열기:
reader = rosbag2_py.BatchReader()
reader.open(storage_options, converter_options)
  1. 데이터 읽기 (배치 처리):
batch_size = 10  # 한 번에 읽어올 메시지의 수
while reader.has_next():
    batch_messages = reader.read_next_batch(batch_size)
    for topic, data, timestamp in batch_messages:
        print(f"Topic: {topic}, Timestamp: {timestamp}, Data: {data}")

추가 팁

  • 배치 크기 조절: 배치 크기는 메모리 사용량과 처리 속도 사이의 균형을 고려하여 조정해야 합니다. 너무 큰 배치 크기는 메모리 오버헤드를 증가시킬 수 있습니다.

  • 토픽 필터링: 필요한 토픽만 읽어오도록 필터링을 설정할 수 있습니다. 이는 reader.set_filter(topics) 메서드를 사용하여 설정할 수 있습니다.

  • BatchReaderrosbag2_py 라이브러리의 일부로, 이 기능이 ROS 2 버전에 따라 다를 수 있으므로, 사용하기 전에 관련 라이브러리와 도구가 최신 상태인지 확인하시는 것이 좋습니다.


Rviz로 visualize 하기

  • ROS2에서 생성된 bag 파일을 RViz2에서 시각화하는 과정은 비교적 직관적
  • 다만, bag 파일에 저장된 데이터를 RViz2에서 직접 읽을 수는 없음
  • 대신, ros2 bag play 명령을 사용하여 데이터를 다시 게시하고, RViz2에서 이 데이터를 구독하여 시각화할 수 있음

1단계: ros2 bag 파일 재생

2단계: RViz2 구성

  • RViz2를 실행하고 적절한 설정으로 구성
  • RViz2를 시작하기 위해 다음 명령을 사용할 수 있습니다:
rviz2
  • RViz2에서는 다음과 같은 단계를 따라야 합니다:
  • Fixed Frame 설정:
    • Fixed Frame을 올바르게 설정해야 합니다.
    • 이는 일반적으로 메인 로봇 프레임 또는 월드 프레임 (예: base_link 또는 odom)이 될 수 있습니다.
  • Display 추가:
    • RViz2의 왼쪽 패널에서 Add 버튼을 클릭하여 각 데이터 타입에 맞는 Display를 추가합니다. 예를 들어:
    • Camera:
      • CompressedImage를 시각화하려면 Camera display를 추가하고, Image Topic/camera/rgb/image_raw/compressed 또는 /camera/depth/image_raw/compressed로 설정
    • TF:
      • TransformStamped 데이터를 시각화하려면 TF display를 추가
    • Pose:
      • PoseStamped 데이터를 보려면 Pose display를 추가하고, Topic을 /camera/pose로 설정
  • 다른 옵션 구성: 필요에 따라 다른 시각화 옵션들을 추가하고 구성할 수 있습니다.

3단계: 데이터 시각화

  • ros2 bag play를 실행한 상태에서 RViz2에서 정확한 토픽을 구독하면, 실시간으로 데이터가 시각화됩니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

1개의 댓글

comment-user-thumbnail
2024년 8월 27일

혹시 ros2 foxy에서 bag파일(db3)을 pcd파일로 바꾸는 방법이 따로 있나요?

답글 달기