Skip to content

Add Booster K1 robot integration#2525

Draft
KrishnaH96 wants to merge 2 commits into
mainfrom
krishna/booster-k1-adapter
Draft

Add Booster K1 robot integration#2525
KrishnaH96 wants to merge 2 commits into
mainfrom
krishna/booster-k1-adapter

Conversation

@KrishnaH96

Copy link
Copy Markdown
Contributor

Add Booster K1 robot integration

A dimos adapter for the Booster K1 humanoid base: connection plus runnable teleop/coordinator blueprints. Validated on hardware.

K1Connection wraps booster-rpc (gRPC control + WebSocket video):

  • Camera published as color_image; base velocity via gRPC move().
  • Non-blocking coalescing sender that decouples the caller from booster-rpc's blocking gRPC, so it keeps up with the coordinator's 100 Hz tick; dead-man stop on idle.
  • Auto standup on start.

Blueprints:

  • booster-k1-basic: connection + rerun camera/3D viz
  • booster-k1-keyboard-teleop: WASD to cmd_vel direct to the connection
  • booster-k1-coordinator: ControlCoordinator BASE velocity via the transport_lcm adapter
  • booster-k1-coordinator-keyboard-teleop: coordinator path + WASD

Also adds the booster extra to pyproject.toml and registers the blueprints in all_blueprints.

Run:

uv sync --extra booster
dimos --robot-ip <ip> --viewer rerun run booster-k1-coordinator-keyboard-teleop

Validated on hardware (K1 on gantry): WASD teleop + camera-in-rerun on both the direct and coordinator paths, smooth under the 100 Hz tick.

Contributor License Agreement

  • I have read and approved the CLA.

KrishnaH96 and others added 2 commits June 17, 2026 23:03
Add a dimos adapter for the Booster K1 humanoid base:

- K1Connection: Module wrapping booster-rpc (gRPC + WebSocket). Camera
  frames over the WebSocket video stream, base velocity via gRPC move().
  Non-blocking coalescing velocity sender decouples the caller from the
  blocking gRPC send ceiling, plus a dead-man stop on idle. Auto standup
  on start.
- Blueprints:
  - booster-k1-basic: connection + rerun camera/3D visualization.
  - booster-k1-keyboard-teleop: WASD (pygame + viewer overlay) -> cmd_vel
    direct to the connection.
  - booster-k1-coordinator: ControlCoordinator BASE velocity task driving
    the connection through the transport_lcm adapter, with the rerun
    viewer and viewer-side WASD wired through twist_command.
  - booster-k1-coordinator-keyboard-teleop: coordinator path + pygame WASD.
- pyproject: add the `booster` extra (booster-rpc, websockets).
- Register the blueprints in all_blueprints.

Validated on hardware (K1 on gantry): WASD teleop and camera-in-rerun
work on both the direct and ControlCoordinator paths.
@codecov

codecov Bot commented Jun 18, 2026

Copy link
Copy Markdown

❌ 5 Tests Failed:

Tests completed Failed Passed Skipped
1886 5 1881 155
View the top 3 failed test(s) by shortest run time
dimos.robot.test_all_blueprints::test_blueprint_is_valid[booster-k1-coordinator-keyboard-teleop]
Stack Traces | 0.004s run time
blueprint_name = 'booster-k1-coordinator-keyboard-teleop'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'booster-k1-coordinator-keyboard-teleop'

dimos/robot/test_all_blueprints.py:103: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:79: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'booster-k1-coordinator-keyboard-teleop'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'booster_k1_coordinator_keyboard_teleop'
        module_path = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator_keyboard_teleop'
        name       = 'booster-k1-coordinator-keyboard-teleop'
.../blueprints/basic/booster_k1_coordinator_keyboard_teleop.py:28: in <module>
    from dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator import booster_k1_coordinator
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_coordinator_keyboard_teleop.cpython-312.pyc'
        __doc__    = 'Booster K1 keyboard teleop through the ControlCoordinator path.\n\nWASD -> KeyboardTeleop.cmd_vel -> /cmd_vel -> Coor.../booster_k1/cmd_vel -> K1Connection.\n\nUsage:\n    dimos --robot-ip <ip> run booster-k1-coordinator-keyboard-teleop\n'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_coordinator_keyboard_teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5e0e7bfb0>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator_keyboard_teleop'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator_keyboard_teleop', loader=<_frozen_impo...igin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_coordinator_keyboard_teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xfff67bbe3560>
