Skip to content

sim2: Go2 with its L1 lidar - #4913

Draft
jeff-hykin wants to merge 92 commits into
jeff/feat/sim2_imufrom
jeff/feat/sim2_go2_l1
Draft

jeff-hykin wants to merge 92 commits into
jeff/feat/sim2_imufrom
jeff/feat/sim2_go2_l1

Conversation

@jeff-hykin

Copy link
Copy Markdown
Member

Go2Sim walks main's Go2 policy on sim2 PD servos; SimL1 reproduces the head L1's rolling 5 cm voxel map measured from real recordings; unitree-go2-sim2-l1.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

go2 replay realtime (arm64)

Details
Benchmark suite Current: b05daaf Previous: 83800d9 Ratio
peak memory 1762.27 MB 1745.215 MB 1.01
peak threads 369 threads 368 threads 1.00
network (transport) 2725.795 MB 2730.954 MB 1.00
disk write 1.824 MB 1.863 MB 0.98
instructions 137.106 G 138.7 G 0.99

This comment was automatically generated by workflow using github-action-benchmark.

@codecov

codecov Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

❌ 8 Tests Failed:

Tests completed Failed Passed Skipped
8167 8 8159 120
View the top 3 failed test(s) by shortest run time
::dimos.sim2.mujoco.test_backend
Stack Traces | 0s run time
ImportError while importing test module '.../sim2/mujoco/test_backend.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../sim2/mujoco/test_backend.py:29: in <module>
    from dimos.sim2.actions import CborKeyValueCommand, JointCommand, read_actions, world_action
