source /opt/ros/<distro>/setup.bash
실행ros2 bag record -o <bag_name> /topic1 /topic2
<bag_name>
: 생성할 bag 파일의 이름입니다./topic1
, /topic2
: 기록하고 싶은 토픽 이름입니다. 필요한 모든 토픽을 나열할 수 있습니다.기록된 데이터를 재생하려면 다음 단계를 따르세요:
ros2 bag play <bag_name>
<bag_name>
: 재생할 bag 파일의 이름입니다.ros2 bag info <bag_name>
ros2 bag play <bag_name> -t /topic1
tf2_ros.TransformBroadcaster
를 사용하여 특정 RGBD 카메라의 위치 및 회전 데이터를 ROS 2 토픽에 발행하는 것을 보여줍니다. TransformBroadcaster
는 일반적으로 /tf
나 /tf_static
토픽에 데이터를 발행ros2 topic list
ros2 bag record /tf -o my_rosbag
-o my_rosbag
는 저장할 bag 파일의 이름을 my_rosbag
로 설정합니다..db3
형식의 bag 파일이 생성됩니다. 이 파일 내에 어떤 데이터가 저장되었는지 확인하고 싶다면, 다음과 같은 명령어를 사용할 수 있습니다.ros2 bag info my_rosbag
rosbag2_py
라이브러리가 ROS 2 Foxy 버전에 대해 바이너리 형태로 제공되지 않는다는 것을 설명하고 있습니다. rosbag2_py
의 리포지토리에는 Foxy 버전에 맞는 코드 브랜치가 존재한다고 언급하고 있습니다.rosbag2_py
라이브러리를 사용할 수 있도록 설정해야 합니다. 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_py
의 SequentialWriter
를 사용하여 topic1
토픽으로 몇 개의 메시지를 기록SequentialWriter
는 데이터를 순차적으로 bag 파일에 기록rosbag2_py
라이브러리를 사용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
메소드를 통해 읽고자 하는 특정 토픽을 필터링rosbag2_py.StorageOptions
StorageOptions
클래스는 ROS bag 파일의 저장소에 관련된 설정을 정의uri
(string): bag 파일의 저장 위치 또는 읽기 위치storage_id
(string): rosbag2_py.ConverterOptions
ConverterOptions
클래스는 메시지 데이터의 직렬화 및 역직렬화 포맷을 설정input_serialization_format
(string): output_serialization_format
(string): rosbag2_py.SequentialReader
SequentialReader
클래스는 bag 파일의 데이터를 순차적으로 읽는 데 사용open(storage_options, converter_options)
:StorageOptions
와 ConverterOptions
를 사용하여 bag 파일을 염has_next()
: True
, 없으면 False
를 반환read_next()
: set_filter(topics)
: rosbag2_py.BatchReader
사용 방법BatchReader
클래스를 사용하면 데이터를 순차적으로 한 번에 하나씩 처리하는 것이 아니라, 한 번에 여러 메시지를 가져와 처리할 수 있습니다. 이는 특히 대량의 데이터를 빠르게 처리해야 할 때 유용합니다.
기본 사용 예제:
import rosbag2_py
# Bag 파일 설정
bag_file_path = 'path/to/your/bagfile'
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.BatchReader()
reader.open(storage_options, converter_options)
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)
메서드를 사용하여 설정할 수 있습니다.
BatchReader
는 rosbag2_py
라이브러리의 일부로, 이 기능이 ROS 2 버전에 따라 다를 수 있으므로, 사용하기 전에 관련 라이브러리와 도구가 최신 상태인지 확인하시는 것이 좋습니다.
ros2 bag play
명령을 사용하여 데이터를 다시 게시하고, RViz2에서 이 데이터를 구독하여 시각화할 수 있음rviz2
Fixed Frame
을 올바르게 설정해야 합니다. base_link
또는 odom
)이 될 수 있습니다.Add
버튼을 클릭하여 각 데이터 타입에 맞는 Display를 추가합니다. 예를 들어:Camera
display를 추가하고, Image Topic
을 /camera/rgb/image_raw/compressed
또는 /camera/depth/image_raw/compressed
로 설정TF
display를 추가Pose
display를 추가하고, Topic을 /camera/pose
로 설정ros2 bag play
를 실행한 상태에서 RViz2에서 정확한 토픽을 구독하면, 실시간으로 데이터가 시각화됩니다.
혹시 ros2 foxy에서 bag파일(db3)을 pcd파일로 바꾸는 방법이 따로 있나요?