bagファイルを読み込んで再生させると永久ループしてしまうので,ループさせずに終わらせる方法を紹介します.
bagファイルを読み込むコードはRealsenseの公式サンプルコードが参考になります.
Example: Read Bag File
ループフラグをFalseに設定
永久ループされてしまう原因は以下のbagファイルを読み込んでいる部分にあります.
rs.config.enable_device_from_file(config, file_name)
このenable_device_from_file関数にはrepeat_playbackというbool型のデフォルト引数があり初期値はTrueに設定されています.
このrepeat_playbackがTrueに設定されていると,ループ再生されてしまいます.
そのため,Falseに設定することでループ再生は解消されます.
rs.config.enable_device_from_file(config, file_name, repeat_playback=False)
出典:Pyrealsense2 Documents: pyrealsense2.config
しかし,Falseに設定したことで次のようなエラーが発生してしまうかと思います.
Traceback (most recent call last):
File "/Users/user/realsense/play_bug.py", line 54, in <module>
frames = pipeline.wait_for_frames()
RuntimeError: Frame didn't arrive within 5000
このエラーの解消方法について説明します.
タイムアウトエラーの解消
エラー文にもあるようにエラーの原因はwait_for_frames関数のタイムアウトによるものです.
frames = pipeline.wait_for_frames()
wait_for_frames関数は次のフレームが利用できるようになるまで待ち続ける関数で,timeout_msというint型のデフォルト引数があり,初期値は5000に設定されています.
そのため,5000ms待っても次のフレームがなければ,タイムアウトエラーとなります.
解消方法として,wait_for_frames関数の代わりにtry_wait_for_frames関数を使うか,try-except構文で処理する方法が考えられます.
try_wait_for_frames関数を使う場合は,次のように書くことでタイムアウトエラーに陥ることを解消できます.
while Ture:
flag,frames = pipeline.try_wait_for_frames()
if flag == False: break
try-except構文で処理する場合は,次のように書くことでタイムアウトエラーに陥ることを解消できます.
while Ture:
try: frames = pipeline.wait_for_frames()
except: break