.../blueprints/basic/booster_k1_coordinator.py:47: in <module>
    from dimos.robot.booster.k1.blueprints.basic.booster_k1_basic import booster_k1_basic
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        HardwareComponent = <class 'dimos.control.components.HardwareComponent'>
        HardwareType = <enum 'HardwareType'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_coordinator.cpython-312.pyc'
        __doc__    = 'Booster K1 ControlCoordinator — basic blueprint + coordinator via LCM transport adapter.\n\nLike unitree_go2_coordina...Connection.move()\n\nUsage:\n    dimos --robot-ip <ip> --viewer rerun --rerun-open native run booster-k1-coordinator\n'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_coordinator.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5e36f3d70>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator', loader=<_frozen_importlib_external.S...ff5e36f3d70>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_coordinator.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xfff67bbe3560>
        make_twist_base_joints = <function make_twist_base_joints at 0xfff60e03ede0>
.../blueprints/basic/booster_k1_basic.py:25: in <module>
    from dimos.robot.booster.k1.connection import K1Connection
        Any        = typing.Any
        DEFAULT_CAPACITY_COLOR_IMAGE = 6220800
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_basic.cpython-312.pyc'
        __doc__    = 'Basic Booster K1 blueprint: connection + camera visualization.'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5e1029e20>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_basic'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_basic', loader=<_frozen_importlib_external.SourceF...at 0xfff5e1029e20>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py')
        autoconnect = <function autoconnect at 0xfff67bbe3560>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, device_path=None, simulation=...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
        platform   = <module 'platform' from '....../usr/lib/python3.12/platform.py'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2025-2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Booster K1 humanoid connection module (built on the booster-rpc SDK).
    
    Scope: the K1 over booster-rpc exposes a camera (JPEG over WebSocket) and base
    velocity control (+ stand/sit mode changes). It has no world-frame odometry or
    lidar, so this connection implements only the `Camera` spec — no `odom`/`lidar`/
    `pointcloud` ports, and therefore no mapping/navigation tier.
    """
    
    import asyncio
    from threading import Event, Lock, Thread
    import time
    from typing import Any
    
>   from booster_rpc import (  # type: ignore[import-untyped]
        BoosterConnection,
        RobotMode,
        RpcApiId,
    )
E   ModuleNotFoundError: No module named 'booster_rpc'

Any        = typing.Any
Event      = <class 'threading.Event'>
Lock       = <built-in function allocate_lock>
Thread     = <class 'threading.Thread'>
__builtins__ = <builtins>
__cached__ = '.../k1/__pycache__/connection.cpython-312.pyc'
__doc__    = 'Booster K1 humanoid connection module (built on the booster-rpc SDK).\n\nScope: the K1 over booster-rpc exposes a cam...mplements only the `Camera` spec — no `odom`/`lidar`/\n`pointcloud` ports, and therefore no mapping/navigation tier.\n'
__file__   = '.../booster/k1/connection.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5e33c2f90>
__name__   = 'dimos.robot.booster.k1.connection'
__package__ = 'dimos.robot.booster.k1'
__spec__   = ModuleSpec(name='dimos.robot.booster.k1.connection', loader=<_frozen_importlib_external.SourceFileLoader object at 0xfff5e33c2f90>, origin='.../booster/k1/connection.py')
asyncio    = <module 'asyncio' from '....../usr/lib/python3.12/asyncio/__init__.py'>
time       = <module 'time' (built-in)>

.../booster/k1/connection.py:28: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[booster-k1-keyboard-teleop]
Stack Traces | 0.004s run time
blueprint_name = 'booster-k1-keyboard-teleop'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'booster-k1-keyboard-teleop'

dimos/robot/test_all_blueprints.py:103: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:79: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'booster-k1-keyboard-teleop'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'booster_k1_keyboard_teleop'
        module_path = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_keyboard_teleop'
        name       = 'booster-k1-keyboard-teleop'
.../blueprints/basic/booster_k1_keyboard_teleop.py:35: in <module>
    from dimos.robot.booster.k1.blueprints.basic.booster_k1_basic import booster_k1_basic
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_keyboard_teleop.cpython-312.pyc'
        __doc__    = 'Booster K1 keyboard teleop: WASD from two surfaces, camera in rerun.\n\nTwo control surfaces, both publishing Twist o...5x, ESC quit.\n\nUsage:\n    dimos --robot-ip <ip> --viewer rerun --rerun-open native run booster-k1-keyboard-teleop\n'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_keyboard_teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5cda03800>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_keyboard_teleop'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_keyboard_teleop', loader=<_frozen_importlib_extern...da03800>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_keyboard_teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xfff67bbe3560>
.../blueprints/basic/booster_k1_basic.py:25: in <module>
    from dimos.robot.booster.k1.connection import K1Connection
        Any        = typing.Any
        DEFAULT_CAPACITY_COLOR_IMAGE = 6220800
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_basic.cpython-312.pyc'
        __doc__    = 'Basic Booster K1 blueprint: connection + camera visualization.'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5d0d73aa0>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_basic'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_basic', loader=<_frozen_importlib_external.SourceF...at 0xfff5d0d73aa0>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py')
        autoconnect = <function autoconnect at 0xfff67bbe3560>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, device_path=None, simulation=...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
        platform   = <module 'platform' from '....../usr/lib/python3.12/platform.py'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2025-2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Booster K1 humanoid connection module (built on the booster-rpc SDK).
    
    Scope: the K1 over booster-rpc exposes a camera (JPEG over WebSocket) and base
    velocity control (+ stand/sit mode changes). It has no world-frame odometry or
    lidar, so this connection implements only the `Camera` spec — no `odom`/`lidar`/
    `pointcloud` ports, and therefore no mapping/navigation tier.
    """
    
    import asyncio
    from threading import Event, Lock, Thread
    import time
    from typing import Any
    
