Skip to content

Commit dc03ebd

Browse files
šŸ› Fix the robot visualization when the dataset contains signals retrieved at different frequencies (#72)
1 parent e12cce5 commit dc03ebd

File tree

3 files changed

+52
-38
lines changed

3 files changed

+52
-38
lines changed

ā€Žrobot_log_visualizer/file_reader/signal_provider.pyā€Ž

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ def index(self, index):
193193
def register_update_index(self, slot):
194194
self.update_index_signal.connect(slot)
195195

196+
def set_dataset_percentage(self, percentage):
197+
self.update_index(int(percentage * len(self)))
198+
196199
def update_index(self, index):
197200
locker = QMutexLocker(self.index_lock)
198201
self._index = max(min(index, len(self.timestamps) - 1), 0)
@@ -204,6 +207,19 @@ def current_time(self):
204207
value = self._current_time
205208
return value
206209

210+
def get_joints_position(self):
211+
return self.data[self.root_name]["joints_state"]["positions"]["data"]
212+
213+
def get_joints_position_at_index(self, index):
214+
joints_position_timestamps = self.data[self.root_name]["joints_state"][
215+
"positions"
216+
]["timestamps"]
217+
# given the index find the closest timestamp
218+
closest_index = np.argmin(
219+
np.abs(joints_position_timestamps - self.timestamps[index])
220+
)
221+
return self.get_joints_position()[closest_index, :]
222+
207223
def run(self):
208224
while True:
209225
start = time.time()

ā€Žrobot_log_visualizer/robot_visualizer/meshcat_provider.pyā€Ž

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,12 @@ def run(self):
149149

150150
if self.state == PeriodicThreadState.running and self._is_model_loaded:
151151
# These are the robot measured joint positions in radians
152-
joints = self._signal_provider.data[self._signal_provider.root_name][
153-
"joints_state"
154-
]["positions"]["data"]
155-
156152
self.meshcat_visualizer.set_multibody_system_state(
157153
base_position,
158154
base_rotation,
159-
joint_value=joints[
160-
self._signal_provider.index, self.model_joints_index
161-
],
155+
joint_value=self._signal_provider.get_joints_position_at_index(
156+
self._signal_provider.index
157+
)[self.model_joints_index],
162158
model_name="robot",
163159
)
164160

ā€Žrobot_log_visualizer/ui/gui.pyā€Ž

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,10 @@ def keyPressEvent(self, event):
246246
if event.key() == Qt.Key_B:
247247
self.slider_pressed = True
248248
new_index = int(self.ui.timeSlider.value()) - 1
249-
self.signal_provider.update_index(new_index)
249+
dataset_percentage = float(new_index) / float(
250+
self.ui.timeSlider.maximum()
251+
)
252+
self.signal_provider.set_dataset_percentage(dataset_percentage)
250253
self.ui.timeLabel.setText(f"{self.signal_provider.current_time:.2f}")
251254
self.text_logger.highlight_cell(
252255
self.find_text_log_index(self.get_text_log_item_path())
@@ -255,11 +258,8 @@ def keyPressEvent(self, event):
255258
# for every video item we set the instant
256259
for video_item in self.video_items:
257260
if video_item.media_loaded:
258-
video_percentage = float(new_index) / float(
259-
self.ui.timeSlider.maximum()
260-
)
261261
video_item.media_player.setPosition(
262-
int(video_percentage * video_item.media_player.duration())
262+
int(dataset_percentage * video_item.media_player.duration())
263263
)
264264

265265
# update the time slider
@@ -268,7 +268,10 @@ def keyPressEvent(self, event):
268268
elif event.key() == Qt.Key_F:
269269
self.slider_pressed = True
270270
new_index = int(self.ui.timeSlider.value()) + 1
271-
self.signal_provider.update_index(new_index)
271+
dataset_percentage = float(new_index) / float(
272+
self.ui.timeSlider.maximum()
273+
)
274+
self.signal_provider.set_dataset_percentage(dataset_percentage)
272275
self.ui.timeLabel.setText(f"{self.signal_provider.current_time:.2f}")
273276
self.text_logger.highlight_cell(
274277
self.find_text_log_index(self.get_text_log_item_path())
@@ -277,11 +280,8 @@ def keyPressEvent(self, event):
277280
# for every video item we set the instant
278281
for video_item in self.video_items:
279282
if video_item.media_loaded:
280-
video_percentage = float(new_index) / float(
281-
self.ui.timeSlider.maximum()
282-
)
283283
video_item.media_player.setPosition(
284-
int(video_percentage * video_item.media_player.duration())
284+
int(dataset_percentage * video_item.media_player.duration())
285285
)
286286

287287
self.ui.timeSlider.setValue(new_index)
@@ -303,31 +303,31 @@ def timeSlider_on_pressed(self):
303303

304304
def timeSlider_on_sliderMoved(self):
305305
index = int(self.ui.timeSlider.value())
306+
dataset_percentage = float(index) / float(self.ui.timeSlider.maximum())
306307

307308
for video_item in self.video_items:
308309
if video_item.media_loaded:
309-
video_percentage = float(index) / float(self.ui.timeSlider.maximum())
310310
video_item.media_player.setPosition(
311-
int(video_percentage * video_item.media_player.duration())
311+
int(dataset_percentage * video_item.media_player.duration())
312312
)
313313

314-
self.signal_provider.update_index(index)
314+
self.signal_provider.set_dataset_percentage(dataset_percentage)
315315
self.ui.timeLabel.setText(f"{self.signal_provider.current_time:.2f}")
316316
self.text_logger.highlight_cell(
317317
self.find_text_log_index(self.get_text_log_item_path())
318318
)
319319

320320
def timeSlider_on_release(self):
321321
index = int(self.ui.timeSlider.value())
322+
dataset_percentage = float(index) / float(self.ui.timeSlider.maximum())
322323

323324
for video_item in self.video_items:
324325
if video_item.media_loaded:
325-
video_percentage = float(index) / float(self.ui.timeSlider.maximum())
326326
video_item.media_player.setPosition(
327-
int(video_percentage * video_item.media_player.duration())
327+
int(dataset_percentage * video_item.media_player.duration())
328328
)
329329

330-
self.signal_provider.update_index(index)
330+
self.signal_provider.set_dataset_percentage(dataset_percentage)
331331
self.ui.timeLabel.setText(f"{self.signal_provider.current_time:.2f}")
332332
self.text_logger.highlight_cell(
333333
self.find_text_log_index(self.get_text_log_item_path())
@@ -475,22 +475,24 @@ def plotTabBar_currentChanged(self, index):
475475

476476
@pyqtSlot()
477477
def update_index(self):
478-
if not self.slider_pressed:
479-
self.ui.timeSlider.setValue(self.signal_provider.index)
480-
self.ui.timeLabel.setText(f"{self.signal_provider.current_time:.2f}")
481-
self.text_logger.highlight_cell(
482-
self.find_text_log_index(self.get_text_log_item_path())
483-
)
478+
if self.slider_pressed:
479+
return
484480

485-
# TODO: this is a hack to update the video player and it should be done only for the activated videos
486-
for video_item in self.video_items:
487-
if video_item.media_loaded:
488-
video_percentage = float(self.ui.timeSlider.value()) / float(
489-
self.ui.timeSlider.maximum()
490-
)
491-
video_item.media_player.setPosition(
492-
int(video_percentage * video_item.media_player.duration())
493-
)
481+
self.ui.timeSlider.setValue(self.signal_provider.index)
482+
self.ui.timeLabel.setText(f"{self.signal_provider.current_time:.2f}")
483+
self.text_logger.highlight_cell(
484+
self.find_text_log_index(self.get_text_log_item_path())
485+
)
486+
487+
# TODO: this is a hack to update the video player and it should be done only for the activated videos
488+
for video_item in self.video_items:
489+
if video_item.media_loaded:
490+
video_percentage = float(self.ui.timeSlider.value()) / float(
491+
self.ui.timeSlider.maximum()
492+
)
493+
video_item.media_player.setPosition(
494+
int(video_percentage * video_item.media_player.duration())
495+
)
494496

495497
def closeEvent(self, event):
496498
# close the window

0 commit comments

Comments
Ā (0)