존재하는 ros2 bag 파일에, 새로운 publish data를 write 하는 방법

About_work·2024년 4월 30일
0

ros2

목록 보기
40/41

1. 새 ros bag 파일을 추가로 따로 생성하기

  • 현재 rosbag2의 사용법에 따르면, 이미 존재하는 bag 파일(old_bag)에 직접 새로운 데이터를 추가하는 것은 지원하지 않습니다.
  • 이미 생성된 .db3 bag 파일에 새로운 메시지를 추가하는 것은 ->
    • 기존의 bag 파일을 직접 수정하는 것이 아니라,
    • 새로운 메시지를 기록한 후 필요하다면 병합하는 방식으로 처리됨
  • 여기서는 새로운 ROS 2 publisher를 생성하고 이를 사용하여 메시지를 기록한 다음, 필요에 따라 기존 데이터와 병합하는 과정을 설명하겠습니다.

1. ROS 2 Publisher 생성

먼저, 새로운 메시지를 publish할 ROS 2 노드를 생성합니다. 예를 들어, std_msgs/msg/String 타입의 메시지를 보내는 publisher를 만들어서 pub

2. 메시지 기록

새로운 메시지를 기록하기 위해서는 새로운 bag 파일을 생성하거나 기존의 bag 파일에 추가하는 방식을 선택할 수 있습니다. 여기서는 새로운 bag 파일에 기록하는 것으로 설명합니다.

ros2 bag record -o new_bag /topic

이 명령어는 /topic이라는 토픽에서 메시지를 기록하여 new_bag이라는 이름의 새로운 bag 파일을 생성합니다.

3. Bag 파일 병합

  • ROS 2에서는 직접적으로 두 bag 파일을 병합하는 기능이 내장되어 있지 않습니다. 따라서, 두 데이터 세트를 동시에 재생하거나 특정 애플리케이션에서 두 소스를 동시에 사용해야 합니다.
  • 다음은 두 bag 파일을 동시에 재생하는 예시입니다:
ros2 bag play old_bag new_bag

필요하다면, 특정 툴이나 스크립트를 사용하여 데이터를 추출하고 프로그래밍 방식으로 두 데이터 세트를 하나로 병합할 수 있습니다. 이 과정은 사용자의 요구 사항에 따라 매우 다양할 수 있으며, 주로 데이터 처리와 관련된 추가적인 프로그래밍 작업이 필요합니다.


2. 생성된 2개의 ros2 bag 파일 합치기

  • ROS 2에서 두 bag 파일의 데이터를 병합하는 공식적인 방법은 없지만, 겹치는 토픽이 없는 두 bag 파일을 하나로 합치는 작업은 비교적 간단하게 처리할 수 있습니다.
  • 이 작업을 수행하기 위한 접근 방법 중 하나는 두 bag 파일에서 데이터를 추출하고, 이를 새로운 bag 파일로 다시 기록하는 것입니다.

2.1. 데이터 추출

  • 먼저, 각각의 bag 파일에서 필요한 데이터를 추출해야 합니다. 이를 위해 ros2 bag 명령어를 사용하여 각 bag 파일의 내용을 확인하고, 관련 데이터를 추출할 수 있습니다.
ros2 bag info your_first_bag
ros2 bag info your_second_bag

2.2. 데이터 재기록

  • 두 bag 파일에서 추출한 데이터를 하나의 새로운 bag 파일로 재기록할 수 있습니다.
  • 이를 위해 ros2 bag record를 사용하여 새로운 bag 파일에 데이터를 기록하는 동안, 두 bag 파일을 동시에 재생합니다.
  • 이 과정에서 ros2 bag play 명령어를 사용하여 각각의 bag 파일을 재생합니다.
  • 이 작업을 수행하기 위해, 먼저 ROS 2에서 두 개의 별도의 터미널을 열고 각각의 bag 파일을 재생합니다:

터미널 1:

ros2 bag play your_first_bag

터미널 2:

ros2 bag play your_second_bag

그런 다음, 세 번째 터미널을 열어 새로운 bag 파일로 모든 토픽을 기록합니다:

터미널 3:

ros2 bag record -a -o merged_bag

