devagent-physical-engine 1.7.2__tar.gz → 1.8.1__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.7.2/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.1}/PKG-INFO +71 -15
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/README.md +70 -14
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/pyproject.toml +5 -3
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/__init__.py +3 -1
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +93 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_v16.py +8 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification.py +28 -3
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/robot_support_v18.py +97 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robots.py +6 -0
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/ros2/abb_irb1200.py +441 -0
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +203 -0
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/ros2/controller_action_probe.py +165 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/doctor.py +9 -1
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/user_cli_v18.py +283 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1/src/devagent_physical_engine.egg-info}/PKG-INFO +71 -15
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/SOURCES.txt +8 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/entry_points.txt +1 -1
- devagent_physical_engine-1.8.1/tests/test_abb_irb1200_visual_v18.py +180 -0
- devagent_physical_engine-1.8.1/tests/test_controller_runtime_hotfix_v181.py +194 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_golden_abb_showcase.py +6 -2
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_industrial_motion_v170.py +2 -2
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_robot_platform_v08.py +26 -1
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ros_trajectory_v09.py +82 -43
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_transfer_place_diagnostic_v172.py +1 -1
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/NOTICE +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/setup.cfg +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/evidence_replay.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/evidence_trust.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_runtime.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_v15.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/production_authority.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/production_grade.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_criterion.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/report_test_execution.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/selective_verification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_codec.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v15.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v16.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_commercial_intelligence_v15.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_evidence_replay_v12.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_coverage_v12.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_transport_v12.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_v12.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_evidence_viewer_palette_v130.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_golden_abb_runner_v171.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_one_command_hardening_v13.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_one_command_pose_hardening_v15.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_one_command_regression_v141.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_one_command_v13.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_production_authority_v11.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_production_grade_coverage_v11.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_production_grade_v11.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_provider_criterion_v15.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_report_test_contract_coverage_v16.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_report_test_lineage_v16.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_report_test_visual_execution_v16.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_selective_verification_v14.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_user_cli_interactive_v131.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_user_cli_progress_v131.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_user_cli_report_visual_v16.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_user_cli_selective_v14.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_user_cli_v15.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-1.7.2 → devagent_physical_engine-1.8.1}/tests/test_workpiece_lifecycle_v011.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
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,
|
|
3
|
+
Version: 1.8.1
|
|
4
|
+
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, 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
|
|
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
|
|
|
76
76
|
Python 3.11+ is required.
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
python -m pip install --upgrade devagent-physical-engine==1.
|
|
79
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.1
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Verify the installed package:
|
|
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
88
88
|
Expected:
|
|
89
89
|
|
|
90
90
|
```text
|
|
91
|
-
1.
|
|
91
|
+
1.8.1
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -115,6 +115,19 @@ For machine-readable CI output:
|
|
|
115
115
|
devagent verify ./customer-project --json
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
Inspect truthful robot support tiers:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
devagent robots
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For the exact ABB IRB1200 experimental visual runtime:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
devagent robot doctor abb_irb1200
|
|
128
|
+
devagent robot visualize abb_irb1200
|
|
129
|
+
```
|
|
130
|
+
|
|
118
131
|
Default locations:
|
|
119
132
|
|
|
120
133
|
```text
|
|
@@ -327,9 +340,37 @@ pilz_transfer_place_sequence_composition_failed
|
|
|
327
340
|
|
|
328
341
|
Each probe writes its own request/receipt plus a `transfer-place-diagnostic.json` summary. These probes never execute motion and never relax targets, planner types, collision policy, attached-workpiece scene state, velocity/acceleration limits, Twin lineage, or real-execution authority. Their purpose is to identify the exact target-stack defect before changing physical execution semantics.
|
|
329
342
|
|
|
343
|
+
## v1.8 truthful robot support + ABB IRB1200 visual runtime
|
|
344
|
+
|
|
345
|
+
v1.8 makes robot support explicit instead of implying that every built-in robot profile has the same simulator authority.
|
|
346
|
+
|
|
347
|
+
Support is exposed through:
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
devagent robots
|
|
351
|
+
devagent robot doctor <robot>
|
|
352
|
+
devagent robot visualize <robot>
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
The exact `abb_irb1200` profile adds an experimental visual runtime using Ubuntu 24.04, ROS 2 Jazzy, Gazebo Harmonic, `gz_ros2_control`, upstream ABB IRB1200 geometry, MoveIt, and RViz. Runtime readiness is bounded on controller state, `/joint_states`, FollowJointTrajectory, `move_group`, and RViz availability.
|
|
356
|
+
|
|
357
|
+
For the Golden ABB cell, DevAgent can load the waypoint seed, pre-plan every phase through MoveIt before sending any simulated trajectory, then execute the preview while Gazebo/RViz remain open for inspection.
|
|
358
|
+
|
|
359
|
+
This is intentionally **visual simulation availability**, not measured FAT qualification. ABB preview evidence is not promoted to a qualified physical measurement, and `real_execution_allowed` remains false. The normal One-Command ABB FAT path continues to fail closed until an exact-Twin measured ABB execution adapter is separately qualified.
|
|
360
|
+
|
|
361
|
+
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
362
|
+
|
|
363
|
+
## v1.8.1 direct UR5e controller/action readiness hotfix
|
|
364
|
+
|
|
365
|
+
A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
|
|
366
|
+
|
|
367
|
+
v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
|
|
368
|
+
|
|
369
|
+
The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
|
|
370
|
+
|
|
330
371
|
## Qualified visual-execution scope
|
|
331
372
|
|
|
332
|
-
|
|
373
|
+
Measured report-test execution remains intentionally narrow:
|
|
333
374
|
|
|
334
375
|
```text
|
|
335
376
|
robot: UR5e
|
|
@@ -340,7 +381,7 @@ runtime: Ubuntu 24.04 + ROS 2 Jazzy + Gazebo Harmonic + MoveIt/Pilz
|
|
|
340
381
|
|
|
341
382
|
Unsupported customer Twins, unqualified robot profiles, boundary/fault cases outside the qualified scope, ambiguous case mappings, or incomplete lineage fail closed.
|
|
342
383
|
|
|
343
|
-
|
|
384
|
+
ABB IRB1200 is separately exposed as `SIMULATION_AVAILABLE_EXPERIMENTAL`: Gazebo/MoveIt/RViz preview is available, but it does not silently enter the UR5e measured FAT executor and cannot promote physical evidence.
|
|
344
385
|
|
|
345
386
|
## Interactive engineering session
|
|
346
387
|
|
|
@@ -448,12 +489,12 @@ Ubuntu 24.04
|
|
|
448
489
|
ROS 2 Jazzy
|
|
449
490
|
Gazebo Harmonic
|
|
450
491
|
gz_ros2_control
|
|
451
|
-
|
|
452
|
-
ur_simulation_gz
|
|
453
|
-
MoveIt 2 + Pilz Industrial Motion Planner
|
|
492
|
+
MoveIt 2
|
|
454
493
|
```
|
|
455
494
|
|
|
456
|
-
|
|
495
|
+
UR5e measured report-test execution additionally uses the Universal Robots ROS 2 driver, `ur_simulation_gz`, and Pilz Industrial Motion Planner.
|
|
496
|
+
|
|
497
|
+
Preview UR5e setup:
|
|
457
498
|
|
|
458
499
|
```bash
|
|
459
500
|
devagent-physical setup --profile ur5e-sim --dry-run
|
|
@@ -465,12 +506,24 @@ Apply explicitly:
|
|
|
465
506
|
devagent-physical setup --profile ur5e-sim --yes
|
|
466
507
|
```
|
|
467
508
|
|
|
468
|
-
Check runtime:
|
|
509
|
+
Check the UR5e runtime:
|
|
469
510
|
|
|
470
511
|
```bash
|
|
471
512
|
devagent-physical ros doctor
|
|
472
513
|
```
|
|
473
514
|
|
|
515
|
+
Check ABB IRB1200 visual runtime prerequisites:
|
|
516
|
+
|
|
517
|
+
```bash
|
|
518
|
+
devagent robot doctor abb_irb1200
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Launch ABB IRB1200 Gazebo + MoveIt + RViz preview:
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
devagent robot visualize abb_irb1200
|
|
525
|
+
```
|
|
526
|
+
|
|
474
527
|
Hosted CI validates deterministic software contracts. It does not pretend to execute a graphical ROS/Gazebo/MoveIt target stack. Target-stack acceptance must run on the intended workstation.
|
|
475
528
|
|
|
476
529
|
## Optional AI providers
|
|
@@ -497,7 +550,7 @@ Provider-backed interpretation cannot grant physical truth, site qualification,
|
|
|
497
550
|
## Installed CLIs
|
|
498
551
|
|
|
499
552
|
```text
|
|
500
|
-
devagent one-command
|
|
553
|
+
devagent one-command verification, interactive report testing, robot support/visualization
|
|
501
554
|
devagent-commercial commercial/evidence workflow
|
|
502
555
|
devagent-physical deterministic core + ROS/qualification tools
|
|
503
556
|
devagent-physical-ai optional provider-backed engineering front end
|
|
@@ -515,9 +568,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
515
568
|
|
|
516
569
|
# Project status
|
|
517
570
|
|
|
518
|
-
**v1.
|
|
571
|
+
**v1.8.1 — Production/Stable software workflow**
|
|
519
572
|
|
|
520
|
-
v1.
|
|
573
|
+
v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
|
|
521
574
|
|
|
522
575
|
Production-oriented software capabilities include:
|
|
523
576
|
|
|
@@ -529,7 +582,10 @@ optional provider-backed advisory criterion proposals
|
|
|
529
582
|
requirement-driven nominal / boundary / fault case generation
|
|
530
583
|
immutable project/Twin lineage
|
|
531
584
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
532
|
-
|
|
585
|
+
truthful robot support tiers
|
|
586
|
+
qualified UR5e report-test visual execution contract
|
|
587
|
+
direct UR5e controller-manager/action readiness binding
|
|
588
|
+
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
533
589
|
industrial Pilz PTP / LIN planning
|
|
534
590
|
adaptive bounded blend selection
|
|
535
591
|
plan-only transfer/place segment diagnostics
|
|
@@ -35,7 +35,7 @@ regression + FAT report + Evidence Viewer
|
|
|
35
35
|
Python 3.11+ is required.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
python -m pip install --upgrade devagent-physical-engine==1.
|
|
38
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.1
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Verify the installed package:
|
|
@@ -47,7 +47,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
47
47
|
Expected:
|
|
48
48
|
|
|
49
49
|
```text
|
|
50
|
-
1.
|
|
50
|
+
1.8.1
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Run the normal customer workflow:
|
|
@@ -74,6 +74,19 @@ For machine-readable CI output:
|
|
|
74
74
|
devagent verify ./customer-project --json
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
+
Inspect truthful robot support tiers:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
devagent robots
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
For the exact ABB IRB1200 experimental visual runtime:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
devagent robot doctor abb_irb1200
|
|
87
|
+
devagent robot visualize abb_irb1200
|
|
88
|
+
```
|
|
89
|
+
|
|
77
90
|
Default locations:
|
|
78
91
|
|
|
79
92
|
```text
|
|
@@ -286,9 +299,37 @@ pilz_transfer_place_sequence_composition_failed
|
|
|
286
299
|
|
|
287
300
|
Each probe writes its own request/receipt plus a `transfer-place-diagnostic.json` summary. These probes never execute motion and never relax targets, planner types, collision policy, attached-workpiece scene state, velocity/acceleration limits, Twin lineage, or real-execution authority. Their purpose is to identify the exact target-stack defect before changing physical execution semantics.
|
|
288
301
|
|
|
302
|
+
## v1.8 truthful robot support + ABB IRB1200 visual runtime
|
|
303
|
+
|
|
304
|
+
v1.8 makes robot support explicit instead of implying that every built-in robot profile has the same simulator authority.
|
|
305
|
+
|
|
306
|
+
Support is exposed through:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
devagent robots
|
|
310
|
+
devagent robot doctor <robot>
|
|
311
|
+
devagent robot visualize <robot>
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The exact `abb_irb1200` profile adds an experimental visual runtime using Ubuntu 24.04, ROS 2 Jazzy, Gazebo Harmonic, `gz_ros2_control`, upstream ABB IRB1200 geometry, MoveIt, and RViz. Runtime readiness is bounded on controller state, `/joint_states`, FollowJointTrajectory, `move_group`, and RViz availability.
|
|
315
|
+
|
|
316
|
+
For the Golden ABB cell, DevAgent can load the waypoint seed, pre-plan every phase through MoveIt before sending any simulated trajectory, then execute the preview while Gazebo/RViz remain open for inspection.
|
|
317
|
+
|
|
318
|
+
This is intentionally **visual simulation availability**, not measured FAT qualification. ABB preview evidence is not promoted to a qualified physical measurement, and `real_execution_allowed` remains false. The normal One-Command ABB FAT path continues to fail closed until an exact-Twin measured ABB execution adapter is separately qualified.
|
|
319
|
+
|
|
320
|
+
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
321
|
+
|
|
322
|
+
## v1.8.1 direct UR5e controller/action readiness hotfix
|
|
323
|
+
|
|
324
|
+
A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
|
|
325
|
+
|
|
326
|
+
v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
|
|
327
|
+
|
|
328
|
+
The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
|
|
329
|
+
|
|
289
330
|
## Qualified visual-execution scope
|
|
290
331
|
|
|
291
|
-
|
|
332
|
+
Measured report-test execution remains intentionally narrow:
|
|
292
333
|
|
|
293
334
|
```text
|
|
294
335
|
robot: UR5e
|
|
@@ -299,7 +340,7 @@ runtime: Ubuntu 24.04 + ROS 2 Jazzy + Gazebo Harmonic + MoveIt/Pilz
|
|
|
299
340
|
|
|
300
341
|
Unsupported customer Twins, unqualified robot profiles, boundary/fault cases outside the qualified scope, ambiguous case mappings, or incomplete lineage fail closed.
|
|
301
342
|
|
|
302
|
-
|
|
343
|
+
ABB IRB1200 is separately exposed as `SIMULATION_AVAILABLE_EXPERIMENTAL`: Gazebo/MoveIt/RViz preview is available, but it does not silently enter the UR5e measured FAT executor and cannot promote physical evidence.
|
|
303
344
|
|
|
304
345
|
## Interactive engineering session
|
|
305
346
|
|
|
@@ -407,12 +448,12 @@ Ubuntu 24.04
|
|
|
407
448
|
ROS 2 Jazzy
|
|
408
449
|
Gazebo Harmonic
|
|
409
450
|
gz_ros2_control
|
|
410
|
-
|
|
411
|
-
ur_simulation_gz
|
|
412
|
-
MoveIt 2 + Pilz Industrial Motion Planner
|
|
451
|
+
MoveIt 2
|
|
413
452
|
```
|
|
414
453
|
|
|
415
|
-
|
|
454
|
+
UR5e measured report-test execution additionally uses the Universal Robots ROS 2 driver, `ur_simulation_gz`, and Pilz Industrial Motion Planner.
|
|
455
|
+
|
|
456
|
+
Preview UR5e setup:
|
|
416
457
|
|
|
417
458
|
```bash
|
|
418
459
|
devagent-physical setup --profile ur5e-sim --dry-run
|
|
@@ -424,12 +465,24 @@ Apply explicitly:
|
|
|
424
465
|
devagent-physical setup --profile ur5e-sim --yes
|
|
425
466
|
```
|
|
426
467
|
|
|
427
|
-
Check runtime:
|
|
468
|
+
Check the UR5e runtime:
|
|
428
469
|
|
|
429
470
|
```bash
|
|
430
471
|
devagent-physical ros doctor
|
|
431
472
|
```
|
|
432
473
|
|
|
474
|
+
Check ABB IRB1200 visual runtime prerequisites:
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
devagent robot doctor abb_irb1200
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
Launch ABB IRB1200 Gazebo + MoveIt + RViz preview:
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
devagent robot visualize abb_irb1200
|
|
484
|
+
```
|
|
485
|
+
|
|
433
486
|
Hosted CI validates deterministic software contracts. It does not pretend to execute a graphical ROS/Gazebo/MoveIt target stack. Target-stack acceptance must run on the intended workstation.
|
|
434
487
|
|
|
435
488
|
## Optional AI providers
|
|
@@ -456,7 +509,7 @@ Provider-backed interpretation cannot grant physical truth, site qualification,
|
|
|
456
509
|
## Installed CLIs
|
|
457
510
|
|
|
458
511
|
```text
|
|
459
|
-
devagent one-command
|
|
512
|
+
devagent one-command verification, interactive report testing, robot support/visualization
|
|
460
513
|
devagent-commercial commercial/evidence workflow
|
|
461
514
|
devagent-physical deterministic core + ROS/qualification tools
|
|
462
515
|
devagent-physical-ai optional provider-backed engineering front end
|
|
@@ -474,9 +527,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
474
527
|
|
|
475
528
|
# Project status
|
|
476
529
|
|
|
477
|
-
**v1.
|
|
530
|
+
**v1.8.1 — Production/Stable software workflow**
|
|
478
531
|
|
|
479
|
-
v1.
|
|
532
|
+
v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
|
|
480
533
|
|
|
481
534
|
Production-oriented software capabilities include:
|
|
482
535
|
|
|
@@ -488,7 +541,10 @@ optional provider-backed advisory criterion proposals
|
|
|
488
541
|
requirement-driven nominal / boundary / fault case generation
|
|
489
542
|
immutable project/Twin lineage
|
|
490
543
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
491
|
-
|
|
544
|
+
truthful robot support tiers
|
|
545
|
+
qualified UR5e report-test visual execution contract
|
|
546
|
+
direct UR5e controller-manager/action readiness binding
|
|
547
|
+
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
492
548
|
industrial Pilz PTP / LIN planning
|
|
493
549
|
adaptive bounded blend selection
|
|
494
550
|
plan-only transfer/place segment diagnostics
|
|
@@ -540,4 +596,4 @@ Original creator: Tom Ha
|
|
|
540
596
|
Original project: https://github.com/tomha85/devagent-physical-engine
|
|
541
597
|
All rights reserved.
|
|
542
598
|
|
|
543
|
-
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
599
|
+
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
@@ -4,8 +4,8 @@ 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,
|
|
7
|
+
version = "1.8.1"
|
|
8
|
+
description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, 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"]
|
|
@@ -47,7 +47,7 @@ Repository = "https://github.com/tomha85/devagent-physical-engine"
|
|
|
47
47
|
Issues = "https://github.com/tomha85/devagent-physical-engine/issues"
|
|
48
48
|
|
|
49
49
|
[project.scripts]
|
|
50
|
-
devagent = "devagent_physical_engine.
|
|
50
|
+
devagent = "devagent_physical_engine.user_cli_v18:main"
|
|
51
51
|
devagent-physical = "devagent_physical_engine.cli:main"
|
|
52
52
|
devagent-physical-ai = "devagent_physical_engine.ai_cli:main"
|
|
53
53
|
devagent-commercial = "devagent_physical_engine.commercial_cli:main"
|
|
@@ -81,6 +81,8 @@ omit = [
|
|
|
81
81
|
"src/devagent_physical_engine/ros2/gazebo_pose.py",
|
|
82
82
|
"src/devagent_physical_engine/ros2/workpiece_follow.py",
|
|
83
83
|
"src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py",
|
|
84
|
+
"src/devagent_physical_engine/ros2/abb_irb1200.py",
|
|
85
|
+
"src/devagent_physical_engine/ros2/abb_irb1200_preview.py",
|
|
84
86
|
]
|
|
85
87
|
|
|
86
88
|
[tool.coverage.report]
|
|
@@ -26,6 +26,7 @@ from .commercial_intelligence import (
|
|
|
26
26
|
)
|
|
27
27
|
from .commercial_readiness import CommercialProjectStatus, FATReportBuilder
|
|
28
28
|
from .commercial_repository import CommercialProjectRepository
|
|
29
|
+
from .controller_runtime_hotfix_v181 import install_controller_runtime_hotfix_v181
|
|
29
30
|
from .evidence_replay import ReplayInspectionService
|
|
30
31
|
from .evidence_trust import (
|
|
31
32
|
EVIDENCE_TRUST_SCHEMA_VERSION,
|
|
@@ -215,6 +216,7 @@ __all__ = [
|
|
|
215
216
|
install_support_contact_hotfix_v161()
|
|
216
217
|
install_smooth_motion_hotfix_v162()
|
|
217
218
|
install_industrial_motion_v170()
|
|
219
|
+
install_controller_runtime_hotfix_v181()
|
|
218
220
|
install_one_command_runtime()
|
|
219
221
|
|
|
220
|
-
__version__ = "1.
|
|
222
|
+
__version__ = "1.8.1"
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Mapping
|
|
6
|
+
|
|
7
|
+
from .ros2 import trajectory as _trajectory
|
|
8
|
+
from .ros2.commands import CommandExecutionError, RosCommandRunner
|
|
9
|
+
from .ros2.trajectory import RosTrajectoryError
|
|
10
|
+
from .ros2.ur5e_adapter import UR5E_JOINTS, UR5eGazeboAdapter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
_DEFAULT_TRAJECTORY_ACTION = "/joint_trajectory_controller/follow_joint_trajectory"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _last_json_mapping(stdout: str, *, code: str) -> Mapping[str, object]:
|
|
17
|
+
lines = [line.strip() for line in stdout.splitlines() if line.strip()]
|
|
18
|
+
if not lines:
|
|
19
|
+
raise RosTrajectoryError(code)
|
|
20
|
+
try:
|
|
21
|
+
payload = json.loads(lines[-1])
|
|
22
|
+
except json.JSONDecodeError as exc:
|
|
23
|
+
raise RosTrajectoryError(code) from exc
|
|
24
|
+
if not isinstance(payload, Mapping):
|
|
25
|
+
raise RosTrajectoryError(code)
|
|
26
|
+
return payload
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def resolve_active_trajectory_action_v181(
|
|
30
|
+
runner: RosCommandRunner,
|
|
31
|
+
*,
|
|
32
|
+
preferred_action: str = _DEFAULT_TRAJECTORY_ACTION,
|
|
33
|
+
) -> str:
|
|
34
|
+
if not preferred_action.startswith("/") or any(
|
|
35
|
+
character.isspace() for character in preferred_action
|
|
36
|
+
):
|
|
37
|
+
raise RosTrajectoryError("trajectory_action_must_be_absolute")
|
|
38
|
+
|
|
39
|
+
service_timeout = 3.0
|
|
40
|
+
action_timeout = 3.0
|
|
41
|
+
helper = Path(_trajectory.__file__).with_name("controller_action_probe.py").resolve()
|
|
42
|
+
command = (
|
|
43
|
+
"python3",
|
|
44
|
+
str(helper),
|
|
45
|
+
"--preferred-action",
|
|
46
|
+
preferred_action,
|
|
47
|
+
"--service-timeout",
|
|
48
|
+
format(service_timeout, ".6g"),
|
|
49
|
+
"--action-timeout",
|
|
50
|
+
format(action_timeout, ".6g"),
|
|
51
|
+
)
|
|
52
|
+
try:
|
|
53
|
+
result = runner.run(
|
|
54
|
+
command,
|
|
55
|
+
timeout_s=service_timeout * 2.0 + action_timeout + 4.0,
|
|
56
|
+
)
|
|
57
|
+
except CommandExecutionError as exc:
|
|
58
|
+
raise RosTrajectoryError("trajectory_controller_discovery_timeout") from exc
|
|
59
|
+
|
|
60
|
+
payload = _last_json_mapping(
|
|
61
|
+
result.stdout,
|
|
62
|
+
code="trajectory_controller_probe_output_invalid",
|
|
63
|
+
)
|
|
64
|
+
code = str(payload.get("code") or "trajectory_controller_probe_failed")
|
|
65
|
+
if payload.get("success") is not True:
|
|
66
|
+
raise RosTrajectoryError(code)
|
|
67
|
+
if not result.ok:
|
|
68
|
+
raise RosTrajectoryError("trajectory_controller_probe_exit_nonzero")
|
|
69
|
+
|
|
70
|
+
action_name = str(payload.get("action_name") or "").strip()
|
|
71
|
+
if not action_name.startswith("/") or not action_name.endswith(
|
|
72
|
+
"/follow_joint_trajectory"
|
|
73
|
+
):
|
|
74
|
+
raise RosTrajectoryError("trajectory_controller_probe_output_invalid")
|
|
75
|
+
return action_name
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def ur5e_ready_probe_v181(self: UR5eGazeboAdapter) -> tuple[bool, str]:
|
|
79
|
+
try:
|
|
80
|
+
action_name = resolve_active_trajectory_action_v181(self.runner)
|
|
81
|
+
_trajectory.read_joint_state(
|
|
82
|
+
self.runner,
|
|
83
|
+
timeout_s=4.0,
|
|
84
|
+
required_joint_names=UR5E_JOINTS,
|
|
85
|
+
)
|
|
86
|
+
except RosTrajectoryError as exc:
|
|
87
|
+
return False, str(exc)
|
|
88
|
+
return True, f"controller/action/joint-state ready:{action_name}"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def install_controller_runtime_hotfix_v181() -> None:
|
|
92
|
+
_trajectory.resolve_active_trajectory_action = resolve_active_trajectory_action_v181
|
|
93
|
+
UR5eGazeboAdapter._ready_probe = ur5e_ready_probe_v181
|
|
@@ -13,6 +13,10 @@ from .commercial_repository import CommercialProjectRepository
|
|
|
13
13
|
from .one_command_v15 import OneCommandVerifier as OneCommandVerifierV15
|
|
14
14
|
from .one_command_v15 import SimpleVerifyResult
|
|
15
15
|
from .report_test_execution_strict import ReportTestFullExecutor
|
|
16
|
+
from .robot_support_v18 import ensure_v18_robot_profiles
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
ensure_v18_robot_profiles()
|
|
16
20
|
|
|
17
21
|
|
|
18
22
|
class ProfileGatedReportTestFullExecutor(ReportTestFullExecutor):
|
|
@@ -23,6 +27,10 @@ class ProfileGatedReportTestFullExecutor(ReportTestFullExecutor):
|
|
|
23
27
|
entering UR5e-specific request materialization so that One-Command can continue
|
|
24
28
|
producing bounded campaign/FAT evidence instead of surfacing an executor
|
|
25
29
|
traceback.
|
|
30
|
+
|
|
31
|
+
Exact profiles may expose an experimental visual runtime (for example ABB
|
|
32
|
+
IRB1200) while remaining blocked here until that runtime passes measured FAT
|
|
33
|
+
qualification. Availability is deliberately not treated as evidence authority.
|
|
26
34
|
"""
|
|
27
35
|
|
|
28
36
|
def execute(
|
|
@@ -9,6 +9,17 @@ from .robots import CATALOG
|
|
|
9
9
|
from .simulation import DeterministicSimulationBackend
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
# This is the original v1 cross-vendor *family* corpus. Exact model profiles added
|
|
13
|
+
# later (for example abb_irb1200) must not silently change the historical smoke
|
|
14
|
+
# baseline or turn a family-level qualification into a count of registry entries.
|
|
15
|
+
V1_ROBOT_FAMILIES = (
|
|
16
|
+
"ur5e",
|
|
17
|
+
"fanuc_crx",
|
|
18
|
+
"kuka_kr",
|
|
19
|
+
"abb_irb",
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
12
23
|
@dataclass(frozen=True, slots=True)
|
|
13
24
|
class QualificationCaseResult:
|
|
14
25
|
robot: str
|
|
@@ -35,10 +46,24 @@ def run_cross_vendor_smoke() -> QualificationSummary:
|
|
|
35
46
|
supervisor = ExecutionSupervisor()
|
|
36
47
|
goal = Goal("G1", "load", "P17", "conveyor_a", "cnc_04")
|
|
37
48
|
results: list[QualificationCaseResult] = []
|
|
38
|
-
for robot_name
|
|
49
|
+
for robot_name in V1_ROBOT_FAMILIES:
|
|
50
|
+
factory = CATALOG[robot_name]
|
|
39
51
|
resource = factory()
|
|
40
52
|
graph = planner.plan(goal, [resource])
|
|
41
53
|
world = WorldState(facts={"robot_ready", "object_available"})
|
|
42
|
-
report = supervisor.execute(
|
|
43
|
-
|
|
54
|
+
report = supervisor.execute(
|
|
55
|
+
graph,
|
|
56
|
+
[resource],
|
|
57
|
+
world,
|
|
58
|
+
DeterministicSimulationBackend(),
|
|
59
|
+
ExecutionMode.SIMULATION,
|
|
60
|
+
)
|
|
61
|
+
results.append(
|
|
62
|
+
QualificationCaseResult(
|
|
63
|
+
robot_name,
|
|
64
|
+
report.completed,
|
|
65
|
+
len(report.executed_tasks),
|
|
66
|
+
len(report.issues),
|
|
67
|
+
)
|
|
68
|
+
)
|
|
44
69
|
return QualificationSummary(tuple(results))
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from .robot_platform import (
|
|
4
|
+
ARM_CAPABILITIES,
|
|
5
|
+
BUILTIN_ROBOT_PROFILES,
|
|
6
|
+
QualificationState,
|
|
7
|
+
RobotProfile,
|
|
8
|
+
RobotQualification,
|
|
9
|
+
RosIntegration,
|
|
10
|
+
SimulationTier,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
ABB_IRB1200_PROFILE_KEY = "abb_irb1200"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _abb_irb1200_profile() -> RobotProfile:
|
|
17
|
+
"""Exact ABB IRB 1200-5/0.9 profile.
|
|
18
|
+
|
|
19
|
+
The visual/physics runtime remains EXPERIMENTAL until target-workstation
|
|
20
|
+
acceptance proves the exact Gazebo/MoveIt integration. This makes the runtime
|
|
21
|
+
available without prematurely upgrading FAT evidence authority.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
return RobotProfile(
|
|
25
|
+
key=ABB_IRB1200_PROFILE_KEY,
|
|
26
|
+
vendor="abb",
|
|
27
|
+
model="irb1200_5_90",
|
|
28
|
+
capabilities=ARM_CAPABILITIES,
|
|
29
|
+
qualification=RobotQualification(
|
|
30
|
+
{
|
|
31
|
+
SimulationTier.DETERMINISTIC: QualificationState.QUALIFIED,
|
|
32
|
+
SimulationTier.KINEMATIC: QualificationState.EXPERIMENTAL,
|
|
33
|
+
SimulationTier.PHYSICS: QualificationState.EXPERIMENTAL,
|
|
34
|
+
SimulationTier.VISUAL: QualificationState.EXPERIMENTAL,
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
ros=RosIntegration(
|
|
38
|
+
ros2_compatible=True,
|
|
39
|
+
joint_state_interface="/joint_states",
|
|
40
|
+
trajectory_interface="joint_trajectory_controller/follow_joint_trajectory",
|
|
41
|
+
robot_description="abb_irb1200_support",
|
|
42
|
+
moveit_config="abb_irb1200_5_90_moveit_config",
|
|
43
|
+
hardware_driver="abb_ros2",
|
|
44
|
+
),
|
|
45
|
+
aliases=(
|
|
46
|
+
"abb irb1200",
|
|
47
|
+
"abb irb 1200",
|
|
48
|
+
"abb irb 1200-5/0.9",
|
|
49
|
+
"abb irb1200-5/0.9",
|
|
50
|
+
"irb1200",
|
|
51
|
+
"irb1200 5 90",
|
|
52
|
+
),
|
|
53
|
+
legacy_qualification="experimental",
|
|
54
|
+
notes=(
|
|
55
|
+
"Exact ABB IRB 1200-5/0.9 ROS2 profile.",
|
|
56
|
+
"Gazebo Harmonic + gz_ros2_control + MoveIt/RViz runtime is available "
|
|
57
|
+
"as an experimental visual path until laptop acceptance is recorded.",
|
|
58
|
+
"Visual preview motion is not FAT measurement evidence and real execution "
|
|
59
|
+
"remains locked.",
|
|
60
|
+
),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def ensure_v18_robot_profiles() -> None:
|
|
65
|
+
"""Idempotently extend the built-in registry with exact v1.8 profiles."""
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
BUILTIN_ROBOT_PROFILES.get(ABB_IRB1200_PROFILE_KEY)
|
|
69
|
+
except Exception:
|
|
70
|
+
BUILTIN_ROBOT_PROFILES.register(_abb_irb1200_profile())
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def robot_support_level(profile: RobotProfile) -> str:
|
|
74
|
+
"""Return a user-facing support label that never overstates qualification."""
|
|
75
|
+
|
|
76
|
+
physics = profile.qualification.state_for(SimulationTier.PHYSICS)
|
|
77
|
+
visual = profile.qualification.state_for(SimulationTier.VISUAL)
|
|
78
|
+
kinematic = profile.qualification.state_for(SimulationTier.KINEMATIC)
|
|
79
|
+
|
|
80
|
+
if physics is QualificationState.QUALIFIED and visual is QualificationState.QUALIFIED:
|
|
81
|
+
return "SIMULATION_SUPPORTED"
|
|
82
|
+
if physics is QualificationState.EXPERIMENTAL and visual is QualificationState.EXPERIMENTAL:
|
|
83
|
+
return "SIMULATION_AVAILABLE_EXPERIMENTAL"
|
|
84
|
+
if visual is QualificationState.QUALIFIED or kinematic is QualificationState.QUALIFIED:
|
|
85
|
+
return "VISUAL_SUPPORTED"
|
|
86
|
+
if visual is QualificationState.EXPERIMENTAL or kinematic is QualificationState.EXPERIMENTAL:
|
|
87
|
+
return "VISUAL_AVAILABLE_EXPERIMENTAL"
|
|
88
|
+
return "MODEL_ONLY"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
ensure_v18_robot_profiles()
|
|
92
|
+
|
|
93
|
+
__all__ = [
|
|
94
|
+
"ABB_IRB1200_PROFILE_KEY",
|
|
95
|
+
"ensure_v18_robot_profiles",
|
|
96
|
+
"robot_support_level",
|
|
97
|
+
]
|
|
@@ -9,8 +9,10 @@ from .robot_platform import (
|
|
|
9
9
|
RobotPlatformError,
|
|
10
10
|
RobotProfileRegistry,
|
|
11
11
|
)
|
|
12
|
+
from .robot_support_v18 import ensure_v18_robot_profiles
|
|
12
13
|
|
|
13
14
|
|
|
15
|
+
ensure_v18_robot_profiles()
|
|
14
16
|
PROFILE_REGISTRY: RobotProfileRegistry = BUILTIN_ROBOT_PROFILES
|
|
15
17
|
|
|
16
18
|
|
|
@@ -34,6 +36,10 @@ def abb_irb(resource_id: str = "robot_01") -> Resource:
|
|
|
34
36
|
return _resource("abb_irb", resource_id)
|
|
35
37
|
|
|
36
38
|
|
|
39
|
+
def abb_irb1200(resource_id: str = "robot_01") -> Resource:
|
|
40
|
+
return _resource("abb_irb1200", resource_id)
|
|
41
|
+
|
|
42
|
+
|
|
37
43
|
class _RegistryBackedCatalog(Mapping[str, Callable[..., Resource]]):
|
|
38
44
|
"""Compatibility view for older core code that expects CATALOG[key]().
|
|
39
45
|
|