devagent-physical-engine 1.6.1__tar.gz → 1.7.0__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.
- {devagent_physical_engine-1.6.1/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.7.0}/PKG-INFO +84 -13
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/README.md +82 -11
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/pyproject.toml +7 -4
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/__init__.py +5 -1
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +51 -0
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/industrial_motion_v170.py +144 -0
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +291 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +40 -4
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +394 -0
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +553 -0
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +192 -0
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +116 -0
- devagent_physical_engine-1.7.0/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +39 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0/src/devagent_physical_engine.egg-info}/PKG-INFO +84 -13
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +10 -0
- devagent_physical_engine-1.7.0/tests/test_industrial_motion_v170.py +124 -0
- devagent_physical_engine-1.7.0/tests/test_smooth_motion_hotfix_v162.py +81 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/NOTICE +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/setup.cfg +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial_cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/evidence_replay.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/evidence_trust.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/one_command.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/one_command_runtime.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/one_command_v15.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/one_command_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/production_authority.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/production_grade.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_criterion.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/report_test_execution.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/selective_verification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/twin_codec.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/user_cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/user_cli_v15.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/user_cli_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_commercial_intelligence_v15.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_evidence_replay_v12.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_evidence_trust_coverage_v12.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_evidence_trust_transport_v12.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_evidence_trust_v12.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_evidence_viewer_palette_v130.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_golden_abb_showcase.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_one_command_hardening_v13.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_one_command_pose_hardening_v15.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_one_command_regression_v141.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_one_command_v13.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_production_authority_v11.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_production_grade_coverage_v11.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_production_grade_v11.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_provider_criterion_v15.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_report_test_contract_coverage_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_report_test_lineage_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_report_test_visual_execution_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_selective_verification_v14.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_user_cli_interactive_v131.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_user_cli_progress_v131.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_user_cli_report_visual_v16.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_user_cli_selective_v14.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_user_cli_v15.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-1.6.1 → devagent_physical_engine-1.7.0}/tests/test_workpiece_lifecycle_v011.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-physical-engine
|
|
3
|
-
Version: 1.
|
|
4
|
-
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, validated requirement mapping, report-test Gazebo
|
|
3
|
+
Version: 1.7.0
|
|
4
|
+
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, validated requirement mapping, industrial Pilz PTP/LIN report-test Gazebo execution, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
License: All Rights Reserved
|
|
7
7
|
Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
|
|
8
8
|
Project-URL: Repository, https://github.com/tomha85/devagent-physical-engine
|
|
9
9
|
Project-URL: Issues, https://github.com/tomha85/devagent-physical-engine/issues
|
|
10
|
-
Keywords: robotics,industrial-automation,agentic-ai,ros2,gazebo,verification,selective-testing,digital-twin,fat-testing,regression,evidence,replay
|
|
10
|
+
Keywords: robotics,industrial-automation,agentic-ai,ros2,gazebo,moveit,pilz,verification,selective-testing,digital-twin,fat-testing,regression,evidence,replay
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
@@ -82,7 +82,7 @@ DevAgent is designed to answer: **What can be proven about this cell, what faile
|
|
|
82
82
|
Python 3.11+ is required.
|
|
83
83
|
|
|
84
84
|
```bash
|
|
85
|
-
python -m pip install --upgrade devagent-physical-engine==1.
|
|
85
|
+
python -m pip install --upgrade devagent-physical-engine==1.7.0
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
Verify the installed package:
|
|
@@ -94,7 +94,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
94
94
|
Expected:
|
|
95
95
|
|
|
96
96
|
```text
|
|
97
|
-
1.
|
|
97
|
+
1.7.0
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
Run the normal customer workflow:
|
|
@@ -217,9 +217,77 @@ attached workpiece ↔ conveyor_a support surface
|
|
|
217
217
|
|
|
218
218
|
That allowance is scoped to lift departure only. Transfer/place keep normal collision checking, no global PlanningScene collision policy is disabled, and the live ACM is never replaced by a sparse two-object matrix.
|
|
219
219
|
|
|
220
|
+
## v1.6.2 smooth visual motion hotfix
|
|
221
|
+
|
|
222
|
+
v1.6.2 makes the packaged UR5e visual task deliberately slower and easier to inspect. The task-specific MoveIt planner defaults are reduced from 25% velocity / 25% acceleration to:
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
velocity scale: 12%
|
|
226
|
+
acceleration scale: 8%
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
This is real trajectory time parameterization through MoveIt and `FollowJointTrajectory`; DevAgent does not fake smoothness with teleports or sleeps. Explicit planner scales remain authoritative. Collision checks, endpoint tolerances, tracking tolerances, Twin lineage, and real-execution authority are unchanged.
|
|
230
|
+
|
|
231
|
+
The joint-state recorder also rejects duplicate/backward ROS source timestamps before trajectory interpolation while recording the number of dropped samples. This removes the false `trajectory_tracking_time_not_increasing` failure caused by duplicate Gazebo/ros2_control JointState stamps without manufacturing synthetic timestamps.
|
|
232
|
+
|
|
233
|
+
Because the visual trajectory now executes more slowly, cycle-time requirements are evaluated against the actual slower simulation execution. DevAgent does not normalize the observed duration back to a faster value or claim performance that was not executed.
|
|
234
|
+
|
|
235
|
+
## v1.7 industrial smooth motion execution
|
|
236
|
+
|
|
237
|
+
v1.7 replaces the packaged report-test stop/go joint-phase presentation with a bounded industrial motion sequence planned by the running MoveIt **Pilz Industrial Motion Planner**. DevAgent does not stitch trajectories by hand and does not manufacture interpolation points.
|
|
238
|
+
|
|
239
|
+
The qualified UR5e load sequence is grouped as:
|
|
240
|
+
|
|
241
|
+
```text
|
|
242
|
+
HOME
|
|
243
|
+
↓ PTP
|
|
244
|
+
PRE_PICK
|
|
245
|
+
↓ LIN
|
|
246
|
+
PICK
|
|
247
|
+
↓ grasp / hard boundary
|
|
248
|
+
LIFT
|
|
249
|
+
↓ LIN support departure / hard boundary
|
|
250
|
+
TRANSFER
|
|
251
|
+
↓ PTP with safe internal blend
|
|
252
|
+
PLACE
|
|
253
|
+
↓ LIN / release hard boundary
|
|
254
|
+
RETRACT
|
|
255
|
+
↓ LIN with safe internal blend
|
|
256
|
+
HOME
|
|
257
|
+
↓ PTP
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Execution groups are intentionally bounded:
|
|
261
|
+
|
|
262
|
+
```text
|
|
263
|
+
approach_pick PTP → LIN
|
|
264
|
+
lift_departure LIN
|
|
265
|
+
transfer_place PTP → LIN
|
|
266
|
+
retreat_home LIN → PTP
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Compatible motion inside a group can use a small Pilz blend radius. DevAgent never blends through grasp, the support-contact departure boundary, or release. The simulation profile is deliberately conservative:
|
|
270
|
+
|
|
271
|
+
```text
|
|
272
|
+
PTP velocity scale: 10%
|
|
273
|
+
PTP acceleration scale: 6%
|
|
274
|
+
LIN velocity scale: 6%
|
|
275
|
+
LIN acceleration scale: 4%
|
|
276
|
+
safe blend radius: 12 mm
|
|
277
|
+
workpiece follow target: 60 Hz
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
`LIN` means the Pilz planner owns a Cartesian linear tool path; `PTP` remains collision-aware point-to-point planning. MoveIt/Pilz owns geometry, timestamps, velocity/acceleration time parameterization, collision checking, and the returned blended `RobotTrajectory`.
|
|
281
|
+
|
|
282
|
+
The source-support exception is also bounded at runtime. During `lift_departure`, DevAgent snapshots the complete live MoveIt Allowed Collision Matrix, enables exactly the attached-workpiece ↔ source-support pair, verifies read-back, executes the lift, restores the exact original matrix, and verifies the restoration before transfer is allowed to continue. No global collision disable is used.
|
|
283
|
+
|
|
284
|
+
Slower industrial execution is real execution time in simulation, not cosmetic playback. Therefore cycle-time requirements are evaluated against the actual measured slower trajectory.
|
|
285
|
+
|
|
286
|
+
The v1.7 hosted qualification proves deterministic software contracts and fail-closed routing. Graphical ROS 2 Jazzy + Gazebo Harmonic + MoveIt/Pilz target-stack acceptance still has to run on the intended workstation; hosted Python CI does not pretend to execute that graphical stack.
|
|
287
|
+
|
|
220
288
|
## Exact lineage hardening
|
|
221
289
|
|
|
222
|
-
A case ID such as `case-0001` is local to its verification plan. v1.6 therefore requires the complete lineage:
|
|
290
|
+
A case ID such as `case-0001` is local to its verification plan. v1.6+ therefore requires the complete lineage:
|
|
223
291
|
|
|
224
292
|
```text
|
|
225
293
|
Requirement
|
|
@@ -434,7 +502,7 @@ Gazebo Harmonic
|
|
|
434
502
|
gz_ros2_control
|
|
435
503
|
Universal Robots ROS 2 driver
|
|
436
504
|
ur_simulation_gz
|
|
437
|
-
MoveIt 2
|
|
505
|
+
MoveIt 2 + Pilz Industrial Motion Planner
|
|
438
506
|
```
|
|
439
507
|
|
|
440
508
|
Preview setup:
|
|
@@ -455,7 +523,7 @@ Check runtime:
|
|
|
455
523
|
devagent-physical ros doctor
|
|
456
524
|
```
|
|
457
525
|
|
|
458
|
-
Hosted Python CI validates software contracts and deterministic execution boundaries. It does not by itself prove a graphical Gazebo runtime, `move_group`, TF, controller actions, OEM drivers, or an arbitrary customer cell. Physical target-stack qualification must run on the intended workstation/adapter stack.
|
|
526
|
+
Hosted Python CI validates software contracts and deterministic execution boundaries. It does not by itself prove a graphical Gazebo runtime, `move_group`, `/sequence_move_group`, TF, controller actions, OEM drivers, or an arbitrary customer cell. Physical target-stack qualification must run on the intended workstation/adapter stack.
|
|
459
527
|
|
|
460
528
|
---
|
|
461
529
|
|
|
@@ -512,9 +580,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
512
580
|
|
|
513
581
|
# Project status
|
|
514
582
|
|
|
515
|
-
**v1.
|
|
583
|
+
**v1.7.0 — Production/Stable software workflow**
|
|
516
584
|
|
|
517
|
-
v1.
|
|
585
|
+
v1.7.0 adds industrial smooth report-test execution for the qualified UR5e load profile using MoveIt Pilz `PTP` and `LIN` commands, bounded internal blend radii, conservative real simulation speed/acceleration, a 60 Hz workpiece-follow target, and an exact live-ACM support-contact lease scoped only to lift departure. It retains exact-Twin report execution, immutable Requirement→Mapping→Verification Plan→Case lineage, typed simulation measurements, deterministic verdicts, and fail-closed authority boundaries.
|
|
518
586
|
|
|
519
587
|
Production-oriented software capabilities include:
|
|
520
588
|
|
|
@@ -527,6 +595,9 @@ requirement-driven nominal / boundary / fault case generation
|
|
|
527
595
|
immutable project/Twin lineage
|
|
528
596
|
exact Requirement → Case provenance
|
|
529
597
|
qualified report-test visual execution contract
|
|
598
|
+
industrial Pilz PTP / LIN task planning
|
|
599
|
+
bounded safe trajectory blending
|
|
600
|
+
lift-only support-contact ACM lease + exact restore
|
|
530
601
|
Gazebo/MoveIt selected-case visualization
|
|
531
602
|
typed physical measurement binding
|
|
532
603
|
deterministic full campaigns
|
|
@@ -542,9 +613,9 @@ change impact + regression
|
|
|
542
613
|
provider-neutral optional AI front end
|
|
543
614
|
```
|
|
544
615
|
|
|
545
|
-
Quality gates include Python 3.11/3.12/3.13 regression, compilation, Ruff correctness checks, package build/clean-install, runtime dependency audit, global branch coverage, One-Command coverage, Commercial Intelligence coverage, report-test visual execution qualification tests, Selective Verification coverage, Production Authority coverage, and Evidence Trust/Replay coverage.
|
|
616
|
+
Quality gates include Python 3.11/3.12/3.13 regression, compilation, Ruff correctness checks, package build/clean-install, runtime dependency audit, global branch coverage, One-Command coverage, Commercial Intelligence coverage, industrial-motion contract tests, report-test visual execution qualification tests, Selective Verification coverage, Production Authority coverage, and Evidence Trust/Replay coverage.
|
|
546
617
|
|
|
547
|
-
Production/Stable describes the bounded software workflow. It does not claim arbitrary customer cells are physically qualified, site-qualified, functionally safe, or authorized for autonomous real execution.
|
|
618
|
+
Production/Stable describes the bounded software workflow. It does not claim arbitrary customer cells are physically qualified, site-qualified, functionally safe, or authorized for autonomous real execution. The new graphical Pilz execution path must additionally pass target-stack acceptance on the intended ROS/Gazebo/MoveIt workstation.
|
|
548
619
|
|
|
549
620
|
---
|
|
550
621
|
|
|
@@ -554,7 +625,7 @@ One-command verification:
|
|
|
554
625
|
|
|
555
626
|
https://github.com/tomha85/devagent-physical-engine/blob/main/docs/ONE_COMMAND_VERIFY_V13.md
|
|
556
627
|
|
|
557
|
-
v1.6 report-test visual execution:
|
|
628
|
+
v1.6 report-test visual execution (lineage and authority foundation retained in v1.7):
|
|
558
629
|
|
|
559
630
|
https://github.com/tomha85/devagent-physical-engine/blob/main/docs/REPORT_TEST_VISUAL_EXECUTION_V16.md
|
|
560
631
|
|
|
@@ -41,7 +41,7 @@ DevAgent is designed to answer: **What can be proven about this cell, what faile
|
|
|
41
41
|
Python 3.11+ is required.
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
|
-
python -m pip install --upgrade devagent-physical-engine==1.
|
|
44
|
+
python -m pip install --upgrade devagent-physical-engine==1.7.0
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
Verify the installed package:
|
|
@@ -53,7 +53,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
53
53
|
Expected:
|
|
54
54
|
|
|
55
55
|
```text
|
|
56
|
-
1.
|
|
56
|
+
1.7.0
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
Run the normal customer workflow:
|
|
@@ -176,9 +176,77 @@ attached workpiece ↔ conveyor_a support surface
|
|
|
176
176
|
|
|
177
177
|
That allowance is scoped to lift departure only. Transfer/place keep normal collision checking, no global PlanningScene collision policy is disabled, and the live ACM is never replaced by a sparse two-object matrix.
|
|
178
178
|
|
|
179
|
+
## v1.6.2 smooth visual motion hotfix
|
|
180
|
+
|
|
181
|
+
v1.6.2 makes the packaged UR5e visual task deliberately slower and easier to inspect. The task-specific MoveIt planner defaults are reduced from 25% velocity / 25% acceleration to:
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
velocity scale: 12%
|
|
185
|
+
acceleration scale: 8%
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
This is real trajectory time parameterization through MoveIt and `FollowJointTrajectory`; DevAgent does not fake smoothness with teleports or sleeps. Explicit planner scales remain authoritative. Collision checks, endpoint tolerances, tracking tolerances, Twin lineage, and real-execution authority are unchanged.
|
|
189
|
+
|
|
190
|
+
The joint-state recorder also rejects duplicate/backward ROS source timestamps before trajectory interpolation while recording the number of dropped samples. This removes the false `trajectory_tracking_time_not_increasing` failure caused by duplicate Gazebo/ros2_control JointState stamps without manufacturing synthetic timestamps.
|
|
191
|
+
|
|
192
|
+
Because the visual trajectory now executes more slowly, cycle-time requirements are evaluated against the actual slower simulation execution. DevAgent does not normalize the observed duration back to a faster value or claim performance that was not executed.
|
|
193
|
+
|
|
194
|
+
## v1.7 industrial smooth motion execution
|
|
195
|
+
|
|
196
|
+
v1.7 replaces the packaged report-test stop/go joint-phase presentation with a bounded industrial motion sequence planned by the running MoveIt **Pilz Industrial Motion Planner**. DevAgent does not stitch trajectories by hand and does not manufacture interpolation points.
|
|
197
|
+
|
|
198
|
+
The qualified UR5e load sequence is grouped as:
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
HOME
|
|
202
|
+
↓ PTP
|
|
203
|
+
PRE_PICK
|
|
204
|
+
↓ LIN
|
|
205
|
+
PICK
|
|
206
|
+
↓ grasp / hard boundary
|
|
207
|
+
LIFT
|
|
208
|
+
↓ LIN support departure / hard boundary
|
|
209
|
+
TRANSFER
|
|
210
|
+
↓ PTP with safe internal blend
|
|
211
|
+
PLACE
|
|
212
|
+
↓ LIN / release hard boundary
|
|
213
|
+
RETRACT
|
|
214
|
+
↓ LIN with safe internal blend
|
|
215
|
+
HOME
|
|
216
|
+
↓ PTP
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Execution groups are intentionally bounded:
|
|
220
|
+
|
|
221
|
+
```text
|
|
222
|
+
approach_pick PTP → LIN
|
|
223
|
+
lift_departure LIN
|
|
224
|
+
transfer_place PTP → LIN
|
|
225
|
+
retreat_home LIN → PTP
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Compatible motion inside a group can use a small Pilz blend radius. DevAgent never blends through grasp, the support-contact departure boundary, or release. The simulation profile is deliberately conservative:
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
PTP velocity scale: 10%
|
|
232
|
+
PTP acceleration scale: 6%
|
|
233
|
+
LIN velocity scale: 6%
|
|
234
|
+
LIN acceleration scale: 4%
|
|
235
|
+
safe blend radius: 12 mm
|
|
236
|
+
workpiece follow target: 60 Hz
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`LIN` means the Pilz planner owns a Cartesian linear tool path; `PTP` remains collision-aware point-to-point planning. MoveIt/Pilz owns geometry, timestamps, velocity/acceleration time parameterization, collision checking, and the returned blended `RobotTrajectory`.
|
|
240
|
+
|
|
241
|
+
The source-support exception is also bounded at runtime. During `lift_departure`, DevAgent snapshots the complete live MoveIt Allowed Collision Matrix, enables exactly the attached-workpiece ↔ source-support pair, verifies read-back, executes the lift, restores the exact original matrix, and verifies the restoration before transfer is allowed to continue. No global collision disable is used.
|
|
242
|
+
|
|
243
|
+
Slower industrial execution is real execution time in simulation, not cosmetic playback. Therefore cycle-time requirements are evaluated against the actual measured slower trajectory.
|
|
244
|
+
|
|
245
|
+
The v1.7 hosted qualification proves deterministic software contracts and fail-closed routing. Graphical ROS 2 Jazzy + Gazebo Harmonic + MoveIt/Pilz target-stack acceptance still has to run on the intended workstation; hosted Python CI does not pretend to execute that graphical stack.
|
|
246
|
+
|
|
179
247
|
## Exact lineage hardening
|
|
180
248
|
|
|
181
|
-
A case ID such as `case-0001` is local to its verification plan. v1.6 therefore requires the complete lineage:
|
|
249
|
+
A case ID such as `case-0001` is local to its verification plan. v1.6+ therefore requires the complete lineage:
|
|
182
250
|
|
|
183
251
|
```text
|
|
184
252
|
Requirement
|
|
@@ -393,7 +461,7 @@ Gazebo Harmonic
|
|
|
393
461
|
gz_ros2_control
|
|
394
462
|
Universal Robots ROS 2 driver
|
|
395
463
|
ur_simulation_gz
|
|
396
|
-
MoveIt 2
|
|
464
|
+
MoveIt 2 + Pilz Industrial Motion Planner
|
|
397
465
|
```
|
|
398
466
|
|
|
399
467
|
Preview setup:
|
|
@@ -414,7 +482,7 @@ Check runtime:
|
|
|
414
482
|
devagent-physical ros doctor
|
|
415
483
|
```
|
|
416
484
|
|
|
417
|
-
Hosted Python CI validates software contracts and deterministic execution boundaries. It does not by itself prove a graphical Gazebo runtime, `move_group`, TF, controller actions, OEM drivers, or an arbitrary customer cell. Physical target-stack qualification must run on the intended workstation/adapter stack.
|
|
485
|
+
Hosted Python CI validates software contracts and deterministic execution boundaries. It does not by itself prove a graphical Gazebo runtime, `move_group`, `/sequence_move_group`, TF, controller actions, OEM drivers, or an arbitrary customer cell. Physical target-stack qualification must run on the intended workstation/adapter stack.
|
|
418
486
|
|
|
419
487
|
---
|
|
420
488
|
|
|
@@ -471,9 +539,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
471
539
|
|
|
472
540
|
# Project status
|
|
473
541
|
|
|
474
|
-
**v1.
|
|
542
|
+
**v1.7.0 — Production/Stable software workflow**
|
|
475
543
|
|
|
476
|
-
v1.
|
|
544
|
+
v1.7.0 adds industrial smooth report-test execution for the qualified UR5e load profile using MoveIt Pilz `PTP` and `LIN` commands, bounded internal blend radii, conservative real simulation speed/acceleration, a 60 Hz workpiece-follow target, and an exact live-ACM support-contact lease scoped only to lift departure. It retains exact-Twin report execution, immutable Requirement→Mapping→Verification Plan→Case lineage, typed simulation measurements, deterministic verdicts, and fail-closed authority boundaries.
|
|
477
545
|
|
|
478
546
|
Production-oriented software capabilities include:
|
|
479
547
|
|
|
@@ -486,6 +554,9 @@ requirement-driven nominal / boundary / fault case generation
|
|
|
486
554
|
immutable project/Twin lineage
|
|
487
555
|
exact Requirement → Case provenance
|
|
488
556
|
qualified report-test visual execution contract
|
|
557
|
+
industrial Pilz PTP / LIN task planning
|
|
558
|
+
bounded safe trajectory blending
|
|
559
|
+
lift-only support-contact ACM lease + exact restore
|
|
489
560
|
Gazebo/MoveIt selected-case visualization
|
|
490
561
|
typed physical measurement binding
|
|
491
562
|
deterministic full campaigns
|
|
@@ -501,9 +572,9 @@ change impact + regression
|
|
|
501
572
|
provider-neutral optional AI front end
|
|
502
573
|
```
|
|
503
574
|
|
|
504
|
-
Quality gates include Python 3.11/3.12/3.13 regression, compilation, Ruff correctness checks, package build/clean-install, runtime dependency audit, global branch coverage, One-Command coverage, Commercial Intelligence coverage, report-test visual execution qualification tests, Selective Verification coverage, Production Authority coverage, and Evidence Trust/Replay coverage.
|
|
575
|
+
Quality gates include Python 3.11/3.12/3.13 regression, compilation, Ruff correctness checks, package build/clean-install, runtime dependency audit, global branch coverage, One-Command coverage, Commercial Intelligence coverage, industrial-motion contract tests, report-test visual execution qualification tests, Selective Verification coverage, Production Authority coverage, and Evidence Trust/Replay coverage.
|
|
505
576
|
|
|
506
|
-
Production/Stable describes the bounded software workflow. It does not claim arbitrary customer cells are physically qualified, site-qualified, functionally safe, or authorized for autonomous real execution.
|
|
577
|
+
Production/Stable describes the bounded software workflow. It does not claim arbitrary customer cells are physically qualified, site-qualified, functionally safe, or authorized for autonomous real execution. The new graphical Pilz execution path must additionally pass target-stack acceptance on the intended ROS/Gazebo/MoveIt workstation.
|
|
507
578
|
|
|
508
579
|
---
|
|
509
580
|
|
|
@@ -513,7 +584,7 @@ One-command verification:
|
|
|
513
584
|
|
|
514
585
|
https://github.com/tomha85/devagent-physical-engine/blob/main/docs/ONE_COMMAND_VERIFY_V13.md
|
|
515
586
|
|
|
516
|
-
v1.6 report-test visual execution:
|
|
587
|
+
v1.6 report-test visual execution (lineage and authority foundation retained in v1.7):
|
|
517
588
|
|
|
518
589
|
https://github.com/tomha85/devagent-physical-engine/blob/main/docs/REPORT_TEST_VISUAL_EXECUTION_V16.md
|
|
519
590
|
|
|
@@ -555,4 +626,4 @@ Original creator: Tom Ha
|
|
|
555
626
|
Original project: https://github.com/tomha85/devagent-physical-engine
|
|
556
627
|
All rights reserved.
|
|
557
628
|
|
|
558
|
-
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
629
|
+
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devagent-physical-engine"
|
|
7
|
-
version = "1.
|
|
8
|
-
description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, validated requirement mapping, report-test Gazebo
|
|
7
|
+
version = "1.7.0"
|
|
8
|
+
description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, validated requirement mapping, industrial Pilz PTP/LIN report-test Gazebo execution, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
dependencies = ["PyYAML>=6.0,<7"]
|
|
12
12
|
authors = [{ name = "Tom Ha" }]
|
|
13
13
|
license = { text = "All Rights Reserved" }
|
|
14
|
-
keywords = ["robotics", "industrial-automation", "agentic-ai", "ros2", "gazebo", "verification", "selective-testing", "digital-twin", "fat-testing", "regression", "evidence", "replay"]
|
|
14
|
+
keywords = ["robotics", "industrial-automation", "agentic-ai", "ros2", "gazebo", "moveit", "pilz", "verification", "selective-testing", "digital-twin", "fat-testing", "regression", "evidence", "replay"]
|
|
15
15
|
classifiers = [
|
|
16
16
|
"Development Status :: 5 - Production/Stable",
|
|
17
17
|
"Intended Audience :: Developers",
|
|
@@ -71,7 +71,10 @@ omit = [
|
|
|
71
71
|
"src/devagent_physical_engine/ros2/ur5e_v10_adapter.py",
|
|
72
72
|
"src/devagent_physical_engine/ros2/task_*.py",
|
|
73
73
|
"src/devagent_physical_engine/ros2/report_test_visualization.py",
|
|
74
|
+
"src/devagent_physical_engine/ros2/report_test_visualization_v170.py",
|
|
74
75
|
"src/devagent_physical_engine/ros2/moveit_task_planner.py",
|
|
76
|
+
"src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py",
|
|
77
|
+
"src/devagent_physical_engine/ros2/support_contact_lease_v170.py",
|
|
75
78
|
"src/devagent_physical_engine/ros2/fk_pose.py",
|
|
76
79
|
"src/devagent_physical_engine/ros2/gazebo_pose.py",
|
|
77
80
|
"src/devagent_physical_engine/ros2/workpiece_follow.py",
|
|
@@ -81,4 +84,4 @@ omit = [
|
|
|
81
84
|
[tool.coverage.report]
|
|
82
85
|
fail_under = 75
|
|
83
86
|
show_missing = true
|
|
84
|
-
skip_covered = false
|
|
87
|
+
skip_covered = false
|
|
@@ -34,6 +34,7 @@ from .evidence_trust import (
|
|
|
34
34
|
EvidenceTrace,
|
|
35
35
|
EvidenceViewer,
|
|
36
36
|
)
|
|
37
|
+
from .industrial_motion_hotfix_v170 import install_industrial_motion_v170
|
|
37
38
|
from .models import (
|
|
38
39
|
ActionContract,
|
|
39
40
|
Capability,
|
|
@@ -108,6 +109,7 @@ from .selective_verification import (
|
|
|
108
109
|
VerificationTestMappingRecorder,
|
|
109
110
|
)
|
|
110
111
|
from .selective_verification_v16 import SelectiveVerificationServiceV16
|
|
112
|
+
from .smooth_motion_hotfix_v162 import install_smooth_motion_hotfix_v162
|
|
111
113
|
from .support_contact_hotfix_v161 import install_support_contact_hotfix_v161
|
|
112
114
|
from .twin import TwinConfidenceLevel, TwinSpec, TwinValidationReport, TwinValidator
|
|
113
115
|
from .twin_codec import twin_from_dict, twin_from_revision
|
|
@@ -211,6 +213,8 @@ __all__ = [
|
|
|
211
213
|
]
|
|
212
214
|
|
|
213
215
|
install_support_contact_hotfix_v161()
|
|
216
|
+
install_smooth_motion_hotfix_v162()
|
|
217
|
+
install_industrial_motion_v170()
|
|
214
218
|
install_one_command_runtime()
|
|
215
219
|
|
|
216
|
-
__version__ = "1.
|
|
220
|
+
__version__ = "1.7.0"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from functools import wraps
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .ros2.report_test_visualization_v170 import run_report_test_visualization_v170
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
_PATCH_MARKER = "_devagent_industrial_motion_v170"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _patch_constructor(cls) -> None:
|
|
13
|
+
original = cls.__init__
|
|
14
|
+
if getattr(original, _PATCH_MARKER, False):
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
@wraps(original)
|
|
18
|
+
def patched(self, *args: Any, **kwargs: Any):
|
|
19
|
+
kwargs.setdefault("visual_runner", run_report_test_visualization_v170)
|
|
20
|
+
return original(self, *args, **kwargs)
|
|
21
|
+
|
|
22
|
+
setattr(patched, _PATCH_MARKER, True)
|
|
23
|
+
cls.__init__ = patched
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def install_industrial_motion_v170() -> None:
|
|
27
|
+
"""Route all report-test executor construction through the v1.7 visual runner.
|
|
28
|
+
|
|
29
|
+
v1.6 bound the old visual runner into constructor defaults at import time. Merely
|
|
30
|
+
replacing a module global would therefore leave existing executor classes on the
|
|
31
|
+
old path. This installer patches only those constructor defaults and preserves all
|
|
32
|
+
lineage, mapping, evidence, and authority classes unchanged.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from . import report_test_execution as base_exec
|
|
36
|
+
from . import report_test_execution_strict as strict_exec
|
|
37
|
+
from .ros2 import report_test_visualization as base_visual
|
|
38
|
+
|
|
39
|
+
base_exec.run_report_test_visualization = run_report_test_visualization_v170
|
|
40
|
+
strict_exec.run_report_test_visualization = run_report_test_visualization_v170
|
|
41
|
+
base_visual.run_report_test_visualization = run_report_test_visualization_v170
|
|
42
|
+
|
|
43
|
+
for cls in (
|
|
44
|
+
base_exec.ReportTestExecutionRuntime,
|
|
45
|
+
base_exec.ReportTestSelectiveExecutor,
|
|
46
|
+
base_exec.ReportTestFullExecutor,
|
|
47
|
+
strict_exec.ReportTestExecutionRuntime,
|
|
48
|
+
strict_exec.ReportTestSelectiveExecutor,
|
|
49
|
+
strict_exec.ReportTestFullExecutor,
|
|
50
|
+
):
|
|
51
|
+
_patch_constructor(cls)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
INDUSTRIAL_MOTION_PROFILE_V170 = "pilz_ptp_lin_blended_v1"
|
|
7
|
+
PILZ_PIPELINE_ID = "pilz_industrial_motion_planner"
|
|
8
|
+
|
|
9
|
+
# Conservative simulation profile. These are planning/execution limits, not a
|
|
10
|
+
# cosmetic playback multiplier; measured cycle time therefore remains truthful.
|
|
11
|
+
PTP_VELOCITY_SCALE = 0.10
|
|
12
|
+
PTP_ACCELERATION_SCALE = 0.06
|
|
13
|
+
LIN_VELOCITY_SCALE = 0.06
|
|
14
|
+
LIN_ACCELERATION_SCALE = 0.04
|
|
15
|
+
SAFE_BLEND_RADIUS_M = 0.012
|
|
16
|
+
WORKPIECE_FOLLOW_RATE_HZ = 60.0
|
|
17
|
+
WORKPIECE_MIN_EFFECTIVE_RATE_HZ = 30.0
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True, slots=True)
|
|
21
|
+
class IndustrialSegmentSpec:
|
|
22
|
+
phase_name: str
|
|
23
|
+
planner_id: str
|
|
24
|
+
blend_radius_m: float
|
|
25
|
+
velocity_scale: float
|
|
26
|
+
acceleration_scale: float
|
|
27
|
+
|
|
28
|
+
def __post_init__(self) -> None:
|
|
29
|
+
if not self.phase_name.strip():
|
|
30
|
+
raise ValueError("industrial_phase_name_required")
|
|
31
|
+
if self.planner_id not in {"PTP", "LIN"}:
|
|
32
|
+
raise ValueError("industrial_planner_id_invalid")
|
|
33
|
+
if self.blend_radius_m < 0:
|
|
34
|
+
raise ValueError("industrial_blend_radius_invalid")
|
|
35
|
+
if not 0 < self.velocity_scale <= 1:
|
|
36
|
+
raise ValueError("industrial_velocity_scale_invalid")
|
|
37
|
+
if not 0 < self.acceleration_scale <= 1:
|
|
38
|
+
raise ValueError("industrial_acceleration_scale_invalid")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True, slots=True)
|
|
42
|
+
class IndustrialGroupSpec:
|
|
43
|
+
group_id: str
|
|
44
|
+
segments: tuple[IndustrialSegmentSpec, ...]
|
|
45
|
+
workpiece_loaded: bool
|
|
46
|
+
scene_state: str
|
|
47
|
+
support_contact_departure: bool = False
|
|
48
|
+
|
|
49
|
+
def __post_init__(self) -> None:
|
|
50
|
+
if not self.group_id.strip() or not self.segments:
|
|
51
|
+
raise ValueError("industrial_group_invalid")
|
|
52
|
+
if self.scene_state not in {"inherit", "attached", "world"}:
|
|
53
|
+
raise ValueError("industrial_scene_state_invalid")
|
|
54
|
+
if self.segments[-1].blend_radius_m != 0.0:
|
|
55
|
+
raise ValueError("industrial_group_final_blend_must_be_zero")
|
|
56
|
+
if self.support_contact_departure:
|
|
57
|
+
if self.scene_state != "attached" or not self.workpiece_loaded:
|
|
58
|
+
raise ValueError("industrial_support_departure_requires_loaded_attached_group")
|
|
59
|
+
if tuple(item.phase_name for item in self.segments) != ("lift",):
|
|
60
|
+
raise ValueError("industrial_support_departure_must_be_lift_only")
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def phase_names(self) -> tuple[str, ...]:
|
|
64
|
+
return tuple(item.phase_name for item in self.segments)
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def planner_chain(self) -> str:
|
|
68
|
+
return "->".join(item.planner_id for item in self.segments)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def reference_industrial_groups() -> tuple[IndustrialGroupSpec, ...]:
|
|
72
|
+
"""Qualified UR5e report-test sequence with safe industrial motion boundaries.
|
|
73
|
+
|
|
74
|
+
Grasp/release and the support-contact departure remain explicit zero-blend
|
|
75
|
+
boundaries. Within approach, transfer/place, and retreat, Pilz blends compatible
|
|
76
|
+
PTP/LIN commands so the controller receives one continuous trajectory instead of
|
|
77
|
+
several stop/go FollowJointTrajectory commands.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
groups = (
|
|
81
|
+
IndustrialGroupSpec(
|
|
82
|
+
"approach_pick",
|
|
83
|
+
(
|
|
84
|
+
IndustrialSegmentSpec(
|
|
85
|
+
"pre_pick", "PTP", SAFE_BLEND_RADIUS_M, PTP_VELOCITY_SCALE, PTP_ACCELERATION_SCALE
|
|
86
|
+
),
|
|
87
|
+
IndustrialSegmentSpec(
|
|
88
|
+
"pick", "LIN", 0.0, LIN_VELOCITY_SCALE, LIN_ACCELERATION_SCALE
|
|
89
|
+
),
|
|
90
|
+
),
|
|
91
|
+
workpiece_loaded=False,
|
|
92
|
+
scene_state="inherit",
|
|
93
|
+
),
|
|
94
|
+
IndustrialGroupSpec(
|
|
95
|
+
"lift_departure",
|
|
96
|
+
(
|
|
97
|
+
IndustrialSegmentSpec(
|
|
98
|
+
"lift", "LIN", 0.0, LIN_VELOCITY_SCALE, LIN_ACCELERATION_SCALE
|
|
99
|
+
),
|
|
100
|
+
),
|
|
101
|
+
workpiece_loaded=True,
|
|
102
|
+
scene_state="attached",
|
|
103
|
+
support_contact_departure=True,
|
|
104
|
+
),
|
|
105
|
+
IndustrialGroupSpec(
|
|
106
|
+
"transfer_place",
|
|
107
|
+
(
|
|
108
|
+
IndustrialSegmentSpec(
|
|
109
|
+
"transfer", "PTP", SAFE_BLEND_RADIUS_M, PTP_VELOCITY_SCALE, PTP_ACCELERATION_SCALE
|
|
110
|
+
),
|
|
111
|
+
IndustrialSegmentSpec(
|
|
112
|
+
"place", "LIN", 0.0, LIN_VELOCITY_SCALE, LIN_ACCELERATION_SCALE
|
|
113
|
+
),
|
|
114
|
+
),
|
|
115
|
+
workpiece_loaded=True,
|
|
116
|
+
scene_state="attached",
|
|
117
|
+
),
|
|
118
|
+
IndustrialGroupSpec(
|
|
119
|
+
"retreat_home",
|
|
120
|
+
(
|
|
121
|
+
IndustrialSegmentSpec(
|
|
122
|
+
"retract", "LIN", SAFE_BLEND_RADIUS_M, LIN_VELOCITY_SCALE, LIN_ACCELERATION_SCALE
|
|
123
|
+
),
|
|
124
|
+
IndustrialSegmentSpec(
|
|
125
|
+
"return_home", "PTP", 0.0, PTP_VELOCITY_SCALE, PTP_ACCELERATION_SCALE
|
|
126
|
+
),
|
|
127
|
+
),
|
|
128
|
+
workpiece_loaded=False,
|
|
129
|
+
scene_state="world",
|
|
130
|
+
),
|
|
131
|
+
)
|
|
132
|
+
expected = (
|
|
133
|
+
"pre_pick",
|
|
134
|
+
"pick",
|
|
135
|
+
"lift",
|
|
136
|
+
"transfer",
|
|
137
|
+
"place",
|
|
138
|
+
"retract",
|
|
139
|
+
"return_home",
|
|
140
|
+
)
|
|
141
|
+
actual = tuple(phase for group in groups for phase in group.phase_names)
|
|
142
|
+
if actual != expected:
|
|
143
|
+
raise RuntimeError("industrial_reference_phase_coverage_invalid")
|
|
144
|
+
return groups
|