여기서 -a 옵션은 모든 토픽을 기록하라는 명령입니다.

2.3. 데이터 확인

병합된 bag 파일의 내용을 확인하여 모든 기대하는 데이터가 포함되어 있는지 검증합니다.

ros2 bag info merged_bag

2.4. 참고 사항

  • 이 방법은 두 bag 파일에서 데이터의 시간 동기화가 중요하지 않은 경우에 적합합니다. 시간 동기화가 중요한 경우에는 데이터의 타임스탬프를 조정해야 할 수도 있습니다.
  • 실제로 데이터를 병합하는 작업은 시스템의 리소스와 데이터의 크기에 따라 성능에 영향을 줄 수 있으므로, 충분한 계산 리소스를 확보하는 것이 중요합니다.
  • rosbag2는 아직 모든 기능에서 완벽한 호환성을 제공하지 않을 수 있으므로, 복잡한 데이터 처리가 필요한 경우 추가적인 스크립트나 도구를 개발하여 사용할 수 있습니다.
  • 이와 같은 방법으로 ROS 2에서 두 개의 bag 파일을 하나로 병합할 수 있으며, 이를 통해 데이터 관리의 유연성을 높일 수 있습니다.

bag play 동시에 수행하기

ROS 2에서 두 개의 ros2 bag play 명령어를 동시에 실행하려면, 명령어를 병렬로 실행하는 스크립트를 작성하거나 터미널을 분할하여 사용할 수 있습니다. 여기서는 몇 가지 방법을 소개하겠습니다.

단일 Bash 스크립트를 작성하여 두 bag 파일을 동시에 재생할 수 있습니다. 이 스크립트는 두 명령어를 백그라운드에서 실행하고, 모든 작업이 완료되면 종료하도록 할 수 있습니다.

#!/bin/bash

# 첫 번째 bag 파일 재생
ros2 bag play your_first_bag &
# 두 번째 bag 파일 재생
ros2 bag play your_second_bag &

# 두 프로세스가 종료될 때까지 기다림
wait

이 스크립트를 play_both_bags.sh와 같은 이름으로 저장하고 실행 권한을 부여한 다음 실행합니다:

chmod +x play_both_bags.sh
./play_both_bags.sh

bag play 동시 종료시키기

백그라운드에서 실행 중인 프로세스를 강제로 종료하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법 중 두 가지를 소개하겠습니다:

1. jobskill 명령어 사용

백그라운드에서 실행 중인 프로세스를 확인하고, 해당 프로세스를 종료하기 위해 kill 명령어를 사용하는 방법입니다.

  1. 백그라운드 작업 확인:
    터미널에서 jobs 명령어를 실행하여 백그라운드에서 실행 중인 모든 작업을 확인할 수 있습니다. 각 작업은 번호와 상태가 함께 표시됩니다.

    jobs
  2. 특정 작업 종료:
    kill 명령어와 함께 %작업번호를 사용하여 특정 백그라운드 작업을 종료합니다. 예를 들어, 첫 번째 백그라운드 작업을 종료하고 싶다면 다음과 같이 입력합니다:

    kill %1

    여러 작업을 동시에 종료하려면 각 작업 번호를 나열하면 됩니다:

    kill %1 %2

2. pkill 또는 killall 명령어 사용

명령어의 이름이나 프로세스 이름을 기반으로 모든 관련 프로세스를 종료할 수 있습니다. 예를 들어, ros2 bag play로 시작된 모든 프로세스를 종료하려면:

  • pkill 사용:

    pkill -f "ros2 bag play"

    여기서 -f 옵션은 주어진 문자열이 프로세스의 명령 라인 전체와 일치하는지 확인합니다.

  • killall 사용:

    killall -r "ros2 bag play"

    -r 옵션은 정규 표현식을 사용하여 이름을 매칭시킵니다.

이러한 명령어들을 사용할 때 주의할 점은, 다른 중요한 프로세스가 우연히 같은 이름을 사용하고 있을 경우에도 영향을 받을 수 있다는 것입니다. 따라서 프로세스를 종료하기 전에 정확히 어떤 프로세스가 종료될지 확인하는 것이 좋습니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글