From b6d7784130ff0cd9cee563eb40318faade870e5b Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Fri, 27 Mar 2026 01:23:20 +0200 Subject: [PATCH] fix(blueprints): get module by name --- dimos/robot/all_blueprints.py | 150 +++++++++--------- dimos/robot/get_all_blueprints.py | 6 +- dimos/robot/test_all_blueprints_generation.py | 10 +- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 5910093d61..00690d514f 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -98,79 +98,79 @@ all_modules = { - "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", - "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", - "go2-connection": "dimos.robot.unitree.go2.connection", - "go2-fleet-connection": "dimos.robot.unitree.go2.fleet_connection", - "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", - "map": "dimos.robot.unitree.type.map", - "mcp-client": "dimos.agents.mcp.mcp_client", - "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", - "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", - "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-module": "dimos.visualization.rerun.bridge", - "ros-nav": "dimos.navigation.rosnav", - "simple-phone-teleop": "dimos.teleop.phone.phone_extensions", - "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-g1-skill-container": "dimos.robot.unitree.g1.skill_container", - "unitree-skill-container": "dimos.robot.unitree.unitree_skill_container", - "unity-bridge-module": "dimos.simulation.unity.module", - "vlm-agent": "dimos.agents.vlm_agent", - "vlm-stream-tester": "dimos.agents.vlm_stream_tester", - "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-module": "dimos.web.websocket_vis.websocket_vis_module", - "zed-camera": "dimos.hardware.sensors.camera.zed.camera", + "arm-teleop-module": "dimos.teleop.quest.quest_extensions.ArmTeleopModule", + "b-box-navigation-module": "dimos.navigation.bbox_navigation.BBoxNavigationModule", + "b1-connection-module": "dimos.robot.unitree.b1.connection.B1ConnectionModule", + "camera-module": "dimos.hardware.sensors.camera.module.CameraModule", + "cartesian-motion-controller": "dimos.manipulation.control.servo_control.cartesian_motion_controller.CartesianMotionController", + "control-coordinator": "dimos.control.coordinator.ControlCoordinator", + "cost-mapper": "dimos.mapping.costmapper.CostMapper", + "demo-calculator-skill": "dimos.agents.skills.demo_calculator_skill.DemoCalculatorSkill", + "demo-robot": "dimos.agents.skills.demo_robot.DemoRobot", + "detection2-d-module": "dimos.perception.detection.module2D.Detection2DModule", + "detection3-d-module": "dimos.perception.detection.module3D.Detection3DModule", + "drone-camera-module": "dimos.robot.drone.camera_module.DroneCameraModule", + "drone-connection-module": "dimos.robot.drone.connection_module.DroneConnectionModule", + "drone-tracking-module": "dimos.robot.drone.drone_tracking_module.DroneTrackingModule", + "embedding-memory": "dimos.memory.embedding.EmbeddingMemory", + "emitter-module": "dimos.utils.demo_image_encoding.EmitterModule", + "fast-lio2": "dimos.hardware.sensors.lidar.fastlio2.module.FastLio2", + "foxglove-bridge": "dimos.robot.foxglove_bridge.FoxgloveBridge", + "g1-connection": "dimos.robot.unitree.g1.connection.G1Connection", + "g1-connection-base": "dimos.robot.unitree.g1.connection.G1ConnectionBase", + "g1-sim-connection": "dimos.robot.unitree.g1.sim.G1SimConnection", + "go2-connection": "dimos.robot.unitree.go2.connection.GO2Connection", + "go2-fleet-connection": "dimos.robot.unitree.go2.fleet_connection.Go2FleetConnection", + "google-maps-skill-container": "dimos.agents.skills.google_maps_skill_container.GoogleMapsSkillContainer", + "gps-nav-skill-container": "dimos.agents.skills.gps_nav_skill.GpsNavSkillContainer", + "grasp-gen-module": "dimos.manipulation.grasping.graspgen_module.GraspGenModule", + "grasping-module": "dimos.manipulation.grasping.grasping.GraspingModule", + "gstreamer-camera-module": "dimos.hardware.sensors.camera.gstreamer.gstreamer_camera.GstreamerCameraModule", + "joint-trajectory-controller": "dimos.manipulation.control.trajectory_controller.joint_trajectory_controller.JointTrajectoryController", + "joystick-module": "dimos.robot.unitree.b1.joystick_module.JoystickModule", + "keyboard-teleop": "dimos.robot.unitree.keyboard_teleop.KeyboardTeleop", + "keyboard-teleop-module": "dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule", + "manipulation-module": "dimos.manipulation.manipulation_module.ManipulationModule", + "map": "dimos.robot.unitree.type.map.Map", + "mcp-client": "dimos.agents.mcp.mcp_client.McpClient", + "mcp-server": "dimos.agents.mcp.mcp_server.McpServer", + "mock-b1-connection-module": "dimos.robot.unitree.b1.connection.MockB1ConnectionModule", + "module-a": "dimos.robot.unitree.demo_error_on_name_conflicts.ModuleA", + "module-b": "dimos.robot.unitree.demo_error_on_name_conflicts.ModuleB", + "navigation-module": "dimos.robot.unitree.rosnav.NavigationModule", + "navigation-skill-container": "dimos.agents.skills.navigation.NavigationSkillContainer", + "object-db-module": "dimos.perception.detection.moduleDB.ObjectDBModule", + "object-scene-registration-module": "dimos.perception.object_scene_registration.ObjectSceneRegistrationModule", + "object-tracker2-d": "dimos.perception.object_tracker_2d.ObjectTracker2D", + "object-tracker3-d": "dimos.perception.object_tracker_3d.ObjectTracker3D", + "object-tracking": "dimos.perception.object_tracker.ObjectTracking", + "osm-skill": "dimos.agents.skills.osm.OsmSkill", + "patrolling-module": "dimos.navigation.patrolling.module.PatrollingModule", + "perceive-loop-skill": "dimos.perception.perceive_loop_skill.PerceiveLoopSkill", + "person-follow-skill-container": "dimos.agents.skills.person_follow.PersonFollowSkillContainer", + "person-tracker": "dimos.perception.detection.person_tracker.PersonTracker", + "phone-teleop-module": "dimos.teleop.phone.phone_teleop_module.PhoneTeleopModule", + "pick-and-place-module": "dimos.manipulation.pick_and_place_module.PickAndPlaceModule", + "quest-teleop-module": "dimos.teleop.quest.quest_teleop_module.QuestTeleopModule", + "real-sense-camera": "dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera", + "receiver-module": "dimos.utils.demo_image_encoding.ReceiverModule", + "reid-module": "dimos.perception.detection.reid.module.ReidModule", + "replanning-a-star-planner": "dimos.navigation.replanning_a_star.module.ReplanningAStarPlanner", + "rerun-bridge-module": "dimos.visualization.rerun.bridge.RerunBridgeModule", + "ros-nav": "dimos.navigation.rosnav.ROSNav", + "simple-phone-teleop": "dimos.teleop.phone.phone_extensions.SimplePhoneTeleop", + "spatial-memory": "dimos.perception.spatial_perception.SpatialMemory", + "speak-skill": "dimos.agents.skills.speak_skill.SpeakSkill", + "temporal-memory": "dimos.perception.experimental.temporal_memory.temporal_memory.TemporalMemory", + "twist-teleop-module": "dimos.teleop.quest.quest_extensions.TwistTeleopModule", + "unitree-g1-skill-container": "dimos.robot.unitree.g1.skill_container.UnitreeG1SkillContainer", + "unitree-skill-container": "dimos.robot.unitree.unitree_skill_container.UnitreeSkillContainer", + "unity-bridge-module": "dimos.simulation.unity.module.UnityBridgeModule", + "vlm-agent": "dimos.agents.vlm_agent.VLMAgent", + "vlm-stream-tester": "dimos.agents.vlm_stream_tester.VlmStreamTester", + "voxel-grid-mapper": "dimos.mapping.voxels.VoxelGridMapper", + "wavefront-frontier-explorer": "dimos.navigation.frontier_exploration.wavefront_frontier_goal_selector.WavefrontFrontierExplorer", + "web-input": "dimos.agents.web_human_input.WebInput", + "websocket-vis-module": "dimos.web.websocket_vis.websocket_vis_module.WebsocketVisModule", + "zed-camera": "dimos.hardware.sensors.camera.zed.camera.ZEDCamera", } diff --git a/dimos/robot/get_all_blueprints.py b/dimos/robot/get_all_blueprints.py index f7a79fb8d7..9fb4b9e94c 100644 --- a/dimos/robot/get_all_blueprints.py +++ b/dimos/robot/get_all_blueprints.py @@ -45,9 +45,9 @@ def get_blueprint_by_name(name: str) -> Blueprint: def get_module_by_name(name: str) -> Blueprint: if name not in all_modules: _fail_unknown(name, list(all_modules.keys())) - attr_name = name.replace("-", "_") - python_module = __import__(all_modules[name], fromlist=[attr_name]) - return getattr(python_module, attr_name)() # type: ignore[no-any-return] + module_path, class_name = all_modules[name].rsplit(".", 1) + python_module = __import__(module_path, fromlist=[class_name]) + return getattr(python_module, class_name).blueprint() # type: ignore[no-any-return] def get_by_name(name: str) -> Blueprint: diff --git a/dimos/robot/test_all_blueprints_generation.py b/dimos/robot/test_all_blueprints_generation.py index c4b9652e47..48d482f3b6 100644 --- a/dimos/robot/test_all_blueprints_generation.py +++ b/dimos/robot/test_all_blueprints_generation.py @@ -171,9 +171,9 @@ def _scan_for_blueprints(root: Path) -> tuple[dict[str, str], dict[str, str]]: # Only register modules from production files (skip test, deprecated, core) if _is_production_module_file(file_path, root): - for var_name in module_vars: + for var_name, class_name in module_vars: cli_name = var_name.replace("_", "-") - all_modules[cli_name] = module_name + all_modules[cli_name] = f"{module_name}.{class_name}" # Blueprints take priority when names collide (e.g. a pre-configured # blueprint named "mid360" vs the raw Mid360 Module class). @@ -250,9 +250,9 @@ def _path_to_module_name(path: Path, root: Path) -> str: def _find_blueprints_in_file( file_path: Path, module_classes: set[str] | None = None -) -> tuple[list[str], list[str]]: +) -> tuple[list[str], list[tuple[str, str]]]: blueprint_vars: list[str] = [] - module_vars: list[str] = [] + module_vars: list[tuple[str, str]] = [] try: source = file_path.read_text(encoding="utf-8") @@ -281,7 +281,7 @@ def _find_blueprints_in_file( if node.name.startswith("_") or node.name in _EXCLUDED_MODULE_NAMES: continue if any(b in module_classes for b in _get_base_class_names(node)): - module_vars.append(_camel_to_snake(node.name)) + module_vars.append((_camel_to_snake(node.name), node.name)) return blueprint_vars, module_vars