Skip to content
Merged
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
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ dimos restart # stop + re-run with same original args
| `unitree-g1-agentic-sim` | G1 | sim | GPT-4o (G1 prompt) | — | Full agentic sim, no real robot needed |
| `xarm-perception-agent` | xArm | real | GPT-4o | — | Manipulation + perception + agent |
| `xarm7-trajectory-sim` | xArm7 | sim | — | — | Trajectory planning sim |
| `arm-teleop-xarm7` | xArm7 | real | — | — | Quest VR teleop |
| `teleop-quest-xarm7` | xArm7 | real | — | — | Quest VR teleop |
| `dual-xarm6-planner` | xArm6×2 | real | — | — | Dual-arm motion planner |

Run `dimos list` for the full list.
Expand Down
16 changes: 7 additions & 9 deletions dimos/robot/all_blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@
# Run `pytest dimos/robot/test_all_blueprints_generation.py` to regenerate.

all_blueprints = {
"arm-teleop": "dimos.teleop.quest.blueprints:arm_teleop",
"arm-teleop-dual": "dimos.teleop.quest.blueprints:arm_teleop_dual",
"arm-teleop-piper": "dimos.teleop.quest.blueprints:arm_teleop_piper",
"arm-teleop-visualizing": "dimos.teleop.quest.blueprints:arm_teleop_visualizing",
"arm-teleop-xarm7": "dimos.teleop.quest.blueprints:arm_teleop_xarm7",
"coordinator-basic": "dimos.control.blueprints:coordinator_basic",
"coordinator-cartesian-ik-mock": "dimos.control.blueprints:coordinator_cartesian_ik_mock",
"coordinator-cartesian-ik-piper": "dimos.control.blueprints:coordinator_cartesian_ik_piper",
Expand Down Expand Up @@ -60,9 +55,13 @@
"mid360-fastlio": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio",
"mid360-fastlio-voxels": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio_voxels",
"mid360-fastlio-voxels-native": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio_voxels_native",
"phone-go2-fleet-teleop": "dimos.teleop.phone.blueprints:phone_go2_fleet_teleop",
"phone-go2-teleop": "dimos.teleop.phone.blueprints:phone_go2_teleop",
"simple-phone-teleop": "dimos.teleop.phone.blueprints:simple_phone_teleop",
"teleop-phone": "dimos.teleop.phone.blueprints:teleop_phone",
"teleop-phone-go2": "dimos.teleop.phone.blueprints:teleop_phone_go2",
"teleop-phone-go2-fleet": "dimos.teleop.phone.blueprints:teleop_phone_go2_fleet",
"teleop-quest-dual": "dimos.teleop.quest.blueprints:teleop_quest_dual",
"teleop-quest-piper": "dimos.teleop.quest.blueprints:teleop_quest_piper",
"teleop-quest-rerun": "dimos.teleop.quest.blueprints:teleop_quest_rerun",
"teleop-quest-xarm7": "dimos.teleop.quest.blueprints:teleop_quest_xarm7",
"uintree-g1-primitive-no-nav": "dimos.robot.unitree.g1.blueprints.primitive.uintree_g1_primitive_no_nav:uintree_g1_primitive_no_nav",
"unitree-g1": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1:unitree_g1",
"unitree-g1-agentic": "dimos.robot.unitree.g1.blueprints.agentic.unitree_g1_agentic:unitree_g1_agentic",
Expand Down Expand Up @@ -143,7 +142,6 @@
"temporal-memory": "dimos.perception.experimental.temporal_memory.temporal_memory",
"twist-teleop-module": "dimos.teleop.quest.quest_extensions",
"unitree-skills": "dimos.robot.unitree.unitree_skill_container",
"visualizing-teleop-module": "dimos.teleop.quest.quest_extensions",
"vlm-agent": "dimos.agents.vlm_agent",
"vlm-stream-tester": "dimos.agents.vlm_stream_tester",
"voxel-mapper": "dimos.mapping.voxels",
Expand Down
10 changes: 3 additions & 7 deletions dimos/teleop/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@ Toggle-based engage — press primary button once to engage, press again to dise
### TwistTeleopModule
Outputs TwistStamped (linear + angular velocity) instead of PoseStamped.

### VisualizingTeleopModule
Adds Rerun visualization for debugging. Extends ArmTeleopModule (toggle engage).

### PhoneTeleopModule
Base phone teleop module. Receives orientation + gyro data from phone motion sensors, computes velocity commands from orientation deltas.

Expand Down Expand Up @@ -68,7 +65,7 @@ Filters to mobile-base axes (linear.x, linear.y, angular.z) and publishes as `Tw
teleop/
├── quest/
│ ├── quest_teleop_module.py # Base Quest teleop module
│ ├── quest_extensions.py # ArmTeleop, TwistTeleop, VisualizingTeleop
│ ├── quest_extensions.py # ArmTeleop, TwistTeleop
│ ├── quest_types.py # QuestControllerState, Buttons
│ └── web/
│ └── static/index.html # WebXR client
Expand All @@ -80,15 +77,14 @@ teleop/
│ └── static/index.html # Mobile sensor web app
├── utils/
│ ├── teleop_transforms.py # WebXR → robot frame math
│ └── teleop_visualization.py # Rerun visualization helpers
└── blueprints.py # Module blueprints for easy instantiation
```

## Quick Start

```bash
dimos run arm-teleop # Quest arm teleop
dimos run phone-go2-teleop # Phone → Go2
dimos run teleop-quest-rerun # Quest teleop + Rerun viz
dimos run teleop-phone-go2 # Phone → Go2
```

Open `https://<host-ip>:<port>/teleop` on device. Accept the self-signed certificate.
Expand Down
4 changes: 2 additions & 2 deletions dimos/teleop/phone/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ Phone Browser ──WebSocket──→ Embedded HTTPS Server ──→ Phone
## Running

```bash
dimos run phone-go2-teleop # Go2
dimos run simple-phone-teleop # Generic ground robot
dimos run teleop-phone-go2 # Go2
dimos run teleop-phone # Generic ground robot
```

Open `https://<host-ip>:8444/teleop` on phone. Accept cert, allow sensors, connect, hold to drive.
Expand Down
8 changes: 4 additions & 4 deletions dimos/teleop/phone/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@
from dimos.teleop.phone.phone_extensions import simple_phone_teleop_module

# Simple phone teleop (mobile base axis filtering + cmd_vel output)
simple_phone_teleop = autoconnect(
teleop_phone = autoconnect(
simple_phone_teleop_module(),
)

# Phone teleop wired to Unitree Go2
phone_go2_teleop = autoconnect(
teleop_phone_go2 = autoconnect(
simple_phone_teleop_module(),
unitree_go2_basic,
)

# Phone teleop wired to Go2 fleet — twist commands sent to all robots
phone_go2_fleet_teleop = autoconnect(
teleop_phone_go2_fleet = autoconnect(
simple_phone_teleop_module(),
unitree_go2_fleet,
)


__all__ = ["phone_go2_fleet_teleop", "phone_go2_teleop", "simple_phone_teleop"]
__all__ = ["teleop_phone", "teleop_phone_go2", "teleop_phone_go2_fleet"]
10 changes: 5 additions & 5 deletions dimos/teleop/quest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ Quest Browser ──WebSocket──→ Embedded HTTPS Server ──→ Quest
## Running

```bash
dimos run arm-teleop # Basic arm teleop
dimos run arm-teleop-xarm6 # XArm6
dimos run arm-teleop-piper # Piper
dimos run arm-teleop-dual # Dual arm
dimos run teleop-quest-rerun # Quest teleop + Rerun viz
dimos run teleop-quest-xarm7 # XArm7
dimos run teleop-quest-piper # Piper
dimos run teleop-quest-dual # Dual arm
```

Open `https://<host-ip>:8443/teleop` on Quest browser. Accept cert, tap Connect.
Expand All @@ -42,7 +42,7 @@ Open `https://<host-ip>:8443/teleop` on Quest browser. Accept cert, tap Connect.
```
quest/
├── quest_teleop_module.py # Base module
├── quest_extensions.py # ArmTeleop, TwistTeleop, VisualizingTeleop
├── quest_extensions.py # ArmTeleop, TwistTeleop
├── quest_types.py # QuestControllerState, Buttons
├── blueprints.py
└── web/static/index.html # WebXR client
Expand Down
37 changes: 12 additions & 25 deletions dimos/teleop/quest/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,14 @@
from dimos.core.blueprints import autoconnect
from dimos.core.transport import LCMTransport
from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped
from dimos.teleop.quest.quest_extensions import arm_teleop_module, visualizing_teleop_module
from dimos.teleop.quest.quest_extensions import arm_teleop_module
from dimos.teleop.quest.quest_types import Buttons
from dimos.visualization.rerun.bridge import rerun_bridge

# Arm teleop with press-and-hold engage
arm_teleop = autoconnect(
# Arm teleop with press-and-hold engage (has rerun viz)
teleop_quest_rerun = autoconnect(
arm_teleop_module(),
).transports(
{
("left_controller_output", PoseStamped): LCMTransport("/teleop/left_delta", PoseStamped),
("right_controller_output", PoseStamped): LCMTransport("/teleop/right_delta", PoseStamped),
("buttons", Buttons): LCMTransport("/teleop/buttons", Buttons),
}
)

# Arm teleop with Rerun visualization
arm_teleop_visualizing = autoconnect(
visualizing_teleop_module(),
rerun_bridge(),
).transports(
{
("left_controller_output", PoseStamped): LCMTransport("/teleop/left_delta", PoseStamped),
Expand All @@ -50,9 +41,7 @@


# Single XArm7 teleop: right controller -> xarm7
# Usage: dimos run arm-teleop-xarm7

arm_teleop_xarm7 = autoconnect(
teleop_quest_xarm7 = autoconnect(
arm_teleop_module(task_names={"right": "teleop_xarm"}),
coordinator_teleop_xarm7,
).transports(
Expand All @@ -66,8 +55,7 @@


# Single Piper teleop: left controller -> piper arm
# Usage: dimos run arm-teleop-piper
arm_teleop_piper = autoconnect(
teleop_quest_piper = autoconnect(
arm_teleop_module(task_names={"left": "teleop_piper"}),
coordinator_teleop_piper,
).transports(
Expand All @@ -81,7 +69,7 @@


# Dual arm teleop: right -> piper, left -> xarm6 (TeleopIK)
arm_teleop_dual = autoconnect(
teleop_quest_dual = autoconnect(
arm_teleop_module(task_names={"right": "teleop_piper", "left": "teleop_xarm"}),
coordinator_teleop_dual,
).transports(
Expand All @@ -98,9 +86,8 @@


__all__ = [
"arm_teleop",
"arm_teleop_dual",
"arm_teleop_piper",
"arm_teleop_visualizing",
"arm_teleop_xarm7",
"teleop_quest_dual",
"teleop_quest_piper",
"teleop_quest_rerun",
"teleop_quest_xarm7",
]
42 changes: 0 additions & 42 deletions dimos/teleop/quest/quest_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
Available subclasses:
- ArmTeleopModule: Per-hand press-and-hold engage (X/A hold to track), task name routing
- TwistTeleopModule: Outputs Twist instead of PoseStamped
- VisualizingTeleopModule: Adds Rerun visualization (inherits press-and-hold engage)
"""

from typing import Any
Expand All @@ -29,10 +28,6 @@
from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped
from dimos.teleop.quest.quest_teleop_module import Hand, QuestTeleopConfig, QuestTeleopModule
from dimos.teleop.quest.quest_types import Buttons, QuestControllerState
from dimos.teleop.utils.teleop_visualization import (
visualize_buttons,
visualize_pose,
)


class TwistTeleopConfig(QuestTeleopConfig):
Expand Down Expand Up @@ -138,51 +133,14 @@ def _publish_button_state(
self.buttons.publish(buttons)


class VisualizingTeleopModule(ArmTeleopModule):
"""Quest teleop with Rerun visualization.

Adds visualization of controller poses and trigger values to Rerun.
Useful for debugging and development.

Outputs:
- left_controller_output: PoseStamped (inherited)
- right_controller_output: PoseStamped (inherited)
- buttons: Buttons (inherited)
"""

def _get_output_pose(self, hand: Hand) -> PoseStamped | None:
"""Get output pose and visualize in Rerun."""
output_pose = super()._get_output_pose(hand)

if output_pose is not None:
current_pose = self._current_poses.get(hand)
controller = self._controllers.get(hand)
if current_pose is not None:
label = "left" if hand == Hand.LEFT else "right"
visualize_pose(current_pose, label)

if controller:
visualize_buttons(
label,
primary=controller.primary,
secondary=controller.secondary,
grip=controller.grip,
trigger=controller.trigger,
)
return output_pose


# Module blueprints for easy instantiation
twist_teleop_module = TwistTeleopModule.blueprint
arm_teleop_module = ArmTeleopModule.blueprint
visualizing_teleop_module = VisualizingTeleopModule.blueprint

__all__ = [
"ArmTeleopConfig",
"ArmTeleopModule",
"TwistTeleopModule",
"VisualizingTeleopModule",
"arm_teleop_module",
"twist_teleop_module",
"visualizing_teleop_module",
]
59 changes: 0 additions & 59 deletions dimos/teleop/utils/teleop_visualization.py

This file was deleted.

Loading