Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
241 changes: 0 additions & 241 deletions dimos/manipulation/visualization/viser/adapter.py

This file was deleted.

33 changes: 27 additions & 6 deletions dimos/manipulation/visualization/viser/animation.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,31 @@
from __future__ import annotations

from collections.abc import Callable, Sequence
from dataclasses import dataclass
import time

from dimos.manipulation.planning.spec.models import PlanningGroupID
from dimos.msgs.sensor_msgs.JointState import JointState


@dataclass(frozen=True)
class PreviewTrack:
"""One render track owned by one or more planning groups."""

robot_id: str
group_ids: tuple[PlanningGroupID, ...]
joint_names: tuple[str, ...]
path: tuple[JointState, ...]


@dataclass(frozen=True)
class GroupPreviewAnimation:
"""Group-native preview transaction for a generated plan."""

group_ids: tuple[PlanningGroupID, ...]
tracks: tuple[PreviewTrack, ...]


def interpolate_joint_path(
path: Sequence[JointState], duration: float, fps: float
) -> list[list[float]]:
Expand Down Expand Up @@ -57,10 +77,10 @@ def sampled_joint_path_frames(
) -> list[list[float]]:
"""Return animation frames while preserving already sampled trajectories.

ManipulationModule.preview_path() owns trajectory-aware interpolation because it has access
to JointTrajectory waypoint timing. If a path arrives already sampled near the target display
rate, Viser should play those samples directly instead of re-interpolating by waypoint index.
Sparse direct VisualizationSpec callers still get local interpolation as a fallback.
ViserManipulationVisualizer.animate_plan() projects GeneratedPlan waypoints into robot-local
preview paths. If a path arrives already sampled near the target display rate, Viser should
play those samples directly instead of re-interpolating by waypoint index. Sparse direct scene
callers still get local interpolation as a fallback.
"""
waypoints = [list(waypoint.position) for waypoint in path if waypoint.position]
if not waypoints:
Expand Down Expand Up @@ -92,7 +112,8 @@ def animate(self, path: Sequence[JointState], duration: float, fps: float) -> bo
if not frames:
return False
step_delay = duration / max(len(frames) - 1, 1) if duration > 0.0 else 0.0
for joints in frames:
for index, joints in enumerate(frames):
self._set_joints(joints)
self._sleep(step_delay)
if index < len(frames) - 1:
self._sleep(step_delay)
return True
Loading
Loading