rosotacom-dev 2.5.dev36__tar.gz → 2.5.dev38__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/DEVELOPMENT_PRINCIPLES.md +8 -2
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/install.sh +13 -3
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/justfile +1 -1
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/pyproject.toml +0 -2
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/cli.py +14 -19
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +25 -9
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/SOURCES.txt +1 -2
- rosotacom_dev-2.5.dev38/src/rosotacom_dev.egg-info/entry_points.txt +2 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/scm_file_list.json +1 -2
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_package_metadata.py +11 -3
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_cli.py +7 -13
- rosotacom_dev-2.5.dev38/tests/unit/test_ota_unwrapper.py +140 -0
- rosotacom_dev-2.5.dev36/run_session_in_container.py +0 -9
- rosotacom_dev-2.5.dev36/src/rosotacom_dev.egg-info/entry_points.txt +0 -4
- rosotacom_dev-2.5.dev36/stop_session_in_container.py +0 -9
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/actions/setup-just/action.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/dev-release.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/nightly-e2e.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/pr-merge-gate.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/release.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/README.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/budgets.jsonl +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/ci.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/README.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/link-bandwidth.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/testing.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/session-configuration.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/image_cache.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_security_maintenance_config.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_session_configuration_doc.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_session_template_substitution.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/contract/test_workflow_contracts.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/conftest.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_catmux_pane_logging.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_image_cache.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_session_pipeline.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_status_overview_observer.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/tests/unit/test_video_quality.py +0 -0
|
@@ -13,10 +13,16 @@ A change is complete only if:
|
|
|
13
13
|
|
|
14
14
|
## Compatibility Policy
|
|
15
15
|
|
|
16
|
-
Preserve documented CLI behavior
|
|
17
|
-
`stop_rosotacom` entry points. Do not add silent aliases for removed behavior
|
|
16
|
+
Preserve documented CLI behavior. Do not add silent aliases for removed behavior
|
|
18
17
|
unless a migration explicitly requires them.
|
|
19
18
|
|
|
19
|
+
`rosotacom` is the only console script this package installs. The
|
|
20
|
+
`start_rosotacom` / `stop_rosotacom` entry points were the one standing
|
|
21
|
+
exception to rule 6 above; they were removed on 2026-08-14 because they were
|
|
22
|
+
nothing but `rosotacom start` and `rosotacom stop` under a second name, and a
|
|
23
|
+
second name is what makes a stale shim on a machine indistinguishable from a
|
|
24
|
+
live command. `rosotacom doctor` reports one that is still lying around.
|
|
25
|
+
|
|
20
26
|
## Testing Policy
|
|
21
27
|
|
|
22
28
|
Test public behavior and contracts.
|
|
@@ -85,8 +85,18 @@ echo " just setup"
|
|
|
85
85
|
if [[ "$INSTALL_GLOBAL_SYMLINKS" == true ]]; then
|
|
86
86
|
mkdir -p "$BIN_DIR"
|
|
87
87
|
ln -sf "$VENV_DIR/bin/rosotacom" "$BIN_DIR/rosotacom"
|
|
88
|
-
ln -sf "$VENV_DIR/bin/start_rosotacom" "$BIN_DIR/start_rosotacom"
|
|
89
|
-
ln -sf "$VENV_DIR/bin/stop_rosotacom" "$BIN_DIR/stop_rosotacom"
|
|
90
88
|
echo
|
|
91
|
-
echo "Installed
|
|
89
|
+
echo "Installed global symlink into: $BIN_DIR"
|
|
90
|
+
# `start_rosotacom` / `stop_rosotacom` were entry points until 2026-08-14. A
|
|
91
|
+
# machine that ran an older install.sh still has their symlinks, and they now
|
|
92
|
+
# point into a venv whose package no longer provides them. Only links this
|
|
93
|
+
# script could have written are touched — into THIS checkout's venv, never a
|
|
94
|
+
# file or a link belonging to something else.
|
|
95
|
+
for retired in start_rosotacom stop_rosotacom; do
|
|
96
|
+
link="$BIN_DIR/$retired"
|
|
97
|
+
if [[ -L "$link" && "$(readlink -- "$link")" == "$VENV_DIR/bin/$retired" ]]; then
|
|
98
|
+
rm -- "$link"
|
|
99
|
+
echo "Removed retired symlink: $link (use 'rosotacom start' / 'rosotacom stop')"
|
|
100
|
+
fi
|
|
101
|
+
done
|
|
92
102
|
fi
|
|
@@ -19,7 +19,7 @@ format:
|
|
|
19
19
|
lint:
|
|
20
20
|
{{python}} -m ruff check .
|
|
21
21
|
{{python}} -m ruff format --check .
|
|
22
|
-
{{python}} -m py_compile src/rosotacom/*.py
|
|
22
|
+
{{python}} -m py_compile src/rosotacom/*.py
|
|
23
23
|
|
|
24
24
|
typecheck:
|
|
25
25
|
{{python}} -m mypy
|
|
@@ -5676,18 +5676,21 @@ def doctor(args: argparse.Namespace) -> int:
|
|
|
5676
5676
|
except Exception as exc: # noqa: BLE001 - doctor reports all setup failures.
|
|
5677
5677
|
line("ERROR", "config", str(exc))
|
|
5678
5678
|
|
|
5679
|
-
|
|
5680
|
-
|
|
5681
|
-
|
|
5682
|
-
|
|
5683
|
-
|
|
5684
|
-
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5679
|
+
# `start_rosotacom` / `stop_rosotacom` were entry points of this package until
|
|
5680
|
+
# 2026-08-14; `rosotacom start` and `rosotacom stop` are the command. A shim
|
|
5681
|
+
# left behind keeps dispatching through whichever venv it points at, which is
|
|
5682
|
+
# exactly the stale-install confusion this check used to report — so it is a
|
|
5683
|
+
# leftover to delete now, not a second way to run this.
|
|
5684
|
+
retired = [Path.home() / ".local" / "bin" / name for name in ("start_rosotacom", "stop_rosotacom")]
|
|
5685
|
+
leftovers = [p for p in retired if p.exists() or p.is_symlink()]
|
|
5686
|
+
if leftovers:
|
|
5687
|
+
line(
|
|
5688
|
+
"WARN",
|
|
5689
|
+
"retired entry points",
|
|
5690
|
+
f"{', '.join(str(p) for p in leftovers)} — remove; `rosotacom start` / `rosotacom stop` replaced them",
|
|
5691
|
+
)
|
|
5689
5692
|
else:
|
|
5690
|
-
line("
|
|
5693
|
+
line("OK", "retired entry points", "no start_rosotacom/stop_rosotacom shim left")
|
|
5691
5694
|
|
|
5692
5695
|
tmux = shutil.which("tmux")
|
|
5693
5696
|
if tmux:
|
|
@@ -9757,13 +9760,5 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
9757
9760
|
return 1
|
|
9758
9761
|
|
|
9759
9762
|
|
|
9760
|
-
def start_compat_main() -> int:
|
|
9761
|
-
return main(["start", *sys.argv[1:]])
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
def stop_compat_main() -> int:
|
|
9765
|
-
return main(["stop", *sys.argv[1:]])
|
|
9766
|
-
|
|
9767
|
-
|
|
9768
9763
|
if __name__ == "__main__":
|
|
9769
9764
|
raise SystemExit(main())
|
|
@@ -11,6 +11,7 @@ from rosidl_runtime_py.utilities import get_message
|
|
|
11
11
|
|
|
12
12
|
from com_msgs.msg import OtaStamped
|
|
13
13
|
from com_py.qos import get_topic_qos, load_qos_config
|
|
14
|
+
from com_py.status_overview_core import is_sequence_epoch_reset
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class UniversalOtaUnwrapperNode(Node):
|
|
@@ -142,20 +143,35 @@ class UniversalOtaUnwrapperNode(Node):
|
|
|
142
143
|
return publisher, typed_cls
|
|
143
144
|
|
|
144
145
|
def _check_sequence(self, wrapped_topic: str, seq: int):
|
|
146
|
+
"""Say which of the three things a sequence break is.
|
|
147
|
+
|
|
148
|
+
A backward jump is either reordering or the sending peer restarting, and
|
|
149
|
+
this pane log was the last place still calling both "reordering". Three
|
|
150
|
+
consumers now agree that a jump larger than the transport can reorder is
|
|
151
|
+
a new epoch -- the live accounting, the transit join and the offline bag
|
|
152
|
+
join -- and a breadcrumb that disagrees with them costs exactly the time
|
|
153
|
+
it takes to trust it.
|
|
154
|
+
"""
|
|
145
155
|
last_seq = self._last_seq.get(wrapped_topic)
|
|
146
156
|
self._last_seq[wrapped_topic] = seq
|
|
147
157
|
if last_seq is None:
|
|
148
158
|
return
|
|
149
159
|
expected = last_seq + 1
|
|
150
|
-
if seq
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
if seq == expected:
|
|
161
|
+
return
|
|
162
|
+
if is_sequence_epoch_reset(seq, expected):
|
|
163
|
+
self.get_logger().warning(
|
|
164
|
+
f"[{wrapped_topic}] Sending peer restarted: sequence begins again at {seq} "
|
|
165
|
+
f"after {last_seq}. Counts and delays are per epoch from here."
|
|
166
|
+
)
|
|
167
|
+
elif seq < last_seq:
|
|
168
|
+
self.get_logger().warning(
|
|
169
|
+
f"[{wrapped_topic}] Sequence reordering detected: received {seq} after {last_seq}"
|
|
170
|
+
)
|
|
171
|
+
else:
|
|
172
|
+
self.get_logger().warning(
|
|
173
|
+
f"[{wrapped_topic}] Sequence jump detected: expected {expected}, received {seq}"
|
|
174
|
+
)
|
|
159
175
|
|
|
160
176
|
def unwrapper_callback(self, wrapped_msg: OtaStamped, wrapped_topic: str, out_topic: str):
|
|
161
177
|
try:
|
|
@@ -14,9 +14,7 @@ justfile
|
|
|
14
14
|
pyproject.toml
|
|
15
15
|
requirements.txt
|
|
16
16
|
rosotacom.yaml
|
|
17
|
-
run_session_in_container.py
|
|
18
17
|
session-configuration.md
|
|
19
|
-
stop_session_in_container.py
|
|
20
18
|
terminology.md
|
|
21
19
|
.devcontainer/devcontainer.json.template
|
|
22
20
|
.devcontainer/re_generate_devcontainer_json.py
|
|
@@ -335,6 +333,7 @@ tests/unit/test_link_bytes.py
|
|
|
335
333
|
tests/unit/test_link_trace.py
|
|
336
334
|
tests/unit/test_network_profiles.py
|
|
337
335
|
tests/unit/test_network_shaper.py
|
|
336
|
+
tests/unit/test_ota_unwrapper.py
|
|
338
337
|
tests/unit/test_ota_wrapper.py
|
|
339
338
|
tests/unit/test_ota_xml.py
|
|
340
339
|
tests/unit/test_plots.py
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/src/rosotacom_dev.egg-info/scm_file_list.json
RENAMED
|
@@ -87,7 +87,6 @@
|
|
|
87
87
|
"pyproject.toml",
|
|
88
88
|
"requirements.txt",
|
|
89
89
|
"rosotacom.yaml",
|
|
90
|
-
"run_session_in_container.py",
|
|
91
90
|
"session-configuration.md",
|
|
92
91
|
"src/rosotacom/__init__.py",
|
|
93
92
|
"src/rosotacom/__main__.py",
|
|
@@ -281,7 +280,6 @@
|
|
|
281
280
|
"src/rosotacom/trace_profiles.py",
|
|
282
281
|
"src/rosotacom/transit.py",
|
|
283
282
|
"src/rosotacom/video_quality.py",
|
|
284
|
-
"stop_session_in_container.py",
|
|
285
283
|
"terminology.md",
|
|
286
284
|
"tests/contract/test_benched_set_registry.py",
|
|
287
285
|
"tests/contract/test_findings.py",
|
|
@@ -330,6 +328,7 @@
|
|
|
330
328
|
"tests/unit/test_link_trace.py",
|
|
331
329
|
"tests/unit/test_network_profiles.py",
|
|
332
330
|
"tests/unit/test_network_shaper.py",
|
|
331
|
+
"tests/unit/test_ota_unwrapper.py",
|
|
333
332
|
"tests/unit/test_ota_wrapper.py",
|
|
334
333
|
"tests/unit/test_ota_xml.py",
|
|
335
334
|
"tests/unit/test_plots.py",
|
|
@@ -15,12 +15,20 @@ def test_package_version_is_derived_from_scm_metadata() -> None:
|
|
|
15
15
|
assert '__version__ = "0.1.0"' not in package_init
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def
|
|
18
|
+
def test_rosotacom_is_the_only_console_script() -> None:
|
|
19
|
+
"""One installed command, so a shim in ~/.local/bin cannot be mistaken for it.
|
|
20
|
+
|
|
21
|
+
`start_rosotacom` / `stop_rosotacom` were removed on 2026-08-14: they were
|
|
22
|
+
`rosotacom start` / `rosotacom stop` under a second name (see
|
|
23
|
+
DEVELOPMENT_PRINCIPLES.md, Compatibility Policy). This pins that no second
|
|
24
|
+
name comes back.
|
|
25
|
+
"""
|
|
19
26
|
pyproject = (PACKAGE_ROOT / "pyproject.toml").read_text(encoding="utf-8")
|
|
27
|
+
scripts = pyproject.split("[project.scripts]", 1)[1].split("\n[", 1)[0]
|
|
28
|
+
entries = [line.split("=", 1)[0].strip() for line in scripts.splitlines() if "=" in line]
|
|
20
29
|
|
|
21
30
|
assert 'rosotacom = "rosotacom.cli:main"' in pyproject
|
|
22
|
-
assert
|
|
23
|
-
assert 'stop_rosotacom = "rosotacom.cli:stop_compat_main"' in pyproject
|
|
31
|
+
assert entries == ["rosotacom"], entries
|
|
24
32
|
|
|
25
33
|
|
|
26
34
|
def test_videoquality_reader_dependencies_are_packaged() -> None:
|
|
@@ -1990,20 +1990,14 @@ rosbag2_bagfile_information:
|
|
|
1990
1990
|
assert "TEST OK" in capsys.readouterr().out
|
|
1991
1991
|
|
|
1992
1992
|
|
|
1993
|
-
def
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
def fake_main(argv: list[str] | None = None) -> int:
|
|
1997
|
-
calls.append(list(argv or []))
|
|
1998
|
-
return 0
|
|
1993
|
+
def test_the_retired_compat_entrypoints_are_gone() -> None:
|
|
1994
|
+
"""Removed on 2026-08-14 — they were `start`/`stop` under a second name.
|
|
1999
1995
|
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
assert rosotacom
|
|
2005
|
-
|
|
2006
|
-
assert calls == [["start", "1_heartbeat"], ["stop", "1_heartbeat"]]
|
|
1996
|
+
Asserting their absence is the point: a re-added alias would otherwise pass
|
|
1997
|
+
every other test in this file silently.
|
|
1998
|
+
"""
|
|
1999
|
+
assert not hasattr(rosotacom, "start_compat_main")
|
|
2000
|
+
assert not hasattr(rosotacom, "stop_compat_main")
|
|
2007
2001
|
|
|
2008
2002
|
|
|
2009
2003
|
def test_path_yaml_and_network_helpers(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""What the unwrapper calls a break in the sequence.
|
|
2
|
+
|
|
3
|
+
A backward jump is either the transport reordering two messages or the sending
|
|
4
|
+
peer restarting, and they mean opposite things: one is a property of the link,
|
|
5
|
+
the other resets the numbering everything downstream keys on. Three consumers
|
|
6
|
+
already distinguish them — the live status accounting, the transit join and the
|
|
7
|
+
offline bag join — and this pane log was the last place still calling both
|
|
8
|
+
"reordering".
|
|
9
|
+
|
|
10
|
+
The node imports rclpy, which the host suite does not have, so its ROS surface
|
|
11
|
+
is stubbed before the module is loaded by file path (same approach as
|
|
12
|
+
`tests/unit/test_ota_wrapper.py`).
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import importlib.util
|
|
18
|
+
import sys
|
|
19
|
+
from collections.abc import Iterator
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from types import ModuleType, SimpleNamespace
|
|
22
|
+
|
|
23
|
+
import pytest
|
|
24
|
+
|
|
25
|
+
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
26
|
+
COM_PY = REPO_ROOT / "src" / "rosotacom" / "resources" / "ws" / "ros2src" / "com_py" / "com_py"
|
|
27
|
+
UNWRAPPER_PY = COM_PY / "universal_ota_unwrapper.py"
|
|
28
|
+
CORE_PY = COM_PY / "status_overview_core.py"
|
|
29
|
+
|
|
30
|
+
_STUBBED = (
|
|
31
|
+
"rclpy",
|
|
32
|
+
"rclpy.node",
|
|
33
|
+
"rclpy.serialization",
|
|
34
|
+
"rosidl_runtime_py",
|
|
35
|
+
"rosidl_runtime_py.utilities",
|
|
36
|
+
"com_msgs",
|
|
37
|
+
"com_msgs.msg",
|
|
38
|
+
"com_py",
|
|
39
|
+
"com_py.qos",
|
|
40
|
+
"com_py.status_overview_core",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class _FakeNode:
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _stub_module(name: str, **attrs: object) -> ModuleType:
|
|
49
|
+
module = ModuleType(name)
|
|
50
|
+
for key, value in attrs.items():
|
|
51
|
+
setattr(module, key, value)
|
|
52
|
+
sys.modules[name] = module
|
|
53
|
+
return module
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _load(path: Path, name: str) -> ModuleType:
|
|
57
|
+
spec = importlib.util.spec_from_file_location(name, path)
|
|
58
|
+
assert spec and spec.loader
|
|
59
|
+
module = importlib.util.module_from_spec(spec)
|
|
60
|
+
sys.modules[name] = module
|
|
61
|
+
spec.loader.exec_module(module)
|
|
62
|
+
return module
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@pytest.fixture(scope="module")
|
|
66
|
+
def unwrapper_module() -> Iterator[ModuleType]:
|
|
67
|
+
saved = {name: sys.modules.get(name) for name in _STUBBED}
|
|
68
|
+
_stub_module("rclpy", init=lambda *a, **k: None, shutdown=lambda *a, **k: None, spin=lambda *a, **k: None)
|
|
69
|
+
_stub_module("rclpy.node", Node=_FakeNode)
|
|
70
|
+
_stub_module("rclpy.serialization", deserialize_message=lambda *a, **k: None)
|
|
71
|
+
_stub_module("rosidl_runtime_py", utilities=None)
|
|
72
|
+
_stub_module("rosidl_runtime_py.utilities", get_message=lambda type_str: None)
|
|
73
|
+
_stub_module("com_msgs", msg=None)
|
|
74
|
+
_stub_module("com_msgs.msg", OtaStamped=object)
|
|
75
|
+
_stub_module("com_py", qos=None)
|
|
76
|
+
_stub_module("com_py.qos", get_topic_qos=lambda *a, **k: None, load_qos_config=lambda *a, **k: {})
|
|
77
|
+
# The real rule, not a stub: the point of this test is that the unwrapper
|
|
78
|
+
# and the accounting agree about what a restart is.
|
|
79
|
+
core = _load(CORE_PY, "rosotacom_status_overview_core_unwrapper")
|
|
80
|
+
_stub_module("com_py.status_overview_core", is_sequence_epoch_reset=core.is_sequence_epoch_reset)
|
|
81
|
+
|
|
82
|
+
module = _load(UNWRAPPER_PY, "rosotacom_universal_ota_unwrapper")
|
|
83
|
+
yield module
|
|
84
|
+
|
|
85
|
+
sys.modules.pop("rosotacom_universal_ota_unwrapper", None)
|
|
86
|
+
sys.modules.pop("rosotacom_status_overview_core_unwrapper", None)
|
|
87
|
+
for name, previous in saved.items():
|
|
88
|
+
if previous is None:
|
|
89
|
+
sys.modules.pop(name, None)
|
|
90
|
+
else:
|
|
91
|
+
sys.modules[name] = previous
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _node(unwrapper_module: ModuleType, warnings: list[str]):
|
|
95
|
+
node = object.__new__(unwrapper_module.UniversalOtaUnwrapperNode)
|
|
96
|
+
node._last_seq = {}
|
|
97
|
+
node.get_logger = lambda: SimpleNamespace(
|
|
98
|
+
warning=warnings.append, error=lambda *a, **k: None, info=lambda *a, **k: None
|
|
99
|
+
)
|
|
100
|
+
return node
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _feed(unwrapper_module: ModuleType, sequence: list[int]) -> list[str]:
|
|
104
|
+
warnings: list[str] = []
|
|
105
|
+
node = _node(unwrapper_module, warnings)
|
|
106
|
+
for value in sequence:
|
|
107
|
+
node._check_sequence("/x/ota_stamped", value)
|
|
108
|
+
return warnings
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_an_uninterrupted_stream_says_nothing(unwrapper_module: ModuleType) -> None:
|
|
112
|
+
assert _feed(unwrapper_module, list(range(20))) == []
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_a_restart_is_called_a_restart(unwrapper_module: ModuleType) -> None:
|
|
116
|
+
"""The field shape: seq 28983, then the new run's first arrival at 37."""
|
|
117
|
+
(warning,) = _feed(unwrapper_module, [28982, 28983, 37, 38])
|
|
118
|
+
|
|
119
|
+
assert "Sending peer restarted" in warning
|
|
120
|
+
assert "37" in warning and "28983" in warning
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_a_reset_to_zero_is_a_restart_too(unwrapper_module: ModuleType) -> None:
|
|
124
|
+
(warning,) = _feed(unwrapper_module, [40, 41, 0, 1])
|
|
125
|
+
assert "Sending peer restarted" in warning
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def test_reordering_is_still_reordering(unwrapper_module: ModuleType) -> None:
|
|
129
|
+
# 1002 after 1000 is a forward gap (one warning); 1001 after 1002 is the
|
|
130
|
+
# reordering (the second). Both are real and both keep their old words.
|
|
131
|
+
gap, reorder = _feed(unwrapper_module, [1000, 1002, 1001])
|
|
132
|
+
|
|
133
|
+
assert "Sequence jump" in gap
|
|
134
|
+
assert "reordering" in reorder.lower()
|
|
135
|
+
assert "restarted" not in reorder
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def test_a_forward_gap_is_a_jump(unwrapper_module: ModuleType) -> None:
|
|
139
|
+
(warning,) = _feed(unwrapper_module, [10, 15])
|
|
140
|
+
assert "Sequence jump" in warning
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.devcontainer/devcontainer.json.template
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.devcontainer/re_generate_devcontainer_json.py
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/documentation-audit.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/implementation-cleanup.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/quality-workflow.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/release-process.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/ISSUE_TEMPLATE/repository-diagnosis.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/.github/workflows/benchmark-calibrate.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/capacity-size-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-gop-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-nominal-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/calibration/probe-loss-tight-fastdds.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/cyclone-spdp-discovery-bursts.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/head-of-line-irregularity.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/jitter-loss-bandwidth-latency.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev36 → rosotacom_dev-2.5.dev38}/docs/findings/zero-loss-boundaries-18kb-20hz.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|