rosotacom-dev 2.5.dev75__tar.gz → 2.5.dev77__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.dev75 → rosotacom_dev-2.5.dev77}/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/README.md +3 -0
- rosotacom_dev-2.5.dev77/docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md +116 -0
- rosotacom_dev-2.5.dev77/docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md +182 -0
- rosotacom_dev-2.5.dev77/docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md +140 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/profiles.yaml +147 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/PKG-INFO +1 -1
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/SOURCES.txt +3 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/scm_file_list.json +3 -0
- rosotacom_dev-2.5.dev77/src/rosotacom_dev.egg-info/scm_version.json +8 -0
- rosotacom_dev-2.5.dev75/src/rosotacom_dev.egg-info/scm_version.json +0 -8
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/actions/setup-just/action.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/dev-release.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/nightly-e2e.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/pr-merge-gate.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.github/workflows/release.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/CONCURRENCY.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/README.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/budgets.jsonl +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/ci.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/a-fitted-delay-table-never-reached-the-shaper.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/a-transport-element-doubles-every-fastdds-sample.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/fastdds-datagram-cap-drops-large-samples.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/graph-derived-types-block-a-non-graph-transport.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/keyframe-loss-kills-the-next-deltas.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/oversubscription-queues-not-losses.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/reorder-becomes-reader-loss.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/repro/decode_chain_repro.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/repro/reorder_drop_repro.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/sender-rows-make-a-dead-link-look-loss-free.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/link-bandwidth.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/ota-pcap.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/testing.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/install.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/justfile +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/pyproject.toml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/session-configuration.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/cli.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/image_cache.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/netem_dist.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/network_preflight.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/dist/field-20260817.dist +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/ros2docker.lyrical.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.lyrical.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.lyrical.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ros2docker.lyrical.json.example +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_local_participants.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_scoped.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_local.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ffmpeg_flags.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/ota_pcap.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/playout_pacer_core.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_generated_topics_have_a_producer.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_lyrical_runtime_compat.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_security_maintenance_config.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_session_configuration_doc.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_session_template_substitution.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/contract/test_workflow_contracts.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/conftest.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_fastdds-default/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_catmux_pane_logging.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_cli.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_concurrency.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_container_shaping.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ffmpeg_flags.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_field_profiles.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_image_cache.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_netem_dist.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_network_preflight.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_link_configs.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_pcap.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_playout_pacer.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_pub_sub_pair_types.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_qos_fallback_logging.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_relay_optional_parameters.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_ros_node_entity_ownership.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_session_pipeline.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_status_overview_observer.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_terminology_stage_ownership.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/tests/unit/test_video_quality.py +0 -0
|
@@ -28,6 +28,9 @@ living verification hook.
|
|
|
28
28
|
|
|
29
29
|
## Findings
|
|
30
30
|
|
|
31
|
+
- [The size law belongs to the transport, not to the link](the-size-law-belongs-to-the-transport-not-the-link.md) - one emulated link, three OTA middlewares: CycloneDDS follows `1-(1-p)^N` with a flat residual over three decades of size, Fast DDS keeps the form and loses the fit, and zenoh is flat from 300 B to 12 kB and then falls off a cliff at 38 kB.
|
|
32
|
+
- [Neither a queue nor a burst tilts the size law](neither-a-queue-nor-a-burst-tilts-the-size-law.md) - the field's size-systematic residual is reproduced by none of the three candidates: independent per-packet loss fits flat, a token bucket a burst can fill changes nothing systematic, and a serialisation constraint does not tilt the curve but truncates it (38 kB goes from 32% to 97.5% while 1 kB pays 10% more).
|
|
33
|
+
- [A shorter group does not lose fewer key frames](a-shorter-group-does-not-lose-fewer-key-frames.md) - shortening the group cuts the large message's loss from 29.5% to 12.5% and leaves the rate at which large messages go missing unchanged (0.59, 0.79, 0.62 per second), while doubling the link's per-packet rate moves it by 1.8x.
|
|
31
34
|
- [A fitted delay table never reached the shaper](a-fitted-delay-table-never-reached-the-shaper.md) - every profile carrying a custom netem distribution failed at arming: the table was installed as `/usr/lib/tc/<name>.dist` while iproute2 on a multiarch image reads `/usr/lib/<triplet>/tc`, so the drive-fitted delay tail was never actually in use.
|
|
32
35
|
- [Sender-side transit rows made a dead link report zero loss](sender-rows-make-a-dead-link-look-loss-free.md) - `delivered = rows - lost` counted the sender's own `sent` rows as deliveries, so a topic the receiver never saw summarised as `delivered == expected` at 0.0% loss, with the publisher's timer reported as arrival spacing.
|
|
33
36
|
- [A bridge that learns types from the graph cannot use a transport that does not carry the graph](graph-derived-types-block-a-non-graph-transport.md) - over `zenoh_ros2dds` the payload topic never arrived in either run: the bridge routes a topic once a local reader exists and the reader waited for the bridge, leaving only `Pending=1` in a log.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# A Shorter Group Does Not Lose Fewer Key Frames
|
|
2
|
+
|
|
3
|
+
## Claim
|
|
4
|
+
|
|
5
|
+
Shortening the group of pictures is the design lever the fragment law hands a
|
|
6
|
+
video stream: fewer bytes in the largest message class, so a smaller fragment
|
|
7
|
+
count, so a lower loss probability for the frame everything else depends on.
|
|
8
|
+
The lever works on that probability and **not on the rate at which key frames
|
|
9
|
+
go missing**, because the same change makes proportionally more of them.
|
|
10
|
+
|
|
11
|
+
Three size distributions at one cadence, each standing in for a group length,
|
|
12
|
+
under an unchanged link:
|
|
13
|
+
|
|
14
|
+
| link | pattern | large msg | per second | loss of it | **lost per second** | offered |
|
|
15
|
+
|---|---|---:|---:|---:|---:|---:|
|
|
16
|
+
| p = 1 % | 4 small + 1 large | 38.1 kB | 2.00 | 29.52 % | **0.590** | 0.936 Mbit/s |
|
|
17
|
+
| p = 1 % | 2 small + 1 large | 24.1 kB | 3.33 | 23.82 % | **0.794** | 0.915 Mbit/s |
|
|
18
|
+
| p = 1 % | 1 small + 1 large | 14.1 kB | 5.00 | 12.45 % | **0.623** | 0.768 Mbit/s |
|
|
19
|
+
| p = 2 % | 4 small + 1 large | 38.1 kB | 2.00 | 56.43 % | **1.127** | 0.935 Mbit/s |
|
|
20
|
+
| p = 2 % | 2 small + 1 large | 24.1 kB | 3.34 | 37.95 % | **1.266** | 0.915 Mbit/s |
|
|
21
|
+
| p = 2 % | 1 small + 1 large | 14.1 kB | 5.00 | 21.98 % | **1.099** | 0.768 Mbit/s |
|
|
22
|
+
|
|
23
|
+
Read the two bold columns together. **The loss of the large message falls by
|
|
24
|
+
more than half — 29.5 % to 12.5 % — while the rate at which large messages are
|
|
25
|
+
lost does not move: 0.590, 0.794, 0.623 per second.** The lever's two factors
|
|
26
|
+
cancel to within a few per cent, by construction rather than by accident: a
|
|
27
|
+
message 2.7× smaller occupies 2.7× fewer packets, and there are 2.5× more of
|
|
28
|
+
them.
|
|
29
|
+
|
|
30
|
+
**The factor that does move the answer is the one the designer does not set.**
|
|
31
|
+
Doubling the link's per-packet rate moves the same quantity by 1.8–1.9× in
|
|
32
|
+
every pattern.
|
|
33
|
+
|
|
34
|
+
The rule is therefore usable and its limit is exactly stated: it predicts
|
|
35
|
+
*which* term changes and by how much, and it does not predict that the outcome
|
|
36
|
+
improves. What a shorter group buys is the length of each hole, not their
|
|
37
|
+
number — and, worth having, about 18 % less offered bandwidth for the same
|
|
38
|
+
cadence.
|
|
39
|
+
|
|
40
|
+
## Setup
|
|
41
|
+
|
|
42
|
+
- Host pair / topology: one host, the packaged local benchmark rig — two
|
|
43
|
+
communication containers on their own Docker network, `tc` inside each
|
|
44
|
+
container's own netns (`--sudo-mode container`).
|
|
45
|
+
- Session: `bench_1_1_capacity` from the packaged example project, one
|
|
46
|
+
`a->b:/bench_capacity` stream at 10 Hz with `--size-pattern`, CycloneDDS,
|
|
47
|
+
OTA QoS best_effort / KEEP_LAST depth 1. The patterns are
|
|
48
|
+
`4x5KB+1x38KB`, `2x5KB+1x24KB` and `1x5KB+1x14KB` — a large class against a
|
|
49
|
+
fixed small one, in the three ratios a group length of five, three and two
|
|
50
|
+
produces.
|
|
51
|
+
- rosotacom SHA: measured at `7bb420c`; needs 2.5.dev74 or later for the fitted
|
|
52
|
+
delay table to arm.
|
|
53
|
+
- Profiles: `tilt-iid` and `tilt-iid-worse` in
|
|
54
|
+
[`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml)
|
|
55
|
+
— the 2026-08-17 drive's own delay table at 25 ms ± 18 ms with 1 % and 2 %
|
|
56
|
+
independent per-packet loss. Nothing else differs between the two links.
|
|
57
|
+
- Seed policy: netem `loss` is unseeded, `n=1` per cell; each cell offers about
|
|
58
|
+
2100 messages of which 420–1680 are of the large class, so the intervals on
|
|
59
|
+
the large-class figures are 3–5 points wide and on the per-second rates
|
|
60
|
+
correspondingly.
|
|
61
|
+
|
|
62
|
+
## Evidence
|
|
63
|
+
|
|
64
|
+
Evidence grade: per-message counts from the receiving peer's own RFC 0003
|
|
65
|
+
transit records. Lost rows carry no payload and therefore no size, so the size
|
|
66
|
+
classes are learnt from the delivered rows as the publisher's repeating pattern
|
|
67
|
+
against the sequence number, and every row — delivered or lost — is then
|
|
68
|
+
assigned by its position in that cycle. The window is taken in sequence numbers
|
|
69
|
+
(first 300, last 50 dropped).
|
|
70
|
+
|
|
71
|
+
The transfer function itself holds throughout, so the cancellation is not a
|
|
72
|
+
breakdown of the model but a consequence of it: fitting one `(p, F)` over the
|
|
73
|
+
mixed workload leaves residuals of 0.86–1.11 at p = 1 % and 0.99–1.03 at
|
|
74
|
+
p = 2 %.
|
|
75
|
+
|
|
76
|
+
Verification: manual, from a source checkout with Docker:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
for prof in tilt-iid tilt-iid-worse; do
|
|
80
|
+
for patt in 4x5KB+1x38KB 2x5KB+1x24KB 1x5KB+1x14KB; do
|
|
81
|
+
rosotacom benchmark probe \
|
|
82
|
+
--project src/rosotacom/resources/examples/rosotacom.yaml \
|
|
83
|
+
--profile "$prof" --size-pattern "$patt" --rate-hz 10 --duration 240 \
|
|
84
|
+
--repeats 1 --sudo-mode container --no-plot
|
|
85
|
+
done
|
|
86
|
+
done
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Split each run's transit rows by size class and divide the large class's losses
|
|
90
|
+
by the window in seconds. Within one link the three patterns must agree on that
|
|
91
|
+
rate to within about a quarter; between the two links it must roughly double.
|
|
92
|
+
|
|
93
|
+
## Status
|
|
94
|
+
|
|
95
|
+
confirmed, 2026-08-31.
|
|
96
|
+
|
|
97
|
+
## Publication notes
|
|
98
|
+
|
|
99
|
+
This is the bench form of a field result that reads, without it, like an
|
|
100
|
+
excuse. A campaign that shortened its group of pictures and then measured no
|
|
101
|
+
improvement in the aggregate can attribute that to the link having been worse
|
|
102
|
+
on the days that followed — which is true and unsatisfying, because it is
|
|
103
|
+
unfalsifiable from one campaign. Here the link is held still by construction
|
|
104
|
+
and the aggregate still does not move, so the cancellation is a property of the
|
|
105
|
+
lever rather than of those evenings.
|
|
106
|
+
|
|
107
|
+
Stated positively, it is the sentence that makes the design rule usable: the
|
|
108
|
+
fragment law tells you what will change and by how much, and the thing it
|
|
109
|
+
changes is not the thing an operator counts. For a video path the honest
|
|
110
|
+
formulation is that a shorter group trades hole *length* against hole *count*
|
|
111
|
+
at constant link, and pays for it in nothing — the offered bandwidth falls by
|
|
112
|
+
about a fifth at the same cadence and quality target.
|
|
113
|
+
|
|
114
|
+
The 2× row is the other half and belongs with it wherever the rule is offered
|
|
115
|
+
as advice: the term the designer does not control moved the outcome by more
|
|
116
|
+
than the term they do.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Neither A Queue Nor A Burst Tilts The Size Law
|
|
2
|
+
|
|
3
|
+
## Claim
|
|
4
|
+
|
|
5
|
+
The field fit of `1-(1-p)^N` carries a residual that is systematic in size: the
|
|
6
|
+
smallest class loses about half of what the fit predicts and the largest about
|
|
7
|
+
2.9× more, a spread of roughly six across the ladder. Three candidate causes
|
|
8
|
+
were emulated against the same measurement chain, and none of them produces it.
|
|
9
|
+
|
|
10
|
+
| | 300 B | 1.1 kB | 3.1 kB | 6.1 kB | 12.1 kB | 38.1 kB |
|
|
11
|
+
|---|---:|---:|---:|---:|---:|---:|
|
|
12
|
+
| independent per packet | 1.05 % | 1.47 % | 3.47 % | 6.28 % | 11.23 % | 31.92 % |
|
|
13
|
+
| a two-state process, same mean, 105 ms bad runs | 1.47 % | 1.76 % | 2.76 % | 5.09 % | 10.00 % | **21.98 %** |
|
|
14
|
+
| + a token bucket a burst can fill (4 Mbit/s) | 1.14 % | 1.33 % | 2.57 % | 4.99 % | 13.43 % | 32.92 % |
|
|
15
|
+
| a serialisation constraint (1.5 Mbit/s) | — | 1.62 % | — | — | 11.60 % | **97.54 %** |
|
|
16
|
+
|
|
17
|
+
- **The chain is not the cause.** Under independent per-packet loss the fitted
|
|
18
|
+
law is reproduced with residuals of 1.20, 0.85, 1.01, 1.06, 0.97 and 1.00 —
|
|
19
|
+
flat over three decades of size. Whatever tilts the field, it is not the
|
|
20
|
+
wrapper, the join, or the way the fit is taken.
|
|
21
|
+
- **Clustered loss is not the cause, and it bends the curve the other way.**
|
|
22
|
+
A two-state process at the same 1 % mean, with its chain rescaled per cell so
|
|
23
|
+
that a bad run is the same 105 ms of wall clock in every one of them, makes
|
|
24
|
+
the largest class lose **31 % less** than the independent law rather than
|
|
25
|
+
more: 21.98 % against 31.92 %, intervals 20.3–23.8 against 30.0–33.9. The
|
|
26
|
+
reason is the one that makes it a mechanism rather than a coincidence — a
|
|
27
|
+
38-packet message occupies about the length of one bad run, so its packets
|
|
28
|
+
share a fate and the message is lost once instead of thirty-eight times
|
|
29
|
+
independently. The field's residual has the opposite sign, so burstiness at
|
|
30
|
+
this scale does not explain it; it makes it harder to explain.
|
|
31
|
+
- **A burst meeting a queue is not the cause.** A token bucket at 4 Mbit/s —
|
|
32
|
+
above the largest class's mean offered rate of 3.0 Mbit/s and far below its
|
|
33
|
+
instantaneous one, so a 38-packet message meets a queue and a 1-packet
|
|
34
|
+
message does not — changes nothing systematic: 1.09, 0.90, 0.74, 0.80, 1.20,
|
|
35
|
+
1.03 against the unqueued arm. The queue defers rather than drops, which is
|
|
36
|
+
the same statement as
|
|
37
|
+
[oversubscription queues, it does not lose](oversubscription-queues-not-losses.md),
|
|
38
|
+
seen per size.
|
|
39
|
+
- **A serialisation constraint does not tilt it either — it removes the class.**
|
|
40
|
+
At 1.5 Mbit/s the one-packet message pays 10 % more than unshaped and the
|
|
41
|
+
13-packet message 3 % more, while the 38-packet message goes from 31.9 % to
|
|
42
|
+
**97.5 %**. That is not a slope, it is a threshold: below the constraint
|
|
43
|
+
nothing changes, above it the stream is gone.
|
|
44
|
+
|
|
45
|
+
The last row is worth naming for what it is *shaped* like. A link whose
|
|
46
|
+
transmission opportunities are a fraction of the wall clock presents from above
|
|
47
|
+
as exactly this — a small probe crossing unharmed while a large burst does not
|
|
48
|
+
— which is the signature an uplink moved onto a duty-cycled carrier would leave
|
|
49
|
+
in an application's own numbers. This reproduces the signature; it does not
|
|
50
|
+
demonstrate the mechanism, because a sustained rate cap and a duty cycle are
|
|
51
|
+
not the same thing and this cell is oversubscribed on the mean as well as on
|
|
52
|
+
the burst.
|
|
53
|
+
|
|
54
|
+
## Setup
|
|
55
|
+
|
|
56
|
+
- Host pair / topology: one host, the packaged local benchmark rig — two
|
|
57
|
+
communication containers on their own Docker network, `tc` inside each
|
|
58
|
+
container's own netns (`--sudo-mode container`).
|
|
59
|
+
- Session: `bench_1_1_capacity` from the packaged example project, one
|
|
60
|
+
`a->b:/bench_capacity` stream at 10 Hz, CycloneDDS, OTA QoS best_effort /
|
|
61
|
+
KEEP_LAST depth 1.
|
|
62
|
+
- rosotacom SHA: measured at `7bb420c`; needs 2.5.dev74 or later for the fitted
|
|
63
|
+
delay table to arm at all.
|
|
64
|
+
- Profiles: `tilt-iid`, `tilt-iid-queued` and `tilt-iid-tight` in
|
|
65
|
+
[`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml).
|
|
66
|
+
All three carry the 2026-08-17 drive's own delay table at 25 ms ± 18 ms and
|
|
67
|
+
1 % independent per-packet loss; they differ only in the rate cap in front of
|
|
68
|
+
it — none, 4 Mbit/s, 1.5 Mbit/s.
|
|
69
|
+
- Seed policy: netem `loss` is unseeded, `n=1` per cell, about 2100 messages
|
|
70
|
+
inside the measured window of each.
|
|
71
|
+
|
|
72
|
+
## Evidence
|
|
73
|
+
|
|
74
|
+
Evidence grade: per-message counts from the receiving peer's own RFC 0003
|
|
75
|
+
transit records, windowed in sequence numbers (first 300 and last 50 dropped)
|
|
76
|
+
so that the unshaped messages before the shaper is armed leave both the
|
|
77
|
+
delivered and the lost class at once.
|
|
78
|
+
|
|
79
|
+
The independent arm, with one `(p, F)` fitted by maximum likelihood over the
|
|
80
|
+
whole ladder (`p = 0.870 %` per packet, `F = 872 B`):
|
|
81
|
+
|
|
82
|
+
| wrapped | N | offered | lost | observed | 95 % CI | obs/pred |
|
|
83
|
+
|---:|---:|---:|---:|---:|---:|---:|
|
|
84
|
+
| 300 B | 1 | 2101 | 22 | 1.047 % | 0.69–1.58 | 1.20 |
|
|
85
|
+
| 1.1 kB | 2 | 2102 | 31 | 1.475 % | 1.04–2.09 | 0.85 |
|
|
86
|
+
| 3.1 kB | 4 | 2105 | 73 | 3.468 % | 2.77–4.34 | 1.01 |
|
|
87
|
+
| 6.1 kB | 7 | 2103 | 132 | 6.277 % | 5.32–7.40 | 1.06 |
|
|
88
|
+
| 12.1 kB | 14 | 2102 | 236 | 11.227 % | 9.95–12.65 | 0.97 |
|
|
89
|
+
| 38.1 kB | 44 | 2102 | 671 | 31.922 % | 29.96–33.95 | 1.00 |
|
|
90
|
+
|
|
91
|
+
The queued arm on the same ladder: 24, 28, 54, 105, 283 and 693 losses of about
|
|
92
|
+
2100 offered, giving the second row of the claim table. The tight arm: 34 of
|
|
93
|
+
2104, 244 of 2103, and 1826 of 1872.
|
|
94
|
+
|
|
95
|
+
**Measuring the two-state arm took two attempts, and the reason is worth
|
|
96
|
+
recording.** `netem`'s Gilbert–Elliott model advances its chain once per
|
|
97
|
+
*packet*, not once per second, so a size ladder at a fixed message rate runs the
|
|
98
|
+
chain at a different speed in every cell — 10 packets/s for a one-fragment
|
|
99
|
+
message against 380 for a 38-fragment one. The cells then do not share a loss
|
|
100
|
+
process. The arm measured that way duly reported a per-packet mean of 0.33 % in
|
|
101
|
+
its smallest cell against a stationary 1.00 %, because that cell never sampled
|
|
102
|
+
enough of the chain.
|
|
103
|
+
|
|
104
|
+
Holding the offered *packet* rate constant instead was the obvious fix and it
|
|
105
|
+
measured something else entirely: **the pipeline serves messages, not packets.**
|
|
106
|
+
At 60 messages/s the one-packet cell lost 10.774 % under the bursty profile and
|
|
107
|
+
10.626 % under the independent one, and at 380 messages/s 48.391 % and 48.430 %.
|
|
108
|
+
Two different loss processes cannot agree to three digits; what both were
|
|
109
|
+
reporting is the depth-1 OTA queue overwriting its own backlog before the link
|
|
110
|
+
sees it. That is the depth-1 overwrite of bundled publications, which the
|
|
111
|
+
operator harness's ledger records against a real drive, reached here by
|
|
112
|
+
accident and against a synthetic one.
|
|
113
|
+
|
|
114
|
+
What works is to leave the message rate at the field's 10 Hz and rescale the
|
|
115
|
+
chain: multiplying `p` and `r` by `380/(N × 10)` in each cell leaves the
|
|
116
|
+
stationary bad fraction at 3.92 % and the mean loss at 1 % while making the bad
|
|
117
|
+
run 105 ms of wall clock everywhere, which is the drive's own figure. The six
|
|
118
|
+
`bp-frag-*` profiles are that ladder.
|
|
119
|
+
|
|
120
|
+
Verification: manual, from a source checkout with Docker:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
for prof in tilt-iid tilt-iid-queued; do
|
|
124
|
+
for size in 200 1000 3000 6000 12000 38000; do
|
|
125
|
+
rosotacom benchmark probe \
|
|
126
|
+
--project src/rosotacom/resources/examples/rosotacom.yaml \
|
|
127
|
+
--profile "$prof" --size "$size" --rate-hz 10 --duration 240 \
|
|
128
|
+
--repeats 1 --sudo-mode container --no-plot
|
|
129
|
+
done
|
|
130
|
+
done
|
|
131
|
+
rosotacom benchmark probe --project src/rosotacom/resources/examples/rosotacom.yaml \
|
|
132
|
+
--profile tilt-iid-tight --size 38000 --rate-hz 10 --duration 240 \
|
|
133
|
+
--repeats 1 --sudo-mode container --no-plot
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
for pair in 200:one 1000:two 3000:four 6000:six 12000:twelve 38000:thirtyeight; do
|
|
138
|
+
rosotacom benchmark probe \
|
|
139
|
+
--project src/rosotacom/resources/examples/rosotacom.yaml \
|
|
140
|
+
--profile "bp-frag-${pair##*:}" --size "${pair%%:*}" --rate-hz 10 \
|
|
141
|
+
--duration 240 --repeats 1 --sudo-mode container --no-plot
|
|
142
|
+
done
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The independent ladder must fit one `(p, F)` to within about ten per cent at
|
|
146
|
+
every point; the queued ladder must not differ from it systematically; the
|
|
147
|
+
rescaled two-state ladder must fall below it at the large end and not above; and
|
|
148
|
+
the tight cell at 38 kB must be near-total loss while its 1 kB cell is not.
|
|
149
|
+
|
|
150
|
+
## Status
|
|
151
|
+
|
|
152
|
+
confirmed, 2026-08-31.
|
|
153
|
+
|
|
154
|
+
## Publication notes
|
|
155
|
+
|
|
156
|
+
This is a set of negative results and the negative is the point: a residual
|
|
157
|
+
that survives three plausible explanations is worth more than one that has not
|
|
158
|
+
been attacked. What it licenses is a narrower claim than "we do not know why" —
|
|
159
|
+
the tilt is not an artefact of the accounting, it is not what a queue does to a
|
|
160
|
+
burst, and it is not a serialisation limit, because a serialisation limit does
|
|
161
|
+
not tilt a curve, it truncates it.
|
|
162
|
+
|
|
163
|
+
The clustered arm is the one that changes the reading rather than confirming
|
|
164
|
+
it. A reviewer's first guess for a size-systematic residual is burstiness, and
|
|
165
|
+
burstiness at the drive's own time scale produces the **opposite sign**: it
|
|
166
|
+
protects large messages, because a message long enough to span a bad run is lost
|
|
167
|
+
once rather than in each of its packets. So the field's residual is not
|
|
168
|
+
explained by the mechanism that the field's own two-layer model already
|
|
169
|
+
contains, which is worth saying out loud.
|
|
170
|
+
|
|
171
|
+
What is left to attack is correlation at a scale *shorter* than a large
|
|
172
|
+
message's own time on the wire — short enough that a message straddles a loss
|
|
173
|
+
event more often than a single packet does, without its packets sharing one.
|
|
174
|
+
`netem` cannot express that at all: its chain advances per packet, so a run is
|
|
175
|
+
always measured in packets rather than in milliseconds, and the two coincide
|
|
176
|
+
only at one message size.
|
|
177
|
+
|
|
178
|
+
The serialisation row deserves one sentence wherever a duty-cycled uplink is
|
|
179
|
+
discussed. It shows that the observable signature of such a link — small
|
|
180
|
+
messages unaffected, large messages gone, round-trip time unchanged — is
|
|
181
|
+
reproducible from a rate constraint alone, which means the signature on its own
|
|
182
|
+
does not identify the mechanism.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# The Size Law Belongs To The Transport, Not To The Link
|
|
2
|
+
|
|
3
|
+
## Claim
|
|
4
|
+
|
|
5
|
+
On one emulated link, with the impairment held byte-identical and only the OTA
|
|
6
|
+
middleware changed, message loss against message size takes three different
|
|
7
|
+
shapes:
|
|
8
|
+
|
|
9
|
+
| wrapped size | fragments | CycloneDDS | Fast DDS | zenoh native |
|
|
10
|
+
|---:|---:|---:|---:|---:|
|
|
11
|
+
| 300 B | 1 | 1.05 % | 1.05 % | 0.57 % |
|
|
12
|
+
| 1.1 kB | 2 | 1.47 % | 1.14 % | 1.00 % |
|
|
13
|
+
| 3.1 kB | 4 | 3.47 % | 3.80 % | 0.71 % |
|
|
14
|
+
| 6.1 kB | 7 | 6.28 % | 4.81 % | 1.00 % |
|
|
15
|
+
| 12.1 kB | 13 | 11.23 % | 8.74 % | **0.47 %** |
|
|
16
|
+
| 38.1 kB | 38 | 31.92 % | 39.25 % | **61.69 %** |
|
|
17
|
+
|
|
18
|
+
**CycloneDDS follows `1-(1-p)^N` and nothing else.** Fitting one per-packet
|
|
19
|
+
rate and one effective packet size over the whole ladder leaves residuals of
|
|
20
|
+
1.20, 0.85, 1.01, 1.06, 0.97 and 1.00 — flat across three decades of size and
|
|
21
|
+
a factor of 44 in packet count, with no trend.
|
|
22
|
+
|
|
23
|
+
**Fast DDS keeps the form and loses the fit.** It carries no RTPS fragment size
|
|
24
|
+
at all, so the effective packet is the datagram; one `(p, F)` describes the
|
|
25
|
+
ladder to within 0.71–1.14, and the misfit is systematic rather than noise
|
|
26
|
+
(at 12 kB the Wilson interval is 7.61–10.02 % against a predicted 12.32 %).
|
|
27
|
+
|
|
28
|
+
**zenoh does not obey the law.** Its loss is flat at 0.5–1.0 % from 300 B to
|
|
29
|
+
12 kB — a 13-packet message loses what a 1-packet message loses, which is what
|
|
30
|
+
a transport that repairs its own losses looks like — and then falls off a cliff
|
|
31
|
+
to 61.7 % at 38 kB, where the offered rate leaves the regime the repair can
|
|
32
|
+
carry.
|
|
33
|
+
|
|
34
|
+
So the transfer function this project reports from the field is not a property
|
|
35
|
+
of the link. It is what a **best-effort, fragmenting, unrepaired** transport
|
|
36
|
+
does to a link, and the same link answers a repairing transport completely
|
|
37
|
+
differently. Any design rule of the form *a stream's availability follows from
|
|
38
|
+
its largest message class* carries that scope with it.
|
|
39
|
+
|
|
40
|
+
## Setup
|
|
41
|
+
|
|
42
|
+
- Host pair / topology: one host, the packaged local benchmark rig — two
|
|
43
|
+
communication containers on their own Docker network, `tc` inside each
|
|
44
|
+
container's own netns (`--sudo-mode container`), no host privileges.
|
|
45
|
+
- Session: `bench_1_1_capacity` from the packaged example project, one
|
|
46
|
+
`a->b:/bench_capacity` stream at 10 Hz, OTA QoS best_effort / KEEP_LAST
|
|
47
|
+
depth 1, `--rmw` the only thing that differs between the three ladders.
|
|
48
|
+
- rosotacom SHA: measured at `7bb420c`; re-runs record theirs. The runs need
|
|
49
|
+
2.5.dev74 or later, because before it a profile carrying a fitted delay table
|
|
50
|
+
could not be armed at all
|
|
51
|
+
([a fitted delay table never reached the shaper](a-fitted-delay-table-never-reached-the-shaper.md)).
|
|
52
|
+
- Profile: `tilt-iid` in
|
|
53
|
+
[`src/rosotacom/resources/examples/profiles.yaml`](../../src/rosotacom/resources/examples/profiles.yaml)
|
|
54
|
+
— the 2026-08-17 drive's own delay table at 25 ms ± 18 ms, with independent
|
|
55
|
+
per-packet loss raised to 1 % so that a 240 s run resolves the one-packet
|
|
56
|
+
cell. The *form* of the law is under test, and it does not depend on the
|
|
57
|
+
level.
|
|
58
|
+
- Seed policy: netem `loss` is unseeded; each cell offers about 2100 messages
|
|
59
|
+
inside the measured window, so the Wilson intervals in the table below carry
|
|
60
|
+
the run-to-run spread. `n=1` per cell.
|
|
61
|
+
|
|
62
|
+
## Evidence
|
|
63
|
+
|
|
64
|
+
Evidence grade: per-message counts read from the **receiving** peer's own RFC
|
|
65
|
+
0003 transit records, not from the runner's summary — a summary over rows from
|
|
66
|
+
two observers is exactly what has been wrong in this harness before
|
|
67
|
+
([sender rows](sender-rows-make-a-dead-link-look-loss-free.md)). The window is
|
|
68
|
+
taken in sequence numbers (first 300, last 50 dropped), because a lost row
|
|
69
|
+
carries no timestamp of its own and the shaper is armed after discovery.
|
|
70
|
+
|
|
71
|
+
CycloneDDS, one `(p, F)` fitted by maximum likelihood over the whole ladder —
|
|
72
|
+
`p = 0.870 %` per packet, `F = 1008–872 B` against a declared 1024 B fragment,
|
|
73
|
+
the difference being the per-packet header the fragment size does not count:
|
|
74
|
+
|
|
75
|
+
| wrapped | N | offered | lost | observed | 95 % CI | predicted | obs/pred |
|
|
76
|
+
|---:|---:|---:|---:|---:|---:|---:|---:|
|
|
77
|
+
| 300 B | 1 | 2101 | 22 | 1.047 % | 0.69–1.58 | 0.870 % | 1.20 |
|
|
78
|
+
| 1.1 kB | 2 | 2102 | 31 | 1.475 % | 1.04–2.09 | 1.733 % | 0.85 |
|
|
79
|
+
| 3.1 kB | 4 | 2105 | 73 | 3.468 % | 2.77–4.34 | 3.435 % | 1.01 |
|
|
80
|
+
| 6.1 kB | 7 | 2103 | 132 | 6.277 % | 5.32–7.40 | 5.934 % | 1.06 |
|
|
81
|
+
| 12.1 kB | 14 | 2102 | 236 | 11.227 % | 9.95–12.65 | 11.515 % | 0.97 |
|
|
82
|
+
| 38.1 kB | 44 | 2102 | 671 | 31.922 % | 29.96–33.95 | 31.921 % | 1.00 |
|
|
83
|
+
|
|
84
|
+
Fast DDS on the identical profile, `p = 1.306 %`, `F = 1224 B`: 0.80, 0.87,
|
|
85
|
+
0.98, 0.76, **0.71**, **1.14**. The two ends of the ladder sit on opposite
|
|
86
|
+
sides of the fit and their intervals exclude it, so a single effective packet
|
|
87
|
+
size does not describe this stack.
|
|
88
|
+
|
|
89
|
+
zenoh native on the identical profile: 0.571, 0.998, 0.712, 0.996, 0.475,
|
|
90
|
+
**61.693 %**. No fit is reported because there is nothing of this family to
|
|
91
|
+
fit — five points are flat and the sixth is a cliff.
|
|
92
|
+
|
|
93
|
+
**The effective packet is smaller than the fragment, and by a measurable
|
|
94
|
+
amount.** CycloneDDS's fitted `F` lands at 872–1008 B against a configured
|
|
95
|
+
1024 B fragment, i.e. every packet carries roughly 15 % of itself in headers.
|
|
96
|
+
That is the same quantity as the wire-to-payload ratio measured on the tunnel
|
|
97
|
+
(1.13–1.17×), reached from the opposite direction: one from counting bytes on
|
|
98
|
+
an interface, one from fitting a loss curve.
|
|
99
|
+
|
|
100
|
+
Verification: manual, and it needs a source checkout with Docker:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
for size in 200 1000 3000 6000 12000 38000; do
|
|
104
|
+
for rmw in cyclone fastdds zenoh; do
|
|
105
|
+
rosotacom benchmark probe \
|
|
106
|
+
--project src/rosotacom/resources/examples/rosotacom.yaml \
|
|
107
|
+
--profile tilt-iid --size "$size" --rate-hz 10 --duration 240 \
|
|
108
|
+
--repeats 1 --rmw "$rmw" --sudo-mode container --no-plot
|
|
109
|
+
done
|
|
110
|
+
done
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Read the per-size counts from `logs/b/status/events.jsonl` of each instance
|
|
114
|
+
(`kind: transit`, `status` delivered or lost, `size_bytes` on the delivered
|
|
115
|
+
rows) rather than from `result.json`. The CycloneDDS ladder must fit one
|
|
116
|
+
`(p, F)` to within about ten per cent at every point; the zenoh ladder must be
|
|
117
|
+
flat below 12 kB.
|
|
118
|
+
|
|
119
|
+
## Status
|
|
120
|
+
|
|
121
|
+
confirmed, 2026-08-31.
|
|
122
|
+
|
|
123
|
+
## Publication notes
|
|
124
|
+
|
|
125
|
+
The useful sentence is the scope one. `1-(1-p)^N` is textbook and the field fit
|
|
126
|
+
of it is a real result, but reporting it without naming the transport invites
|
|
127
|
+
the reading that it describes the *link*. It does not: on one link, at one
|
|
128
|
+
impairment, three transports produce a clean power law, a distorted one, and no
|
|
129
|
+
law at all. A paper that quotes a per-fragment rate should therefore quote the
|
|
130
|
+
middleware and its QoS beside it, and a design rule derived from the law should
|
|
131
|
+
say that it holds for a best-effort path that fragments and does not repair.
|
|
132
|
+
|
|
133
|
+
Two smaller points travel with it. The **effective packet is not the fragment**:
|
|
134
|
+
the fitted size falls about 15 % below the configured one, which is the header
|
|
135
|
+
share, and it is the same 15 % an interface counter reports as wire-over-payload
|
|
136
|
+
— so a fragment budget computed from the configured size understates exposure
|
|
137
|
+
by that much. And zenoh's shape is the more interesting half of the comparison
|
|
138
|
+
rather than a footnote: a transport that repairs turns a size-dependent
|
|
139
|
+
availability problem into a capacity cliff, which is a different failure to
|
|
140
|
+
design against, not a smaller one.
|
{rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom/resources/examples/profiles.yaml
RENAMED
|
@@ -169,3 +169,150 @@ profiles:
|
|
|
169
169
|
# camera stream - a source-side case. Deliberately unshaped: play the case
|
|
170
170
|
# bag with `--profile none` to see that the link is not the cause.
|
|
171
171
|
field-20260817-case6-source-gap: {}
|
|
172
|
+
|
|
173
|
+
# ---- fragment-law tilt (B1): three loss processes, one delay model -------
|
|
174
|
+
# The field fit says message loss follows 1-(1-p)^ceil(size/F) and the field
|
|
175
|
+
# residual is systematic in size: the smallest class loses about half of what
|
|
176
|
+
# the fit predicts and the largest about 2.9x more. The campaign cannot
|
|
177
|
+
# separate an accounting artefact from a property of the link. These three
|
|
178
|
+
# can: the delay model is the drive's own table in all of them, and the only
|
|
179
|
+
# thing that moves is how the loss is distributed over packets.
|
|
180
|
+
#
|
|
181
|
+
# The rate is raised to ~1% per packet in every arm so a 240 s run at 10 Hz
|
|
182
|
+
# resolves the small end; the law's *form* is what is under test, and it does
|
|
183
|
+
# not depend on the level.
|
|
184
|
+
|
|
185
|
+
# A -- independent per packet. The law is exact by construction here, so this
|
|
186
|
+
# arm measures the measurement chain and nothing else.
|
|
187
|
+
tilt-iid:
|
|
188
|
+
uplink:
|
|
189
|
+
delay: 25ms
|
|
190
|
+
jitter: 18ms
|
|
191
|
+
distribution: field-20260817
|
|
192
|
+
distribution_file: dist/field-20260817.dist
|
|
193
|
+
loss: 1%
|
|
194
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
195
|
+
|
|
196
|
+
# B -- the drive's own two-state process, scaled to the same mean. Clustering
|
|
197
|
+
# correlates the fragments of one message, so large messages should lose
|
|
198
|
+
# *less* than the independent law predicts -- the opposite sign to the field.
|
|
199
|
+
# p and r are the drive's, so the runs and gaps keep their measured lengths.
|
|
200
|
+
tilt-bursty:
|
|
201
|
+
uplink:
|
|
202
|
+
delay: 25ms
|
|
203
|
+
jitter: 18ms
|
|
204
|
+
distribution: field-20260817
|
|
205
|
+
distribution_file: dist/field-20260817.dist
|
|
206
|
+
loss_gemodel: { p: 0.102%, r: 2.5%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
207
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
208
|
+
|
|
209
|
+
# C -- A plus a queue a burst can fill. 4 Mbit/s is above the largest class's
|
|
210
|
+
# mean offered rate (38 kB at 10 Hz is ~3.0 Mbit/s of payload) and below its
|
|
211
|
+
# instantaneous one, so a 38-fragment message meets a queue and a 1-fragment
|
|
212
|
+
# message does not. That is the burst-tilt candidate, isolated.
|
|
213
|
+
tilt-iid-queued:
|
|
214
|
+
uplink:
|
|
215
|
+
rate: 4mbit
|
|
216
|
+
delay: 25ms
|
|
217
|
+
jitter: 18ms
|
|
218
|
+
distribution: field-20260817
|
|
219
|
+
distribution_file: dist/field-20260817.dist
|
|
220
|
+
loss: 1%
|
|
221
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
222
|
+
|
|
223
|
+
# B2 -- the boundary of the design rule. Same delay model, two per-fragment
|
|
224
|
+
# rates: the one the rule is applied at, and one twice as bad. The rule says
|
|
225
|
+
# what the size distribution does; it does not say what the link will be.
|
|
226
|
+
tilt-iid-worse:
|
|
227
|
+
uplink:
|
|
228
|
+
delay: 25ms
|
|
229
|
+
jitter: 18ms
|
|
230
|
+
distribution: field-20260817
|
|
231
|
+
distribution_file: dist/field-20260817.dist
|
|
232
|
+
loss: 2%
|
|
233
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
234
|
+
|
|
235
|
+
# B4 -- a serialisation constraint tight enough that a burst cannot fit in
|
|
236
|
+
# its own send interval, which is the shape an EN-DC uplink on a TDD carrier
|
|
237
|
+
# would present from above: a small probe survives what a 38-fragment burst
|
|
238
|
+
# does not.
|
|
239
|
+
tilt-iid-tight:
|
|
240
|
+
uplink:
|
|
241
|
+
rate: 1.5mbit
|
|
242
|
+
delay: 25ms
|
|
243
|
+
jitter: 18ms
|
|
244
|
+
distribution: field-20260817
|
|
245
|
+
distribution_file: dist/field-20260817.dist
|
|
246
|
+
loss: 1%
|
|
247
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
248
|
+
|
|
249
|
+
# B1-prime -- the two-state process with its chain rescaled per cell.
|
|
250
|
+
#
|
|
251
|
+
# netem advances a Gilbert-Elliott chain once per *packet*, so the fitted p
|
|
252
|
+
# and r describe a process in packets and not in time. At the drive's own
|
|
253
|
+
# 380 fragments/s they mean a bad run of about 105 ms; on a size ladder at a
|
|
254
|
+
# fixed 10 Hz the packet rate is N x 10, so the same p and r stretch the bad
|
|
255
|
+
# run by 380/(N x 10) and every cell meets a different link. Forcing the
|
|
256
|
+
# packet rate constant instead was tried and measured the wrong thing: the
|
|
257
|
+
# pipeline serves messages, not packets, and at 60 messages/s the depth-1 OTA
|
|
258
|
+
# queue overwrites its own backlog -- both loss processes then reported
|
|
259
|
+
# 10.7 % to two digits.
|
|
260
|
+
#
|
|
261
|
+
# So the chain is rescaled instead: p and r are multiplied by 380/(N x 10) in
|
|
262
|
+
# each cell, which leaves the stationary bad fraction at 3.92 % and the mean
|
|
263
|
+
# loss at 1 % while making the bad run 105 ms of wall clock everywhere. The
|
|
264
|
+
# comparison against `tilt-iid` is then a comparison of one thing.
|
|
265
|
+
|
|
266
|
+
bp-frag-one:
|
|
267
|
+
uplink:
|
|
268
|
+
delay: 25ms
|
|
269
|
+
jitter: 18ms
|
|
270
|
+
distribution: field-20260817
|
|
271
|
+
distribution_file: dist/field-20260817.dist
|
|
272
|
+
loss_gemodel: { p: 3.876%, r: 95%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
273
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
274
|
+
|
|
275
|
+
bp-frag-two:
|
|
276
|
+
uplink:
|
|
277
|
+
delay: 25ms
|
|
278
|
+
jitter: 18ms
|
|
279
|
+
distribution: field-20260817
|
|
280
|
+
distribution_file: dist/field-20260817.dist
|
|
281
|
+
loss_gemodel: { p: 1.938%, r: 47.5%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
282
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
283
|
+
|
|
284
|
+
bp-frag-four:
|
|
285
|
+
uplink:
|
|
286
|
+
delay: 25ms
|
|
287
|
+
jitter: 18ms
|
|
288
|
+
distribution: field-20260817
|
|
289
|
+
distribution_file: dist/field-20260817.dist
|
|
290
|
+
loss_gemodel: { p: 0.969%, r: 23.75%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
291
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
292
|
+
|
|
293
|
+
bp-frag-six:
|
|
294
|
+
uplink:
|
|
295
|
+
delay: 25ms
|
|
296
|
+
jitter: 18ms
|
|
297
|
+
distribution: field-20260817
|
|
298
|
+
distribution_file: dist/field-20260817.dist
|
|
299
|
+
loss_gemodel: { p: 0.646%, r: 15.83%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
300
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
301
|
+
|
|
302
|
+
bp-frag-twelve:
|
|
303
|
+
uplink:
|
|
304
|
+
delay: 25ms
|
|
305
|
+
jitter: 18ms
|
|
306
|
+
distribution: field-20260817
|
|
307
|
+
distribution_file: dist/field-20260817.dist
|
|
308
|
+
loss_gemodel: { p: 0.323%, r: 7.917%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
309
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
310
|
+
|
|
311
|
+
bp-frag-thirtyeight:
|
|
312
|
+
uplink:
|
|
313
|
+
delay: 25ms
|
|
314
|
+
jitter: 18ms
|
|
315
|
+
distribution: field-20260817
|
|
316
|
+
distribution_file: dist/field-20260817.dist
|
|
317
|
+
loss_gemodel: { p: 0.102%, r: 2.5%, loss_bad: 13.5%, loss_good: 0.49% }
|
|
318
|
+
downlink: { delay: 7ms, jitter: 5ms }
|
|
@@ -63,6 +63,7 @@ docs/testing.md
|
|
|
63
63
|
docs/work-items.md
|
|
64
64
|
docs/findings/README.md
|
|
65
65
|
docs/findings/a-fitted-delay-table-never-reached-the-shaper.md
|
|
66
|
+
docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md
|
|
66
67
|
docs/findings/a-transport-element-doubles-every-fastdds-sample.md
|
|
67
68
|
docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md
|
|
68
69
|
docs/findings/cyclone-spdp-discovery-bursts.md
|
|
@@ -74,10 +75,12 @@ docs/findings/jitter-loss-bandwidth-latency.md
|
|
|
74
75
|
docs/findings/keyframe-loss-kills-the-next-deltas.md
|
|
75
76
|
docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md
|
|
76
77
|
docs/findings/lighter-message-loss.md
|
|
78
|
+
docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md
|
|
77
79
|
docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md
|
|
78
80
|
docs/findings/oversubscription-queues-not-losses.md
|
|
79
81
|
docs/findings/reorder-becomes-reader-loss.md
|
|
80
82
|
docs/findings/sender-rows-make-a-dead-link-look-loss-free.md
|
|
83
|
+
docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md
|
|
81
84
|
docs/findings/zero-loss-boundaries-18kb-20hz.md
|
|
82
85
|
docs/findings/repro/decode_chain_repro.py
|
|
83
86
|
docs/findings/repro/reorder_drop_repro.py
|
{rosotacom_dev-2.5.dev75 → rosotacom_dev-2.5.dev77}/src/rosotacom_dev.egg-info/scm_file_list.json
RENAMED
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"docs/ffmpeg-keyframes.md",
|
|
48
48
|
"docs/findings/README.md",
|
|
49
49
|
"docs/findings/a-fitted-delay-table-never-reached-the-shaper.md",
|
|
50
|
+
"docs/findings/a-shorter-group-does-not-lose-fewer-key-frames.md",
|
|
50
51
|
"docs/findings/a-transport-element-doubles-every-fastdds-sample.md",
|
|
51
52
|
"docs/findings/cyclone-fragment-equal-to-max-drops-fragmented-samples.md",
|
|
52
53
|
"docs/findings/cyclone-spdp-discovery-bursts.md",
|
|
@@ -58,12 +59,14 @@
|
|
|
58
59
|
"docs/findings/keyframe-loss-kills-the-next-deltas.md",
|
|
59
60
|
"docs/findings/lifespan-is-enforced-by-one-reader-and-not-the-other.md",
|
|
60
61
|
"docs/findings/lighter-message-loss.md",
|
|
62
|
+
"docs/findings/neither-a-queue-nor-a-burst-tilts-the-size-law.md",
|
|
61
63
|
"docs/findings/one-domain-two-cyclone-configs-stop-interoperating.md",
|
|
62
64
|
"docs/findings/oversubscription-queues-not-losses.md",
|
|
63
65
|
"docs/findings/reorder-becomes-reader-loss.md",
|
|
64
66
|
"docs/findings/repro/decode_chain_repro.py",
|
|
65
67
|
"docs/findings/repro/reorder_drop_repro.py",
|
|
66
68
|
"docs/findings/sender-rows-make-a-dead-link-look-loss-free.md",
|
|
69
|
+
"docs/findings/the-size-law-belongs-to-the-transport-not-the-link.md",
|
|
67
70
|
"docs/findings/zero-loss-boundaries-18kb-20hz.md",
|
|
68
71
|
"docs/forensics-report.md",
|
|
69
72
|
"docs/geo-link-map.md",
|