>   from booster_rpc import (  # type: ignore[import-untyped]
        BoosterConnection,
        RobotMode,
        RpcApiId,
    )
E   ModuleNotFoundError: No module named 'booster_rpc'

Any        = typing.Any
Event      = <class 'threading.Event'>
Lock       = <built-in function allocate_lock>
Thread     = <class 'threading.Thread'>
__builtins__ = <builtins>
__cached__ = '.../k1/__pycache__/connection.cpython-312.pyc'
__doc__    = 'Booster K1 humanoid connection module (built on the booster-rpc SDK).\n\nScope: the K1 over booster-rpc exposes a cam...mplements only the `Camera` spec — no `odom`/`lidar`/\n`pointcloud` ports, and therefore no mapping/navigation tier.\n'
__file__   = '.../booster/k1/connection.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5cfdc8080>
__name__   = 'dimos.robot.booster.k1.connection'
__package__ = 'dimos.robot.booster.k1'
__spec__   = ModuleSpec(name='dimos.robot.booster.k1.connection', loader=<_frozen_importlib_external.SourceFileLoader object at 0xfff5cfdc8080>, origin='.../booster/k1/connection.py')
asyncio    = <module 'asyncio' from '....../usr/lib/python3.12/asyncio/__init__.py'>
time       = <module 'time' (built-in)>

.../booster/k1/connection.py:28: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[booster-k1-coordinator]
Stack Traces | 0.005s run time
blueprint_name = 'booster-k1-coordinator'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'booster-k1-coordinator'

dimos/robot/test_all_blueprints.py:103: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:79: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'booster-k1-coordinator'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'booster_k1_coordinator'
        module_path = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator'
        name       = 'booster-k1-coordinator'
