mirror of
https://github.com/huggingface/lerobot.git
synced 2026-07-21 17:01:53 +00:00
fix(process init timeout): adding proper support when waiting for record process initialization
This commit is contained in:
@@ -269,12 +269,14 @@ class PortAudioMicrophone(Microphone):
|
|||||||
|
|
||||||
# Create and start an audio input stream with a recording callback
|
# Create and start an audio input stream with a recording callback
|
||||||
# Remark: this is done in a separate process so that audio recording is not impacted by the main thread CPU usage, especially the busy_wait function.
|
# Remark: this is done in a separate process so that audio recording is not impacted by the main thread CPU usage, especially the busy_wait function.
|
||||||
|
process_init_event = process_Event()
|
||||||
self.record_process = Process(
|
self.record_process = Process(
|
||||||
target=self._record_process,
|
target=self._record_process,
|
||||||
args=(
|
args=(
|
||||||
self.microphone_index,
|
self.microphone_index,
|
||||||
self.sample_rate,
|
self.sample_rate,
|
||||||
self.channels,
|
self.channels,
|
||||||
|
process_init_event,
|
||||||
self.record_start_event,
|
self.record_start_event,
|
||||||
self.record_stop_event,
|
self.record_stop_event,
|
||||||
self.record_close_event,
|
self.record_close_event,
|
||||||
@@ -288,10 +290,10 @@ class PortAudioMicrophone(Microphone):
|
|||||||
self.record_process.daemon = True
|
self.record_process.daemon = True
|
||||||
self.record_process.start()
|
self.record_process.start()
|
||||||
|
|
||||||
time.sleep(
|
is_init = process_init_event.wait(
|
||||||
0.1
|
timeout=5.0
|
||||||
) # Wait for the recording process to be started, and to potentially raise an error on failure.
|
) # Wait for the recording process to be started, and to potentially raise an error on failure.
|
||||||
if not self.is_connected:
|
if not self.is_connected or not is_init:
|
||||||
raise RuntimeError(f"Error connecting microphone {self.microphone_index}.")
|
raise RuntimeError(f"Error connecting microphone {self.microphone_index}.")
|
||||||
|
|
||||||
logger.info(f"{self} connected.")
|
logger.info(f"{self} connected.")
|
||||||
@@ -348,6 +350,7 @@ class PortAudioMicrophone(Microphone):
|
|||||||
microphone_index,
|
microphone_index,
|
||||||
sample_rate,
|
sample_rate,
|
||||||
channels,
|
channels,
|
||||||
|
process_init_event,
|
||||||
record_start_event,
|
record_start_event,
|
||||||
record_stop_event,
|
record_stop_event,
|
||||||
record_close_event,
|
record_close_event,
|
||||||
@@ -386,6 +389,7 @@ class PortAudioMicrophone(Microphone):
|
|||||||
# never_drop_input=True, # Disabled as it generates an error for some devices
|
# never_drop_input=True, # Disabled as it generates an error for some devices
|
||||||
callback=audio_callback,
|
callback=audio_callback,
|
||||||
)
|
)
|
||||||
|
process_init_event.set()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
start_flag = record_start_event.wait(timeout=0.1)
|
start_flag = record_start_event.wait(timeout=0.1)
|
||||||
|
|||||||
@@ -173,12 +173,14 @@ class TouchLabSensor(Microphone):
|
|||||||
|
|
||||||
# Create and start an audio input stream with a recording callback
|
# Create and start an audio input stream with a recording callback
|
||||||
# Remark: this is done in a separate process so that audio recording is not impacted by the main thread CPU usage, especially the busy_wait function.
|
# Remark: this is done in a separate process so that audio recording is not impacted by the main thread CPU usage, especially the busy_wait function.
|
||||||
|
process_init_event = process_Event()
|
||||||
self.record_process = Process(
|
self.record_process = Process(
|
||||||
target=self._record_process,
|
target=self._record_process,
|
||||||
args=(
|
args=(
|
||||||
self.sensor_port,
|
self.sensor_port,
|
||||||
self.baud_rate,
|
self.baud_rate,
|
||||||
self.channels,
|
self.channels,
|
||||||
|
process_init_event,
|
||||||
self.record_start_event,
|
self.record_start_event,
|
||||||
self.record_stop_event,
|
self.record_stop_event,
|
||||||
self.record_close_event,
|
self.record_close_event,
|
||||||
@@ -191,10 +193,10 @@ class TouchLabSensor(Microphone):
|
|||||||
self.record_process.daemon = True
|
self.record_process.daemon = True
|
||||||
self.record_process.start()
|
self.record_process.start()
|
||||||
|
|
||||||
time.sleep(
|
is_init = process_init_event.wait(
|
||||||
0.1
|
timeout=5.0
|
||||||
) # Wait for the recording process to be started, and to potentially raise an error on failure.
|
) # Wait for the recording process to be started, and to potentially raise an error on failure.
|
||||||
if not self.is_connected:
|
if not self.is_connected or not is_init:
|
||||||
raise RuntimeError(f"Error connecting sensor connected to {self.sensor_port}.")
|
raise RuntimeError(f"Error connecting sensor connected to {self.sensor_port}.")
|
||||||
|
|
||||||
logger.info(f"{self} connected.")
|
logger.info(f"{self} connected.")
|
||||||
@@ -204,6 +206,7 @@ class TouchLabSensor(Microphone):
|
|||||||
sensor_port,
|
sensor_port,
|
||||||
baud_rate,
|
baud_rate,
|
||||||
channels,
|
channels,
|
||||||
|
process_init_event,
|
||||||
record_start_event,
|
record_start_event,
|
||||||
record_stop_event,
|
record_stop_event,
|
||||||
record_close_event,
|
record_close_event,
|
||||||
@@ -233,6 +236,8 @@ class TouchLabSensor(Microphone):
|
|||||||
write_queue.put_nowait(indata[:, channels_index])
|
write_queue.put_nowait(indata[:, channels_index])
|
||||||
read_shared_array.write(local_read_shared_array, indata[:, channels_index])
|
read_shared_array.write(local_read_shared_array, indata[:, channels_index])
|
||||||
|
|
||||||
|
process_init_event.set()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
start_flag = record_start_event.wait(timeout=0.1)
|
start_flag = record_start_event.wait(timeout=0.1)
|
||||||
if record_close_event.is_set():
|
if record_close_event.is_set():
|
||||||
|
|||||||
@@ -355,7 +355,11 @@ def record_loop(
|
|||||||
async_microphones_start_recording(robot.microphones)
|
async_microphones_start_recording(robot.microphones)
|
||||||
|
|
||||||
# Fill audio buffers if needed
|
# Fill audio buffers if needed
|
||||||
if robot.microphones and (policy is not None or dataset is not None):
|
if (
|
||||||
|
robot.microphones
|
||||||
|
and (policy is not None or dataset is not None)
|
||||||
|
and DEFAULT_INITIAL_AUDIO_BUFFER_DURATION > 0.0
|
||||||
|
):
|
||||||
# This initial wait might be longer than the audio chunk duration to
|
# This initial wait might be longer than the audio chunk duration to
|
||||||
# (1) ensure that the audio buffers are filled with enough data
|
# (1) ensure that the audio buffers are filled with enough data
|
||||||
# (2) add additional initial samples to the dataset in case of variable audio chunk duration during training
|
# (2) add additional initial samples to the dataset in case of variable audio chunk duration during training
|
||||||
|
|||||||
Reference in New Issue
Block a user