From 533494a3ec468fe1121005e1173b49541039ae3f Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 19 Mar 2026 08:31:44 +0200 Subject: [PATCH] chore(blueprints): remove aliases --- dimos/agents/agent.py | 5 - dimos/agents/demo_agent.py | 4 +- dimos/agents/mcp/mcp_client.py | 5 - dimos/agents/skills/demo_calculator_skill.py | 5 - dimos/agents/skills/demo_google_maps_skill.py | 12 +- dimos/agents/skills/demo_gps_nav.py | 12 +- dimos/agents/skills/demo_robot.py | 6 - dimos/agents/skills/demo_skill.py | 8 +- .../skills/google_maps_skill_container.py | 5 - dimos/agents/skills/gps_nav_skill.py | 6 - dimos/agents/skills/navigation.py | 5 - dimos/agents/skills/osm.py | 5 - dimos/agents/skills/person_follow.py | 5 - dimos/agents/skills/speak_skill.py | 5 - dimos/agents/vlm_agent.py | 5 - dimos/agents/vlm_stream_tester.py | 5 - dimos/agents/web_human_input.py | 5 - dimos/control/README.md | 4 +- dimos/control/blueprints/basic.py | 12 +- dimos/control/blueprints/dual.py | 8 +- dimos/control/blueprints/mobile.py | 6 +- dimos/control/blueprints/teleop.py | 18 +-- dimos/control/coordinator.py | 13 -- .../examples/twist_base_keyboard_teleop.py | 4 +- dimos/core/test_blueprints.py | 23 ++- dimos/hardware/sensors/camera/module.py | 10 +- .../sensors/camera/realsense/camera.py | 5 - dimos/hardware/sensors/camera/zed/camera.py | 3 - dimos/hardware/sensors/camera/zed/compat.py | 25 ++-- .../lidar/fastlio2/fastlio_blueprints.py | 8 +- .../hardware/sensors/lidar/fastlio2/module.py | 8 - .../sensors/lidar/livox/livox_blueprints.py | 4 +- dimos/hardware/sensors/lidar/livox/module.py | 8 - dimos/manipulation/blueprints.py | 28 ++-- .../cartesian_motion_controller.py | 4 - .../joint_trajectory_controller.py | 4 - dimos/manipulation/grasping/demo_grasping.py | 20 +-- .../manipulation/grasping/graspgen_module.py | 3 - dimos/manipulation/grasping/grasping.py | 4 - dimos/manipulation/manipulation_module.py | 4 - dimos/manipulation/pick_and_place_module.py | 4 - dimos/mapping/costmapper.py | 3 - dimos/mapping/osm/demo_osm.py | 12 +- dimos/mapping/voxels.py | 3 - .../wavefront_frontier_goal_selector.py | 5 - dimos/navigation/replanning_a_star/module.py | 5 - dimos/navigation/rosnav.py | 6 - .../demo_object_scene_registration.py | 20 +-- dimos/perception/detection/module3D.py | 5 - dimos/perception/detection/moduleDB.py | 5 - dimos/perception/detection/person_tracker.py | 5 - .../temporal_memory/temporal_memory.py | 7 +- .../temporal_memory/temporal_utils/helpers.py | 2 +- dimos/perception/object_scene_registration.py | 5 - dimos/perception/object_tracker.py | 5 - dimos/perception/spatial_perception.py | 5 - dimos/robot/all_blueprints.py | 58 ++++--- .../drone/blueprints/agentic/drone_agentic.py | 8 +- .../drone/blueprints/basic/drone_basic.py | 12 +- dimos/robot/foxglove_bridge.py | 6 - dimos/robot/manipulators/piper/blueprints.py | 12 +- dimos/robot/manipulators/xarm/blueprints.py | 18 +-- dimos/robot/test_all_blueprints.py | 1 + dimos/robot/test_all_blueprints_generation.py | 141 ++++++++++++++---- .../g1/blueprints/agentic/_agentic_skills.py | 16 +- .../g1/blueprints/agentic/unitree_g1_full.py | 4 +- .../g1/blueprints/basic/unitree_g1_basic.py | 8 +- .../blueprints/basic/unitree_g1_basic_sim.py | 8 +- .../blueprints/basic/unitree_g1_joystick.py | 4 +- .../perceptive/_perception_and_memory.py | 8 +- .../perceptive/unitree_g1_detection.py | 12 +- .../blueprints/perceptive/unitree_g1_shm.py | 4 +- .../primitive/uintree_g1_primitive_no_nav.py | 30 ++-- dimos/robot/unitree/g1/connection.py | 6 - dimos/robot/unitree/g1/sim.py | 6 - dimos/robot/unitree/g1/skill_container.py | 4 - .../go2/blueprints/agentic/_common_agentic.py | 20 +-- .../blueprints/agentic/unitree_go2_agentic.py | 4 +- .../unitree_go2_agentic_huggingface.py | 4 +- .../agentic/unitree_go2_agentic_mcp.py | 4 +- .../agentic/unitree_go2_agentic_ollama.py | 4 +- .../agentic/unitree_go2_temporal_memory.py | 4 +- .../go2/blueprints/basic/unitree_go2_basic.py | 17 ++- .../go2/blueprints/basic/unitree_go2_fleet.py | 8 +- .../go2/blueprints/smart/unitree_go2.py | 16 +- .../blueprints/smart/unitree_go2_detection.py | 4 +- .../blueprints/smart/unitree_go2_spatial.py | 4 +- .../smart/unitree_go2_vlm_stream_test.py | 8 +- dimos/robot/unitree/go2/connection.py | 6 - dimos/robot/unitree/go2/fleet_connection.py | 6 - dimos/robot/unitree/keyboard_teleop.py | 5 - dimos/robot/unitree/type/map.py | 6 - .../robot/unitree/unitree_skill_container.py | 5 - dimos/simulation/manipulators/sim_module.py | 9 -- dimos/simulation/sim_blueprints.py | 5 +- .../teleop/keyboard/keyboard_teleop_module.py | 3 - dimos/teleop/phone/blueprints.py | 8 +- dimos/teleop/phone/phone_extensions.py | 8 - dimos/teleop/phone/phone_teleop_module.py | 9 -- dimos/teleop/quest/blueprints.py | 14 +- dimos/teleop/quest/quest_extensions.py | 13 -- dimos/teleop/quest/quest_teleop_module.py | 11 -- dimos/visualization/rerun/bridge.py | 4 - .../web/websocket_vis/websocket_vis_module.py | 5 - .../manipulation/adding_a_custom_arm.md | 4 +- pyproject.toml | 2 +- 106 files changed, 409 insertions(+), 603 deletions(-) diff --git a/dimos/agents/agent.py b/dimos/agents/agent.py index 672d30c3de..cce8148e2e 100644 --- a/dimos/agents/agent.py +++ b/dimos/agents/agent.py @@ -259,8 +259,3 @@ def _append_image_to_history(agent: Agent, skill: SkillInfo, uuid_: str, result: ] ) ) - - -agent = Agent.blueprint - -__all__ = ["Agent", "AgentSpec", "agent"] diff --git a/dimos/agents/demo_agent.py b/dimos/agents/demo_agent.py index b839b0809c..29396f3cfa 100644 --- a/dimos/agents/demo_agent.py +++ b/dimos/agents/demo_agent.py @@ -14,7 +14,7 @@ from dimos.agents.agent import Agent from dimos.core.blueprints import autoconnect -from dimos.hardware.sensors.camera.module import camera_module +from dimos.hardware.sensors.camera.module import CameraModule from dimos.hardware.sensors.camera.webcam import Webcam from dimos.hardware.sensors.camera.zed import compat as zed @@ -31,7 +31,7 @@ def _create_webcam() -> Webcam: demo_agent_camera = autoconnect( Agent.blueprint(), - camera_module( + CameraModule.blueprint( hardware=_create_webcam, ), ) diff --git a/dimos/agents/mcp/mcp_client.py b/dimos/agents/mcp/mcp_client.py index b32d195de8..e0200a6323 100644 --- a/dimos/agents/mcp/mcp_client.py +++ b/dimos/agents/mcp/mcp_client.py @@ -304,8 +304,3 @@ def _append_image_to_history( ] ) ) - - -mcp_client = McpClient.blueprint - -__all__ = ["McpClient", "McpClientConfig", "mcp_client"] diff --git a/dimos/agents/skills/demo_calculator_skill.py b/dimos/agents/skills/demo_calculator_skill.py index 61d66e301a..6c0605bb7c 100644 --- a/dimos/agents/skills/demo_calculator_skill.py +++ b/dimos/agents/skills/demo_calculator_skill.py @@ -36,8 +36,3 @@ def sum_numbers(self, n1: int, n2: int, *args: int, **kwargs: int) -> str: """ return f"{int(n1) + int(n2)}" - - -demo_calculator_skill = DemoCalculatorSkill.blueprint - -__all__ = ["DemoCalculatorSkill", "demo_calculator_skill"] diff --git a/dimos/agents/skills/demo_google_maps_skill.py b/dimos/agents/skills/demo_google_maps_skill.py index 13f2ebc19b..616bbac90a 100644 --- a/dimos/agents/skills/demo_google_maps_skill.py +++ b/dimos/agents/skills/demo_google_maps_skill.py @@ -13,13 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent -from dimos.agents.skills.demo_robot import demo_robot -from dimos.agents.skills.google_maps_skill_container import google_maps_skill +from dimos.agents.agent import Agent +from dimos.agents.skills.demo_robot import DemoRobot +from dimos.agents.skills.google_maps_skill_container import GoogleMapsSkillContainer from dimos.core.blueprints import autoconnect demo_google_maps_skill = autoconnect( - demo_robot(), - google_maps_skill(), - agent(), + DemoRobot.blueprint(), + GoogleMapsSkillContainer.blueprint(), + Agent.blueprint(), ) diff --git a/dimos/agents/skills/demo_gps_nav.py b/dimos/agents/skills/demo_gps_nav.py index 7a6abd32dd..4810fc3883 100644 --- a/dimos/agents/skills/demo_gps_nav.py +++ b/dimos/agents/skills/demo_gps_nav.py @@ -13,13 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent -from dimos.agents.skills.demo_robot import demo_robot -from dimos.agents.skills.gps_nav_skill import gps_nav_skill +from dimos.agents.agent import Agent +from dimos.agents.skills.demo_robot import DemoRobot +from dimos.agents.skills.gps_nav_skill import GpsNavSkillContainer from dimos.core.blueprints import autoconnect demo_gps_nav = autoconnect( - demo_robot(), - gps_nav_skill(), - agent(), + DemoRobot.blueprint(), + GpsNavSkillContainer.blueprint(), + Agent.blueprint(), ) diff --git a/dimos/agents/skills/demo_robot.py b/dimos/agents/skills/demo_robot.py index 789e26d7e1..2917ec2d76 100644 --- a/dimos/agents/skills/demo_robot.py +++ b/dimos/agents/skills/demo_robot.py @@ -32,9 +32,3 @@ def stop(self) -> None: def _publish_gps_location(self) -> None: self.gps_location.publish(LatLon(lat=37.78092426217621, lon=-122.40682866540769)) - - -demo_robot = DemoRobot.blueprint - - -__all__ = ["DemoRobot", "demo_robot"] diff --git a/dimos/agents/skills/demo_skill.py b/dimos/agents/skills/demo_skill.py index b067a3fbc2..81935d25b8 100644 --- a/dimos/agents/skills/demo_skill.py +++ b/dimos/agents/skills/demo_skill.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent -from dimos.agents.skills.demo_calculator_skill import demo_calculator_skill +from dimos.agents.agent import Agent +from dimos.agents.skills.demo_calculator_skill import DemoCalculatorSkill from dimos.core.blueprints import autoconnect demo_skill = autoconnect( - demo_calculator_skill(), - agent(), + DemoCalculatorSkill.blueprint(), + Agent.blueprint(), ) diff --git a/dimos/agents/skills/google_maps_skill_container.py b/dimos/agents/skills/google_maps_skill_container.py index e218601696..ee48e51653 100644 --- a/dimos/agents/skills/google_maps_skill_container.py +++ b/dimos/agents/skills/google_maps_skill_container.py @@ -124,8 +124,3 @@ def get_gps_position_for_queries(self, queries: list[str]) -> str: results.append(f"no result for {query}") return json.dumps(results) - - -google_maps_skill = GoogleMapsSkillContainer.blueprint - -__all__ = ["GoogleMapsSkillContainer", "google_maps_skill"] diff --git a/dimos/agents/skills/gps_nav_skill.py b/dimos/agents/skills/gps_nav_skill.py index 1464665131..c6f86951be 100644 --- a/dimos/agents/skills/gps_nav_skill.py +++ b/dimos/agents/skills/gps_nav_skill.py @@ -98,9 +98,3 @@ def _convert_point(self, point: dict[str, float]) -> LatLon | None: return None return LatLon(lat=lat, lon=lon) - - -gps_nav_skill = GpsNavSkillContainer.blueprint - - -__all__ = ["GpsNavSkillContainer", "gps_nav_skill"] diff --git a/dimos/agents/skills/navigation.py b/dimos/agents/skills/navigation.py index 47ae21c799..e366465959 100644 --- a/dimos/agents/skills/navigation.py +++ b/dimos/agents/skills/navigation.py @@ -321,8 +321,3 @@ def _get_goal_pose_from_result(self, result: dict[str, Any]) -> PoseStamped | No orientation=Quaternion.from_euler(make_vector3(0, 0, theta)), frame_id="map", ) - - -navigation_skill = NavigationSkillContainer.blueprint - -__all__ = ["NavigationSkillContainer", "navigation_skill"] diff --git a/dimos/agents/skills/osm.py b/dimos/agents/skills/osm.py index d0281fb808..a89e86044f 100644 --- a/dimos/agents/skills/osm.py +++ b/dimos/agents/skills/osm.py @@ -78,8 +78,3 @@ def map_query(self, query_sentence: str) -> str: distance = int(distance_in_meters(latlon, self._latest_location)) # type: ignore[arg-type] return f"{context}. It's at position latitude={latlon.lat}, longitude={latlon.lon}. It is {distance} meters away." - - -osm_skill = OsmSkill.blueprint - -__all__ = ["OsmSkill", "osm_skill"] diff --git a/dimos/agents/skills/person_follow.py b/dimos/agents/skills/person_follow.py index 563fcd4f59..56d3de62d3 100644 --- a/dimos/agents/skills/person_follow.py +++ b/dimos/agents/skills/person_follow.py @@ -311,8 +311,3 @@ def _send_stop_reason(self, query: str, reason: str) -> None: def _decode_base64_image(b64: str) -> Image: bgr_array = TurboJPEG().decode(base64.b64decode(b64)) return Image(data=bgr_array, format=ImageFormat.BGR) - - -person_follow_skill = PersonFollowSkillContainer.blueprint - -__all__ = ["PersonFollowSkillContainer", "person_follow_skill"] diff --git a/dimos/agents/skills/speak_skill.py b/dimos/agents/skills/speak_skill.py index aa06d30ba4..802aec03d0 100644 --- a/dimos/agents/skills/speak_skill.py +++ b/dimos/agents/skills/speak_skill.py @@ -97,8 +97,3 @@ def set_as_complete_e(_e: Exception) -> None: subscription.dispose() return f"Spoke: {text}" - - -speak_skill = SpeakSkill.blueprint - -__all__ = ["SpeakSkill", "speak_skill"] diff --git a/dimos/agents/vlm_agent.py b/dimos/agents/vlm_agent.py index 81bad79ae5..114302b397 100644 --- a/dimos/agents/vlm_agent.py +++ b/dimos/agents/vlm_agent.py @@ -121,8 +121,3 @@ def query_image( response = self._invoke_image(image, query, response_format=response_format) content = response.content return content if isinstance(content, str) else str(content) - - -vlm_agent = VLMAgent.blueprint - -__all__ = ["VLMAgent", "vlm_agent"] diff --git a/dimos/agents/vlm_stream_tester.py b/dimos/agents/vlm_stream_tester.py index 5f2165dc8d..80353dbfe0 100644 --- a/dimos/agents/vlm_stream_tester.py +++ b/dimos/agents/vlm_stream_tester.py @@ -173,8 +173,3 @@ def _run_rpc_queries(self) -> None: except Exception as exc: logger.warning("RPC query_image failed", error=str(exc)) time.sleep(self._query_interval_s) - - -vlm_stream_tester = VlmStreamTester.blueprint - -__all__ = ["VlmStreamTester", "vlm_stream_tester"] diff --git a/dimos/agents/web_human_input.py b/dimos/agents/web_human_input.py index 22fdb231b3..2b84736d27 100644 --- a/dimos/agents/web_human_input.py +++ b/dimos/agents/web_human_input.py @@ -84,8 +84,3 @@ def stop(self) -> None: if self._human_transport: self._human_transport.lcm.stop() super().stop() - - -web_input = WebInput.blueprint - -__all__ = ["WebInput", "web_input"] diff --git a/dimos/control/README.md b/dimos/control/README.md index 755bfbd939..15303b421d 100644 --- a/dimos/control/README.md +++ b/dimos/control/README.md @@ -96,9 +96,9 @@ dimos/control/ ## Configuration ```python -from dimos.control import control_coordinator, HardwareComponent, TaskConfig +from dimos.control import ControlCoordinator, HardwareComponent, TaskConfig -my_robot = control_coordinator( +my_robot = ControlCoordinator.blueprint( tick_rate=100.0, hardware=[ HardwareComponent( diff --git a/dimos/control/blueprints/basic.py b/dimos/control/blueprints/basic.py index 7ad441ed70..58619f6fc3 100644 --- a/dimos/control/blueprints/basic.py +++ b/dimos/control/blueprints/basic.py @@ -24,12 +24,12 @@ from __future__ import annotations from dimos.control.blueprints._hardware import mock_arm, piper, xarm6, xarm7 -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.transport import LCMTransport from dimos.msgs.sensor_msgs.JointState import JointState # Minimal blueprint (no hardware, no tasks) -coordinator_basic = control_coordinator( +coordinator_basic = ControlCoordinator.blueprint( tick_rate=100.0, publish_joint_state=True, joint_state_frame_id="coordinator", @@ -40,7 +40,7 @@ ) # Mock 7-DOF arm (for testing) -coordinator_mock = control_coordinator( +coordinator_mock = ControlCoordinator.blueprint( hardware=[mock_arm()], tasks=[ TaskConfig( @@ -57,7 +57,7 @@ ) # XArm7 real hardware -coordinator_xarm7 = control_coordinator( +coordinator_xarm7 = ControlCoordinator.blueprint( hardware=[xarm7()], tasks=[ TaskConfig( @@ -74,7 +74,7 @@ ) # XArm6 real hardware -coordinator_xarm6 = control_coordinator( +coordinator_xarm6 = ControlCoordinator.blueprint( hardware=[xarm6()], tasks=[ TaskConfig( @@ -91,7 +91,7 @@ ) # Piper arm (6-DOF, CAN bus) -coordinator_piper = control_coordinator( +coordinator_piper = ControlCoordinator.blueprint( hardware=[piper()], tasks=[ TaskConfig( diff --git a/dimos/control/blueprints/dual.py b/dimos/control/blueprints/dual.py index 8482316ba5..057e982f90 100644 --- a/dimos/control/blueprints/dual.py +++ b/dimos/control/blueprints/dual.py @@ -23,12 +23,12 @@ from __future__ import annotations from dimos.control.blueprints._hardware import mock_arm, piper, xarm6, xarm7 -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.transport import LCMTransport from dimos.msgs.sensor_msgs.JointState import JointState # Dual mock arms (7-DOF left, 6-DOF right) -coordinator_dual_mock = control_coordinator( +coordinator_dual_mock = ControlCoordinator.blueprint( hardware=[mock_arm("left_arm", 7), mock_arm("right_arm", 6)], tasks=[ TaskConfig( @@ -51,7 +51,7 @@ ) # Dual XArm (XArm7 left, XArm6 right) -coordinator_dual_xarm = control_coordinator( +coordinator_dual_xarm = ControlCoordinator.blueprint( hardware=[xarm7("left_arm"), xarm6("right_arm")], tasks=[ TaskConfig( @@ -74,7 +74,7 @@ ) # Dual arm (XArm6 + Piper) -coordinator_piper_xarm = control_coordinator( +coordinator_piper_xarm = ControlCoordinator.blueprint( hardware=[xarm6("xarm_arm"), piper("piper_arm")], tasks=[ TaskConfig( diff --git a/dimos/control/blueprints/mobile.py b/dimos/control/blueprints/mobile.py index 4ed3410b8f..5e5e1966b8 100644 --- a/dimos/control/blueprints/mobile.py +++ b/dimos/control/blueprints/mobile.py @@ -23,7 +23,7 @@ from dimos.control.blueprints._hardware import mock_arm, mock_twist_base from dimos.control.components import make_twist_base_joints -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.transport import LCMTransport from dimos.msgs.geometry_msgs.Twist import Twist from dimos.msgs.sensor_msgs.JointState import JointState @@ -31,7 +31,7 @@ _base_joints = make_twist_base_joints("base") # Mock holonomic twist base (3-DOF: vx, vy, wz) -coordinator_mock_twist_base = control_coordinator( +coordinator_mock_twist_base = ControlCoordinator.blueprint( hardware=[mock_twist_base()], tasks=[ TaskConfig( @@ -49,7 +49,7 @@ ) # Mock arm (7-DOF) + mock holonomic base (3-DOF) -coordinator_mobile_manip_mock = control_coordinator( +coordinator_mobile_manip_mock = ControlCoordinator.blueprint( hardware=[mock_arm(), mock_twist_base()], tasks=[ TaskConfig( diff --git a/dimos/control/blueprints/teleop.py b/dimos/control/blueprints/teleop.py index 2e922bbcbf..1dfa55d80d 100644 --- a/dimos/control/blueprints/teleop.py +++ b/dimos/control/blueprints/teleop.py @@ -37,14 +37,14 @@ xarm7, ) from dimos.control.components import make_gripper_joints -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.transport import LCMTransport from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.JointState import JointState from dimos.teleop.quest.quest_types import Buttons # XArm6 teleop - streaming position control -coordinator_teleop_xarm6 = control_coordinator( +coordinator_teleop_xarm6 = ControlCoordinator.blueprint( hardware=[xarm6()], tasks=[ TaskConfig( @@ -62,7 +62,7 @@ ) # XArm6 velocity control - streaming velocity for joystick -coordinator_velocity_xarm6 = control_coordinator( +coordinator_velocity_xarm6 = ControlCoordinator.blueprint( hardware=[xarm6()], tasks=[ TaskConfig( @@ -80,7 +80,7 @@ ) # XArm6 combined (servo + velocity tasks) -coordinator_combined_xarm6 = control_coordinator( +coordinator_combined_xarm6 = ControlCoordinator.blueprint( hardware=[xarm6()], tasks=[ TaskConfig( @@ -105,7 +105,7 @@ # Mock 6-DOF arm with CartesianIK -coordinator_cartesian_ik_mock = control_coordinator( +coordinator_cartesian_ik_mock = ControlCoordinator.blueprint( hardware=[mock_arm("arm", 6)], tasks=[ TaskConfig( @@ -127,7 +127,7 @@ ) # Piper arm with CartesianIK -coordinator_cartesian_ik_piper = control_coordinator( +coordinator_cartesian_ik_piper = ControlCoordinator.blueprint( hardware=[piper()], tasks=[ TaskConfig( @@ -150,7 +150,7 @@ # Single XArm7 with TeleopIK -coordinator_teleop_xarm7 = control_coordinator( +coordinator_teleop_xarm7 = ControlCoordinator.blueprint( hardware=[xarm7(gripper=True)], tasks=[ TaskConfig( @@ -177,7 +177,7 @@ ) # Single Piper with TeleopIK -coordinator_teleop_piper = control_coordinator( +coordinator_teleop_piper = ControlCoordinator.blueprint( hardware=[piper()], tasks=[ TaskConfig( @@ -201,7 +201,7 @@ ) # Dual arm teleop: XArm6 + Piper with TeleopIK -coordinator_teleop_dual = control_coordinator( +coordinator_teleop_dual = ControlCoordinator.blueprint( hardware=[xarm6("xarm_arm"), piper("piper_arm")], tasks=[ TaskConfig( diff --git a/dimos/control/coordinator.py b/dimos/control/coordinator.py index 0757f27705..9f3264f85c 100644 --- a/dimos/control/coordinator.py +++ b/dimos/control/coordinator.py @@ -722,16 +722,3 @@ def stop(self) -> None: def get_tick_count(self) -> int: """Get the number of ticks since start.""" return self._tick_loop.tick_count if self._tick_loop else 0 - - -# Blueprint export -control_coordinator = ControlCoordinator.blueprint - - -__all__ = [ - "ControlCoordinator", - "ControlCoordinatorConfig", - "HardwareComponent", - "TaskConfig", - "control_coordinator", -] diff --git a/dimos/control/examples/twist_base_keyboard_teleop.py b/dimos/control/examples/twist_base_keyboard_teleop.py index 610f8679e4..44cd34c354 100644 --- a/dimos/control/examples/twist_base_keyboard_teleop.py +++ b/dimos/control/examples/twist_base_keyboard_teleop.py @@ -34,13 +34,13 @@ from __future__ import annotations from dimos.control.blueprints.mobile import coordinator_mock_twist_base -from dimos.robot.unitree.keyboard_teleop import keyboard_teleop +from dimos.robot.unitree.keyboard_teleop import KeyboardTeleop def main() -> None: """Run mock twist base + keyboard teleop.""" coord = coordinator_mock_twist_base.build() - teleop = keyboard_teleop().build() + teleop = KeyboardTeleop.blueprint().build() print("Starting mock twist base coordinator + keyboard teleop...") print("Coordinator tick loop: 100Hz") diff --git a/dimos/core/test_blueprints.py b/dimos/core/test_blueprints.py index 5f7bf33b8b..b61e34c5f9 100644 --- a/dimos/core/test_blueprints.py +++ b/dimos/core/test_blueprints.py @@ -107,11 +107,6 @@ class ModuleC(Module): data3: In[Data3] -module_a = ModuleA.blueprint -module_b = ModuleB.blueprint -module_c = ModuleC.blueprint - - def test_get_connection_set() -> None: assert _BlueprintAtom.create(CatModule, kwargs={"k": "v"}) == _BlueprintAtom( module=CatModule, @@ -125,7 +120,7 @@ def test_get_connection_set() -> None: def test_autoconnect() -> None: - blueprint_set = autoconnect(module_a(), module_b()) + blueprint_set = autoconnect(ModuleA.blueprint(), ModuleB.blueprint()) assert blueprint_set == Blueprint( blueprints=( @@ -154,7 +149,7 @@ def test_autoconnect() -> None: def test_transports() -> None: custom_transport = LCMTransport("/custom_topic", Data1) - blueprint_set = autoconnect(module_a(), module_b()).transports( + blueprint_set = autoconnect(ModuleA.blueprint(), ModuleB.blueprint()).transports( {("data1", Data1): custom_transport} ) @@ -163,7 +158,9 @@ def test_transports() -> None: def test_global_config() -> None: - blueprint_set = autoconnect(module_a(), module_b()).global_config(option1=True, option2=42) + blueprint_set = autoconnect(ModuleA.blueprint(), ModuleB.blueprint()).global_config( + option1=True, option2=42 + ) assert "option1" in blueprint_set.global_config_overrides assert blueprint_set.global_config_overrides["option1"] is True @@ -173,7 +170,7 @@ def test_global_config() -> None: @pytest.mark.slow def test_build_happy_path() -> None: - blueprint_set = autoconnect(module_a(), module_b(), module_c()) + blueprint_set = autoconnect(ModuleA.blueprint(), ModuleB.blueprint(), ModuleC.blueprint()) coordinator = blueprint_set.build(**_BUILD_WITHOUT_RERUN) @@ -475,7 +472,9 @@ def test_module_ref_spec() -> None: @pytest.mark.slow def test_disabled_modules_are_skipped_during_build() -> None: - blueprint_set = autoconnect(module_a(), module_b(), module_c()).disabled_modules(ModuleC) + blueprint_set = autoconnect( + ModuleA.blueprint(), ModuleB.blueprint(), ModuleC.blueprint() + ).disabled_modules(ModuleC) coordinator = blueprint_set.build(**_BUILD_WITHOUT_RERUN) @@ -490,11 +489,11 @@ def test_disabled_modules_are_skipped_during_build() -> None: def test_autoconnect_merges_disabled_modules() -> None: bp_a = Blueprint( - blueprints=module_a().blueprints, + blueprints=ModuleA.blueprint().blueprints, disabled_modules_tuple=(ModuleA,), ) bp_b = Blueprint( - blueprints=module_b().blueprints, + blueprints=ModuleB.blueprint().blueprints, disabled_modules_tuple=(ModuleB,), ) diff --git a/dimos/hardware/sensors/camera/module.py b/dimos/hardware/sensors/camera/module.py index e0d0b3407e..b8165658d9 100644 --- a/dimos/hardware/sensors/camera/module.py +++ b/dimos/hardware/sensors/camera/module.py @@ -32,7 +32,7 @@ from dimos.msgs.sensor_msgs.CameraInfo import CameraInfo from dimos.msgs.sensor_msgs.Image import Image, sharpness_barrier from dimos.spec import perception -from dimos.visualization.rerun.bridge import rerun_bridge +from dimos.visualization.rerun.bridge import RerunBridgeModule def default_transform() -> Transform: @@ -118,11 +118,7 @@ def stop(self) -> None: super().stop() -camera_module = CameraModule.blueprint - demo_camera = autoconnect( - camera_module(), - rerun_bridge(), + CameraModule.blueprint(), + RerunBridgeModule.blueprint(), ) - -__all__ = ["CameraModule", "camera_module"] diff --git a/dimos/hardware/sensors/camera/realsense/camera.py b/dimos/hardware/sensors/camera/realsense/camera.py index 23bc19cdad..821982981d 100644 --- a/dimos/hardware/sensors/camera/realsense/camera.py +++ b/dimos/hardware/sensors/camera/realsense/camera.py @@ -479,8 +479,3 @@ def cleanup() -> None: if __name__ == "__main__": main() - - -realsense_camera = RealSenseCamera.blueprint - -__all__ = ["RealSenseCamera", "RealSenseCameraConfig", "realsense_camera"] diff --git a/dimos/hardware/sensors/camera/zed/camera.py b/dimos/hardware/sensors/camera/zed/camera.py index 214b1f73e3..dd429c29cf 100644 --- a/dimos/hardware/sensors/camera/zed/camera.py +++ b/dimos/hardware/sensors/camera/zed/camera.py @@ -528,6 +528,3 @@ def cleanup() -> None: ZEDModule = ZEDCamera -zed_camera = ZEDCamera.blueprint - -__all__ = ["ZEDCamera", "ZEDCameraConfig", "ZEDModule", "zed_camera"] diff --git a/dimos/hardware/sensors/camera/zed/compat.py b/dimos/hardware/sensors/camera/zed/compat.py index 3cec8d9566..c00971e471 100644 --- a/dimos/hardware/sensors/camera/zed/compat.py +++ b/dimos/hardware/sensors/camera/zed/compat.py @@ -28,26 +28,24 @@ HAS_ZED_SDK = False if HAS_ZED_SDK: - from dimos.hardware.sensors.camera.zed.camera import ZEDCamera, ZEDModule, zed_camera + from dimos.hardware.sensors.camera.zed.camera import ZEDCamera, ZEDModule else: # Provide stub classes when SDK is not available + _ZED_ERR = ( + "ZED SDK not installed. Please install pyzed package to use ZED camera functionality." + ) + class ZEDCamera: # type: ignore[no-redef] def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] - raise ImportError( - "ZED SDK not installed. Please install pyzed package to use ZED camera functionality." - ) + raise ImportError(_ZED_ERR) + + @classmethod + def blueprint(cls, *args: object, **kwargs: object) -> None: # type: ignore[no-untyped-def] + raise ImportError(_ZED_ERR) class ZEDModule: # type: ignore[no-redef] def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] - raise ImportError( - "ZED SDK not installed. Please install pyzed package to use ZED camera functionality." - ) - - def zed_camera(*args: object, **kwargs: object) -> None: # type: ignore[misc,no-redef] - raise ModuleNotFoundError( - "ZED SDK not installed. Please install pyzed package to use ZED camera functionality.", - name="pyzed", - ) + raise ImportError(_ZED_ERR) # Set up camera calibration provider (always available) @@ -59,5 +57,4 @@ def zed_camera(*args: object, **kwargs: object) -> None: # type: ignore[misc,no "CameraInfo", "ZEDCamera", "ZEDModule", - "zed_camera", ] diff --git a/dimos/hardware/sensors/lidar/fastlio2/fastlio_blueprints.py b/dimos/hardware/sensors/lidar/fastlio2/fastlio_blueprints.py index b1a6baef44..f3de842b46 100644 --- a/dimos/hardware/sensors/lidar/fastlio2/fastlio_blueprints.py +++ b/dimos/hardware/sensors/lidar/fastlio2/fastlio_blueprints.py @@ -15,13 +15,13 @@ from dimos.core.blueprints import autoconnect from dimos.hardware.sensors.lidar.fastlio2.module import FastLio2 from dimos.mapping.voxels import VoxelGridMapper -from dimos.visualization.rerun.bridge import rerun_bridge +from dimos.visualization.rerun.bridge import RerunBridgeModule voxel_size = 0.05 mid360_fastlio = autoconnect( FastLio2.blueprint(voxel_size=voxel_size, map_voxel_size=voxel_size, map_freq=-1), - rerun_bridge( + RerunBridgeModule.blueprint( visual_override={ "world/lidar": lambda grid: grid.to_rerun(voxel_size=voxel_size, mode="boxes"), } @@ -31,7 +31,7 @@ mid360_fastlio_voxels = autoconnect( FastLio2.blueprint(), VoxelGridMapper.blueprint(publish_interval=1.0, voxel_size=voxel_size, carve_columns=False), - rerun_bridge( + RerunBridgeModule.blueprint( visual_override={ "world/global_map": lambda grid: grid.to_rerun(voxel_size=voxel_size, mode="boxes"), "world/lidar": None, @@ -41,7 +41,7 @@ mid360_fastlio_voxels_native = autoconnect( FastLio2.blueprint(voxel_size=voxel_size, map_voxel_size=voxel_size, map_freq=3.0), - rerun_bridge( + RerunBridgeModule.blueprint( visual_override={ "world/lidar": None, "world/global_map": lambda grid: grid.to_rerun(voxel_size=voxel_size, mode="boxes"), diff --git a/dimos/hardware/sensors/lidar/fastlio2/module.py b/dimos/hardware/sensors/lidar/fastlio2/module.py index c1a96a525b..cdce59bd81 100644 --- a/dimos/hardware/sensors/lidar/fastlio2/module.py +++ b/dimos/hardware/sensors/lidar/fastlio2/module.py @@ -132,14 +132,6 @@ class FastLio2( global_map: Out[PointCloud2] -fastlio2_module = FastLio2.blueprint - -__all__ = [ - "FastLio2", - "FastLio2Config", - "fastlio2_module", -] - # Verify protocol port compliance (mypy will flag missing ports) if TYPE_CHECKING: FastLio2() diff --git a/dimos/hardware/sensors/lidar/livox/livox_blueprints.py b/dimos/hardware/sensors/lidar/livox/livox_blueprints.py index 9ded4578ba..c8835b3e89 100644 --- a/dimos/hardware/sensors/lidar/livox/livox_blueprints.py +++ b/dimos/hardware/sensors/lidar/livox/livox_blueprints.py @@ -14,9 +14,9 @@ from dimos.core.blueprints import autoconnect from dimos.hardware.sensors.lidar.livox.module import Mid360 -from dimos.visualization.rerun.bridge import rerun_bridge +from dimos.visualization.rerun.bridge import RerunBridgeModule mid360 = autoconnect( Mid360.blueprint(), - rerun_bridge(), + RerunBridgeModule.blueprint(), ).global_config(n_workers=2, robot_model="mid360") diff --git a/dimos/hardware/sensors/lidar/livox/module.py b/dimos/hardware/sensors/lidar/livox/module.py index 999cdd9aa1..5701a4b4d4 100644 --- a/dimos/hardware/sensors/lidar/livox/module.py +++ b/dimos/hardware/sensors/lidar/livox/module.py @@ -89,14 +89,6 @@ class Mid360(NativeModule[Mid360Config], perception.Lidar, perception.IMU): imu: Out[Imu] -mid360_module = Mid360.blueprint - -__all__ = [ - "Mid360", - "Mid360Config", - "mid360_module", -] - # Verify protocol port compliance (mypy will flag missing ports) if TYPE_CHECKING: Mid360() diff --git a/dimos/manipulation/blueprints.py b/dimos/manipulation/blueprints.py index 8ef2c03279..8110166042 100644 --- a/dimos/manipulation/blueprints.py +++ b/dimos/manipulation/blueprints.py @@ -32,20 +32,20 @@ from dimos.agents.agent import Agent from dimos.control.components import HardwareComponent, HardwareType, make_joints -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.blueprints import autoconnect from dimos.core.transport import LCMTransport -from dimos.hardware.sensors.camera.realsense.camera import realsense_camera -from dimos.manipulation.manipulation_module import manipulation_module -from dimos.manipulation.pick_and_place_module import pick_and_place_module +from dimos.hardware.sensors.camera.realsense.camera import RealSenseCamera +from dimos.manipulation.manipulation_module import ManipulationModule +from dimos.manipulation.pick_and_place_module import PickAndPlaceModule from dimos.manipulation.planning.spec.config import RobotModelConfig from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.Quaternion import Quaternion from dimos.msgs.geometry_msgs.Transform import Transform from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.sensor_msgs.JointState import JointState -from dimos.perception.object_scene_registration import object_scene_registration_module -from dimos.robot.foxglove_bridge import foxglove_bridge # TODO: migrate to rerun +from dimos.perception.object_scene_registration import ObjectSceneRegistrationModule +from dimos.robot.foxglove_bridge import FoxgloveBridge # TODO: migrate to rerun from dimos.utils.data import get_data @@ -273,7 +273,7 @@ def _make_piper_config( # Single XArm6 planner (standalone, no coordinator) -xarm6_planner_only = manipulation_module( +xarm6_planner_only = ManipulationModule.blueprint( robots=[_make_xarm6_config()], planning_timeout=10.0, enable_viz=True, @@ -286,7 +286,7 @@ def _make_piper_config( # Dual XArm6 planner with coordinator integration # Usage: Start with coordinator_dual_mock, then plan/execute via RPC -dual_xarm6_planner = manipulation_module( +dual_xarm6_planner = ManipulationModule.blueprint( robots=[ _make_xarm6_config( "left_arm", y_offset=0.5, joint_prefix="left_", coordinator_task="traj_left" @@ -307,12 +307,12 @@ def _make_piper_config( # Single XArm7 planner + mock coordinator (standalone, no external coordinator needed) # Usage: dimos run xarm7-planner-coordinator xarm7_planner_coordinator = autoconnect( - manipulation_module( + ManipulationModule.blueprint( robots=[_make_xarm7_config("arm", joint_prefix="arm_", coordinator_task="traj_arm")], planning_timeout=10.0, enable_viz=True, ), - control_coordinator( + ControlCoordinator.blueprint( tick_rate=100.0, publish_joint_state=True, joint_state_frame_id="coordinator", @@ -387,7 +387,7 @@ def _make_piper_config( xarm_perception = ( autoconnect( - pick_and_place_module( + PickAndPlaceModule.blueprint( robots=[ _make_xarm7_config( "arm", @@ -402,12 +402,12 @@ def _make_piper_config( planning_timeout=10.0, enable_viz=True, ), - realsense_camera( + RealSenseCamera.blueprint( base_frame_id="link7", base_transform=_XARM_PERCEPTION_CAMERA_TRANSFORM, ), - object_scene_registration_module(target_frame="world"), - foxglove_bridge(), # TODO: migrate to rerun + ObjectSceneRegistrationModule.blueprint(target_frame="world"), + FoxgloveBridge.blueprint(), # TODO: migrate to rerun ) .transports( { diff --git a/dimos/manipulation/control/servo_control/cartesian_motion_controller.py b/dimos/manipulation/control/servo_control/cartesian_motion_controller.py index 0cbd41e218..6b702495e2 100644 --- a/dimos/manipulation/control/servo_control/cartesian_motion_controller.py +++ b/dimos/manipulation/control/servo_control/cartesian_motion_controller.py @@ -708,7 +708,3 @@ def _integrate_velocity(self, current_pose: Pose, velocity: Twist, dt: float) -> def _normalize_angle(angle: float) -> float: """Normalize angle to [-pi, pi].""" return math.atan2(math.sin(angle), math.cos(angle)) - - -# Expose blueprint for declarative composition -cartesian_motion_controller = CartesianMotionController.blueprint diff --git a/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py b/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py index 465df7afea..a91e1bfb11 100644 --- a/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py +++ b/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py @@ -351,7 +351,3 @@ def _execution_loop(self) -> None: time.sleep(period) logger.info("Execution loop stopped") - - -# Expose blueprint for declarative composition -joint_trajectory_controller = JointTrajectoryController.blueprint diff --git a/dimos/manipulation/grasping/demo_grasping.py b/dimos/manipulation/grasping/demo_grasping.py index 43a6c9a20a..a4eea21787 100644 --- a/dimos/manipulation/grasping/demo_grasping.py +++ b/dimos/manipulation/grasping/demo_grasping.py @@ -14,23 +14,23 @@ # limitations under the License. from pathlib import Path -from dimos.agents.agent import agent +from dimos.agents.agent import Agent from dimos.core.blueprints import autoconnect -from dimos.hardware.sensors.camera.realsense.camera import realsense_camera +from dimos.hardware.sensors.camera.realsense.camera import RealSenseCamera from dimos.manipulation.grasping.graspgen_module import graspgen -from dimos.manipulation.grasping.grasping import grasping_module +from dimos.manipulation.grasping.grasping import GraspingModule from dimos.perception.detection.detectors.yoloe import YoloePromptMode -from dimos.perception.object_scene_registration import object_scene_registration_module -from dimos.robot.foxglove_bridge import foxglove_bridge +from dimos.perception.object_scene_registration import ObjectSceneRegistrationModule +from dimos.robot.foxglove_bridge import FoxgloveBridge -camera_module = realsense_camera(enable_pointcloud=False) +camera_module = RealSenseCamera.blueprint(enable_pointcloud=False) demo_grasping = autoconnect( camera_module, - object_scene_registration_module( + ObjectSceneRegistrationModule.blueprint( target_frame="camera_color_optical_frame", prompt_mode=YoloePromptMode.PROMPT ), - grasping_module(), + GraspingModule.blueprint(), graspgen( docker_file_path=Path(__file__).parent / "docker_context" / "Dockerfile", docker_build_context=Path(__file__).parent.parent.parent.parent, # repo root @@ -43,6 +43,6 @@ ("/tmp", "/tmp", "rw") ], # Grasp visualization debug standalone: python -m dimos.manipulation.grasping.visualize_grasps ), - foxglove_bridge(), - agent(), + FoxgloveBridge.blueprint(), + Agent.blueprint(), ).global_config(viewer="foxglove") diff --git a/dimos/manipulation/grasping/graspgen_module.py b/dimos/manipulation/grasping/graspgen_module.py index c883126840..ae2d59512a 100644 --- a/dimos/manipulation/grasping/graspgen_module.py +++ b/dimos/manipulation/grasping/graspgen_module.py @@ -270,6 +270,3 @@ def graspgen( return GraspGenModule.blueprint( docker_file=dockerfile, docker_build_context=build_context, **kwargs ) - - -__all__ = ["GraspGenConfig", "GraspGenModule", "graspgen"] diff --git a/dimos/manipulation/grasping/grasping.py b/dimos/manipulation/grasping/grasping.py index ef05dc29e2..50671777c0 100644 --- a/dimos/manipulation/grasping/grasping.py +++ b/dimos/manipulation/grasping/grasping.py @@ -145,7 +145,3 @@ def _format_grasp_result(self, grasps: PoseArray, object_name: str) -> str: f"Best grasp: pos=({pos.x:.4f}, {pos.y:.4f}, {pos.z:.4f}), " f"rpy=({rpy.x:.1f}, {rpy.y:.1f}, {rpy.z:.1f}) degrees" ) - - -grasping_module = GraspingModule.blueprint -__all__ = ["GraspingModule", "grasping_module"] diff --git a/dimos/manipulation/manipulation_module.py b/dimos/manipulation/manipulation_module.py index fe5561c705..d6908d07d9 100644 --- a/dimos/manipulation/manipulation_module.py +++ b/dimos/manipulation/manipulation_module.py @@ -1121,7 +1121,3 @@ def stop(self) -> None: self._world_monitor.stop_all_monitors() super().stop() - - -# Expose blueprint for declarative composition -manipulation_module = ManipulationModule.blueprint diff --git a/dimos/manipulation/pick_and_place_module.py b/dimos/manipulation/pick_and_place_module.py index b433df6801..81e7bcf2d3 100644 --- a/dimos/manipulation/pick_and_place_module.py +++ b/dimos/manipulation/pick_and_place_module.py @@ -592,7 +592,3 @@ def stop(self) -> None: self._graspgen = None super().stop() - - -# Expose blueprint for declarative composition -pick_and_place_module = PickAndPlaceModule.blueprint diff --git a/dimos/mapping/costmapper.py b/dimos/mapping/costmapper.py index 06bf493564..87ed64d404 100644 --- a/dimos/mapping/costmapper.py +++ b/dimos/mapping/costmapper.py @@ -74,6 +74,3 @@ def stop(self) -> None: def _calculate_costmap(self, msg: PointCloud2) -> OccupancyGrid: fn = OCCUPANCY_ALGOS[self.config.algo] return fn(msg, **asdict(self.config.config)) - - -cost_mapper = CostMapper.blueprint diff --git a/dimos/mapping/osm/demo_osm.py b/dimos/mapping/osm/demo_osm.py index 97622cfaf2..54b6ab39a3 100644 --- a/dimos/mapping/osm/demo_osm.py +++ b/dimos/mapping/osm/demo_osm.py @@ -13,13 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent -from dimos.agents.skills.demo_robot import demo_robot -from dimos.agents.skills.osm import osm_skill +from dimos.agents.agent import Agent +from dimos.agents.skills.demo_robot import DemoRobot +from dimos.agents.skills.osm import OsmSkill from dimos.core.blueprints import autoconnect demo_osm = autoconnect( - demo_robot(), - osm_skill(), - agent(), + DemoRobot.blueprint(), + OsmSkill.blueprint(), + Agent.blueprint(), ) diff --git a/dimos/mapping/voxels.py b/dimos/mapping/voxels.py index e4e03dfc01..92cbeed03e 100644 --- a/dimos/mapping/voxels.py +++ b/dimos/mapping/voxels.py @@ -241,6 +241,3 @@ def ensure_legacy_pcd( ) return pcd_any.to_legacy() - - -voxel_mapper = VoxelGridMapper.blueprint diff --git a/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py b/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py index 20fab41b35..e2f408b538 100644 --- a/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py +++ b/dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py @@ -840,8 +840,3 @@ def end_exploration(self) -> str: return "Stopped exploration. The robot has stopped moving." else: return "Exploration skill was not active, so nothing was stopped." - - -wavefront_frontier_explorer = WavefrontFrontierExplorer.blueprint - -__all__ = ["WavefrontFrontierExplorer", "wavefront_frontier_explorer"] diff --git a/dimos/navigation/replanning_a_star/module.py b/dimos/navigation/replanning_a_star/module.py index 842a6319d4..26c540a254 100644 --- a/dimos/navigation/replanning_a_star/module.py +++ b/dimos/navigation/replanning_a_star/module.py @@ -119,8 +119,3 @@ def set_safe_goal_clearance(self, clearance: float) -> None: @rpc def reset_safe_goal_clearance(self) -> None: self._planner.reset_safe_goal_clearance() - - -replanning_a_star_planner = ReplanningAStarPlanner.blueprint - -__all__ = ["ReplanningAStarPlanner", "replanning_a_star_planner"] diff --git a/dimos/navigation/rosnav.py b/dimos/navigation/rosnav.py index 38c8e32847..ef76539d5f 100644 --- a/dimos/navigation/rosnav.py +++ b/dimos/navigation/rosnav.py @@ -381,9 +381,6 @@ def stop(self) -> None: super().stop() -ros_nav = ROSNav.blueprint - - def deploy(dimos: ModuleCoordinator): # type: ignore[no-untyped-def] nav = dimos.deploy(ROSNav) # type: ignore[attr-defined] @@ -412,6 +409,3 @@ def deploy(dimos: ModuleCoordinator): # type: ignore[no-untyped-def] nav.start() return nav - - -__all__ = ["ROSNav", "deploy", "ros_nav"] diff --git a/dimos/perception/demo_object_scene_registration.py b/dimos/perception/demo_object_scene_registration.py index cdb09d359e..55b26f385a 100644 --- a/dimos/perception/demo_object_scene_registration.py +++ b/dimos/perception/demo_object_scene_registration.py @@ -13,26 +13,26 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent +from dimos.agents.agent import Agent from dimos.core.blueprints import autoconnect -from dimos.hardware.sensors.camera.realsense.camera import realsense_camera -from dimos.hardware.sensors.camera.zed.compat import zed_camera +from dimos.hardware.sensors.camera.realsense.camera import RealSenseCamera +from dimos.hardware.sensors.camera.zed.compat import ZEDCamera from dimos.perception.detection.detectors.yoloe import YoloePromptMode -from dimos.perception.object_scene_registration import object_scene_registration_module -from dimos.robot.foxglove_bridge import foxglove_bridge +from dimos.perception.object_scene_registration import ObjectSceneRegistrationModule +from dimos.robot.foxglove_bridge import FoxgloveBridge camera_choice = "zed" if camera_choice == "realsense": - camera_module = realsense_camera(enable_pointcloud=False) + camera_module = RealSenseCamera.blueprint(enable_pointcloud=False) elif camera_choice == "zed": - camera_module = zed_camera(enable_pointcloud=False) + camera_module = ZEDCamera.blueprint(enable_pointcloud=False) else: raise ValueError(f"Invalid camera choice: {camera_choice}") demo_object_scene_registration = autoconnect( camera_module, - object_scene_registration_module(target_frame="world", prompt_mode=YoloePromptMode.LRPC), - foxglove_bridge(), - agent(), + ObjectSceneRegistrationModule.blueprint(target_frame="world", prompt_mode=YoloePromptMode.LRPC), + FoxgloveBridge.blueprint(), + Agent.blueprint(), ).global_config(viewer="foxglove") diff --git a/dimos/perception/detection/module3D.py b/dimos/perception/detection/module3D.py index fa392dc799..66771a4e2a 100644 --- a/dimos/perception/detection/module3D.py +++ b/dimos/perception/detection/module3D.py @@ -232,8 +232,3 @@ def deploy( # type: ignore[no-untyped-def] detector.start() return detector - - -detection3d_module = Detection3DModule.blueprint - -__all__ = ["Detection3DModule", "deploy", "detection3d_module"] diff --git a/dimos/perception/detection/moduleDB.py b/dimos/perception/detection/moduleDB.py index 5672786b94..81e73b0b04 100644 --- a/dimos/perception/detection/moduleDB.py +++ b/dimos/perception/detection/moduleDB.py @@ -311,8 +311,3 @@ def to_foxglove_scene_update(self) -> "SceneUpdate": def __len__(self) -> int: return len(self.objects.values()) - - -detection_db_module = ObjectDBModule.blueprint - -__all__ = ["ObjectDBModule", "detection_db_module"] diff --git a/dimos/perception/detection/person_tracker.py b/dimos/perception/detection/person_tracker.py index 9dbba210a2..0113135adf 100644 --- a/dimos/perception/detection/person_tracker.py +++ b/dimos/perception/detection/person_tracker.py @@ -124,8 +124,3 @@ def track(self, detections2D: ImageDetections2D) -> None: pose_in_world = tf_world_to_target.to_pose(ts=detections2D.ts) self.target.publish(pose_in_world) - - -person_tracker_module = PersonTracker.blueprint - -__all__ = ["PersonTracker", "person_tracker_module"] diff --git a/dimos/perception/experimental/temporal_memory/temporal_memory.py b/dimos/perception/experimental/temporal_memory/temporal_memory.py index d4e343872b..da9fe62370 100644 --- a/dimos/perception/experimental/temporal_memory/temporal_memory.py +++ b/dimos/perception/experimental/temporal_memory/temporal_memory.py @@ -44,7 +44,7 @@ from .clip_filter import CLIP_AVAILABLE, adaptive_keyframes from .entity_graph_db import EntityGraphDB -from .frame_window_accumulator import Frame, FrameWindowAccumulator +from .frame_window_accumulator import FrameWindowAccumulator from .temporal_state import TemporalState from .temporal_utils.graph_utils import build_graph_context, extract_time_window from .temporal_utils.helpers import is_scene_stale @@ -624,8 +624,3 @@ def get_graph_db_stats(self) -> dict[str, Any]: if not self._graph_db: return {"stats": {}, "entities": [], "recent_relations": []} return self._graph_db.get_summary() - - -temporal_memory = TemporalMemory.blueprint - -__all__ = ["Frame", "TemporalMemory", "TemporalMemoryConfig", "temporal_memory"] diff --git a/dimos/perception/experimental/temporal_memory/temporal_utils/helpers.py b/dimos/perception/experimental/temporal_memory/temporal_utils/helpers.py index 513feb65a4..88ddee1157 100644 --- a/dimos/perception/experimental/temporal_memory/temporal_utils/helpers.py +++ b/dimos/perception/experimental/temporal_memory/temporal_utils/helpers.py @@ -19,7 +19,7 @@ import numpy as np if TYPE_CHECKING: - from ..temporal_memory import Frame + from ..frame_window_accumulator import Frame def next_entity_id_hint(roster: Any) -> str: diff --git a/dimos/perception/object_scene_registration.py b/dimos/perception/object_scene_registration.py index 5fb1748032..3be2db4b47 100644 --- a/dimos/perception/object_scene_registration.py +++ b/dimos/perception/object_scene_registration.py @@ -354,8 +354,3 @@ def _process_3d_detections( aggregated_pc = aggregate_pointclouds(objects_for_pc) self.pointcloud.publish(aggregated_pc) return - - -object_scene_registration_module = ObjectSceneRegistrationModule.blueprint - -__all__ = ["ObjectSceneRegistrationModule", "object_scene_registration_module"] diff --git a/dimos/perception/object_tracker.py b/dimos/perception/object_tracker.py index 6afc5e0814..a8970c61d8 100644 --- a/dimos/perception/object_tracker.py +++ b/dimos/perception/object_tracker.py @@ -631,8 +631,3 @@ def _get_depth_from_bbox(self, bbox: list[int], depth_frame: np.ndarray) -> floa return depth_25th_percentile return None - - -object_tracking = ObjectTracking.blueprint - -__all__ = ["ObjectTracking", "object_tracking"] diff --git a/dimos/perception/spatial_perception.py b/dimos/perception/spatial_perception.py index fe6d7d50e0..13a3c8e289 100644 --- a/dimos/perception/spatial_perception.py +++ b/dimos/perception/spatial_perception.py @@ -583,8 +583,3 @@ def deploy( # type: ignore[no-untyped-def] spatial_memory.color_image.connect(camera.color_image) spatial_memory.start() return spatial_memory - - -spatial_memory = SpatialMemory.blueprint - -__all__ = ["SpatialMemory", "deploy", "spatial_memory"] diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 5fd61891c2..6d77effe68 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -97,56 +97,78 @@ all_modules = { "agent": "dimos.agents.agent", "arm-teleop-module": "dimos.teleop.quest.quest_extensions", + "b-box-navigation-module": "dimos.navigation.bbox_navigation", + "b1-connection-module": "dimos.robot.unitree.b1.connection", "camera-module": "dimos.hardware.sensors.camera.module", "cartesian-motion-controller": "dimos.manipulation.control.servo_control.cartesian_motion_controller", "control-coordinator": "dimos.control.coordinator", "cost-mapper": "dimos.mapping.costmapper", "demo-calculator-skill": "dimos.agents.skills.demo_calculator_skill", "demo-robot": "dimos.agents.skills.demo_robot", - "detection-db-module": "dimos.perception.detection.moduleDB", - "detection3d-module": "dimos.perception.detection.module3D", - "fastlio2-module": "dimos.hardware.sensors.lidar.fastlio2.module", + "detection2-d-module": "dimos.perception.detection.module2D", + "detection3-d-module": "dimos.perception.detection.module3D", + "drone-camera-module": "dimos.robot.drone.camera_module", + "drone-connection-module": "dimos.robot.drone.connection_module", + "drone-tracking-module": "dimos.robot.drone.drone_tracking_module", + "embedding-memory": "dimos.memory.embedding", + "emitter-module": "dimos.utils.demo_image_encoding", + "fast-lio2": "dimos.hardware.sensors.lidar.fastlio2.module", "foxglove-bridge": "dimos.robot.foxglove_bridge", "g1-connection": "dimos.robot.unitree.g1.connection", + "g1-connection-base": "dimos.robot.unitree.g1.connection", "g1-sim-connection": "dimos.robot.unitree.g1.sim", - "g1-skills": "dimos.robot.unitree.g1.skill_container", "go2-connection": "dimos.robot.unitree.go2.connection", "go2-fleet-connection": "dimos.robot.unitree.go2.fleet_connection", - "google-maps-skill": "dimos.agents.skills.google_maps_skill_container", - "gps-nav-skill": "dimos.agents.skills.gps_nav_skill", + "google-maps-skill-container": "dimos.agents.skills.google_maps_skill_container", + "gps-nav-skill-container": "dimos.agents.skills.gps_nav_skill", + "grasp-gen-module": "dimos.manipulation.grasping.graspgen_module", "grasping-module": "dimos.manipulation.grasping.grasping", + "gstreamer-camera-module": "dimos.hardware.sensors.camera.gstreamer.gstreamer_camera", "joint-trajectory-controller": "dimos.manipulation.control.trajectory_controller.joint_trajectory_controller", + "joystick-module": "dimos.robot.unitree.b1.joystick_module", "keyboard-teleop": "dimos.robot.unitree.keyboard_teleop", "keyboard-teleop-module": "dimos.teleop.keyboard.keyboard_teleop_module", "manipulation-module": "dimos.manipulation.manipulation_module", - "mapper": "dimos.robot.unitree.type.map", + "map": "dimos.robot.unitree.type.map", "mcp-client": "dimos.agents.mcp.mcp_client", - "mid360-module": "dimos.hardware.sensors.lidar.livox.module", - "navigation-skill": "dimos.agents.skills.navigation", + "mcp-server": "dimos.agents.mcp.mcp_server", + "mock-b1-connection-module": "dimos.robot.unitree.b1.connection", + "module-a": "dimos.robot.unitree.demo_error_on_name_conflicts", + "module-b": "dimos.robot.unitree.demo_error_on_name_conflicts", + "navigation-module": "dimos.robot.unitree.rosnav", + "navigation-skill-container": "dimos.agents.skills.navigation", + "object-db-module": "dimos.perception.detection.moduleDB", "object-scene-registration-module": "dimos.perception.object_scene_registration", + "object-tracker2-d": "dimos.perception.object_tracker_2d", + "object-tracker3-d": "dimos.perception.object_tracker_3d", "object-tracking": "dimos.perception.object_tracker", "osm-skill": "dimos.agents.skills.osm", - "person-follow-skill": "dimos.agents.skills.person_follow", - "person-tracker-module": "dimos.perception.detection.person_tracker", + "patrolling-module": "dimos.navigation.patrolling.module", + "perceive-loop-skill": "dimos.perception.perceive_loop_skill", + "person-follow-skill-container": "dimos.agents.skills.person_follow", + "person-tracker": "dimos.perception.detection.person_tracker", "phone-teleop-module": "dimos.teleop.phone.phone_teleop_module", "pick-and-place-module": "dimos.manipulation.pick_and_place_module", "quest-teleop-module": "dimos.teleop.quest.quest_teleop_module", - "realsense-camera": "dimos.hardware.sensors.camera.realsense.camera", + "real-sense-camera": "dimos.hardware.sensors.camera.realsense.camera", + "receiver-module": "dimos.utils.demo_image_encoding", + "reid-module": "dimos.perception.detection.reid.module", "replanning-a-star-planner": "dimos.navigation.replanning_a_star.module", - "rerun-bridge": "dimos.visualization.rerun.bridge", + "rerun-bridge-module": "dimos.visualization.rerun.bridge", "ros-nav": "dimos.navigation.rosnav", - "simple-phone-teleop-module": "dimos.teleop.phone.phone_extensions", - "simulation": "dimos.simulation.manipulators.sim_module", + "simple-phone-teleop": "dimos.teleop.phone.phone_extensions", + "simulation-module": "dimos.simulation.manipulators.sim_module", "spatial-memory": "dimos.perception.spatial_perception", "speak-skill": "dimos.agents.skills.speak_skill", "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", + "unitree-g1-skill-container": "dimos.robot.unitree.g1.skill_container", + "unitree-skill-container": "dimos.robot.unitree.unitree_skill_container", "vlm-agent": "dimos.agents.vlm_agent", "vlm-stream-tester": "dimos.agents.vlm_stream_tester", - "voxel-mapper": "dimos.mapping.voxels", + "voxel-grid-mapper": "dimos.mapping.voxels", "wavefront-frontier-explorer": "dimos.navigation.frontier_exploration.wavefront_frontier_goal_selector", "web-input": "dimos.agents.web_human_input", - "websocket-vis": "dimos.web.websocket_vis.websocket_vis_module", + "websocket-vis-module": "dimos.web.websocket_vis.websocket_vis_module", "zed-camera": "dimos.hardware.sensors.camera.zed.camera", } diff --git a/dimos/robot/drone/blueprints/agentic/drone_agentic.py b/dimos/robot/drone/blueprints/agentic/drone_agentic.py index 5c0483dc24..f94af1ac5c 100644 --- a/dimos/robot/drone/blueprints/agentic/drone_agentic.py +++ b/dimos/robot/drone/blueprints/agentic/drone_agentic.py @@ -20,10 +20,10 @@ tracking, mapping skills, and an LLM agent. """ -from dimos.agents.agent import agent +from dimos.agents.agent import Agent from dimos.agents.skills.google_maps_skill_container import GoogleMapsSkillContainer from dimos.agents.skills.osm import OsmSkill -from dimos.agents.web_human_input import web_input +from dimos.agents.web_human_input import WebInput from dimos.core.blueprints import autoconnect from dimos.robot.drone.blueprints.basic.drone_basic import drone_basic from dimos.robot.drone.drone_tracking_module import DroneTrackingModule @@ -44,8 +44,8 @@ DroneTrackingModule.blueprint(outdoor=False), GoogleMapsSkillContainer.blueprint(), OsmSkill.blueprint(), - agent(system_prompt=DRONE_SYSTEM_PROMPT, model="gpt-4o"), - web_input(), + Agent.blueprint(system_prompt=DRONE_SYSTEM_PROMPT, model="gpt-4o"), + WebInput.blueprint(), ).remappings( [ (DroneTrackingModule, "video_input", "video"), diff --git a/dimos/robot/drone/blueprints/basic/drone_basic.py b/dimos/robot/drone/blueprints/basic/drone_basic.py index cfa311b80b..fbe6621ae1 100644 --- a/dimos/robot/drone/blueprints/basic/drone_basic.py +++ b/dimos/robot/drone/blueprints/basic/drone_basic.py @@ -23,7 +23,7 @@ from dimos.protocol.pubsub.impl.lcmpubsub import LCM from dimos.robot.drone.camera_module import DroneCameraModule from dimos.robot.drone.connection_module import DroneConnectionModule -from dimos.web.websocket_vis.websocket_vis_module import websocket_vis +from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule def _static_drone_body(rr: Any) -> list[Any]: @@ -68,13 +68,13 @@ def _drone_rerun_blueprint() -> Any: # Conditional visualization if global_config.viewer == "foxglove": - from dimos.robot.foxglove_bridge import foxglove_bridge + from dimos.robot.foxglove_bridge import FoxgloveBridge - _vis = foxglove_bridge() + _vis = FoxgloveBridge.blueprint() elif global_config.viewer.startswith("rerun"): - from dimos.visualization.rerun.bridge import _resolve_viewer_mode, rerun_bridge + from dimos.visualization.rerun.bridge import RerunBridgeModule, _resolve_viewer_mode - _vis = rerun_bridge(viewer_mode=_resolve_viewer_mode(), **_rerun_config) + _vis = RerunBridgeModule.blueprint(viewer_mode=_resolve_viewer_mode(), **_rerun_config) else: _vis = autoconnect() @@ -92,7 +92,7 @@ def _drone_rerun_blueprint() -> Any: outdoor=False, ), DroneCameraModule.blueprint(camera_intrinsics=[1000.0, 1000.0, 960.0, 540.0]), - websocket_vis(), + WebsocketVisModule.blueprint(), ) __all__ = [ diff --git a/dimos/robot/foxglove_bridge.py b/dimos/robot/foxglove_bridge.py index 9f0fc938e5..f5b6c20c97 100644 --- a/dimos/robot/foxglove_bridge.py +++ b/dimos/robot/foxglove_bridge.py @@ -105,9 +105,3 @@ def deploy( ) foxglove_bridge.start() return foxglove_bridge - - -foxglove_bridge = FoxgloveBridge.blueprint - - -__all__ = ["FoxgloveBridge", "deploy", "foxglove_bridge"] diff --git a/dimos/robot/manipulators/piper/blueprints.py b/dimos/robot/manipulators/piper/blueprints.py index ead27fd54b..54a1242537 100644 --- a/dimos/robot/manipulators/piper/blueprints.py +++ b/dimos/robot/manipulators/piper/blueprints.py @@ -23,16 +23,16 @@ """ from dimos.control.components import HardwareComponent, HardwareType, make_joints -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.blueprints import autoconnect from dimos.core.transport import LCMTransport -from dimos.manipulation.manipulation_module import manipulation_module +from dimos.manipulation.manipulation_module import ManipulationModule from dimos.manipulation.planning.spec.config import RobotModelConfig from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.Quaternion import Quaternion from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.sensor_msgs.JointState import JointState -from dimos.teleop.keyboard.keyboard_teleop_module import keyboard_teleop_module +from dimos.teleop.keyboard.keyboard_teleop_module import KeyboardTeleopModule from dimos.utils.data import LfsPath, get_data _PIPER_MODEL_PATH = LfsPath("piper_description/mujoco_model/piper_no_gripper_description.xml") @@ -40,8 +40,8 @@ # Piper 6-DOF mock sim + keyboard teleop + Drake visualization keyboard_teleop_piper = autoconnect( - keyboard_teleop_module(model_path=_PIPER_MODEL_PATH, ee_joint_id=6), - control_coordinator( + KeyboardTeleopModule.blueprint(model_path=_PIPER_MODEL_PATH, ee_joint_id=6), + ControlCoordinator.blueprint( tick_rate=100.0, publish_joint_state=True, joint_state_frame_id="coordinator", @@ -64,7 +64,7 @@ ), ], ), - manipulation_module( + ManipulationModule.blueprint( robots=[ RobotModelConfig( name="arm", diff --git a/dimos/robot/manipulators/xarm/blueprints.py b/dimos/robot/manipulators/xarm/blueprints.py index e699057b44..ebfe9f2329 100644 --- a/dimos/robot/manipulators/xarm/blueprints.py +++ b/dimos/robot/manipulators/xarm/blueprints.py @@ -24,17 +24,17 @@ """ from dimos.control.components import HardwareComponent, HardwareType, make_joints -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.blueprints import autoconnect from dimos.core.transport import LCMTransport from dimos.manipulation.blueprints import ( _make_xarm6_config, _make_xarm7_config, ) -from dimos.manipulation.manipulation_module import manipulation_module +from dimos.manipulation.manipulation_module import ManipulationModule from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.JointState import JointState -from dimos.teleop.keyboard.keyboard_teleop_module import keyboard_teleop_module +from dimos.teleop.keyboard.keyboard_teleop_module import KeyboardTeleopModule from dimos.utils.data import LfsPath _XARM6_MODEL_PATH = LfsPath("xarm_description/urdf/xarm6/xarm6.urdf") @@ -42,8 +42,8 @@ # XArm6 mock sim + keyboard teleop + Drake visualization keyboard_teleop_xarm6 = autoconnect( - keyboard_teleop_module(model_path=_XARM6_MODEL_PATH, ee_joint_id=6), - control_coordinator( + KeyboardTeleopModule.blueprint(model_path=_XARM6_MODEL_PATH, ee_joint_id=6), + ControlCoordinator.blueprint( tick_rate=100.0, publish_joint_state=True, joint_state_frame_id="coordinator", @@ -66,7 +66,7 @@ ), ], ), - manipulation_module( + ManipulationModule.blueprint( robots=[_make_xarm6_config(name="arm", joint_prefix="arm_", add_gripper=False)], enable_viz=True, ), @@ -81,8 +81,8 @@ # XArm7 mock sim + keyboard teleop + Drake visualization keyboard_teleop_xarm7 = autoconnect( - keyboard_teleop_module(model_path=_XARM7_MODEL_PATH, ee_joint_id=7), - control_coordinator( + KeyboardTeleopModule.blueprint(model_path=_XARM7_MODEL_PATH, ee_joint_id=7), + ControlCoordinator.blueprint( tick_rate=100.0, publish_joint_state=True, joint_state_frame_id="coordinator", @@ -105,7 +105,7 @@ ), ], ), - manipulation_module( + ManipulationModule.blueprint( robots=[_make_xarm7_config(name="arm", joint_prefix="arm_", add_gripper=False)], enable_viz=True, ), diff --git a/dimos/robot/test_all_blueprints.py b/dimos/robot/test_all_blueprints.py index 6c2d000ca8..78d0540fe1 100644 --- a/dimos/robot/test_all_blueprints.py +++ b/dimos/robot/test_all_blueprints.py @@ -22,6 +22,7 @@ OPTIONAL_DEPENDENCIES = {"pyrealsense2", "pyzed", "geometry_msgs", "turbojpeg"} OPTIONAL_ERROR_SUBSTRINGS = { "Unable to locate turbojpeg library automatically", + "ZED SDK not installed", } diff --git a/dimos/robot/test_all_blueprints_generation.py b/dimos/robot/test_all_blueprints_generation.py index e110df74e2..c4b9652e47 100644 --- a/dimos/robot/test_all_blueprints_generation.py +++ b/dimos/robot/test_all_blueprints_generation.py @@ -17,6 +17,7 @@ import difflib import os from pathlib import Path +import re import subprocess import pytest @@ -32,6 +33,7 @@ "dimos/core/test_blueprints.py", } BLUEPRINT_METHODS = {"transports", "global_config", "remappings", "requirements", "configurators"} +_EXCLUDED_MODULE_NAMES = {"Module", "ModuleBase"} def test_all_blueprints_is_current() -> None: @@ -76,22 +78,107 @@ def test_all_blueprints_is_current() -> None: ) +def _camel_to_snake(name: str) -> str: + """Convert CamelCase class name to snake_case.""" + s = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", name) + s = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", s) + return s.lower() + + +def _get_base_class_names(node: ast.ClassDef) -> list[str]: + """Extract base class names from a ClassDef, handling Name, Attribute, and Subscript.""" + names: list[str] = [] + for base in node.bases: + if isinstance(base, ast.Name): + names.append(base.id) + elif isinstance(base, ast.Attribute): + names.append(base.attr) + elif isinstance(base, ast.Subscript): + # Handle Generic[T] style: class Module(ModuleBase[ConfigT]) + v = base.value + if isinstance(v, ast.Name): + names.append(v.id) + elif isinstance(v, ast.Attribute): + names.append(v.attr) + return names + + +def _build_module_class_set(root: Path) -> set[str]: + """Build the set of all class names that are Module subclasses. + + Uses the same transitive-closure approach as dimos.core.test_modules: + start from {"Module", "ModuleBase"} and iteratively add any class whose + base appears in the known set until convergence. + """ + known: set[str] = {"Module", "ModuleBase"} + all_classes: list[tuple[str, list[str]]] = [] + + for path in sorted(root.rglob("*.py")): + if "__pycache__" in str(path): + continue + try: + tree = ast.parse(path.read_text("utf-8"), str(path)) + except Exception: + continue + for node in tree.body: + if isinstance(node, ast.ClassDef): + all_classes.append((node.name, _get_base_class_names(node))) + + changed = True + while changed: + changed = False + for name, bases in all_classes: + if name not in known and any(b in known for b in bases): + known.add(name) + changed = True + + return known + + +def _is_production_module_file(file_path: Path, root: Path) -> bool: + """Return True if this file should contribute to the all_modules registry. + + Excludes test helpers, deprecated code, and framework base classes in core/. + """ + rel = str(file_path.relative_to(root)) + stem = file_path.stem + return not ( + stem.startswith("test_") + or "_test_" in stem + or stem.endswith("_test") + or stem.startswith("fake_") + or stem.startswith("mock_") + or "deprecated" in rel + or "/testing/" in rel + or rel.startswith("core/") + ) + + def _scan_for_blueprints(root: Path) -> tuple[dict[str, str], dict[str, str]]: all_blueprints: dict[str, str] = {} all_modules: dict[str, str] = {} + module_classes = _build_module_class_set(root) + for file_path in sorted(_get_all_python_files(root)): module_name = _path_to_module_name(file_path, root) - blueprint_vars, module_vars = _find_blueprints_in_file(file_path) + blueprint_vars, module_vars = _find_blueprints_in_file(file_path, module_classes) for var_name in blueprint_vars: full_path = f"{module_name}:{var_name}" cli_name = var_name.replace("_", "-") all_blueprints[cli_name] = full_path - for var_name in module_vars: - cli_name = var_name.replace("_", "-") - all_modules[cli_name] = module_name + # Only register modules from production files (skip test, deprecated, core) + if _is_production_module_file(file_path, root): + for var_name in module_vars: + cli_name = var_name.replace("_", "-") + all_modules[cli_name] = module_name + + # Blueprints take priority when names collide (e.g. a pre-configured + # blueprint named "mid360" vs the raw Mid360 Module class). + for key in set(all_modules) & set(all_blueprints): + del all_modules[key] return all_blueprints, all_modules @@ -161,7 +248,9 @@ def _path_to_module_name(path: Path, root: Path) -> str: return ".".join(parts) -def _find_blueprints_in_file(file_path: Path) -> tuple[list[str], list[str]]: +def _find_blueprints_in_file( + file_path: Path, module_classes: set[str] | None = None +) -> tuple[list[str], list[str]]: blueprint_vars: list[str] = [] module_vars: list[str] = [] @@ -173,24 +262,26 @@ def _find_blueprints_in_file(file_path: Path) -> tuple[list[str], list[str]]: # Only look at top-level statements (direct children of the Module node) for node in tree.body: - if not isinstance(node, ast.Assign): - continue - - # Get the variable name(s) - for target in node.targets: - if not isinstance(target, ast.Name): - continue - var_name = target.id - - if var_name.startswith("_"): + if isinstance(node, ast.Assign): + # Get the variable name(s) + for target in node.targets: + if not isinstance(target, ast.Name): + continue + var_name = target.id + + if var_name.startswith("_"): + continue + + # Check if it's a blueprint (ModuleBlueprintSet instance) + if _is_autoconnect_call(node.value) or _ends_with_blueprint_method(node.value): + blueprint_vars.append(var_name) + + # Detect Module subclasses by checking base classes against the known set + elif isinstance(node, ast.ClassDef) and module_classes: + if node.name.startswith("_") or node.name in _EXCLUDED_MODULE_NAMES: continue - - # Check if it's a blueprint (ModuleBlueprintSet instance) - if _is_autoconnect_call(node.value) or _ends_with_blueprint_method(node.value): - blueprint_vars.append(var_name) - # Check if it's a module factory (SomeModule.blueprint) - elif _is_blueprint_factory(node.value): - module_vars.append(var_name) + if any(b in module_classes for b in _get_base_class_names(node)): + module_vars.append(_camel_to_snake(node.name)) return blueprint_vars, module_vars @@ -213,9 +304,3 @@ def _ends_with_blueprint_method(node: ast.expr) -> bool: if isinstance(func, ast.Attribute) and func.attr in BLUEPRINT_METHODS: return True return False - - -def _is_blueprint_factory(node: ast.expr) -> bool: - if isinstance(node, ast.Attribute): - return node.attr == "blueprint" - return False diff --git a/dimos/robot/unitree/g1/blueprints/agentic/_agentic_skills.py b/dimos/robot/unitree/g1/blueprints/agentic/_agentic_skills.py index 820f532570..834dd6d0a3 100644 --- a/dimos/robot/unitree/g1/blueprints/agentic/_agentic_skills.py +++ b/dimos/robot/unitree/g1/blueprints/agentic/_agentic_skills.py @@ -15,18 +15,18 @@ """Agentic skills used by higher-level G1 blueprints.""" -from dimos.agents.agent import agent -from dimos.agents.skills.navigation import navigation_skill -from dimos.agents.skills.speak_skill import speak_skill +from dimos.agents.agent import Agent +from dimos.agents.skills.navigation import NavigationSkillContainer +from dimos.agents.skills.speak_skill import SpeakSkill from dimos.core.blueprints import autoconnect -from dimos.robot.unitree.g1.skill_container import g1_skills +from dimos.robot.unitree.g1.skill_container import UnitreeG1SkillContainer from dimos.robot.unitree.g1.system_prompt import G1_SYSTEM_PROMPT _agentic_skills = autoconnect( - agent(system_prompt=G1_SYSTEM_PROMPT), - navigation_skill(), - speak_skill(), - g1_skills(), + Agent.blueprint(system_prompt=G1_SYSTEM_PROMPT), + NavigationSkillContainer.blueprint(), + SpeakSkill.blueprint(), + UnitreeG1SkillContainer.blueprint(), ) __all__ = ["_agentic_skills"] diff --git a/dimos/robot/unitree/g1/blueprints/agentic/unitree_g1_full.py b/dimos/robot/unitree/g1/blueprints/agentic/unitree_g1_full.py index 7f826f2eec..b3c6dfabaa 100644 --- a/dimos/robot/unitree/g1/blueprints/agentic/unitree_g1_full.py +++ b/dimos/robot/unitree/g1/blueprints/agentic/unitree_g1_full.py @@ -18,12 +18,12 @@ from dimos.core.blueprints import autoconnect from dimos.robot.unitree.g1.blueprints.agentic._agentic_skills import _agentic_skills from dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1_shm import unitree_g1_shm -from dimos.robot.unitree.keyboard_teleop import keyboard_teleop +from dimos.robot.unitree.keyboard_teleop import KeyboardTeleop unitree_g1_full = autoconnect( unitree_g1_shm, _agentic_skills, - keyboard_teleop(), + KeyboardTeleop.blueprint(), ) __all__ = ["unitree_g1_full"] diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic.py index 1fb591e895..fd392e4aa2 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic.py @@ -16,16 +16,16 @@ """Basic G1 stack: base sensors plus real robot connection and ROS nav.""" from dimos.core.blueprints import autoconnect -from dimos.navigation.rosnav import ros_nav +from dimos.navigation.rosnav import ROSNav from dimos.robot.unitree.g1.blueprints.primitive.uintree_g1_primitive_no_nav import ( uintree_g1_primitive_no_nav, ) -from dimos.robot.unitree.g1.connection import g1_connection +from dimos.robot.unitree.g1.connection import G1Connection unitree_g1_basic = autoconnect( uintree_g1_primitive_no_nav, - g1_connection(), - ros_nav(), + G1Connection.blueprint(), + ROSNav.blueprint(), ) __all__ = ["unitree_g1_basic"] diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic_sim.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic_sim.py index 603a9535ee..3294da1772 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic_sim.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_basic_sim.py @@ -16,16 +16,16 @@ """Basic G1 sim stack: base sensors plus sim connection and planner.""" from dimos.core.blueprints import autoconnect -from dimos.navigation.replanning_a_star.module import replanning_a_star_planner +from dimos.navigation.replanning_a_star.module import ReplanningAStarPlanner from dimos.robot.unitree.g1.blueprints.primitive.uintree_g1_primitive_no_nav import ( uintree_g1_primitive_no_nav, ) -from dimos.robot.unitree.g1.sim import g1_sim_connection +from dimos.robot.unitree.g1.sim import G1SimConnection unitree_g1_basic_sim = autoconnect( uintree_g1_primitive_no_nav, - g1_sim_connection(), - replanning_a_star_planner(), + G1SimConnection.blueprint(), + ReplanningAStarPlanner.blueprint(), ) __all__ = ["unitree_g1_basic_sim"] diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_joystick.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_joystick.py index 0242556189..4dcc6a8329 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_joystick.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_joystick.py @@ -17,11 +17,11 @@ from dimos.core.blueprints import autoconnect from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_basic import unitree_g1_basic -from dimos.robot.unitree.keyboard_teleop import keyboard_teleop +from dimos.robot.unitree.keyboard_teleop import KeyboardTeleop unitree_g1_joystick = autoconnect( unitree_g1_basic, - keyboard_teleop(), # Pygame-based joystick control + KeyboardTeleop.blueprint(), # Pygame-based joystick control ) __all__ = ["unitree_g1_joystick"] diff --git a/dimos/robot/unitree/g1/blueprints/perceptive/_perception_and_memory.py b/dimos/robot/unitree/g1/blueprints/perceptive/_perception_and_memory.py index 241fcb32a8..672a990f94 100644 --- a/dimos/robot/unitree/g1/blueprints/perceptive/_perception_and_memory.py +++ b/dimos/robot/unitree/g1/blueprints/perceptive/_perception_and_memory.py @@ -16,12 +16,12 @@ """Perception and memory modules used by higher-level G1 blueprints.""" from dimos.core.blueprints import autoconnect -from dimos.perception.object_tracker import object_tracking -from dimos.perception.spatial_perception import spatial_memory +from dimos.perception.object_tracker import ObjectTracking +from dimos.perception.spatial_perception import SpatialMemory _perception_and_memory = autoconnect( - spatial_memory(), - object_tracking(frame_id="camera_link"), + SpatialMemory.blueprint(), + ObjectTracking.blueprint(frame_id="camera_link"), ) __all__ = ["_perception_and_memory"] diff --git a/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_detection.py b/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_detection.py index 18884bd7af..9bd82f0f6f 100644 --- a/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_detection.py +++ b/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_detection.py @@ -28,9 +28,9 @@ from dimos.msgs.sensor_msgs.PointCloud2 import PointCloud2 from dimos.msgs.vision_msgs.Detection2DArray import Detection2DArray from dimos.perception.detection.detectors.person.yolo import YoloPersonDetector -from dimos.perception.detection.module3D import Detection3DModule, detection3d_module -from dimos.perception.detection.moduleDB import ObjectDBModule, detection_db_module -from dimos.perception.detection.person_tracker import PersonTracker, person_tracker_module +from dimos.perception.detection.module3D import Detection3DModule +from dimos.perception.detection.moduleDB import ObjectDBModule +from dimos.perception.detection.person_tracker import PersonTracker from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_basic import unitree_g1_basic @@ -42,15 +42,15 @@ def _person_only(det: Any) -> bool: autoconnect( unitree_g1_basic, # Person detection modules with YOLO - detection3d_module( + Detection3DModule.blueprint( camera_info=zed.CameraInfo.SingleWebcam, detector=YoloPersonDetector, ), - detection_db_module( + ObjectDBModule.blueprint( camera_info=zed.CameraInfo.SingleWebcam, filter=_person_only, # Filter for person class only ), - person_tracker_module( + PersonTracker.blueprint( cameraInfo=zed.CameraInfo.SingleWebcam, ), ) diff --git a/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_shm.py b/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_shm.py index be67194b62..5b127fb697 100644 --- a/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_shm.py +++ b/dimos/robot/unitree/g1/blueprints/perceptive/unitree_g1_shm.py @@ -19,7 +19,7 @@ from dimos.core.blueprints import autoconnect from dimos.core.transport import pSHMTransport from dimos.msgs.sensor_msgs.Image import Image -from dimos.robot.foxglove_bridge import foxglove_bridge +from dimos.robot.foxglove_bridge import FoxgloveBridge from dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1 import unitree_g1 unitree_g1_shm = autoconnect( @@ -30,7 +30,7 @@ ), } ), - foxglove_bridge( + FoxgloveBridge.blueprint( shm_channels=[ "/color_image#sensor_msgs.Image", ] diff --git a/dimos/robot/unitree/g1/blueprints/primitive/uintree_g1_primitive_no_nav.py b/dimos/robot/unitree/g1/blueprints/primitive/uintree_g1_primitive_no_nav.py index 242fcaf38f..c3da9521c5 100644 --- a/dimos/robot/unitree/g1/blueprints/primitive/uintree_g1_primitive_no_nav.py +++ b/dimos/robot/unitree/g1/blueprints/primitive/uintree_g1_primitive_no_nav.py @@ -22,11 +22,11 @@ from dimos.core.blueprints import autoconnect from dimos.core.global_config import global_config from dimos.core.transport import LCMTransport -from dimos.hardware.sensors.camera.module import camera_module # type: ignore[attr-defined] +from dimos.hardware.sensors.camera.module import CameraModule # type: ignore[attr-defined] from dimos.hardware.sensors.camera.webcam import Webcam from dimos.hardware.sensors.camera.zed import compat as zed -from dimos.mapping.costmapper import cost_mapper -from dimos.mapping.voxels import voxel_mapper +from dimos.mapping.costmapper import CostMapper +from dimos.mapping.voxels import VoxelGridMapper from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.Quaternion import Quaternion from dimos.msgs.geometry_msgs.Transform import Transform @@ -38,10 +38,10 @@ from dimos.msgs.sensor_msgs.PointCloud2 import PointCloud2 from dimos.msgs.std_msgs.Bool import Bool from dimos.navigation.frontier_exploration.wavefront_frontier_goal_selector import ( - wavefront_frontier_explorer, + WavefrontFrontierExplorer, ) from dimos.protocol.pubsub.impl.lcmpubsub import LCM -from dimos.web.websocket_vis.websocket_vis_module import websocket_vis +from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule def _convert_camera_info(camera_info: Any) -> Any: @@ -102,13 +102,15 @@ def _g1_rerun_blueprint() -> Any: } if global_config.viewer == "foxglove": - from dimos.robot.foxglove_bridge import foxglove_bridge + from dimos.robot.foxglove_bridge import FoxgloveBridge - _with_vis = autoconnect(foxglove_bridge()) + _with_vis = autoconnect(FoxgloveBridge.blueprint()) elif global_config.viewer.startswith("rerun"): - from dimos.visualization.rerun.bridge import _resolve_viewer_mode, rerun_bridge + from dimos.visualization.rerun.bridge import RerunBridgeModule, _resolve_viewer_mode - _with_vis = autoconnect(rerun_bridge(viewer_mode=_resolve_viewer_mode(), **rerun_config)) + _with_vis = autoconnect( + RerunBridgeModule.blueprint(viewer_mode=_resolve_viewer_mode(), **rerun_config) + ) else: _with_vis = autoconnect() @@ -124,7 +126,7 @@ def _create_webcam() -> Webcam: _camera = ( autoconnect( - camera_module( + CameraModule.blueprint( transform=Transform( translation=Vector3(0.05, 0.0, 0.6), # height of camera on G1 robot rotation=Quaternion.from_euler(Vector3(0.0, 0.2, 0.0)), @@ -142,11 +144,11 @@ def _create_webcam() -> Webcam: autoconnect( _with_vis, _camera, - voxel_mapper(voxel_size=0.1), - cost_mapper(), - wavefront_frontier_explorer(), + VoxelGridMapper.blueprint(voxel_size=0.1), + CostMapper.blueprint(), + WavefrontFrontierExplorer.blueprint(), # Visualization - websocket_vis(), + WebsocketVisModule.blueprint(), ) .global_config(n_workers=4, robot_model="unitree_g1") .transports( diff --git a/dimos/robot/unitree/g1/connection.py b/dimos/robot/unitree/g1/connection.py index 1f3788de98..bc2ca7d3d9 100644 --- a/dimos/robot/unitree/g1/connection.py +++ b/dimos/robot/unitree/g1/connection.py @@ -112,14 +112,8 @@ def publish_request(self, topic: str, data: dict[str, Any]) -> dict[Any, Any]: return self.connection.publish_request(topic, data) # type: ignore[no-any-return] -g1_connection = G1Connection.blueprint - - def deploy(dimos: ModuleCoordinator, ip: str, local_planner: LocalPlanner) -> "ModuleProxy": connection = dimos.deploy(G1Connection, ip=ip) connection.cmd_vel.connect(local_planner.cmd_vel) connection.start() return connection - - -__all__ = ["G1Connection", "G1ConnectionBase", "deploy", "g1_connection"] diff --git a/dimos/robot/unitree/g1/sim.py b/dimos/robot/unitree/g1/sim.py index 206a689284..22fc33a978 100644 --- a/dimos/robot/unitree/g1/sim.py +++ b/dimos/robot/unitree/g1/sim.py @@ -148,9 +148,3 @@ def publish_request(self, topic: str, data: dict[str, Any]) -> dict[Any, Any]: logger.info(f"Publishing request to topic: {topic} with data: {data}") assert self.connection is not None return self.connection.publish_request(topic, data) - - -g1_sim_connection = G1SimConnection.blueprint - - -__all__ = ["G1SimConnection", "g1_sim_connection"] diff --git a/dimos/robot/unitree/g1/skill_container.py b/dimos/robot/unitree/g1/skill_container.py index b1342ca96d..ffe8dae5f0 100644 --- a/dimos/robot/unitree/g1/skill_container.py +++ b/dimos/robot/unitree/g1/skill_container.py @@ -158,7 +158,3 @@ def _execute_g1_command( {_mode_commands} """ - -g1_skills = UnitreeG1SkillContainer.blueprint - -__all__ = ["UnitreeG1SkillContainer", "g1_skills"] diff --git a/dimos/robot/unitree/go2/blueprints/agentic/_common_agentic.py b/dimos/robot/unitree/go2/blueprints/agentic/_common_agentic.py index 817d5e3a7d..874feddd35 100644 --- a/dimos/robot/unitree/go2/blueprints/agentic/_common_agentic.py +++ b/dimos/robot/unitree/go2/blueprints/agentic/_common_agentic.py @@ -13,20 +13,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.skills.navigation import navigation_skill -from dimos.agents.skills.person_follow import person_follow_skill -from dimos.agents.skills.speak_skill import speak_skill -from dimos.agents.web_human_input import web_input +from dimos.agents.skills.navigation import NavigationSkillContainer +from dimos.agents.skills.person_follow import PersonFollowSkillContainer +from dimos.agents.skills.speak_skill import SpeakSkill +from dimos.agents.web_human_input import WebInput from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.connection import GO2Connection -from dimos.robot.unitree.unitree_skill_container import unitree_skills +from dimos.robot.unitree.unitree_skill_container import UnitreeSkillContainer _common_agentic = autoconnect( - navigation_skill(), - person_follow_skill(camera_info=GO2Connection.camera_info_static), - unitree_skills(), - web_input(), - speak_skill(), + NavigationSkillContainer.blueprint(), + PersonFollowSkillContainer.blueprint(camera_info=GO2Connection.camera_info_static), + UnitreeSkillContainer.blueprint(), + WebInput.blueprint(), + SpeakSkill.blueprint(), ) __all__ = ["_common_agentic"] diff --git a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic.py b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic.py index 2fb1a4cb74..cb0d523fbd 100644 --- a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic.py +++ b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic.py @@ -13,14 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent +from dimos.agents.agent import Agent from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.blueprints.agentic._common_agentic import _common_agentic from dimos.robot.unitree.go2.blueprints.smart.unitree_go2_spatial import unitree_go2_spatial unitree_go2_agentic = autoconnect( unitree_go2_spatial, - agent(), + Agent.blueprint(), _common_agentic, ) diff --git a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_huggingface.py b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_huggingface.py index 1c998b7495..75a2245a99 100644 --- a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_huggingface.py +++ b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_huggingface.py @@ -13,14 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent +from dimos.agents.agent import Agent from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.blueprints.agentic._common_agentic import _common_agentic from dimos.robot.unitree.go2.blueprints.smart.unitree_go2_spatial import unitree_go2_spatial unitree_go2_agentic_huggingface = autoconnect( unitree_go2_spatial, - agent(model="huggingface:Qwen/Qwen2.5-1.5B-Instruct"), + Agent.blueprint(model="huggingface:Qwen/Qwen2.5-1.5B-Instruct"), _common_agentic, ) diff --git a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_mcp.py b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_mcp.py index e75b31e511..0663119adb 100644 --- a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_mcp.py +++ b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_mcp.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.mcp.mcp_client import mcp_client +from dimos.agents.mcp.mcp_client import McpClient from dimos.agents.mcp.mcp_server import McpServer from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.blueprints.agentic._common_agentic import _common_agentic @@ -22,7 +22,7 @@ unitree_go2_agentic_mcp = autoconnect( unitree_go2_spatial, McpServer.blueprint(), - mcp_client(), + McpClient.blueprint(), _common_agentic, ) diff --git a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_ollama.py b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_ollama.py index 6a518ad831..334ea52d35 100644 --- a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_ollama.py +++ b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_ollama.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.agent import agent +from dimos.agents.agent import Agent from dimos.agents.ollama_agent import ollama_installed from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.blueprints.agentic._common_agentic import _common_agentic @@ -21,7 +21,7 @@ unitree_go2_agentic_ollama = autoconnect( unitree_go2_spatial, - agent(model="ollama:qwen3:8b"), + Agent.blueprint(model="ollama:qwen3:8b"), _common_agentic, ).requirements( ollama_installed, diff --git a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_temporal_memory.py b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_temporal_memory.py index 24ab47ad3b..733672bc78 100644 --- a/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_temporal_memory.py +++ b/dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_temporal_memory.py @@ -16,8 +16,8 @@ from dimos.core.blueprints import autoconnect from dimos.core.global_config import global_config from dimos.perception.experimental.temporal_memory.temporal_memory import ( + TemporalMemory, TemporalMemoryConfig, - temporal_memory, ) from dimos.robot.unitree.go2.blueprints.agentic.unitree_go2_agentic import unitree_go2_agentic @@ -25,7 +25,7 @@ # AFTER global_config.update() has applied CLI flags like --new-memory. unitree_go2_temporal_memory = autoconnect( unitree_go2_agentic, - temporal_memory(config=TemporalMemoryConfig(new_memory=global_config.new_memory)), + TemporalMemory.blueprint(config=TemporalMemoryConfig(new_memory=global_config.new_memory)), ) __all__ = ["unitree_go2_temporal_memory"] diff --git a/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_basic.py b/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_basic.py index 3325290bf7..a0d1e6a7ae 100644 --- a/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_basic.py +++ b/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_basic.py @@ -24,8 +24,8 @@ from dimos.msgs.sensor_msgs.Image import Image from dimos.protocol.pubsub.impl.lcmpubsub import LCM from dimos.protocol.service.system_configurator.clock_sync import ClockSyncConfigurator -from dimos.robot.unitree.go2.connection import go2_connection -from dimos.web.websocket_vis.websocket_vis_module import websocket_vis +from dimos.robot.unitree.go2.connection import GO2Connection +from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule # Mac has some issue with high bandwidth UDP, so we use pSHMTransport for color_image # actually we can use pSHMTransport for all platforms, and for all streams @@ -108,17 +108,18 @@ def _go2_rerun_blueprint() -> Any: if global_config.viewer == "foxglove": - from dimos.robot.foxglove_bridge import foxglove_bridge + from dimos.robot.foxglove_bridge import FoxgloveBridge with_vis = autoconnect( _transports_base, - foxglove_bridge(shm_channels=["/color_image#sensor_msgs.Image"]), + FoxgloveBridge.blueprint(shm_channels=["/color_image#sensor_msgs.Image"]), ) elif global_config.viewer.startswith("rerun"): - from dimos.visualization.rerun.bridge import _resolve_viewer_mode, rerun_bridge + from dimos.visualization.rerun.bridge import RerunBridgeModule, _resolve_viewer_mode with_vis = autoconnect( - _transports_base, rerun_bridge(viewer_mode=_resolve_viewer_mode(), **rerun_config) + _transports_base, + RerunBridgeModule.blueprint(viewer_mode=_resolve_viewer_mode(), **rerun_config), ) else: with_vis = _transports_base @@ -126,8 +127,8 @@ def _go2_rerun_blueprint() -> Any: unitree_go2_basic = ( autoconnect( with_vis, - go2_connection(), - websocket_vis(), + GO2Connection.blueprint(), + WebsocketVisModule.blueprint(), ) .global_config(n_workers=4, robot_model="unitree_go2") .configurators(ClockSyncConfigurator()) diff --git a/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_fleet.py b/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_fleet.py index 908444b2fd..1c55f3e93c 100644 --- a/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_fleet.py +++ b/dimos/robot/unitree/go2/blueprints/basic/unitree_go2_fleet.py @@ -23,14 +23,14 @@ from dimos.core.blueprints import autoconnect from dimos.protocol.service.system_configurator.clock_sync import ClockSyncConfigurator from dimos.robot.unitree.go2.blueprints.basic.unitree_go2_basic import with_vis -from dimos.robot.unitree.go2.fleet_connection import go2_fleet_connection -from dimos.web.websocket_vis.websocket_vis_module import websocket_vis +from dimos.robot.unitree.go2.fleet_connection import Go2FleetConnection +from dimos.web.websocket_vis.websocket_vis_module import WebsocketVisModule unitree_go2_fleet = ( autoconnect( with_vis, - go2_fleet_connection(), - websocket_vis(), + Go2FleetConnection.blueprint(), + WebsocketVisModule.blueprint(), ) .global_config(n_workers=4, robot_model="unitree_go2") .configurators(ClockSyncConfigurator()) diff --git a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2.py b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2.py index 10dd290e2d..194aff60ca 100644 --- a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2.py +++ b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2.py @@ -14,21 +14,21 @@ # limitations under the License. from dimos.core.blueprints import autoconnect -from dimos.mapping.costmapper import cost_mapper -from dimos.mapping.voxels import voxel_mapper +from dimos.mapping.costmapper import CostMapper +from dimos.mapping.voxels import VoxelGridMapper from dimos.navigation.frontier_exploration.wavefront_frontier_goal_selector import ( - wavefront_frontier_explorer, + WavefrontFrontierExplorer, ) from dimos.navigation.patrolling.module import PatrollingModule -from dimos.navigation.replanning_a_star.module import replanning_a_star_planner +from dimos.navigation.replanning_a_star.module import ReplanningAStarPlanner from dimos.robot.unitree.go2.blueprints.basic.unitree_go2_basic import unitree_go2_basic unitree_go2 = autoconnect( unitree_go2_basic, - voxel_mapper(voxel_size=0.1), - cost_mapper(), - replanning_a_star_planner(), - wavefront_frontier_explorer(), + VoxelGridMapper.blueprint(voxel_size=0.1), + CostMapper.blueprint(), + ReplanningAStarPlanner.blueprint(), + WavefrontFrontierExplorer.blueprint(), PatrollingModule.blueprint(), ).global_config(n_workers=7, robot_model="unitree_go2") diff --git a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_detection.py b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_detection.py index a9bb7729ae..ae76e260cf 100644 --- a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_detection.py +++ b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_detection.py @@ -23,14 +23,14 @@ from dimos.msgs.sensor_msgs.Image import Image from dimos.msgs.sensor_msgs.PointCloud2 import PointCloud2 from dimos.msgs.vision_msgs.Detection2DArray import Detection2DArray -from dimos.perception.detection.module3D import Detection3DModule, detection3d_module +from dimos.perception.detection.module3D import Detection3DModule from dimos.robot.unitree.go2.blueprints.smart.unitree_go2 import unitree_go2 from dimos.robot.unitree.go2.connection import GO2Connection unitree_go2_detection = ( autoconnect( unitree_go2, - detection3d_module( + Detection3DModule.blueprint( camera_info=GO2Connection.camera_info_static, ), ) diff --git a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_spatial.py b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_spatial.py index 63ffab53c8..840458d998 100644 --- a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_spatial.py +++ b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_spatial.py @@ -15,12 +15,12 @@ from dimos.core.blueprints import autoconnect from dimos.perception.perceive_loop_skill import PerceiveLoopSkill -from dimos.perception.spatial_perception import spatial_memory +from dimos.perception.spatial_perception import SpatialMemory from dimos.robot.unitree.go2.blueprints.smart.unitree_go2 import unitree_go2 unitree_go2_spatial = autoconnect( unitree_go2, - spatial_memory(), + SpatialMemory.blueprint(), PerceiveLoopSkill.blueprint(), ).global_config(n_workers=8) diff --git a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_vlm_stream_test.py b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_vlm_stream_test.py index 194d3973c6..60c4c9ce43 100644 --- a/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_vlm_stream_test.py +++ b/dimos/robot/unitree/go2/blueprints/smart/unitree_go2_vlm_stream_test.py @@ -13,15 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dimos.agents.vlm_agent import vlm_agent -from dimos.agents.vlm_stream_tester import vlm_stream_tester +from dimos.agents.vlm_agent import VLMAgent +from dimos.agents.vlm_stream_tester import VlmStreamTester from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.blueprints.basic.unitree_go2_basic import unitree_go2_basic unitree_go2_vlm_stream_test = autoconnect( unitree_go2_basic, - vlm_agent(), - vlm_stream_tester(), + VLMAgent.blueprint(), + VlmStreamTester.blueprint(), ) __all__ = ["unitree_go2_vlm_stream_test"] diff --git a/dimos/robot/unitree/go2/connection.py b/dimos/robot/unitree/go2/connection.py index 38da7fb439..db3ecb40fc 100644 --- a/dimos/robot/unitree/go2/connection.py +++ b/dimos/robot/unitree/go2/connection.py @@ -337,9 +337,6 @@ def observe(self) -> Image | None: return self._latest_video_frame -go2_connection = GO2Connection.blueprint - - def deploy(dimos: ModuleCoordinator, ip: str, prefix: str = "") -> "ModuleProxy": from dimos.constants import DEFAULT_CAPACITY_COLOR_IMAGE @@ -358,6 +355,3 @@ def deploy(dimos: ModuleCoordinator, ip: str, prefix: str = "") -> "ModuleProxy" connection.start() return connection - - -__all__ = ["GO2Connection", "deploy", "go2_connection", "make_connection"] diff --git a/dimos/robot/unitree/go2/fleet_connection.py b/dimos/robot/unitree/go2/fleet_connection.py index f0e904648a..58fa854297 100644 --- a/dimos/robot/unitree/go2/fleet_connection.py +++ b/dimos/robot/unitree/go2/fleet_connection.py @@ -142,9 +142,3 @@ def publish_request(self, topic: str, data: dict[str, Any]) -> dict[Any, Any]: except Exception as e: logger.error(f"Fleet publish_request failed: {e}") return self.connection.publish_request(topic, data) - - -go2_fleet_connection = Go2FleetConnection.blueprint - - -__all__ = ["Go2FleetConnection", "go2_fleet_connection"] diff --git a/dimos/robot/unitree/keyboard_teleop.py b/dimos/robot/unitree/keyboard_teleop.py index 86885bc446..a05bd53d50 100644 --- a/dimos/robot/unitree/keyboard_teleop.py +++ b/dimos/robot/unitree/keyboard_teleop.py @@ -202,8 +202,3 @@ def _update_display(self, twist: Twist) -> None: y_pos += 25 pygame.display.flip() - - -keyboard_teleop = KeyboardTeleop.blueprint - -__all__ = ["KeyboardTeleop", "keyboard_teleop"] diff --git a/dimos/robot/unitree/type/map.py b/dimos/robot/unitree/type/map.py index da45c003f7..4ec9419c53 100644 --- a/dimos/robot/unitree/type/map.py +++ b/dimos/robot/unitree/type/map.py @@ -112,9 +112,6 @@ def _publish(self, _: Any) -> None: self.global_costmap.publish(occupancygrid) -mapper = Map.blueprint - - def deploy(dimos: ModuleCoordinator, connection: Go2ConnectionProtocol): # type: ignore[no-untyped-def] mapper = dimos.deploy(Map, global_publish_interval=1.0) # type: ignore[attr-defined] mapper.global_map.transport = LCMTransport("/global_map", PointCloud2) @@ -122,6 +119,3 @@ def deploy(dimos: ModuleCoordinator, connection: Go2ConnectionProtocol): # type mapper.lidar.connect(connection.pointcloud) # type: ignore[attr-defined] mapper.start() return mapper - - -__all__ = ["Map", "mapper"] diff --git a/dimos/robot/unitree/unitree_skill_container.py b/dimos/robot/unitree/unitree_skill_container.py index a79c061567..f536d8b45c 100644 --- a/dimos/robot/unitree/unitree_skill_container.py +++ b/dimos/robot/unitree/unitree_skill_container.py @@ -334,8 +334,3 @@ def execute_sport_command(self, command_name: str) -> str: {_commands} """ - - -unitree_skills = UnitreeSkillContainer.blueprint - -__all__ = ["UnitreeSkillContainer", "unitree_skills"] diff --git a/dimos/simulation/manipulators/sim_module.py b/dimos/simulation/manipulators/sim_module.py index 5e873ba634..66a2b5d888 100644 --- a/dimos/simulation/manipulators/sim_module.py +++ b/dimos/simulation/manipulators/sim_module.py @@ -232,12 +232,3 @@ def _resolve_joint_names(self, dof: int) -> list[str]: if len(names) >= dof: return list(names[:dof]) return [f"{self._joint_prefix}{i + 1}" for i in range(dof)] - - -simulation = SimulationModule.blueprint - -__all__ = [ - "SimulationModule", - "SimulationModuleConfig", - "simulation", -] diff --git a/dimos/simulation/sim_blueprints.py b/dimos/simulation/sim_blueprints.py index 494b97ccbf..2a8dd2d029 100644 --- a/dimos/simulation/sim_blueprints.py +++ b/dimos/simulation/sim_blueprints.py @@ -18,10 +18,10 @@ from dimos.msgs.sensor_msgs.JointState import JointState from dimos.msgs.sensor_msgs.RobotState import RobotState from dimos.msgs.trajectory_msgs.JointTrajectory import JointTrajectory -from dimos.simulation.manipulators.sim_module import simulation +from dimos.simulation.manipulators.sim_module import SimulationModule from dimos.utils.data import LfsPath -xarm7_trajectory_sim = simulation( +xarm7_trajectory_sim = SimulationModule.blueprint( engine="mujoco", config_path=LfsPath("xarm7/scene.xml"), headless=True, @@ -38,7 +38,6 @@ __all__ = [ - "simulation", "xarm7_trajectory_sim", ] diff --git a/dimos/teleop/keyboard/keyboard_teleop_module.py b/dimos/teleop/keyboard/keyboard_teleop_module.py index a90dc3cf44..cae1c503cd 100644 --- a/dimos/teleop/keyboard/keyboard_teleop_module.py +++ b/dimos/teleop/keyboard/keyboard_teleop_module.py @@ -213,6 +213,3 @@ def _pygame_loop(self) -> None: clock.tick(50) pygame.quit() - - -keyboard_teleop_module = KeyboardTeleopModule.blueprint diff --git a/dimos/teleop/phone/blueprints.py b/dimos/teleop/phone/blueprints.py index 86e1154d92..908944034e 100644 --- a/dimos/teleop/phone/blueprints.py +++ b/dimos/teleop/phone/blueprints.py @@ -16,22 +16,22 @@ from dimos.core.blueprints import autoconnect from dimos.robot.unitree.go2.blueprints.basic.unitree_go2_basic import unitree_go2_basic from dimos.robot.unitree.go2.blueprints.basic.unitree_go2_fleet import unitree_go2_fleet -from dimos.teleop.phone.phone_extensions import simple_phone_teleop_module +from dimos.teleop.phone.phone_extensions import SimplePhoneTeleop # Simple phone teleop (mobile base axis filtering + cmd_vel output) teleop_phone = autoconnect( - simple_phone_teleop_module(), + SimplePhoneTeleop.blueprint(), ) # Phone teleop wired to Unitree Go2 teleop_phone_go2 = autoconnect( - simple_phone_teleop_module(), + SimplePhoneTeleop.blueprint(), unitree_go2_basic, ) # Phone teleop wired to Go2 fleet — twist commands sent to all robots teleop_phone_go2_fleet = autoconnect( - simple_phone_teleop_module(), + SimplePhoneTeleop.blueprint(), unitree_go2_fleet, ) diff --git a/dimos/teleop/phone/phone_extensions.py b/dimos/teleop/phone/phone_extensions.py index c5cdc1fc80..bd3e6cac7d 100644 --- a/dimos/teleop/phone/phone_extensions.py +++ b/dimos/teleop/phone/phone_extensions.py @@ -43,11 +43,3 @@ def _publish_msg(self, output_msg: TwistStamped) -> None: angular=Vector3(x=0.0, y=0.0, z=output_msg.linear.z), ) ) - - -simple_phone_teleop_module = SimplePhoneTeleop.blueprint - -__all__ = [ - "SimplePhoneTeleop", - "simple_phone_teleop_module", -] diff --git a/dimos/teleop/phone/phone_teleop_module.py b/dimos/teleop/phone/phone_teleop_module.py index 3f32063cce..35bf02fe1e 100644 --- a/dimos/teleop/phone/phone_teleop_module.py +++ b/dimos/teleop/phone/phone_teleop_module.py @@ -280,12 +280,3 @@ def _publish_msg(self, output_msg: TwistStamped) -> None: Override to customize output (e.g., apply limits, remap axes). """ self.twist_output.publish(output_msg) - - -phone_teleop_module = PhoneTeleopModule.blueprint - -__all__ = [ - "PhoneTeleopConfig", - "PhoneTeleopModule", - "phone_teleop_module", -] diff --git a/dimos/teleop/quest/blueprints.py b/dimos/teleop/quest/blueprints.py index 71e16c2da8..6855ab62ca 100644 --- a/dimos/teleop/quest/blueprints.py +++ b/dimos/teleop/quest/blueprints.py @@ -23,14 +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 +from dimos.teleop.quest.quest_extensions import ArmTeleopModule from dimos.teleop.quest.quest_types import Buttons -from dimos.visualization.rerun.bridge import rerun_bridge +from dimos.visualization.rerun.bridge import RerunBridgeModule # Arm teleop with press-and-hold engage (has rerun viz) teleop_quest_rerun = autoconnect( - arm_teleop_module(), - rerun_bridge(), + ArmTeleopModule.blueprint(), + RerunBridgeModule.blueprint(), ).transports( { ("left_controller_output", PoseStamped): LCMTransport("/teleop/left_delta", PoseStamped), @@ -42,7 +42,7 @@ # Single XArm7 teleop: right controller -> xarm7 teleop_quest_xarm7 = autoconnect( - arm_teleop_module(task_names={"right": "teleop_xarm"}), + ArmTeleopModule.blueprint(task_names={"right": "teleop_xarm"}), coordinator_teleop_xarm7, ).transports( { @@ -56,7 +56,7 @@ # Single Piper teleop: left controller -> piper arm teleop_quest_piper = autoconnect( - arm_teleop_module(task_names={"left": "teleop_piper"}), + ArmTeleopModule.blueprint(task_names={"left": "teleop_piper"}), coordinator_teleop_piper, ).transports( { @@ -70,7 +70,7 @@ # Dual arm teleop: right -> piper, left -> xarm6 (TeleopIK) teleop_quest_dual = autoconnect( - arm_teleop_module(task_names={"right": "teleop_piper", "left": "teleop_xarm"}), + ArmTeleopModule.blueprint(task_names={"right": "teleop_piper", "left": "teleop_xarm"}), coordinator_teleop_dual, ).transports( { diff --git a/dimos/teleop/quest/quest_extensions.py b/dimos/teleop/quest/quest_extensions.py index 674fc36f1e..eb7a453929 100644 --- a/dimos/teleop/quest/quest_extensions.py +++ b/dimos/teleop/quest/quest_extensions.py @@ -131,16 +131,3 @@ def _publish_button_state( right=right.trigger if right is not None else 0.0, ) self.buttons.publish(buttons) - - -# Module blueprints for easy instantiation -twist_teleop_module = TwistTeleopModule.blueprint -arm_teleop_module = ArmTeleopModule.blueprint - -__all__ = [ - "ArmTeleopConfig", - "ArmTeleopModule", - "TwistTeleopModule", - "arm_teleop_module", - "twist_teleop_module", -] diff --git a/dimos/teleop/quest/quest_teleop_module.py b/dimos/teleop/quest/quest_teleop_module.py index 5868aab620..28199ff084 100644 --- a/dimos/teleop/quest/quest_teleop_module.py +++ b/dimos/teleop/quest/quest_teleop_module.py @@ -379,14 +379,3 @@ def _publish_button_state( """ buttons = Buttons.from_controllers(left, right) self.buttons.publish(buttons) - - -quest_teleop_module = QuestTeleopModule.blueprint - -__all__ = [ - "Hand", - "QuestTeleopConfig", - "QuestTeleopModule", - "QuestTeleopStatus", - "quest_teleop_module", -] diff --git a/dimos/visualization/rerun/bridge.py b/dimos/visualization/rerun/bridge.py index 12f998d96d..8b1cda443c 100644 --- a/dimos/visualization/rerun/bridge.py +++ b/dimos/visualization/rerun/bridge.py @@ -390,7 +390,3 @@ def cli( if __name__ == "__main__": app() - -# you don't need to include this in your blueprint if you are not creating a -# custom rerun configuration for your deployment, you can also run rerun-bridge standalone -rerun_bridge = RerunBridgeModule.blueprint diff --git a/dimos/web/websocket_vis/websocket_vis_module.py b/dimos/web/websocket_vis/websocket_vis_module.py index 5514144570..685ca2b1ee 100644 --- a/dimos/web/websocket_vis/websocket_vis_module.py +++ b/dimos/web/websocket_vis/websocket_vis_module.py @@ -402,8 +402,3 @@ def _process_costmap(self, costmap: OccupancyGrid) -> dict[str, Any]: def _emit(self, event: str, data: Any) -> None: if self._broadcast_loop and not self._broadcast_loop.is_closed(): asyncio.run_coroutine_threadsafe(self.sio.emit(event, data), self._broadcast_loop) - - -websocket_vis = WebsocketVisModule.blueprint - -__all__ = ["WebsocketVisModule", "websocket_vis"] diff --git a/docs/capabilities/manipulation/adding_a_custom_arm.md b/docs/capabilities/manipulation/adding_a_custom_arm.md index 3e931a7f73..08a08b6144 100644 --- a/docs/capabilities/manipulation/adding_a_custom_arm.md +++ b/docs/capabilities/manipulation/adding_a_custom_arm.md @@ -438,13 +438,13 @@ from __future__ import annotations from pathlib import Path from dimos.control.components import HardwareComponent, HardwareType, make_joints -from dimos.control.coordinator import TaskConfig, control_coordinator +from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.transport import LCMTransport from dimos.msgs.sensor_msgs import JointState # YourArm (6-DOF) — real hardware -coordinator_yourarm = control_coordinator( +coordinator_yourarm = ControlCoordinator.blueprint( tick_rate=100.0, # Control loop frequency (Hz) publish_joint_state=True, # Publish aggregated joint state joint_state_frame_id="coordinator", diff --git a/pyproject.toml b/pyproject.toml index 1535885edf..a60c3d308a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -437,7 +437,7 @@ env = [ "GOOGLE_MAPS_API_KEY=AIzafake_google_key", "PYTHONWARNINGS=ignore:cupyx.jit.rawkernel is experimental:FutureWarning", ] -addopts = "-v -r a -p no:warnings -p no:launch_testing -p no:launch_ros --import-mode=importlib --color=yes -m 'not (tool or slow or mujoco)'" +addopts = "-s -v -r a -p no:warnings -p no:launch_testing -p no:launch_ros --import-mode=importlib --color=yes -m 'not (tool or slow or mujoco)'" asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function"