.../blueprints/basic/booster_k1_coordinator.py:47: in <module>
    from dimos.robot.booster.k1.blueprints.basic.booster_k1_basic import booster_k1_basic
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        HardwareComponent = <class 'dimos.control.components.HardwareComponent'>
        HardwareType = <enum 'HardwareType'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_coordinator.cpython-312.pyc'
        __doc__    = 'Booster K1 ControlCoordinator — basic blueprint + coordinator via LCM transport adapter.\n\nLike unitree_go2_coordina...Connection.move()\n\nUsage:\n    dimos --robot-ip <ip> --viewer rerun --rerun-open native run booster-k1-coordinator\n'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_coordinator.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5d0f08680>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_coordinator', loader=<_frozen_importlib_external.S...ff5d0f08680>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_coordinator.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xfff67bbe3560>
        make_twist_base_joints = <function make_twist_base_joints at 0xfff60e03ede0>
.../blueprints/basic/booster_k1_basic.py:25: in <module>
    from dimos.robot.booster.k1.connection import K1Connection
        Any        = typing.Any
        DEFAULT_CAPACITY_COLOR_IMAGE = 6220800
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_basic.cpython-312.pyc'
        __doc__    = 'Basic Booster K1 blueprint: connection + camera visualization.'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5d0f0b740>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_basic'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_basic', loader=<_frozen_importlib_external.SourceF...at 0xfff5d0f0b740>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py')
        autoconnect = <function autoconnect at 0xfff67bbe3560>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, device_path=None, simulation=...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
        platform   = <module 'platform' from '....../usr/lib/python3.12/platform.py'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2025-2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Booster K1 humanoid connection module (built on the booster-rpc SDK).
    
    Scope: the K1 over booster-rpc exposes a camera (JPEG over WebSocket) and base
    velocity control (+ stand/sit mode changes). It has no world-frame odometry or
    lidar, so this connection implements only the `Camera` spec — no `odom`/`lidar`/
    `pointcloud` ports, and therefore no mapping/navigation tier.
    """
    
    import asyncio
    from threading import Event, Lock, Thread
    import time
    from typing import Any
    
>   from booster_rpc import (  # type: ignore[import-untyped]
        BoosterConnection,
        RobotMode,
        RpcApiId,
    )
E   ModuleNotFoundError: No module named 'booster_rpc'

Any        = typing.Any
Event      = <class 'threading.Event'>
Lock       = <built-in function allocate_lock>
Thread     = <class 'threading.Thread'>
__builtins__ = <builtins>
__cached__ = '.../k1/__pycache__/connection.cpython-312.pyc'
__doc__    = 'Booster K1 humanoid connection module (built on the booster-rpc SDK).\n\nScope: the K1 over booster-rpc exposes a cam...mplements only the `Camera` spec — no `odom`/`lidar`/\n`pointcloud` ports, and therefore no mapping/navigation tier.\n'
__file__   = '.../booster/k1/connection.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5d0e4ed20>
__name__   = 'dimos.robot.booster.k1.connection'
__package__ = 'dimos.robot.booster.k1'
__spec__   = ModuleSpec(name='dimos.robot.booster.k1.connection', loader=<_frozen_importlib_external.SourceFileLoader object at 0xfff5d0e4ed20>, origin='.../booster/k1/connection.py')
asyncio    = <module 'asyncio' from '....../usr/lib/python3.12/asyncio/__init__.py'>
time       = <module 'time' (built-in)>

.../booster/k1/connection.py:28: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[booster-k1-basic]
Stack Traces | 0.007s run time
blueprint_name = 'booster-k1-basic'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'booster-k1-basic'

dimos/robot/test_all_blueprints.py:103: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:79: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'booster-k1-basic'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'booster_k1_basic'
        module_path = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_basic'
        name       = 'booster-k1-basic'
.../blueprints/basic/booster_k1_basic.py:25: in <module>
    from dimos.robot.booster.k1.connection import K1Connection
        Any        = typing.Any
        DEFAULT_CAPACITY_COLOR_IMAGE = 6220800
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/booster_k1_basic.cpython-312.pyc'
        __doc__    = 'Basic Booster K1 blueprint: connection + camera visualization.'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5cfdc8080>
        __name__   = 'dimos.robot.booster.k1.blueprints.basic.booster_k1_basic'
        __package__ = 'dimos.robot.booster.k1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.booster.k1.blueprints.basic.booster_k1_basic', loader=<_frozen_importlib_external.SourceF...at 0xfff5cfdc8080>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/booster_k1_basic.py')
        autoconnect = <function autoconnect at 0xfff67bbe3560>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, device_path=None, simulation=...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
        platform   = <module 'platform' from '....../usr/lib/python3.12/platform.py'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2025-2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Booster K1 humanoid connection module (built on the booster-rpc SDK).
    
    Scope: the K1 over booster-rpc exposes a camera (JPEG over WebSocket) and base
    velocity control (+ stand/sit mode changes). It has no world-frame odometry or
    lidar, so this connection implements only the `Camera` spec — no `odom`/`lidar`/
    `pointcloud` ports, and therefore no mapping/navigation tier.
    """
    
    import asyncio
    from threading import Event, Lock, Thread
    import time
    from typing import Any
    