dimos/sim2/actions.py:21: in <module>
    from dimos_lcm.world_msgs import (
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'
::dimos.sim2.mujoco.test_sensor_world
Stack Traces | 0s run time
ImportError while importing test module '.../sim2/mujoco/test_sensor_world.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../sim2/mujoco/test_sensor_world.py:23: in <module>
    from dimos.sim2.mujoco.sensor_world import open_view, robot_ids
.../sim2/mujoco/sensor_world.py:25: in <module>
    from dimos.sim2.world_observations import WorldMirror
dimos/sim2/world_observations.py:24: in <module>
    from dimos_lcm.world_msgs import CborKeyValue, JointState, Position, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'
::dimos.sim2.test_sim
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/sim2/test_sim.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/sim2/test_sim.py:25: in <module>
    from dimos.sim2.sim import (
dimos/sim2/sim.py:20: in <module>
    from dimos_lcm.world_msgs import WorldAction, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'
::dimos.sim2.test_sim_time
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/sim2/test_sim_time.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/sim2/test_sim_time.py:22: in <module>
    from dimos_lcm.world_msgs import WorldAction, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[unitree-go2-sim2-l1]
Stack Traces | 0.003s run time
blueprint_name = 'unitree-go2-sim2-l1'
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffba7aafc230>

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(
        blueprint_name: str, monkeypatch: pytest.MonkeyPatch
    ) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
        # The multi-robot blueprints read ROBOT_IPS at import time.
        monkeypatch.setattr(global_config, "robot_ips", "192.0.2.10,192.0.2.11")
>       blueprint = _get_blueprint_or_skip(blueprint_name)

blueprint_name = 'unitree-go2-sim2-l1'
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffba7aafc230>

dimos/codebase_checks/test_blueprint_kwargs.py:78: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:33: in _get_blueprint_or_skip
    return load_blueprint(blueprint_name)
        blueprint_name = 'unitree-go2-sim2-l1'
dimos/robot/get_all_blueprints.py:72: in load_blueprint
    return get_blueprint_by_name(name)
        name       = 'unitree-go2-sim2-l1'
dimos/robot/get_all_blueprints.py:65: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'unitree_go2_sim2_l1'
        module_path = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        name       = 'unitree-go2-sim2-l1'
.../blueprints/basic/unitree_go2_sim2_l1.py:20: in <module>
    from dimos.robot.unitree.go2.sim2 import Go2Sim
        UsdModel   = <class 'dimos.robot.assets.model.UsdModel'>
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/unitree_go2_sim2_l1.cpython-312.pyc'
        __doc__    = None
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xffba7aafc3e0>
        __name__   = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        __package__ = 'dimos.robot.unitree.go2.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1', loader=<_frozen_importlib_external.Sou...xffba7aafc3e0>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py')
        autoconnect = <function autoconnect at 0xffbb5b337920>
        global_config = GlobalConfig(robot_ip=None, robot_ips='192.0.2.10,192.0.2.11', simulation='', replay=False, replay_db='go2_short', rec...noh', build_native=False, dtop=False, listen_host='127.0.0.1', local_relay=False, topic_metadata=False, relay_url=None)
        rerun_config = {'blueprint': <function _go2_rerun_blueprint at 0xffba88796660>, 'max_hz': {'world/color_image': 0, 'world/global_cost...world/lidar': 1}, 'static': {'world/robot_body': <function _static_robot_body at 0xffba887965c0>}, 'tf_axes': 0.5, ...}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 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.
    
    
    import asyncio
    from collections.abc import AsyncIterator
    import math
    from pathlib import Path
    from typing import Any
    
>   from dimos_lcm.world_msgs import WorldAction, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'

Any        = typing.Any
AsyncIterator = <class 'collections.abc.AsyncIterator'>
Path       = <class 'pathlib.Path'>
__builtins__ = <builtins>
__cached__ = '.../go2/__pycache__/sim2.cpython-312.pyc'
__doc__    = None
__file__   = '.../unitree/go2/sim2.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xffba7aafc620>
__name__   = 'dimos.robot.unitree.go2.sim2'
__package__ = 'dimos.robot.unitree.go2'
__spec__   = ModuleSpec(name='dimos.robot.unitree.go2.sim2', loader=<_frozen_importlib_external.SourceFileLoader object at 0xffba7aafc620>, origin='.../unitree/go2/sim2.py')
asyncio    = <module 'asyncio' from '.../_temp/uv-python-dir/cpython-3.12.16-linux-aarch64-gnu/lib/python3.12/asyncio/__init__.py'>
math       = <module 'math' (built-in)>

.../unitree/go2/sim2.py:22: ModuleNotFoundError
dimos.robot.test_blueprints_cross_processes::test_blueprint_roundtrips_through_the_codec[unitree-go2-sim2-l1]
Stack Traces | 0.003s run time
name = 'unitree-go2-sim2-l1'
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xff70fdec70e0>

    @pytest.mark.parametrize(
        "name",
        [
            pytest.param(name, marks=pytest.mark.self_hosted)
            if name in SELF_HOSTED_BLUEPRINTS
            else name
            for name in sorted(all_blueprints)
        ],
    )
    def test_blueprint_roundtrips_through_the_codec(name: str, monkeypatch: pytest.MonkeyPatch) -> None:
        # The multi-robot blueprints read ROBOT_IPS at import time.
        monkeypatch.setattr(global_config, "robot_ips", "192.0.2.10,192.0.2.11")
        try:
>           blueprint = load_blueprint(name)

monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xff70fdec70e0>
name       = 'unitree-go2-sim2-l1'

dimos/robot/test_blueprints_cross_processes.py:44: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/get_all_blueprints.py:72: in load_blueprint
    return get_blueprint_by_name(name)
        name       = 'unitree-go2-sim2-l1'
dimos/robot/get_all_blueprints.py:65: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'unitree_go2_sim2_l1'
        module_path = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        name       = 'unitree-go2-sim2-l1'
.../blueprints/basic/unitree_go2_sim2_l1.py:20: in <module>
    from dimos.robot.unitree.go2.sim2 import Go2Sim
        UsdModel   = <class 'dimos.robot.assets.model.UsdModel'>
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/unitree_go2_sim2_l1.cpython-312.pyc'
        __doc__    = None
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff70fdec7c80>
        __name__   = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        __package__ = 'dimos.robot.unitree.go2.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1', loader=<_frozen_importlib_external.Sou...xff70fdec7c80>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py')
        autoconnect = <function autoconnect at 0xff71d6833920>
        global_config = GlobalConfig(robot_ip=None, robot_ips='192.0.2.10,192.0.2.11', simulation='', replay=False, replay_db='go2_short', rec...noh', build_native=False, dtop=False, listen_host='127.0.0.1', local_relay=False, topic_metadata=False, relay_url=None)
        rerun_config = {'blueprint': <function _go2_rerun_blueprint at 0xff70ffc9dee0>, 'max_hz': {'world/color_image': 0, 'world/global_cost...world/lidar': 1}, 'static': {'world/robot_body': <function _static_robot_body at 0xff70ffc9de40>}, 'tf_axes': 0.5, ...}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 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.
    
    
    import asyncio
    from collections.abc import AsyncIterator
    import math
    from pathlib import Path
    from typing import Any
    
>   from dimos_lcm.world_msgs import WorldAction, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'

Any        = typing.Any
AsyncIterator = <class 'collections.abc.AsyncIterator'>
Path       = <class 'pathlib.Path'>
__builtins__ = <builtins>
__cached__ = '.../go2/__pycache__/sim2.cpython-312.pyc'
__doc__    = None
__file__   = '.../unitree/go2/sim2.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff70fdf0f8c0>
__name__   = 'dimos.robot.unitree.go2.sim2'
__package__ = 'dimos.robot.unitree.go2'
__spec__   = ModuleSpec(name='dimos.robot.unitree.go2.sim2', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff70fdf0f8c0>, origin='.../unitree/go2/sim2.py')
asyncio    = <module 'asyncio' from '.../_temp/uv-python-dir/cpython-3.12.16-linux-aarch64-gnu/lib/python3.12/asyncio/__init__.py'>
math       = <module 'math' (built-in)>

.../unitree/go2/sim2.py:22: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[unitree-go2-sim2-l1]
Stack Traces | 0.004s run time
blueprint_name = 'unitree-go2-sim2-l1'
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xff6a813ef530>

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str, monkeypatch: pytest.MonkeyPatch) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
        # The multi-robot blueprints read ROBOT_IPS at import time.
        monkeypatch.setattr(global_config, "robot_ips", "192.0.2.10,192.0.2.11")
>       _check_blueprint(blueprint_name)

blueprint_name = 'unitree-go2-sim2-l1'
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xff6a813ef530>

dimos/robot/test_all_blueprints.py:99: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = load_blueprint(blueprint_name)
        blueprint_name = 'unitree-go2-sim2-l1'
dimos/robot/get_all_blueprints.py:72: in load_blueprint
    return get_blueprint_by_name(name)
        name       = 'unitree-go2-sim2-l1'
dimos/robot/get_all_blueprints.py:65: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'unitree_go2_sim2_l1'
        module_path = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        name       = 'unitree-go2-sim2-l1'
.../blueprints/basic/unitree_go2_sim2_l1.py:20: in <module>
    from dimos.robot.unitree.go2.sim2 import Go2Sim
        UsdModel   = <class 'dimos.robot.assets.model.UsdModel'>
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/unitree_go2_sim2_l1.cpython-312.pyc'
        __doc__    = None
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6a813ef650>
        __name__   = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        __package__ = 'dimos.robot.unitree.go2.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1', loader=<_frozen_importlib_external.Sou...xff6a813ef650>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py')
        autoconnect = <function autoconnect at 0xff6b55a33920>
        global_config = GlobalConfig(robot_ip=None, robot_ips='192.0.2.10,192.0.2.11', simulation='', replay=False, replay_db='go2_short', rec...noh', build_native=False, dtop=False, listen_host='127.0.0.1', local_relay=False, topic_metadata=False, relay_url=None)
        rerun_config = {'blueprint': <function _go2_rerun_blueprint at 0xff6a828a1b20>, 'max_hz': {'world/color_image': 0, 'world/global_cost...world/lidar': 1}, 'static': {'world/robot_body': <function _static_robot_body at 0xff6a828a1a80>}, 'tf_axes': 0.5, ...}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 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.
    
    
    import asyncio
    from collections.abc import AsyncIterator
    import math
    from pathlib import Path
    from typing import Any
    
>   from dimos_lcm.world_msgs import WorldAction, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'

Any        = typing.Any
AsyncIterator = <class 'collections.abc.AsyncIterator'>
Path       = <class 'pathlib.Path'>
__builtins__ = <builtins>
__cached__ = '.../go2/__pycache__/sim2.cpython-312.pyc'
__doc__    = None
__file__   = '.../unitree/go2/sim2.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6a813ef620>
__name__   = 'dimos.robot.unitree.go2.sim2'
__package__ = 'dimos.robot.unitree.go2'
__spec__   = ModuleSpec(name='dimos.robot.unitree.go2.sim2', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6a813ef620>, origin='.../unitree/go2/sim2.py')
asyncio    = <module 'asyncio' from '.../_temp/uv-python-dir/cpython-3.12.16-linux-aarch64-gnu/lib/python3.12/asyncio/__init__.py'>
math       = <module 'math' (built-in)>

.../unitree/go2/sim2.py:22: ModuleNotFoundError
dimos.hardware.sensors.lidar.pointlio.test_wiring::test_every_pointlio_input_has_one_producer
Stack Traces | 0.424s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xff865a899490>

    def test_every_pointlio_input_has_one_producer(monkeypatch: pytest.MonkeyPatch) -> None:
        monkeypatch.setattr(global_config, "robot_ips", "192.0.2.10,192.0.2.11")
        checked = []
        skipped = []
        for name in UBUNTU_BLUEPRINTS:
            try:
>               blueprint = load_blueprint(name)

atom       = BlueprintAtom(kwargs={'frame_id': 'world'}, module=<class 'dimos.hardware.sensors.lidar.pointlio.module.PointLio'>, st...me='tf', type=<class 'dimos.msgs.tf2_msgs.TFMessage.TFMessage'>, direction='out')), module_refs=(), instance_name=None)
blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.robot.unitree.go2.connection.GO2Connection'>, stre...: 'unitree_go2'}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=(), hosted_placements=())
checked    = ['alfred-keyboard-teleop', 'alfred-nav', 'demo-virtual-mid360-pointlio', 'go2-nav', 'go2-nav-hosted', 'go2-nav-l1', ...]
driver     = BlueprintAtom(kwargs={'frame_id': 'mid360_link', 'point_format': 'full'}, module=<class 'dimos.hardware.sensors.lidar...., type=<class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>, direction='out')), module_refs=(), instance_name=None)
driver_frame = 'mid360_link'
lio        = []
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xff865a899490>
name       = 'unitree-go2-sim2-l1'
names      = ['mid360.imu_raw']
port       = 'imu_raw'
producers  = [BlueprintAtom(kwargs={'frame_id': 'mid360_link', 'point_format': 'full'}, module=<class 'dimos.hardware.sensors.lidar... type=<class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>, direction='out')), module_refs=(), instance_name=None)]
sensor_frame = 'mid360_link'
skipped    = ['demo-object-scene-registration (ZED SDK not installed. Please install pyzed package to use ZED camera functionality.)', 'unitree-g1-nav-simple (unitree_sdk2py)', 'unitree-g1-record (unitree_sdk2py)']

.../lidar/pointlio/test_wiring.py:58: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/get_all_blueprints.py:72: in load_blueprint
    return get_blueprint_by_name(name)
        name       = 'unitree-go2-sim2-l1'
dimos/robot/get_all_blueprints.py:65: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'unitree_go2_sim2_l1'
        module_path = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        name       = 'unitree-go2-sim2-l1'
.../blueprints/basic/unitree_go2_sim2_l1.py:20: in <module>
    from dimos.robot.unitree.go2.sim2 import Go2Sim
        UsdModel   = <class 'dimos.robot.assets.model.UsdModel'>
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/unitree_go2_sim2_l1.cpython-312.pyc'
        __doc__    = None
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8678a70620>
        __name__   = 'dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1'
        __package__ = 'dimos.robot.unitree.go2.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.basic.unitree_go2_sim2_l1', loader=<_frozen_importlib_external.Sou...xff8678a70620>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_go2_sim2_l1.py')
        autoconnect = <function autoconnect at 0xff874d827920>
        global_config = GlobalConfig(robot_ip=None, robot_ips='192.0.2.10,192.0.2.11', simulation='', replay=False, replay_db='go2_short', rec...noh', build_native=False, dtop=False, listen_host='127.0.0.1', local_relay=False, topic_metadata=False, relay_url=None)
        rerun_config = {'blueprint': <function _go2_rerun_blueprint at 0xff867aa8fc40>, 'max_hz': {'world/color_image': 0, 'world/global_cost...world/lidar': 1}, 'static': {'world/robot_body': <function _static_robot_body at 0xff867aa8fba0>}, 'tf_axes': 0.5, ...}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 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.
    
    
    import asyncio
    from collections.abc import AsyncIterator
    import math
    from pathlib import Path
    from typing import Any
    
>   from dimos_lcm.world_msgs import WorldAction, WorldObservations
E   ModuleNotFoundError: No module named 'dimos_lcm.world_msgs'

Any        = typing.Any
AsyncIterator = <class 'collections.abc.AsyncIterator'>
Path       = <class 'pathlib.Path'>
__builtins__ = <builtins>
__cached__ = '.../go2/__pycache__/sim2.cpython-312.pyc'
__doc__    = None
__file__   = '.../unitree/go2/sim2.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8678a70bf0>
__name__   = 'dimos.robot.unitree.go2.sim2'
__package__ = 'dimos.robot.unitree.go2'
__spec__   = ModuleSpec(name='dimos.robot.unitree.go2.sim2', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff8678a70bf0>, origin='.../unitree/go2/sim2.py')
asyncio    = <module 'asyncio' from '.../_temp/uv-python-dir/cpython-3.12.16-linux-aarch64-gnu/lib/python3.12/asyncio/__init__.py'>
math       = <module 'math' (built-in)>

.../unitree/go2/sim2.py:22: ModuleNotFoundError

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

…nd actions, SimL1 reproduces the head L1's rolling voxel map, unitree-go2-sim2-l1 blueprint
…s made from its MJCF (GO2_SIM_MODEL), with the L1 and camera frames the blueprint names; SimL1 takes only its frame_id; Go2Sim publishes only odom -> base_link
… config validation takes no lazy path object
…o2.xml with the rig's frames as sites (Go2Sim.l1_mount_frame, lidar_mount_frame, camera_mount_frame); unitree-go2-sim2-l1 poses mjcf_to_urdf(Go2Sim.mjcf) and its sensors name Go2Sim's frames
# Conflicts:
#	dimos/sim2/mujoco_backend.py
…it with @shared_config(UrdfManager); Go2Sim sends its URDF
…as steady stamps, so a loaded machine's slow first point cloud does not fail it
…d's clock

SimL1 defaulted to geom group 0 alone. That is the default the Livox's own
config records as the one that made the beam pass through every desk, chair
and robot -- and a converted scene puts collision geometry in group 3:
office_555 has no group-0 geoms at all. So the L1 published an empty map
every 0.13 s and nothing said why. It takes (0, 3), as the Livox does.

handle_cmd_vel set its deadline from time.monotonic and _act compared against
it, inside a world where every other rate paces on world.stamp(). At speed=4
a command expired after a quarter of CMD_VEL_TIMEOUT of sim time. Both ends
use the world's clock now, and `time` is no longer imported here.
Measured, with three-g1-office-555 running on this machine: the live world logged
`the world stopped: KeyError(... is neither a file this description names nor an
asset the last scene published)` twice while this file's tests ran, each time
right after a second `starting the world` in its own log.

Two names collide. `SCENE_MANAGER` here was `scene/usdmanager`, which is what
that blueprint's `SCENE_NAMESPACE = "scene"` makes of its own scene manager, and
an unnamespaced `sim_module()` is `mujocosim` on both sides. The per-run
`zenoh_domain` this already took does not help: a domain prefixes key
expressions, so it keeps the *streams* apart, while an RPC goes out on the
instance name. So the office's sensors asked this test's manager for a scene --
whose assets are published under different names -- and this test's teardown
stopped the office's world.

Only those two needed it. Every sensor in that blueprint is inside a robot's
`.namespace(name)`, so it is `main/livoxsim` and never `livoxsim`; renaming the
sensors here as well was tried and reverted, since it changed nothing.

No behaviour change: `test_sim_time` has the same three failures with and
without this, on a quiet box and on a busy one. They are `color_image: 0`, which
reproduces with this file untouched on this branch and is a separate matter.

This branch was successfully deployed

No deployments
cachix — b77eb174 Deployed Nov 10, 2026 by jeff-hykin via cachix-build-macos #16705
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