>   from booster_rpc import (  # type: ignore[import-untyped]
        BoosterConnection,
        RobotMode,
        RpcApiId,
    )
E   ModuleNotFoundError: No module named 'booster_rpc'

Any        = typing.Any
Event      = <class 'threading.Event'>
Lock       = <built-in function allocate_lock>
Thread     = <class 'threading.Thread'>
__builtins__ = <builtins>
__cached__ = '.../k1/__pycache__/connection.cpython-312.pyc'
__doc__    = 'Booster K1 humanoid connection module (built on the booster-rpc SDK).\n\nScope: the K1 over booster-rpc exposes a cam...mplements only the `Camera` spec — no `odom`/`lidar`/\n`pointcloud` ports, and therefore no mapping/navigation tier.\n'
__file__   = '.../booster/k1/connection.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xfff5cfdcaa80>
__name__   = 'dimos.robot.booster.k1.connection'
__package__ = 'dimos.robot.booster.k1'
__spec__   = ModuleSpec(name='dimos.robot.booster.k1.connection', loader=<_frozen_importlib_external.SourceFileLoader object at 0xfff5cfdcaa80>, origin='.../booster/k1/connection.py')
asyncio    = <module 'asyncio' from '....../usr/lib/python3.12/asyncio/__init__.py'>
time       = <module 'time' (built-in)>

.../booster/k1/connection.py:28: ModuleNotFoundError
dimos.project.test_no_sections::test_no_section_markers
Stack Traces | 0.472s run time
def test_no_section_markers():
        """
        Fail if any file contains section-style comment markers.
    
        If a file is too complicated to be understood without sections, then the
        sections should be files. We don't need "subfiles".
        """
        violations = find_section_markers()
        if violations:
            report_lines = [
                f"Found {len(violations)} section marker(s). "
                "If a file is too complicated to be understood without sections, "
                'then the sections should be files. We don\'t need "subfiles".',
                "",
            ]
            for path, lineno, text in violations:
                report_lines.append(f"  {path}:{lineno}: {text.strip()}")
>           raise AssertionError("\n".join(report_lines))
E           AssertionError: Found 6 section marker(s). If a file is too complicated to be understood without sections, then the sections should be files. We don't need "subfiles".
E           
E             .../booster/k1/connection.py:58: # --- Step 5: configuration ---------------------------------------------------
E             .../booster/k1/connection.py:63: # --- Step 3: connection backend (keep all booster-rpc protocol details out of the Module) ---
E             .../booster/k1/connection.py:211: # --- Step 4: backend factory (real-only for now; no K1 sim/replay yet) -------
E             .../booster/k1/connection.py:237: # --- Step 1: the connection Module -------------------------------------------
E             .../booster/k1/connection.py:300: # --- control verbs (callable across the graph / by the CLI) ---
E             .../booster/k1/connection.py:316: # --- agent-callable skills ---

lineno     = 316
path       = '.../booster/k1/connection.py'
report_lines = ['Found 6 section marker(s). If a file is too complicated to be understood without sections, then the sections should ....../booster/k1/connection.py:237: # --- Step 1: the connection Module -------------------------------------------', ...]
text       = '    # --- agent-callable skills ---'
violations = [('.../booster/k1/connection.py', 58, '# --- Step 5: configuration -------------------------------------------...ss the graph / by the CLI) ---'), ('.../booster/k1/connection.py', 316, '    # --- agent-callable skills ---')]

dimos/project/test_no_sections.py:145: AssertionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant