{"application":{"id":"3","applicationInfo":{"name":"light_tower_10_14","robotType":"UR5","createdDate":1783503413160,"lastModifiedDate":1783515041808,"defaultProgramId":null},"applicationContent":{"sourceConfig":{"labelMap":{},"analogDomainMap":{},"presets":{}},"activeOperatorScreen":"ur-operator-screen-default","smartSkills":[{"name":"Align to Plane","enabled":true,"type":"ur-align-to-plane","parameters":{"radius":0.05,"push_force":20,"n_plane_points":3,"max_distance":0.25,"velocity_slow":0.001,"velocity_search":0.035,"velocity_move":0.1,"acceleration":0.1}},{"name":"Align Z to Nearest Axis","enabled":true,"type":"ur-align-z-to-nearest-axis"},{"name":"Center","enabled":true,"type":"ur-center","parameters":{"push_force":10,"velocity_move":0.05,"acc_move":0.2,"max_radius_search":0.05,"num_fingers":3}},{"name":"Freedrive","enabled":true,"type":"ur-freedrive","version":"1.0.0","recordingFrequency":50,"recordingSignals":["timestamp","target_q","actual_TCP_pose","tcp_offset"]},{"name":"Move into Contact","enabled":true,"type":"ur-move-into-contact","parameters":{"force":10,"velocity":0.05,"acceleration":0.2,"max_distance":0.25,"retract":0},"version":"1.0.0"},{"name":"Retract","enabled":true,"type":"ur-retract","parameters":{"distance":0.1,"acceleration":0.4,"velocity":0.1},"version":"1.0.0"},{"name":"Put into Box","enabled":false,"type":"ur-put-in-box","version":"1.0.0"},{"name":"Custom","enabled":false,"type":"ur-custom-smart-skill","parameters":{"includePreamble":true,"includeModules":false},"version":"1.0.0"},{"name":"Home","enabled":true,"type":"ur-position","version":"1.1.2","parameters":{"actualWaypoint":{"frame":"base","pose":{"position":[0.0007234911264933834,-0.2333977082004337,1.0803476302965433],"orientation":[-0.0030465488234298825,2.219299153348662,-2.220820782887323]},"qNear":{"base":0,"shoulder":-1.5707963249999999,"elbow":0,"wrist1":-1.5707963249999999,"wrist2":0,"wrist3":0}},"variable":{"name":"Home","reference":false,"type":"$$Variable","valueType":"waypoint","id":"7622345a-0e52-2cf8-0ff6-3a6568b1e03a","_IDENTIFIER":"VariableDeclaration"}}}],"safety":{"settings":{"io":{"automaticModeSafeguardResetInput":{"name":"automaticModeSafeguardResetInput","valueA":255,"valueB":255},"automaticModeSafeguardStopInput":{"name":"automaticModeSafeguardStopInput","valueA":255,"valueB":255},"emergencyStopInput":{"name":"emergencyStopInput","valueA":255,"valueB":255},"notReducedModeOutput":{"name":"notReducedModeOutput","ossdEnabled":false,"valueA":255,"valueB":255},"operationalModeInput":{"name":"operationalModeInput","valueA":255,"valueB":255},"reducedModeInput":{"name":"reducedModeInput","valueA":255,"valueB":255},"reducedModeOutput":{"name":"reducedModeOutput","ossdEnabled":false,"valueA":255,"valueB":255},"robotMovingOutput":{"name":"robotMovingOutput","ossdEnabled":false,"valueA":255,"valueB":255},"robotNotStoppingOutput":{"name":"robotNotStoppingOutput","ossdEnabled":false,"valueA":255,"valueB":255},"safeHomeOutput":{"name":"safeHomeOutput","ossdEnabled":false,"valueA":255,"valueB":255},"safeguardResetInput":{"name":"safeguardResetInput","valueA":0,"valueB":1},"systemEmergencyStoppedOutput":{"name":"systemEmergencyStoppedOutput","ossdEnabled":false,"valueA":255,"valueB":255},"threePositionSwitchInput":{"name":"threePositionSwitchInput","valueA":255,"valueB":255},"freedriveEnabledInput":{"name":"freedriveEnabledInput","valueA":255,"valueB":255},"threePositionEnablingStopOutput":{"name":"threePositionEnablingStopOutput","ossdEnabled":false,"valueA":255,"valueB":255},"notThreePositionEnablingStopOutput":{"name":"notThreePositionEnablingStopOutput","ossdEnabled":false,"valueA":255,"valueB":255}},"major":5,"minor":14,"normalJointPositions":{"base":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"elbow":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"shoulder":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"wrist1":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"wrist2":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"wrist3":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false}},"normalJointSpeeds":{"base":3.3415926,"shoulder":3.3415926,"elbow":3.3415926,"wrist1":3.3415926,"wrist2":3.3415926,"wrist3":3.3415926},"normalRobotLimits":{"elbowForce":150,"elbowSpeed":1.5,"momentum":25,"power":300,"stoppingDistance":0.5,"stoppingTime":0.4,"toolForce":150,"toolSpeed":1.5},"reducedJointPositions":{"base":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"elbow":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"shoulder":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"wrist1":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"wrist2":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false},"wrist3":{"maximum":6.33555,"maximumJointPosition":0.05235988,"maximumRevolutionCounter":1,"minimum":-6.33555,"minimumJointPosition":6.2308254,"minimumRevolutionCounter":-2,"unlimited":false}},"reducedJointSpeeds":{"base":3.3415926,"shoulder":3.3415926,"elbow":3.3415926,"wrist1":3.3415926,"wrist2":3.3415926,"wrist3":3.3415926},"reducedRobotLimits":{"elbowForce":120,"elbowSpeed":0.75,"momentum":10,"power":200,"stoppingDistance":0.3,"stoppingTime":0.3,"toolForce":120,"toolSpeed":0.75},"safetyHardware":{"injectionMoldingMachineInterface":"NONE","teachPendant":"NORMAL"},"safetyPlanes":{"planes":[{"id":"e89dd1d0-8efc-4749-b0a3-344328a0068e","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"6ba29c2a-46e6-ba6e-ec90-930ca7d111c7","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"ce57234c-10e1-a66d-29d6-362597da08b9","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"6e05ab52-f94a-730c-cfdb-95c1265aab42","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"04ebb37f-7bda-efaf-39fb-e6b4f85c12f2","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"c25d0554-96c4-1f9a-dc72-9e48870c924f","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"a82b8c7b-595b-32af-118c-a9f4a079bb3c","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"},{"id":"276c328c-5058-f36e-b117-2a230e67e94a","name":"UNDEFINED","safetyPlane":{"normalModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModePlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"reducedModeTriggerPlane":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true},"tilt":0,"offset":0,"rotation":0,"restriction":"disabled"}],"ioSafetyPlanes":[{"id":"3c588faf-c35b-f291-c687-aba03a8613be","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"b911facc-69b8-e42d-76ed-3c8e386b43dd","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"cb6cacbc-37ae-83df-c79a-72455758d3e3","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"ff45458a-3580-39d7-7a07-59eda63d378f","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"a7ead258-c386-d799-6b9f-4e9b48884243","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"2a1bf9b9-cb64-e1bc-1481-3aaf69be6a03","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"dbffeead-a848-d30f-c85c-f96d425e14f6","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"},{"id":"76b63824-55a2-538b-b861-df918ea1c783","name":"UNDEFINED","ioSafetyPlane":{"triggerOutput":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"triggerSafeguard":{"distance":0,"vector":{"x":0,"y":0,"z":0}},"restrictsElbow":false,"restrictsToolFlange":true,"inputConfiguration":{"name":"UNDEFINED","valueA":255,"valueB":255},"outputConfiguration":{"name":"UNDEFINED","ossdEnabled":false,"valueA":255,"valueB":255}},"tilt":0,"offset":0,"rotation":0,"trigger":"disabled"}]},"safetySafeHome":{"base":-1,"elbow":-1,"shoulder":-1,"wrist1":-1,"wrist2":-1,"wrist3":-1,"enabled":false},"safetyAPIParameters":{"numberOfClients":0,"clients":[]},"safetyFieldbusses":{"enablePROFIsafe":false,"sourceAddressPROFIsafe":0,"destAddressPROFIsafe":0,"modeControlPROFIsafe":false},"threePosition":{"allowManualHighSpeed":true,"useTeachPendantAs3PE":false},"toolDirection":{"limitDeviation":6.2831855,"limitDirection":{"x":0,"y":0,"z":1},"limitRestriction":"DISABLED","tcp":{"id":"toolFlangeTcpId","name":"Tool_flange"},"toolPan":0,"toolTilt":0,"limitTilt":0,"limitRotation":0},"toolPositions":{"toolPositions":[{"name":"Tool Flange","center":{"x":0,"y":0,"z":0},"radius":0,"definition":2},{"name":"UNDEFINED","center":{"x":0,"y":0,"z":0},"radius":0,"definition":0},{"name":"UNDEFINED","center":{"x":0,"y":0,"z":0},"radius":0,"definition":0}]},"normalWristClamp":{"enableWristClampPosition":"LIMIT_ENABLED","enableWristClampTorque":"LIMIT_ENABLED"},"reducedWristClamp":{"enableWristClampPosition":"LIMIT_ENABLED","enableWristClampTorque":"LIMIT_ENABLED"}},"crc":"2850523693","confirmed":true},"operatorScreens":[{"type":"ur-operator-screen-default","version":"0.0.2","parameters":{"status":[],"configuration":[]}}],"applicationContributions":{"ur-mounting":{"type":"ur-mounting","version":"0.0.1","mounting":{"baseAngle":{"value":0,"unit":"deg"},"tiltAngle":{"value":0,"unit":"deg"}}},"ur-frames":{"type":"ur-frames","version":"0.0.7","framesList":[{"name":"base","nameVariable":{"name":"base","reference":false,"type":"$$Variable","valueType":"frame","id":"583d3a7d-b103-aff9-502d-73d459fc2a0e","_IDENTIFIER":"VariableDeclaration"},"parent":"world","pose":{"position":[0,0,0],"orientation":[0,0,0]}},{"name":"tcp","nameVariable":{"name":"tcp","reference":false,"type":"$$Variable","valueType":"frame","id":"1debc310-2146-1b93-ebf3-6e257bfdd2da","_IDENTIFIER":"VariableDeclaration"},"parent":"flange","pose":{"position":[0,0,0],"orientation":[0,0,0]}},{"name":"world","nameVariable":{"name":"world","reference":false,"type":"$$Variable","valueType":"frame","id":"ddca5ccc-8f81-8461-2a8f-935321f2bf01","_IDENTIFIER":"VariableDeclaration"},"pose":{"position":[0,0,0],"orientation":[0,0,0]}},{"name":"flange","nameVariable":{"name":"flange","reference":false,"type":"$$Variable","valueType":"frame","id":"a284652e-3e38-9434-2e20-eae9dd10bd79","_IDENTIFIER":"VariableDeclaration"},"parent":"base","pose":{"position":[0,0,0],"orientation":[0,0,0]}}]},"ur-grid-pattern":{"type":"ur-grid-pattern","version":"0.0.3","grids":[{"grid":{"name":"grid","reference":false,"type":"$$Variable","valueType":"grid","id":"af733917-cce3-4b11-fb24-7e6677ff572e","_IDENTIFIER":"VariableDeclaration"},"waypoint":{"name":"grid_iterator","reference":false,"type":"$$Variable","valueType":"waypoint","id":"68ebd02e-0a2d-ad92-c6de-c677a19dddf0","_IDENTIFIER":"VariableDeclaration"},"corners":[null,null,null,null],"numRows":4,"numColumns":5}]},"ur-end-effector":{"type":"ur-end-effector","version":"0.0.2","endEffectors":[{"id":"ff024c69-09b0-7f9a-4337-82a774fe7b8f","name":"Robot","payload":{"weight":{"value":0,"unit":"kg"}},"cog":{"cx":{"value":0,"unit":"m"},"cy":{"value":0,"unit":"m"},"cz":{"value":0,"unit":"m"}},"inertia":{"Ixx":{"value":0,"unit":"kg*m^2"},"Iyy":{"value":0,"unit":"kg*m^2"},"Izz":{"value":0,"unit":"kg*m^2"},"Ixy":{"value":0,"unit":"kg*m^2"},"Ixz":{"value":0,"unit":"kg*m^2"},"Iyz":{"value":0,"unit":"kg*m^2"}},"useCustomInertia":false,"tcps":[{"id":"9d2f3820-89cc-9b9d-0d28-d03387086ed9","name":"Tool_flange","x":{"value":0,"unit":"m"},"y":{"value":0,"unit":"m"},"z":{"value":0,"unit":"m"},"rx":{"value":0,"unit":"rad"},"ry":{"value":0,"unit":"rad"},"rz":{"value":0,"unit":"rad"}}]}],"defaultTcp":{"endEffectorId":"ff024c69-09b0-7f9a-4337-82a774fe7b8f","tcpId":"9d2f3820-89cc-9b9d-0d28-d03387086ed9"}},"ur-motion-profiles":{"type":"ur-motion-profiles","version":"0.0.1","moveProfiles":{"joint":[{"isDefault":false,"profile":{"name":"Joint_fast","reference":false,"type":"$$Variable","valueType":"profile","id":"66cc9640-9626-20a9-b6be-e75938fdf603","_IDENTIFIER":"VariableDeclaration"},"parameters":{"speedType":"OptiMove","speed":{"entity":{"value":1.0471975511965976,"unit":"rad/s"},"selectedType":"VALUE","value":1.0471975511965976},"acceleration":{"entity":{"value":1.3962634015954636,"unit":"rad/s^2"},"selectedType":"VALUE","value":1.3962634015954636},"optiMoveSpeed":{"entity":{"value":50,"unit":"%"},"selectedType":"VALUE","value":50},"optiMoveAcceleration":{"entity":{"value":25,"unit":"%"},"selectedType":"VALUE","value":25}}},{"isDefault":true,"profile":{"name":"Joint_slow","reference":false,"type":"$$Variable","valueType":"profile","id":"0e781f7a-4120-999b-9eb9-c25c1dc8d0c8","_IDENTIFIER":"VariableDeclaration"},"parameters":{"speedType":"OptiMove","speed":{"entity":{"value":1.0471975511965976,"unit":"rad/s"},"selectedType":"VALUE","value":1.0471975511965976},"acceleration":{"entity":{"value":1.3962634015954636,"unit":"rad/s^2"},"selectedType":"VALUE","value":1.3962634015954636},"optiMoveSpeed":{"entity":{"value":20,"unit":"%"},"selectedType":"VALUE","value":20},"optiMoveAcceleration":{"entity":{"value":4,"unit":"%"},"selectedType":"VALUE","value":4}}}],"linear":[{"isDefault":false,"profile":{"name":"Linear_fast","reference":false,"type":"$$Variable","valueType":"profile","id":"2faf9dcd-a026-b177-e610-2044e80f9d1a","_IDENTIFIER":"VariableDeclaration"},"parameters":{"speedType":"OptiMove","speed":{"entity":{"value":0.25,"unit":"m/s"},"selectedType":"VALUE","value":0.25},"acceleration":{"entity":{"value":1.2,"unit":"m/s^2"},"selectedType":"VALUE","value":1.2},"optiMoveSpeed":{"entity":{"value":50,"unit":"%"},"selectedType":"VALUE","value":50},"optiMoveAcceleration":{"entity":{"value":25,"unit":"%"},"selectedType":"VALUE","value":25}}},{"isDefault":true,"profile":{"name":"Linear_slow","reference":false,"type":"$$Variable","valueType":"profile","id":"f9fc918f-21e5-f43d-8029-5ab979f2ce28","_IDENTIFIER":"VariableDeclaration"},"parameters":{"speedType":"OptiMove","speed":{"entity":{"value":0.25,"unit":"m/s"},"selectedType":"VALUE","value":0.25},"acceleration":{"entity":{"value":1.2,"unit":"m/s^2"},"selectedType":"VALUE","value":1.2},"optiMoveSpeed":{"entity":{"value":20,"unit":"%"},"selectedType":"VALUE","value":20},"optiMoveAcceleration":{"entity":{"value":4,"unit":"%"},"selectedType":"VALUE","value":4}}}],"process":[{"isDefault":true,"profile":{"name":"Process","reference":false,"type":"$$Variable","valueType":"profile","id":"854474bd-bfb7-9f87-49da-48a03f2d574c","_IDENTIFIER":"VariableDeclaration"},"parameters":{"speedType":"Classic","speed":{"entity":{"value":0.25,"unit":"m/s"},"selectedType":"VALUE","value":0.25},"acceleration":{"entity":{"value":1.2,"unit":"m/s^2"},"selectedType":"VALUE","value":1.2}}}]}},"ur-smart-skills":{"type":"ur-smart-skills","version":"0.0.3","preamble":"# Start of Forces\n###\n# Transforms the force and torque values along the axes of the given pose\n# @param pose pose Any valid pose, defaults to base, the x, y, and z values are ignored\n# @return array 6D force torque vector with [Fx, Fy, Fz, Mx, My, Mz] aligned to pose in N and Nm respectively\n###\ndef get_tcp_wrench_in_frame(pose = p[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]):\n    # we are only interested in the rotation of pose, set translations to zero\n    local target_pose = pose\n    target_pose[0] = 0\n    target_pose[1] = 0\n    target_pose[2] = 0\n    # the conversion needs to happen as poses, so we need to convert back and forth a bit\n    local force = get_tcp_force()\n    local force_vector_as_pose = p[force[0], force[1], force[2], 0, 0, 0]\n    local torque_vector_as_pose = p[force[3], force[4], force[5], 0, 0, 0]\n    local transformed_force_as_pose = pose_trans(pose_inv(target_pose), force_vector_as_pose)\n    local transformed_torque_as_pose = pose_trans(pose_inv(target_pose), torque_vector_as_pose)\n    return [transformed_force_as_pose[0], transformed_force_as_pose[1], transformed_force_as_pose[2], transformed_torque_as_pose[0], transformed_torque_as_pose[1], transformed_torque_as_pose[2]]\nend\n###\n# See documentation for @link:get_tcp_wrench_in_frame()\n# @return forces and torques measured in TCP frame\n###\ndef get_tcp_wrench():\n    return get_tcp_wrench_in_frame(get_target_tcp_pose())\nend\n###\n# Projects the measured TCP force along the axis given\n# @param axis array 3D vector\n###\ndef project_tcp_force(axis):\n    local wrench = get_tcp_wrench()\n    local force = [wrench[0], wrench[1], wrench[2]]\n    return dot(force, axis)\nend\n# End of Forces\n# Start of Math\n# Definitions of constants\nglobal PI = acos(-1)\n###\n# Calculates the cross product between to 3D vectors\n# @param v1 array 3D vector\n# @param v2 array 3D vector\n###\ndef cross(v1, v2):\n    if length(v1) != length(v2):\n        popup(str_cat(\"For computing the cross product, the two vectors must have the same length. Provided lengths: \", [length(v1), length(v2)]), error=True, blocking=True)\n        return -1\n    end\n    if length(v1) != 3:\n        popup(str_cat(\"For computing the cross product, the two vectors must have length 3. Provided lengths: \", [length(v1), length(v2)]), error=True, blocking=True)\n        return -1\n    end\n    local cross = [0.0, 0.0, 0.0]\n    local i = 0\n    while i < 3:\n        local j = (i + 1) % 3 # The next index in a cyclic order\n        local k = (i + 2) % 3 # The next next index in a cyclic order\n        cross[i] = v1[j] * v2[k] - v1[k] * v2[j]\n        i = i + 1\n    end\n    return cross\nend\n###\n# Calculates the dot product between to n-dimensional vectors\n# @param v1 array nD vector\n# @param v2 array nD vector\n###\ndef dot(v1, v2):\n    if length(v1) != length(v2):\n        popup(str_cat(\"For computing the dot product, the two vectors must have the same length. Provided lengths: \", [length(v1), length(v2)]), error=True, blocking=True)\n        return -1\n    end\n    local result = 0\n    local i = 0\n    while i < length(v1):\n        result = result + (v1[i] * v2[i])\n        i = i + 1\n    end\n    return result\nend\n###\n# Return the larger number of a and b\n# @param a number a\n# @param b number b\n###\ndef max(a, b):\n    if a > b:\n        return a\n    end\n    return b\nend\n###\n# Find the maximum value in a list. The list must be of non-zero length and contain numbers\n# @param list array list\n###\ndef list_max(list):\n    local length = get_list_length(list)\n    if  length == 0:\n        popup(\"Getting the maximum of an empty list is impossible in list_max().\", error = True, blocking = True)\n        halt\n    end\n    local i = 0\n    local max = list[0]\n    while i < length:\n        if list[i] > max:\n            max = list[i]\n        end\n        i = i + 1\n        sync_at_multiple(i, 30)\n    end\n    return max\nend\ndef sync_at_multiple(i, n):\n    local tmp = i / n\n    if tmp == floor(tmp):\n        sync()\n    end\nend\n# End of Math\n# Start of Move Helper\nur_move_until_force_distance = 0.1\nur_move_until_force_direction = [0, 0, 1]\nur_move_until_force_velocity = 0.1\nur_move_until_force_acceleration = 0.2\ndef ur_move_tcp_direction(distance, direction, velocity, acceleration, blend_radius):\n    local current_pose = get_target_tcp_pose()\n    local movement = normalize(direction) * distance\n    local target_pose = pose_trans(current_pose, p[movement[0], movement[1], movement[2], 0, 0, 0])\n    movel(target_pose, a = 0.2, v = velocity, r = blend_radius)\nend\nthread ur_move_until_force_thread():\n    ur_move_tcp_direction(ur_move_until_force_distance, ur_move_until_force_direction, ur_move_until_force_velocity, ur_move_until_force_acceleration, 0)\n    popup(\"No contact detected.\", title = \"No Contact\", warning = False, error = True, blocking = False)\n    halt\nend\n###\n# Moves the robot in the TCP direction specified until a contact point is reached *or*\n# the robot reaches the maximum distance allowed specified by the distance parameter.\n# @param distance number The maximum distance the robot is allowed to travel in the direction specified\n# @param direction array 3D vector determining the move direction of the TCP\n# @param velocity number Velocity of the robot\n# @param acceleration number Acceleration of the robot\n# @param stop_force number Maximum search radius\n###\ndef ur_move_until_force(distance = 0.1, direction = [0, 0, 1], velocity = 0.1, acceleration = 0.2, stop_force = 20):\n    ur_move_until_force_distance = distance\n    ur_move_until_force_direction = direction\n    ur_move_until_force_velocity = velocity\n    ur_move_until_force_acceleration = acceleration\n    \n    thrd = run ur_move_until_force_thread()\n    while - project_tcp_force(direction) < stop_force:\n        sync()\n    end\n    kill thrd\n    local actual_pose = get_actual_tcp_pose()\n    stopl(1.0)\n    return actual_pose\nend\ndef ur_get_joint_speeds_before_offset(previous_q, time):\n    local current_q = get_joint_positions()\n    local delta_q = current_q - previous_q\n    return delta_q / time\nend\ndef ur_path_move(end_q, v, rampdown=False):\n    # Calculate distance to target\n    local start_q = get_joint_positions()\n    local delta_q = end_q - start_q\n    local positive_delta_q = [norm(delta_q[0]), norm(delta_q[1]), norm(delta_q[2]), norm(delta_q[3]), norm(delta_q[4]), norm(delta_q[5])]\n    # Calculate time to move based on desired velocity\n    local t = list_max(positive_delta_q) / v\n    servoj(end_q , 0, 0, t, lookahead_time=0.1, gain=500)\n    if(rampdown):\n        while(norm(ur_get_joint_speeds_before_offset(start_q, t)) > 0.0001):\n            t = max(t, 0.001)\n            start_q = get_joint_positions()\n            servoj(end_q , 0, 0, t)\n        end\n    end\nend\n# End of Move Helper"},"ur-application-variables":{"type":"ur-application-variables","version":"0.0.1","variables":{}},"ur-urconnect-application":{"type":"ur-urconnect-application","version":"1.0.0"}},"sidebarItems":[{"type":"ur-global-variables","version":"1.0.0","disabled":{"master":false,"automaticMode":false,"remoteMode":true}},{"type":"ur-log-messages-sidebar","version":"0.0.1","disabled":{"master":false,"automaticMode":false,"remoteMode":true}}],"logicPrograms":{"395b37c7-c41b-a6c0-b2a8-14d8ccf94a54":{"id":"395b37c7-c41b-a6c0-b2a8-14d8ccf94a54","programContent":{"children":[{"children":[],"contributedNode":{"type":"ur-modules","version":"0.0.1","allowsChildren":true,"lockChildren":false},"guid":"5f8867ec-c815-bf15-719e-ad8333e11b6b","parentId":"fc2ba7ab-7ba4-a041-19ec-271124f0e475","programType":"logic"},{"children":[{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-comment","version":"0.0.1","parameters":{"comment":"Struct with data for current light"}},"guid":"afd1929b-eac2-cbf7-6f17-f4150cd8c822","parentId":"8bf199ba-aff2-e789-1655-0aa180f60309","programLabel":[{"type":"secondary","value":"Struct with data for current light"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"light","id":"441febb0-40f9-5a25-6c3d-066958f94a8f","valueType":"array","_IDENTIFIER":"VariableDeclaration","reference":false,"type":"$$Variable","declaredByID":"98671d76-e74d-70da-c25f-fe9e7e94ba8e"},"selectedType":"EXPRESSION","value":"lights[light_id]"},"valueType":"array","waypointType":"teach"}},"guid":"98671d76-e74d-70da-c25f-fe9e7e94ba8e","parentId":"8bf199ba-aff2-e789-1655-0aa180f60309","programLabel":[{"type":"primary","value":"light:"},{"type":"secondary","value":"lights[light_id]"}],"programType":"logic"},{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-comment","version":"0.0.1","parameters":{"comment":"Toggle blinking light"}},"guid":"22e2f067-415e-7017-0526-5c07001ecd04","parentId":"58fed0ef-149a-2b8d-b4c8-c90b6aa356d2","programLabel":[{"type":"secondary","value":"Toggle blinking light"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"io_set(\"CB_DO\" + to_str(light_id + 3), not io_get(\"CB_DO\" + to_str(light_id + 3)))","valid":true}},"guid":"1b622a1a-8ab0-af0d-2d75-117b260e47ce","parentId":"58fed0ef-149a-2b8d-b4c8-c90b6aa356d2","programLabel":"io_set(\"CB_DO\" + to_str(light_id + 3), not io_get(\"CB_DO\" + to_str(light_id + 3)))","programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights[light_id].t_s = get_timestamp_s()","valid":true}},"guid":"462450b3-313a-289a-c8b8-131b7dbb50a2","parentId":"58fed0ef-149a-2b8d-b4c8-c90b6aa356d2","programLabel":"lights[light_id].t_s = get_timestamp_s()","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"light.duration_s != 0 and get_timestamp_s() > light.t_s + light.duration_s"}}},"guid":"58fed0ef-149a-2b8d-b4c8-c90b6aa356d2","parentId":"423ddf99-c26a-5a3b-c81c-49b78fc99e86","programLabel":[{"type":"secondary","value":"light.duration_s != 0 and get_timestamp_s() > light.t_s + light.duration_s"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-comment","version":"0.0.1","parameters":{"comment":"Just turn on"}},"guid":"04219ec7-0053-d2f1-59c3-97315e7dcc2f","parentId":"b5f91a92-fb64-720c-0d42-72a655879332","programLabel":[{"type":"secondary","value":"Just turn on"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"io_set(\"CB_DO\" + to_str(light_id + 3), True)","valid":true}},"guid":"cdc843bd-3c47-0a26-389f-21ceb4d2667a","parentId":"b5f91a92-fb64-720c-0d42-72a655879332","programLabel":"io_set(\"CB_DO\" + to_str(light_id + 3), True)","programType":"logic"}],"contributedNode":{"type":"ur-elseif","version":"0.0.2","allowsChildren":true,"parameters":{"expression":{"selectedType":"EXPRESSION","value":"light.duration_s == 0"}}},"guid":"b5f91a92-fb64-720c-0d42-72a655879332","parentId":"423ddf99-c26a-5a3b-c81c-49b78fc99e86","programLabel":[{"type":"secondary","value":"light.duration_s == 0"}],"programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"light.on == True"}}},"guid":"423ddf99-c26a-5a3b-c81c-49b78fc99e86","parentId":"8bf199ba-aff2-e789-1655-0aa180f60309","programLabel":[{"type":"secondary","value":"light.on == True"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-comment","version":"0.0.1","parameters":{"comment":"Turn light off"}},"guid":"b77d4145-ad00-423d-fa36-615aabf3e896","parentId":"924d277a-3d66-df08-5b3b-c8192b275e0e","programLabel":[{"type":"secondary","value":"Turn light off"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"io_set(\"CB_DO\" + to_str(light_id + 3), False)","valid":true}},"guid":"e7436a13-bf77-d66b-b96f-a16bf4f10f94","parentId":"924d277a-3d66-df08-5b3b-c8192b275e0e","programLabel":"io_set(\"CB_DO\" + to_str(light_id + 3), False)","programType":"logic"}],"contributedNode":{"type":"ur-else","version":"0.0.1","allowsChildren":true,"parameters":{}},"guid":"924d277a-3d66-df08-5b3b-c8192b275e0e","parentId":"8bf199ba-aff2-e789-1655-0aa180f60309","programLabel":"","programType":"logic"}],"contributedNode":{"type":"ur-loop","version":"0.0.2","allowsChildren":true,"parameters":{"type":"xtimes","expression":{"value":"","selectedType":"EXPRESSION"},"xtimes":"5","loopVariable":{"name":"light_id","reference":false,"type":"$$Variable","valueType":"integer","declaredByID":"8bf199ba-aff2-e789-1655-0aa180f60309"}}},"guid":"8bf199ba-aff2-e789-1655-0aa180f60309","parentId":"b873e83a-365f-32ba-322f-c79ee8e93d03","programLabel":[{"type":"secondary","translationKey":"program-node-label.loop.times","interpolateParams":{"xtimes":"5"}}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"sync()","valid":true}},"guid":"69bcb55e-3cdf-40f8-6605-4fd25338ef8c","parentId":"b873e83a-365f-32ba-322f-c79ee8e93d03","programLabel":"sync()","programType":"logic"}],"contributedNode":{"type":"ur-function","version":"0.0.3","allowsChildren":true,"parameters":{"isAsync":true,"function":{"name":"light_tower_thread","id":"68c3a3ef-ca87-2e39-091a-18fe7bd4790d","_IDENTIFIER":"FunctionDeclaration","reference":false,"type":"$$Function","declaredByID":"b873e83a-365f-32ba-322f-c79ee8e93d03"},"isLooping":true}},"guid":"b873e83a-365f-32ba-322f-c79ee8e93d03","parentId":"eb827e12-73da-82ea-f438-66952b0458bd","programType":"logic","programLabel":[{"type":"primary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"light_tower_thread"}}]},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"t","id":"9d47aebd-13b7-7064-dacf-93a0c556c781","valueType":"integer","_IDENTIFIER":"VariableDeclaration","reference":false,"type":"$$Variable","declaredByID":"d7dafcfa-8d05-2b98-c093-588c55cc9268"},"selectedType":"EXPRESSION","value":"time()"},"valueType":"integer","waypointType":"teach"}},"guid":"d7dafcfa-8d05-2b98-c093-588c55cc9268","parentId":"4fff03fc-16a6-56a1-c1d4-6db2920455a7","programLabel":[{"type":"primary","value":"t:"},{"type":"secondary","value":"time()"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"return t.sec + t.nanosec / 1000000000","valid":true}},"guid":"0323f933-05c5-44c6-6df8-fbbdfc68500f","parentId":"4fff03fc-16a6-56a1-c1d4-6db2920455a7","programLabel":"return t.sec + t.nanosec / 1000000000","programType":"logic"}],"contributedNode":{"type":"ur-function","version":"0.0.3","allowsChildren":true,"parameters":{"isAsync":false,"function":{"name":"get_timestamp_s","id":"a93b0218-9c47-fcfe-0c7f-8a7f9b90bb69","_IDENTIFIER":"FunctionDeclaration","reference":false,"type":"$$Function","declaredByID":"4fff03fc-16a6-56a1-c1d4-6db2920455a7"},"isLooping":false}},"guid":"4fff03fc-16a6-56a1-c1d4-6db2920455a7","parentId":"eb827e12-73da-82ea-f438-66952b0458bd","programType":"logic","programLabel":[{"type":"primary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"get_timestamp_s"}}]},{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights[light_id2].on = False","valid":true}},"guid":"8f26be10-0503-81ed-b4b0-fdd32b32ad7d","parentId":"f7efd6f1-f025-1c14-2ade-36324da0f40c","programLabel":"lights[light_id2].on = False","programType":"logic"}],"contributedNode":{"type":"ur-loop","version":"0.0.2","allowsChildren":true,"parameters":{"type":"xtimes","expression":{"value":"","selectedType":"EXPRESSION"},"xtimes":"5","loopVariable":{"name":"light_id2","reference":false,"type":"$$Variable","valueType":"integer","declaredByID":"f7efd6f1-f025-1c14-2ade-36324da0f40c"}}},"guid":"f7efd6f1-f025-1c14-2ade-36324da0f40c","parentId":"a92213f0-35ae-48f4-424a-fe752110cc28","programLabel":[{"type":"secondary","translationKey":"program-node-label.loop.times","interpolateParams":{"xtimes":"5"}}],"programType":"logic"}],"contributedNode":{"type":"ur-function","version":"0.0.3","allowsChildren":true,"parameters":{"isAsync":false,"function":{"name":"reset_lights","id":"87aee5e7-62b6-cb54-748a-0aafc1a79be3","_IDENTIFIER":"FunctionDeclaration","reference":false,"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28"},"isLooping":false}},"guid":"a92213f0-35ae-48f4-424a-fe752110cc28","parentId":"eb827e12-73da-82ea-f438-66952b0458bd","programType":"logic","programLabel":[{"type":"primary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"reset_lights"}}]},{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"safety_status","reference":false,"type":"$$Variable","valueType":"integer","id":"c7206784-9ac6-e7c1-f49c-b71eec5869fb","_IDENTIFIER":"VariableDeclaration","declaredByID":"a94a5123-da0e-5158-4caa-ef74f5a8bfe4"},"selectedType":"EXPRESSION","value":"control_api_handle.robot_safety_status()"},"waypointType":"teach","valueType":"integer"}},"guid":"a94a5123-da0e-5158-4caa-ef74f5a8bfe4","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":[{"type":"primary","value":"safety_status:"},{"type":"secondary","value":"control_api_handle.robot_safety_status()"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"program_status","reference":false,"type":"$$Variable","valueType":"integer","id":"2ce28a03-6fd0-a810-f1c7-69020112d061","_IDENTIFIER":"VariableDeclaration","declaredByID":"3cbccb98-9300-76fa-1ced-b06ee7b0602f","suppressed":false},"selectedType":"EXPRESSION","value":"control_api_handle.robot_program_state()"},"waypointType":"teach","valueType":"integer"},"isSuppressed":false},"guid":"3cbccb98-9300-76fa-1ced-b06ee7b0602f","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":[{"type":"primary","value":"program_status:"},{"type":"secondary","value":"control_api_handle.robot_program_state()"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"robot_mode","reference":false,"type":"$$Variable","valueType":"integer","id":"4e3afb0f-8029-9660-c50d-bcbe0fc0cb31","_IDENTIFIER":"VariableDeclaration","declaredByID":"a309ac46-c9ad-65dc-70d2-733583976052"},"selectedType":"EXPRESSION","value":"control_api_handle.robot_mode()"},"waypointType":"teach","valueType":"integer"}},"guid":"a309ac46-c9ad-65dc-70d2-733583976052","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":[{"type":"primary","value":"robot_mode:"},{"type":"secondary","value":"control_api_handle.robot_mode()"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"textmsg(\"program status \"+to_str(program_status) + \" - \" +to_str(safety_status) + \" safety status - robot mode \" +to_str(robot_mode))","valid":true},"isSuppressed":true},"guid":"d35e6a78-67be-21cf-bef1-e856527bf9a2","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":"textmsg(\"program status \"+to_str(program_status) + \" - \" +to_str(safety_status) + \" safety status - robot mode \" +to_str(robot_mode))","programType":"logic"},{"children":[],"contributedNode":{"type":"ur-wait","version":"0.0.4","parameters":{"type":"time","time":{"entity":{"value":1,"unit":"s"},"selectedType":"VALUE","value":1}},"isSuppressed":true},"guid":"36ab1aa4-c329-6d6a-56f1-8e0935b8e544","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":[{"type":"secondary","value":"1.00 s"}],"programType":"logic"},{"children":[{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"status_text","reference":false,"type":"$$Variable","valueType":"string","id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableDeclaration","declaredByID":"0d66d687-fa5d-1d85-9f84-f30e1808526b"},"selectedType":"VALUE","value":"\"Ready for run\""},"waypointType":"teach","valueType":"string"}},"guid":"0d66d687-fa5d-1d85-9f84-f30e1808526b","parentId":"bd006f11-c75d-6a3b-c712-d2b69d027099","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Ready for run\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"3e2692fd-05e8-e938-7fa5-f3e452edab9d","parentId":"bd006f11-c75d-6a3b-c712-d2b69d027099","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.green.on = True lights.green.duration_s = 0.7","valid":true}},"guid":"dcf5edad-70e5-ff3a-a659-b74d9a6e8165","parentId":"bd006f11-c75d-6a3b-c712-d2b69d027099","programLabel":"lights.green.on = True lights.green.duration_s = 0.7","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"program_status == 1 or program_status == 4"}}},"guid":"bd006f11-c75d-6a3b-c712-d2b69d027099","parentId":"d43d91ec-f637-951b-5cc3-29e53169bd17","programLabel":[{"type":"secondary","value":"program_status == 1 or program_status == 4"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Running\""},"waypointType":"teach","valueType":"string"}},"guid":"52210f9b-24cb-e77c-aff4-0e8215fe1f10","parentId":"0d0b19cc-66a6-1da4-b1dc-8a2cf467d124","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Running\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"0d314319-5348-4397-c703-b43acd51776b","parentId":"0d0b19cc-66a6-1da4-b1dc-8a2cf467d124","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.green.on = True lights.green.duration_s = 0","valid":true}},"guid":"b66229e6-49f4-d336-ebb9-626e26ae7718","parentId":"0d0b19cc-66a6-1da4-b1dc-8a2cf467d124","programLabel":"lights.green.on = True lights.green.duration_s = 0","programType":"logic"}],"contributedNode":{"type":"ur-elseif","version":"0.0.2","allowsChildren":true,"parameters":{"expression":{"selectedType":"EXPRESSION","value":"program_status == 2"}}},"guid":"0d0b19cc-66a6-1da4-b1dc-8a2cf467d124","parentId":"d43d91ec-f637-951b-5cc3-29e53169bd17","programLabel":[{"type":"secondary","value":"program_status == 2"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Resuming...\""},"waypointType":"teach","valueType":"string"}},"guid":"4346f72f-9796-dbbf-e73a-e8c63b10fd89","parentId":"b26f37e1-3f88-4122-4ab1-6154cda8ef54","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Resuming...\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"2be563a2-28fe-51e0-e284-72d6940dd805","parentId":"b26f37e1-3f88-4122-4ab1-6154cda8ef54","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.green.on = True lights.green.duration_s = 0.15","valid":true}},"guid":"6dcae6ff-9217-f6c1-7674-370d2a419978","parentId":"b26f37e1-3f88-4122-4ab1-6154cda8ef54","programLabel":"lights.green.on = True lights.green.duration_s = 0.15","programType":"logic"}],"contributedNode":{"type":"ur-else","version":"0.0.1","allowsChildren":true,"parameters":{}},"guid":"b26f37e1-3f88-4122-4ab1-6154cda8ef54","parentId":"d43d91ec-f637-951b-5cc3-29e53169bd17","programLabel":"","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"robot_mode == 7 and safety_status == 1"}}},"guid":"d43d91ec-f637-951b-5cc3-29e53169bd17","parentId":"93865708-12a4-1439-0b06-87181f29c981","programLabel":[{"type":"secondary","value":"robot_mode == 7 and safety_status == 1"}],"programType":"logic"}],"contributedNode":{"type":"ur-folder","version":"0.0.1","allowsChildren":true,"parameters":{"folderName":"Green: robot running or ready for run"}},"guid":"93865708-12a4-1439-0b06-87181f29c981","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":"Green: robot running or ready for run","programType":"logic"},{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Protective stop\""},"waypointType":"teach","valueType":"string"}},"guid":"7019d411-9a3c-6a45-235e-1c9e431d0ff7","parentId":"eecd7024-c568-33eb-c10c-bc6e73ea5ced","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Protective stop\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"3710e211-6872-fce6-cbd4-6dbfbf5773bf","parentId":"eecd7024-c568-33eb-c10c-bc6e73ea5ced","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.yellow.on = True lights.yellow.duration_s = 0.2","valid":true}},"guid":"e92d52aa-90c7-1f48-0809-f1ab2041b033","parentId":"eecd7024-c568-33eb-c10c-bc6e73ea5ced","programLabel":"lights.yellow.on = True lights.yellow.duration_s = 0.2","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"safety_status == 3"}}},"guid":"eecd7024-c568-33eb-c10c-bc6e73ea5ced","parentId":"5638e708-1ea9-fb3f-8f32-e770d751781d","programLabel":[{"type":"secondary","value":"safety_status == 3"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Booting and locked\""},"waypointType":"teach","valueType":"string"}},"guid":"89bf3b9f-6aa7-754c-b4f0-534369aa988e","parentId":"893f7d01-e7b9-9be6-e89f-3c7733be4484","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Booting and locked\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"0c26acce-0b6a-accc-6b5d-0140e7ce26a4","parentId":"893f7d01-e7b9-9be6-e89f-3c7733be4484","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.yellow.on = True lights.yellow.duration_s = 0","valid":true}},"guid":"5e9ca425-2b61-3bb8-3faa-079a2802f868","parentId":"893f7d01-e7b9-9be6-e89f-3c7733be4484","programLabel":"lights.yellow.on = True lights.yellow.duration_s = 0","programType":"logic"}],"contributedNode":{"type":"ur-elseif","version":"0.0.2","allowsChildren":true,"parameters":{"expression":{"selectedType":"EXPRESSION","value":"program_status ==1 and safety_status ==1 and (robot_mode ==2 or robot_mode == 5)"}}},"guid":"893f7d01-e7b9-9be6-e89f-3c7733be4484","parentId":"5638e708-1ea9-fb3f-8f32-e770d751781d","programLabel":[{"type":"secondary","value":"program_status ==1 and safety_status ==1 and (robot_mode ==2 or robot_mode == 5)"}],"programType":"logic"}],"contributedNode":{"type":"ur-folder","version":"0.0.1","allowsChildren":true,"parameters":{"folderName":"Yellow - Safety lock"}},"guid":"5638e708-1ea9-fb3f-8f32-e770d751781d","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":"Yellow - Safety lock","programType":"logic"},{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Quit Fault error\""},"waypointType":"teach","valueType":"string"}},"guid":"5f854376-d37a-21b3-4a73-1e7022f34d57","parentId":"d7e90e59-6fc6-a4bd-b1be-a3d2dc0513e5","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Quit Fault error\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"6911498c-0f5e-20fc-ce08-dd7fe16e6ff7","parentId":"d7e90e59-6fc6-a4bd-b1be-a3d2dc0513e5","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.red.on = True lights.red.duration_s = 0.2","valid":true}},"guid":"16b5cfb9-9c22-6cb5-104b-58aba1cce2f9","parentId":"d7e90e59-6fc6-a4bd-b1be-a3d2dc0513e5","programLabel":"lights.red.on = True lights.red.duration_s = 0.2","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"program_status ==4 and safety_status ==1 and robot_mode == 5"}}},"guid":"d7e90e59-6fc6-a4bd-b1be-a3d2dc0513e5","parentId":"bf368aa4-c770-5ebc-30bb-d4eed331780a","programLabel":[{"type":"secondary","value":"program_status ==4 and safety_status ==1 and robot_mode == 5"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Powered off or estop\""},"waypointType":"teach","valueType":"string"}},"guid":"1652a3d1-3f99-0b9a-1d86-fe8c4b1ecf75","parentId":"10840db9-c6dd-d5fe-fb8f-59a775d18fba","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Powered off or estop\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"d5cc5535-860f-061b-689d-eed8194608dd","parentId":"10840db9-c6dd-d5fe-fb8f-59a775d18fba","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.red.on = True lights.red.duration_s = 0","valid":true}},"guid":"766906eb-5185-1b0c-d2fa-26bf2ea77fdf","parentId":"10840db9-c6dd-d5fe-fb8f-59a775d18fba","programLabel":"lights.red.on = True lights.red.duration_s = 0","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"robot_mode ==3 or safety_status == 7 or safety_status == 6"}}},"guid":"10840db9-c6dd-d5fe-fb8f-59a775d18fba","parentId":"bf368aa4-c770-5ebc-30bb-d4eed331780a","programLabel":[{"type":"secondary","value":"robot_mode ==3 or safety_status == 7 or safety_status == 6"}],"programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-call-function","version":"0.0.2","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedFunction":{"type":"$$Function","declaredByID":"a92213f0-35ae-48f4-424a-fe752110cc28","name":"reset_lights","reference":true}}},"guid":"79c2ea8b-580c-667c-5042-ab8f1b1e7779","parentId":"13223752-b957-a0fd-5aa3-1c014e1eef70","programLabel":[{"type":"primary","value":"reset_lights"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"},"selectedType":"VALUE","value":"\"Safety fault\""},"waypointType":"teach","valueType":"string"}},"guid":"ec9af594-45a2-53ae-cabf-40a9e997e11f","parentId":"13223752-b957-a0fd-5aa3-1c014e1eef70","programLabel":[{"type":"primary","value":"status_text:"},{"type":"secondary","value":"\"Safety fault\""}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"lights.red.on = True lights.red.duration_s = 0.5","valid":true}},"guid":"c2810a5c-ce29-f9c9-5c52-7d2c1bf7f217","parentId":"13223752-b957-a0fd-5aa3-1c014e1eef70","programLabel":"lights.red.on = True lights.red.duration_s = 0.5","programType":"logic"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"safety_status == 9 or safety_status == 8"}}},"guid":"13223752-b957-a0fd-5aa3-1c014e1eef70","parentId":"bf368aa4-c770-5ebc-30bb-d4eed331780a","programLabel":[{"type":"secondary","value":"safety_status == 9 or safety_status == 8"}],"programType":"logic"}],"contributedNode":{"type":"ur-folder","version":"0.0.1","allowsChildren":true,"parameters":{"folderName":"Red - fault"}},"guid":"bf368aa4-c770-5ebc-30bb-d4eed331780a","parentId":"6f990888-f84d-abf3-fc0b-8224df969089","programLabel":"Red - fault","programType":"logic"}],"contributedNode":{"type":"ur-folder","version":"0.0.1","allowsChildren":true,"parameters":{"folderName":"Safety colors display"},"isSuppressed":false},"guid":"6f990888-f84d-abf3-fc0b-8224df969089","parentId":"d82a0c0d-9002-4b6a-0b36-16f26d192843","programLabel":"Safety colors display","programType":"logic"},{"children":[],"contributedNode":{"type":"ur-wait","version":"0.0.4","parameters":{"type":"time","time":{"entity":{"value":0.1,"unit":"s"},"selectedType":"VALUE","value":0.1}}},"guid":"3a7c49e2-c709-46e6-3b67-5dfd321d97ea","parentId":"d82a0c0d-9002-4b6a-0b36-16f26d192843","programLabel":[{"type":"secondary","value":"0.10 s"}],"programType":"logic"}],"contributedNode":{"type":"ur-function","version":"0.0.3","allowsChildren":true,"parameters":{"isAsync":true,"function":{"name":"robot_status_thread","id":"f3f6996b-25f6-b658-fbb6-012acfc3ef82","_IDENTIFIER":"FunctionDeclaration","reference":false,"type":"$$Function","declaredByID":"d82a0c0d-9002-4b6a-0b36-16f26d192843"},"isLooping":true}},"guid":"d82a0c0d-9002-4b6a-0b36-16f26d192843","parentId":"eb827e12-73da-82ea-f438-66952b0458bd","programType":"logic","programLabel":[{"type":"primary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"robot_status_thread"}}]}],"contributedNode":{"type":"ur-functions","version":"0.0.1","allowsChildren":true,"lockChildren":false},"guid":"eb827e12-73da-82ea-f438-66952b0458bd","parentId":"fc2ba7ab-7ba4-a041-19ec-271124f0e475","programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"control_api_handle","id":"fec45934-69a4-34e7-4003-1c09d05019bc","valueType":"array","_IDENTIFIER":"VariableDeclaration","reference":false,"type":"$$Variable","declaredByID":"e28c4499-83cd-cc9e-cc12-9d7f3d30a599"},"selectedType":"EXPRESSION","value":"control_api_factory()"},"valueType":"array","waypointType":"teach"}},"guid":"e28c4499-83cd-cc9e-cc12-9d7f3d30a599","parentId":"9e3365ee-18ef-c23c-ada4-243648825ac3","programLabel":[{"type":"primary","value":"control_api_handle:"},{"type":"secondary","value":"control_api_factory()"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"lights","id":"81e077ca-33a4-6ba6-4180-2429fc69c239","valueType":"array","_IDENTIFIER":"VariableDeclaration","reference":false,"type":"$$Variable","declaredByID":"3101b26c-fdc7-888e-aa34-f5773d99a08c"},"selectedType":"EXPRESSION","value":"struct(white = struct(on = True, duration_s = 0, t_s = 0),  red = struct(on = True, duration_s = 0.2, t_s = 0) , yellow = struct(on = True, duration_s = 0.5, t_s = 0), green = struct(on = True, duration_s = 1, t_s = 0), blue = struct(on = True, duration_s = 3, t_s = 0))"},"valueType":"array","waypointType":"teach"}},"guid":"3101b26c-fdc7-888e-aa34-f5773d99a08c","parentId":"9e3365ee-18ef-c23c-ada4-243648825ac3","programLabel":[{"type":"primary","value":"lights:"},{"type":"secondary","value":"struct(white = struct(on = True, duration_s = 0, t_s = 0),  red = struct(on = True, duration_s = 0.2, t_s = 0) , yellow = struct(on = True, duration_s = 0.5, t_s = 0), green = struct(on = True, duration_s = 1, t_s = 0), blue = struct(on = True, duration_s = 3, t_s = 0))"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-thread","version":"0.0.1","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedThread":{"type":"$$Function","declaredByID":"b873e83a-365f-32ba-322f-c79ee8e93d03","name":"light_tower_thread","reference":true},"selectedAction":"Run"}},"guid":"3c7cb16b-5a8b-36f3-cbc7-9f18cef46a4d","parentId":"9e3365ee-18ef-c23c-ada4-243648825ac3","programLabel":[{"type":"primary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"light_tower_thread"}},{"type":"secondary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"Run"}}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-thread","version":"0.0.1","allowsChildren":false,"parameters":{"selectedModule":{"name":"","reference":true,"type":"$$Module"},"selectedThread":{"type":"$$Function","declaredByID":"d82a0c0d-9002-4b6a-0b36-16f26d192843","name":"robot_status_thread","reference":true},"selectedAction":"Run"}},"guid":"dc3e77bd-8c81-81ac-d462-ca6a40c6caab","parentId":"9e3365ee-18ef-c23c-ada4-243648825ac3","programLabel":[{"type":"primary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"robot_status_thread"}},{"type":"secondary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"Run"}}],"programType":"logic"}],"contributedNode":{"type":"ur-before-start","version":"0.0.1","allowsChildren":true},"guid":"9e3365ee-18ef-c23c-ada4-243648825ac3","parentId":"fc2ba7ab-7ba4-a041-19ec-271124f0e475","programType":"logic"},{"children":[{"children":[],"contributedNode":{"type":"ur-comment","version":"0.0.1","parameters":{"comment":"User program"}},"guid":"9949f154-f447-5455-97e2-11205f85383f","parentId":"402af48d-3383-f492-003e-d07d24ac4bf7","programLabel":[{"type":"secondary","value":"User program"}],"programType":"logic"},{"children":[],"contributedNode":{"type":"ur-wait","version":"0.0.4","parameters":{"type":"time","time":{"entity":{"value":1,"unit":"s"},"selectedType":"VALUE","value":1}}},"guid":"242d50bb-0048-d493-21b3-37739a562490","parentId":"402af48d-3383-f492-003e-d07d24ac4bf7","programLabel":[{"type":"secondary","value":"1 s"}],"programType":"logic"}],"contributedNode":{"type":"ur-logic-program","version":"0.0.1","allowsChildren":true,"parameters":{"logicProgram":{"name":"Logic_Program","reference":false,"type":"$$LogicProgram","declaredByID":"402af48d-3383-f492-003e-d07d24ac4bf7"}}},"guid":"402af48d-3383-f492-003e-d07d24ac4bf7","parentId":"fc2ba7ab-7ba4-a041-19ec-271124f0e475","programType":"logic"}],"contributedNode":{"type":"ur-logic-programs","version":"0.0.1","allowsChildren":true,"lockChildren":true,"parameters":{"name":"","symbolHistory":{"variables":[{"name":"light","valueType":"array","programNodeMetadata":{"programNodeId":"98671d76-e74d-70da-c25f-fe9e7e94ba8e","isSuppressed":false},"reference":{"id":"441febb0-40f9-5a25-6c3d-066958f94a8f","_IDENTIFIER":"VariableReference"}},{"name":"t","valueType":"integer","programNodeMetadata":{"programNodeId":"d7dafcfa-8d05-2b98-c093-588c55cc9268","isSuppressed":false},"reference":{"id":"9d47aebd-13b7-7064-dacf-93a0c556c781","_IDENTIFIER":"VariableReference"}},{"name":"safety_status","valueType":"integer","programNodeMetadata":{"programNodeId":"a94a5123-da0e-5158-4caa-ef74f5a8bfe4","isSuppressed":false},"reference":{"id":"c7206784-9ac6-e7c1-f49c-b71eec5869fb","_IDENTIFIER":"VariableReference"}},{"name":"program_status","valueType":"integer","programNodeMetadata":{"programNodeId":"3cbccb98-9300-76fa-1ced-b06ee7b0602f","isSuppressed":false},"reference":{"id":"2ce28a03-6fd0-a810-f1c7-69020112d061","_IDENTIFIER":"VariableReference"}},{"name":"robot_mode","valueType":"integer","programNodeMetadata":{"programNodeId":"a309ac46-c9ad-65dc-70d2-733583976052","isSuppressed":false},"reference":{"id":"4e3afb0f-8029-9660-c50d-bcbe0fc0cb31","_IDENTIFIER":"VariableReference"}},{"name":"status_text","valueType":"string","programNodeMetadata":{"programNodeId":"0d66d687-fa5d-1d85-9f84-f30e1808526b","isSuppressed":false},"reference":{"id":"edf72e83-a4cd-830a-8fdd-998ad6444c0c","_IDENTIFIER":"VariableReference"}},{"name":"lights","valueType":"array","programNodeMetadata":{"programNodeId":"3101b26c-fdc7-888e-aa34-f5773d99a08c","isSuppressed":false},"reference":{"id":"81e077ca-33a4-6ba6-4180-2429fc69c239","_IDENTIFIER":"VariableReference"}},{"name":"control_api_handle","valueType":"array","programNodeMetadata":{"programNodeId":"e28c4499-83cd-cc9e-cc12-9d7f3d30a599","isSuppressed":false},"reference":{"id":"fec45934-69a4-34e7-4003-1c09d05019bc","_IDENTIFIER":"VariableReference"}},{"name":"base","valueType":"frame","reference":{"id":"583d3a7d-b103-aff9-502d-73d459fc2a0e","_IDENTIFIER":"VariableReference"}},{"name":"tcp","valueType":"frame","reference":{"id":"1debc310-2146-1b93-ebf3-6e257bfdd2da","_IDENTIFIER":"VariableReference"}},{"name":"world","valueType":"frame","reference":{"id":"ddca5ccc-8f81-8461-2a8f-935321f2bf01","_IDENTIFIER":"VariableReference"}},{"name":"flange","valueType":"frame","reference":{"id":"a284652e-3e38-9434-2e20-eae9dd10bd79","_IDENTIFIER":"VariableReference"}},{"name":"grid","valueType":"grid","reference":{"id":"af733917-cce3-4b11-fb24-7e6677ff572e","_IDENTIFIER":"VariableReference"}},{"name":"grid_iterator","valueType":"waypoint","reference":{"id":"68ebd02e-0a2d-ad92-c6de-c677a19dddf0","_IDENTIFIER":"VariableReference"}},{"name":"Joint_fast","valueType":"profile","reference":{"id":"66cc9640-9626-20a9-b6be-e75938fdf603","_IDENTIFIER":"VariableReference"}},{"name":"Joint_slow","valueType":"profile","reference":{"id":"0e781f7a-4120-999b-9eb9-c25c1dc8d0c8","_IDENTIFIER":"VariableReference"}},{"name":"Linear_fast","valueType":"profile","reference":{"id":"2faf9dcd-a026-b177-e610-2044e80f9d1a","_IDENTIFIER":"VariableReference"}},{"name":"Linear_slow","valueType":"profile","reference":{"id":"f9fc918f-21e5-f43d-8029-5ab979f2ce28","_IDENTIFIER":"VariableReference"}},{"name":"Process","valueType":"profile","reference":{"id":"854474bd-bfb7-9f87-49da-48a03f2d574c","_IDENTIFIER":"VariableReference"}},{"name":"Home","valueType":"waypoint","reference":{"id":"7622345a-0e52-2cf8-0ff6-3a6568b1e03a","_IDENTIFIER":"VariableReference"}},{"name":"Loop","valueType":"integer","programNodeMetadata":{"programNodeId":"f7efd6f1-f025-1c14-2ade-36324da0f40c","isSuppressed":false},"reference":{"id":"fa673fc3-b37d-68c2-4425-3a157012522b","_IDENTIFIER":"VariableReference"}},{"name":"blink_timestamp_s","valueType":"array","programNodeMetadata":{"programNodeId":"69aecf70-8d04-f46e-3573-8a87bded46b4","isSuppressed":false},"reference":{"id":"4411d232-83ef-393c-dc43-d9bdccd1aa4f","_IDENTIFIER":"VariableReference"}},{"name":"blink_duration_s","valueType":"array","programNodeMetadata":{"programNodeId":"327f178e-ee44-aa50-205d-048c208aeb1a","isSuppressed":false},"reference":{"id":"10a5c2c2-d635-1521-f7f3-c6d5bfeb9cb3","_IDENTIFIER":"VariableReference"}},{"name":"color","valueType":"array","programNodeMetadata":{"programNodeId":"3101b26c-fdc7-888e-aa34-f5773d99a08c","isSuppressed":false},"reference":{"id":"df0dee3c-64d2-8ece-00b8-0dfd889d6cdf","_IDENTIFIER":"VariableReference"}}],"functions":[{"name":"light_tower_thread","programNodeMetadata":{"programNodeId":"b873e83a-365f-32ba-322f-c79ee8e93d03","isSuppressed":false,"isThread":true},"moduleMetadata":{},"reference":{"id":"68c3a3ef-ca87-2e39-091a-18fe7bd4790d","_IDENTIFIER":"FunctionReference"}},{"name":"get_timestamp_s","programNodeMetadata":{"programNodeId":"4fff03fc-16a6-56a1-c1d4-6db2920455a7","isSuppressed":false,"isThread":false},"moduleMetadata":{},"reference":{"id":"a93b0218-9c47-fcfe-0c7f-8a7f9b90bb69","_IDENTIFIER":"FunctionReference"}},{"name":"reset_lights","programNodeMetadata":{"programNodeId":"a92213f0-35ae-48f4-424a-fe752110cc28","isSuppressed":false,"isThread":false},"moduleMetadata":{},"reference":{"id":"87aee5e7-62b6-cb54-748a-0aafc1a79be3","_IDENTIFIER":"FunctionReference"}},{"name":"robot_status_thread","programNodeMetadata":{"programNodeId":"d82a0c0d-9002-4b6a-0b36-16f26d192843","isSuppressed":false,"isThread":true},"moduleMetadata":{},"reference":{"id":"f3f6996b-25f6-b658-fbb6-012acfc3ef82","_IDENTIFIER":"FunctionReference"}}],"modules":[{"name":"application","reference":{"id":"application-module-id","_IDENTIFIER":"ModuleReference"}},{"name":"Module","programNodeMetadata":{"programNodeId":"ba245961-f8d4-0e7b-8c55-855903c84966","isSuppressed":false},"reference":{"id":"565930d1-03f8-e869-d4a6-acdff84f060a","_IDENTIFIER":"ModuleReference"}}]}}},"guid":"fc2ba7ab-7ba4-a041-19ec-271124f0e475","programType":"logic"},"programInformation":{"name":"Logic_Program","description":"","programState":"FINAL","functionsBlockShown":false,"createdDate":0,"lastSavedDate":0,"lastModifiedDate":0},"urscript":{"script":"$ 1 \"ur-logic-programs\"\n$ 2 \"ur-modules\"\n$ 3 \"ur-functions\"\n$ 4 \"ur-function\"\nthread light_tower_thread():\n  while (True):\n    $ 5 \"ur-loop\"\n    light_id = 0\n    while (light_id < 5):\n      $ 6 \"ur-comment\"\n      $ 7 \"ur-assignment\"\n      global light = lights[light_id]\n      $ 8 \"ur-if\"\n      if (light.on == True):\n        $ 9 \"ur-if\"\n        if (light.duration_s != 0 and get_timestamp_s() > light.t_s + light.duration_s):\n          $ 10 \"ur-comment\"\n          $ 11 \"ur-script\"\n          io_set(\"CB_DO\" + to_str(light_id + 3), not io_get(\"CB_DO\" + to_str(light_id + 3)))\n          $ 12 \"ur-script\"\n          lights[light_id].t_s = get_timestamp_s()\n        $ 13 \"ur-elseif\"\n        elif (light.duration_s == 0):\n          $ 14 \"ur-comment\"\n          $ 15 \"ur-script\"\n          io_set(\"CB_DO\" + to_str(light_id + 3), True)\n        end\n      $ 16 \"ur-else\"\n      else:\n        $ 17 \"ur-comment\"\n        $ 18 \"ur-script\"\n        io_set(\"CB_DO\" + to_str(light_id + 3), False)\n      end\n      light_id = light_id + 1\n    end\n    $ 19 \"ur-script\"\n    sync()\nend\nend\n$ 20 \"ur-function\"\ndef get_timestamp_s():\n  $ 21 \"ur-assignment\"\n  global t = time()\n  $ 22 \"ur-script\"\n  return t.sec + t.nanosec / 1000000000\nend\n$ 23 \"ur-function\"\ndef reset_lights():\n  $ 24 \"ur-loop\"\n  light_id2 = 0\n  while (light_id2 < 5):\n    $ 25 \"ur-script\"\n    lights[light_id2].on = False\n    light_id2 = light_id2 + 1\n  end\nend\n$ 26 \"ur-function\"\nthread robot_status_thread():\n  while (True):\n    $ 27 \"ur-folder\"\n    $ 28 \"ur-assignment\"\n    global safety_status = control_api_handle.robot_safety_status()\n    $ 29 \"ur-assignment\"\n    global program_status = control_api_handle.robot_program_state()\n    $ 30 \"ur-assignment\"\n    global robot_mode = control_api_handle.robot_mode()\n    $ 31 \"ur-folder\"\n    $ 32 \"ur-if\"\n    if (robot_mode == 7 and safety_status == 1):\n      $ 33 \"ur-if\"\n      if (program_status == 1 or program_status == 4):\n        $ 34 \"ur-assignment\"\n        global status_text = \"Ready for run\"\n        $ 35 \"ur-call-function\"\n        reset_lights()\n        $ 36 \"ur-script\"\n        lights.green.on = True lights.green.duration_s = 0.7\n      $ 37 \"ur-elseif\"\n      elif (program_status == 2):\n        $ 38 \"ur-assignment\"\n        status_text = \"Running\"\n        $ 39 \"ur-call-function\"\n        reset_lights()\n        $ 40 \"ur-script\"\n        lights.green.on = True lights.green.duration_s = 0\n      $ 41 \"ur-else\"\n      else:\n        $ 42 \"ur-assignment\"\n        status_text = \"Resuming...\"\n        $ 43 \"ur-call-function\"\n        reset_lights()\n        $ 44 \"ur-script\"\n        lights.green.on = True lights.green.duration_s = 0.15\n      end\n    end\n    $ 45 \"ur-folder\"\n    $ 46 \"ur-if\"\n    if (safety_status == 3):\n      $ 47 \"ur-assignment\"\n      status_text = \"Protective stop\"\n      $ 48 \"ur-call-function\"\n      reset_lights()\n      $ 49 \"ur-script\"\n      lights.yellow.on = True lights.yellow.duration_s = 0.2\n    $ 50 \"ur-elseif\"\n    elif (program_status ==1 and safety_status ==1 and (robot_mode ==2 or robot_mode == 5)):\n      $ 51 \"ur-assignment\"\n      status_text = \"Booting and locked\"\n      $ 52 \"ur-call-function\"\n      reset_lights()\n      $ 53 \"ur-script\"\n      lights.yellow.on = True lights.yellow.duration_s = 0\n    end\n    $ 54 \"ur-folder\"\n    $ 55 \"ur-if\"\n    if (program_status ==4 and safety_status ==1 and robot_mode == 5):\n      $ 56 \"ur-assignment\"\n      status_text = \"Quit Fault error\"\n      $ 57 \"ur-call-function\"\n      reset_lights()\n      $ 58 \"ur-script\"\n      lights.red.on = True lights.red.duration_s = 0.2\n    end\n    $ 59 \"ur-if\"\n    if (robot_mode ==3 or safety_status == 7 or safety_status == 6):\n      $ 60 \"ur-assignment\"\n      status_text = \"Powered off or estop\"\n      $ 61 \"ur-call-function\"\n      reset_lights()\n      $ 62 \"ur-script\"\n      lights.red.on = True lights.red.duration_s = 0\n    end\n    $ 63 \"ur-if\"\n    if (safety_status == 9 or safety_status == 8):\n      $ 64 \"ur-call-function\"\n      reset_lights()\n      $ 65 \"ur-assignment\"\n      status_text = \"Safety fault\"\n      $ 66 \"ur-script\"\n      lights.red.on = True lights.red.duration_s = 0.5\n    end\n    $ 67 \"ur-wait\"\n    sleep(0.1)\nend\nend\n$ 68 \"ur-before-start\"\n$ 69 \"ur-assignment\"\nglobal control_api_handle = control_api_factory()\n$ 70 \"ur-assignment\"\nglobal lights = struct(white = struct(on = True, duration_s = 0, t_s = 0),  red = struct(on = True, duration_s = 0.2, t_s = 0) , yellow = struct(on = True, duration_s = 0.5, t_s = 0), green = struct(on = True, duration_s = 1, t_s = 0), blue = struct(on = True, duration_s = 3, t_s = 0))\n$ 71 \"ur-thread\"\nlight_tower_thread_handler = run light_tower_thread()\n$ 72 \"ur-thread\"\nrobot_status_thread_handler = run robot_status_thread()\n$ 73 \"ur-logic-program\"\nwhile (True):\n  $ 74 \"ur-comment\"\n  $ 75 \"ur-wait\"\n  sleep(1)\nend","nodeIDList":["00000000-0000-0000-0000-000000000000","fc2ba7ab-7ba4-a041-19ec-271124f0e475","5f8867ec-c815-bf15-719e-ad8333e11b6b","eb827e12-73da-82ea-f438-66952b0458bd","b873e83a-365f-32ba-322f-c79ee8e93d03","8bf199ba-aff2-e789-1655-0aa180f60309","afd1929b-eac2-cbf7-6f17-f4150cd8c822","98671d76-e74d-70da-c25f-fe9e7e94ba8e","423ddf99-c26a-5a3b-c81c-49b78fc99e86","58fed0ef-149a-2b8d-b4c8-c90b6aa356d2","22e2f067-415e-7017-0526-5c07001ecd04","1b622a1a-8ab0-af0d-2d75-117b260e47ce","462450b3-313a-289a-c8b8-131b7dbb50a2","b5f91a92-fb64-720c-0d42-72a655879332","04219ec7-0053-d2f1-59c3-97315e7dcc2f","cdc843bd-3c47-0a26-389f-21ceb4d2667a","924d277a-3d66-df08-5b3b-c8192b275e0e","b77d4145-ad00-423d-fa36-615aabf3e896","e7436a13-bf77-d66b-b96f-a16bf4f10f94","69bcb55e-3cdf-40f8-6605-4fd25338ef8c","4fff03fc-16a6-56a1-c1d4-6db2920455a7","d7dafcfa-8d05-2b98-c093-588c55cc9268","0323f933-05c5-44c6-6df8-fbbdfc68500f","a92213f0-35ae-48f4-424a-fe752110cc28","f7efd6f1-f025-1c14-2ade-36324da0f40c","8f26be10-0503-81ed-b4b0-fdd32b32ad7d","d82a0c0d-9002-4b6a-0b36-16f26d192843","6f990888-f84d-abf3-fc0b-8224df969089","a94a5123-da0e-5158-4caa-ef74f5a8bfe4","3cbccb98-9300-76fa-1ced-b06ee7b0602f","a309ac46-c9ad-65dc-70d2-733583976052","93865708-12a4-1439-0b06-87181f29c981","d43d91ec-f637-951b-5cc3-29e53169bd17","bd006f11-c75d-6a3b-c712-d2b69d027099","0d66d687-fa5d-1d85-9f84-f30e1808526b","3e2692fd-05e8-e938-7fa5-f3e452edab9d","dcf5edad-70e5-ff3a-a659-b74d9a6e8165","0d0b19cc-66a6-1da4-b1dc-8a2cf467d124","52210f9b-24cb-e77c-aff4-0e8215fe1f10","0d314319-5348-4397-c703-b43acd51776b","b66229e6-49f4-d336-ebb9-626e26ae7718","b26f37e1-3f88-4122-4ab1-6154cda8ef54","4346f72f-9796-dbbf-e73a-e8c63b10fd89","2be563a2-28fe-51e0-e284-72d6940dd805","6dcae6ff-9217-f6c1-7674-370d2a419978","5638e708-1ea9-fb3f-8f32-e770d751781d","eecd7024-c568-33eb-c10c-bc6e73ea5ced","7019d411-9a3c-6a45-235e-1c9e431d0ff7","3710e211-6872-fce6-cbd4-6dbfbf5773bf","e92d52aa-90c7-1f48-0809-f1ab2041b033","893f7d01-e7b9-9be6-e89f-3c7733be4484","89bf3b9f-6aa7-754c-b4f0-534369aa988e","0c26acce-0b6a-accc-6b5d-0140e7ce26a4","5e9ca425-2b61-3bb8-3faa-079a2802f868","bf368aa4-c770-5ebc-30bb-d4eed331780a","d7e90e59-6fc6-a4bd-b1be-a3d2dc0513e5","5f854376-d37a-21b3-4a73-1e7022f34d57","6911498c-0f5e-20fc-ce08-dd7fe16e6ff7","16b5cfb9-9c22-6cb5-104b-58aba1cce2f9","10840db9-c6dd-d5fe-fb8f-59a775d18fba","1652a3d1-3f99-0b9a-1d86-fe8c4b1ecf75","d5cc5535-860f-061b-689d-eed8194608dd","766906eb-5185-1b0c-d2fa-26bf2ea77fdf","13223752-b957-a0fd-5aa3-1c014e1eef70","79c2ea8b-580c-667c-5042-ab8f1b1e7779","ec9af594-45a2-53ae-cabf-40a9e997e11f","c2810a5c-ce29-f9c9-5c52-7d2c1bf7f217","3a7c49e2-c709-46e6-3b67-5dfd321d97ea","9e3365ee-18ef-c23c-ada4-243648825ac3","e28c4499-83cd-cc9e-cc12-9d7f3d30a599","3101b26c-fdc7-888e-aa34-f5773d99a08c","3c7cb16b-5a8b-36f3-cbc7-9f18cef46a4d","dc3e77bd-8c81-81ac-d462-ca6a40c6caab","402af48d-3383-f492-003e-d07d24ac4bf7","9949f154-f447-5455-97e2-11205f85383f","242d50bb-0048-d493-21b3-37739a562490"]},"autoPlayOptions":{"type":"ALWAYS"}}},"sourcesNodes":{"robot":{"groupId":"robot","version":"1.0.0.","sources":[{"sourceID":"ur-wired-io","signals":[{"signalID":"DI 0","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 1","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 2","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 3","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 4","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 5","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 6","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 7","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DO 0","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 1","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 2","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 3","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 4","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 5","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 6","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 7","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CI 0","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 1","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 2","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 3","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 4","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 5","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 6","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CI 7","direction":"IN","valueType":"BOOLEAN"},{"signalID":"CO 0","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 1","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 2","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 3","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 4","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 5","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 6","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"CO 7","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"AI 0","direction":"IN","valueType":"FLOAT"},{"signalID":"AI 1","direction":"IN","valueType":"FLOAT"},{"signalID":"AO 0","direction":"OUT","valueType":"FLOAT"},{"signalID":"AO 1","direction":"OUT","valueType":"FLOAT"}],"webSocketURL":"/sources/wired-io"},{"sourceID":"ur-tool-io","signals":[{"signalID":"DI 0","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DI 1","direction":"IN","valueType":"BOOLEAN"},{"signalID":"DO 0","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"DO 1","direction":"OUT","valueType":"BOOLEAN"},{"signalID":"AI 0","direction":"IN","valueType":"FLOAT"},{"signalID":"AI 1","direction":"IN","valueType":"FLOAT"}],"webSocketURL":"/sources/tool-io"}],"isDynamic":false},"ur-modbus":{"groupId":"ur-modbus","isDynamic":true,"version":"1.0.0","sources":[]},"ur-robot-io":{"type":"ur-robot-io","groupId":"ur-robot-io","isDynamic":false,"version":"1.0.3","sources":[{"sourceID":"ur-robot-wired-io","name":"Wired I/O","signals":[{"direction":"IN","signalID":"DI 0","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 1","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 2","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 3","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 4","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 5","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 6","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 7","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 0","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 1","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 2","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 3","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 4","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 5","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 6","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 7","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 0","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 1","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 2","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 3","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 4","valueType":"BOOLEAN","name":"ghj (CI 4)"},{"direction":"IN","signalID":"CI 5","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 6","valueType":"BOOLEAN"},{"direction":"IN","signalID":"CI 7","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 0","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 1","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 2","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 3","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 4","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 5","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 6","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"CO 7","valueType":"BOOLEAN"},{"direction":"IN","signalID":"AI 0","valueType":"FLOAT"},{"direction":"IN","signalID":"AI 1","valueType":"FLOAT"},{"direction":"OUT","signalID":"AO 0","valueType":"FLOAT"},{"direction":"OUT","signalID":"AO 1","valueType":"FLOAT"}]},{"sourceID":"ur-robot-tool-io","name":"Tool I/O","signals":[{"direction":"IN","signalID":"DI 0","valueType":"BOOLEAN"},{"direction":"IN","signalID":"DI 1","valueType":"BOOLEAN"},{"direction":"IN","signalID":"AI 0","valueType":"FLOAT"},{"direction":"IN","signalID":"AI 1","valueType":"FLOAT"},{"direction":"OUT","signalID":"DO 0","valueType":"BOOLEAN"},{"direction":"OUT","signalID":"DO 1","valueType":"BOOLEAN"}]}],"parameters":{"sourceConfig":{"labelMap":{"ur-robot-wired-io":{"CI 4":"ghj"}},"analogDomainMap":{},"presets":{},"toolOutput":{"dualPinPower":false,"voltage":{"value":0,"unit":"V"},"powerOutput":{"DO 0":1,"DO 1":1}}},"migrateSourceConfigDone":true}},"universalrobots-ethernetip-frontend":{"type":"universalrobots-ethernetip-frontend","version":"1.0.0","programAction":"IGNORE","enabled":false,"groupId":"universalrobots-ethernetip-frontend","sources":[{"sourceID":"frontend-source","name":"EtherNet/IP","signals":[]}],"isDynamic":false},"universalrobots-profinet-frontend-profinet":{"version":"1.0.0","groupId":"universalrobots-profinet-frontend-profinet","sources":[{"sourceID":"ur-profinet-source","name":"Profinet","signals":[]}],"isDynamic":false,"enabled":false,"robotIoModule":"IGNORE","registerModule1":"IGNORE","registerModule2":"IGNORE"}}},"urscript":{"script":"set_safety_mode_transition_hardness(1)\nreset_world_model()\nset_input_actions_to_default()\nset_analog_outputdomain(0,0)\nset_analog_outputdomain(1,0)\nset_standard_analog_input_domain(0,0)\nset_standard_analog_input_domain(1,0)\nset_tool_output_mode(0)\nset_tool_voltage(0)\nset_tool_digital_output_mode(0,1)\nset_tool_digital_output_mode(1,1)\nset_tool_analog_input_domain(0,0)\nset_tool_analog_input_domain(1,0)\nset_gravity([0, 0, 9.82])\nlocal existingBaseParent = get_frame_parent(\"base\")\nlocal basePose = get_pose(\"base\", existingBaseParent)\nbasePose[3] = 0\nbasePose[4] = 0\nbasePose[5] = 0\nmove_frame(\"base\", basePose, existingBaseParent)\nglobal base = \"base\"\nglobal tcp = \"tcp\"\nglobal world = \"world\"\nglobal flange = \"flange\"\nset_target_payload(0, [0, 0, 0], [0, 0, 0, 0, 0, 0])\nset_tcp(p[0, 0, 0, 0, 0, 0], \"Tool_flange\")\n# Start of Forces\n###\n# Transforms the force and torque values along the axes of the given pose\n# @param pose pose Any valid pose, defaults to base, the x, y, and z values are ignored\n# @return array 6D force torque vector with [Fx, Fy, Fz, Mx, My, Mz] aligned to pose in N and Nm respectively\n###\ndef get_tcp_wrench_in_frame(pose = p[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]):\n    # we are only interested in the rotation of pose, set translations to zero\n    local target_pose = pose\n    target_pose[0] = 0\n    target_pose[1] = 0\n    target_pose[2] = 0\n    # the conversion needs to happen as poses, so we need to convert back and forth a bit\n    local force = get_tcp_force()\n    local force_vector_as_pose = p[force[0], force[1], force[2], 0, 0, 0]\n    local torque_vector_as_pose = p[force[3], force[4], force[5], 0, 0, 0]\n    local transformed_force_as_pose = pose_trans(pose_inv(target_pose), force_vector_as_pose)\n    local transformed_torque_as_pose = pose_trans(pose_inv(target_pose), torque_vector_as_pose)\n    return [transformed_force_as_pose[0], transformed_force_as_pose[1], transformed_force_as_pose[2], transformed_torque_as_pose[0], transformed_torque_as_pose[1], transformed_torque_as_pose[2]]\nend\n###\n# See documentation for @link:get_tcp_wrench_in_frame()\n# @return forces and torques measured in TCP frame\n###\ndef get_tcp_wrench():\n    return get_tcp_wrench_in_frame(get_target_tcp_pose())\nend\n###\n# Projects the measured TCP force along the axis given\n# @param axis array 3D vector\n###\ndef project_tcp_force(axis):\n    local wrench = get_tcp_wrench()\n    local force = [wrench[0], wrench[1], wrench[2]]\n    return dot(force, axis)\nend\n# End of Forces\n# Start of Math\n# Definitions of constants\nglobal PI = acos(-1)\n###\n# Calculates the cross product between to 3D vectors\n# @param v1 array 3D vector\n# @param v2 array 3D vector\n###\ndef cross(v1, v2):\n    if length(v1) != length(v2):\n        popup(str_cat(\"For computing the cross product, the two vectors must have the same length. Provided lengths: \", [length(v1), length(v2)]), error=True, blocking=True)\n        return -1\n    end\n    if length(v1) != 3:\n        popup(str_cat(\"For computing the cross product, the two vectors must have length 3. Provided lengths: \", [length(v1), length(v2)]), error=True, blocking=True)\n        return -1\n    end\n    local cross = [0.0, 0.0, 0.0]\n    local i = 0\n    while i < 3:\n        local j = (i + 1) % 3 # The next index in a cyclic order\n        local k = (i + 2) % 3 # The next next index in a cyclic order\n        cross[i] = v1[j] * v2[k] - v1[k] * v2[j]\n        i = i + 1\n    end\n    return cross\nend\n###\n# Calculates the dot product between to n-dimensional vectors\n# @param v1 array nD vector\n# @param v2 array nD vector\n###\ndef dot(v1, v2):\n    if length(v1) != length(v2):\n        popup(str_cat(\"For computing the dot product, the two vectors must have the same length. Provided lengths: \", [length(v1), length(v2)]), error=True, blocking=True)\n        return -1\n    end\n    local result = 0\n    local i = 0\n    while i < length(v1):\n        result = result + (v1[i] * v2[i])\n        i = i + 1\n    end\n    return result\nend\n###\n# Return the larger number of a and b\n# @param a number a\n# @param b number b\n###\ndef max(a, b):\n    if a > b:\n        return a\n    end\n    return b\nend\n###\n# Find the maximum value in a list. The list must be of non-zero length and contain numbers\n# @param list array list\n###\ndef list_max(list):\n    local length = get_list_length(list)\n    if  length == 0:\n        popup(\"Getting the maximum of an empty list is impossible in list_max().\", error = True, blocking = True)\n        halt\n    end\n    local i = 0\n    local max = list[0]\n    while i < length:\n        if list[i] > max:\n            max = list[i]\n        end\n        i = i + 1\n        sync_at_multiple(i, 30)\n    end\n    return max\nend\ndef sync_at_multiple(i, n):\n    local tmp = i / n\n    if tmp == floor(tmp):\n        sync()\n    end\nend\n# End of Math\n# Start of Move Helper\nur_move_until_force_distance = 0.1\nur_move_until_force_direction = [0, 0, 1]\nur_move_until_force_velocity = 0.1\nur_move_until_force_acceleration = 0.2\ndef ur_move_tcp_direction(distance, direction, velocity, acceleration, blend_radius):\n    local current_pose = get_target_tcp_pose()\n    local movement = normalize(direction) * distance\n    local target_pose = pose_trans(current_pose, p[movement[0], movement[1], movement[2], 0, 0, 0])\n    movel(target_pose, a = 0.2, v = velocity, r = blend_radius)\nend\nthread ur_move_until_force_thread():\n    ur_move_tcp_direction(ur_move_until_force_distance, ur_move_until_force_direction, ur_move_until_force_velocity, ur_move_until_force_acceleration, 0)\n    popup(\"No contact detected.\", title = \"No Contact\", warning = False, error = True, blocking = False)\n    halt\nend\n###\n# Moves the robot in the TCP direction specified until a contact point is reached *or*\n# the robot reaches the maximum distance allowed specified by the distance parameter.\n# @param distance number The maximum distance the robot is allowed to travel in the direction specified\n# @param direction array 3D vector determining the move direction of the TCP\n# @param velocity number Velocity of the robot\n# @param acceleration number Acceleration of the robot\n# @param stop_force number Maximum search radius\n###\ndef ur_move_until_force(distance = 0.1, direction = [0, 0, 1], velocity = 0.1, acceleration = 0.2, stop_force = 20):\n    ur_move_until_force_distance = distance\n    ur_move_until_force_direction = direction\n    ur_move_until_force_velocity = velocity\n    ur_move_until_force_acceleration = acceleration\n    \n    thrd = run ur_move_until_force_thread()\n    while - project_tcp_force(direction) < stop_force:\n        sync()\n    end\n    kill thrd\n    local actual_pose = get_actual_tcp_pose()\n    stopl(1.0)\n    return actual_pose\nend\ndef ur_get_joint_speeds_before_offset(previous_q, time):\n    local current_q = get_joint_positions()\n    local delta_q = current_q - previous_q\n    return delta_q / time\nend\ndef ur_path_move(end_q, v, rampdown=False):\n    # Calculate distance to target\n    local start_q = get_joint_positions()\n    local delta_q = end_q - start_q\n    local positive_delta_q = [norm(delta_q[0]), norm(delta_q[1]), norm(delta_q[2]), norm(delta_q[3]), norm(delta_q[4]), norm(delta_q[5])]\n    # Calculate time to move based on desired velocity\n    local t = list_max(positive_delta_q) / v\n    servoj(end_q , 0, 0, t, lookahead_time=0.1, gain=500)\n    if(rampdown):\n        while(norm(ur_get_joint_speeds_before_offset(start_q, t)) > 0.0001):\n            t = max(t, 0.001)\n            start_q = get_joint_positions()\n            servoj(end_q , 0, 0, t)\n        end\n    end\nend\n# End of Move Helper\nmyurRPC = rpc_factory(\"xmlrpc\",\"http://servicegateway/universal-robots/urconnect/urconnect-telemetry/xmlrpc/\")\n# Waypoint variable for Home smart skill\nglobal Home = struct(p=p[0.0007234911264933834, -0.2333977082004337, 1.0803476302965433, -0.0030465488234298825, 2.219299153348662, -2.220820782887323], frame=\"base\", q=[0, -1.5707963249999999, 0, -1.5707963249999999, 0, 0])\n# Start of Align to Plane\n###\n# Align to plane will touch up a plane by moving the robot into contact with the table or part in several locations to determine its orientation. Afterwards the robot will orient its tool to the plane.\n# @param radius number Radius [m] of the circle within the plane will be touched up\n# @param push_force number How hard to robot pushed against the plane\n# @param n_plane_points number Number of points that the robot uses to compute the plane\n# @param max_distance number Maximum distance that the robot searches\n# @param velocity_slow number Velocity when pressing downwards\n# @param velocity_search number Velocity used when approaching the touch up point\n# @param velocity_move number Velocity used in freespace\n# @param acceleration number Acceleration of the robot\n# @param direction array 3D vector determining the direction of the TCP for touching up the plane\n###\ndef ur_align_to_plane(radius = 0.05, push_force = 20, n_plane_points = 3, max_distance = 0.25, velocity_slow = 0.001, velocity_search = 0.035, velocity_move = 0.10, acceleration = 0.1, direction = [0, 0, 1]):\n    local angle = 2 * PI / n_plane_points\n    local start_pos = get_target_tcp_pose()\n    local retract_distance = -0.015\n    ur_move_tcp_direction(retract_distance, direction, velocity_move, acceleration, 0)\n    sleep(0.25)\n    zero_ftsensor()\n    local cnt = 0\n    local t_base_target = get_target_tcp_pose()\n    local mean_point = [0.0, 0.0, 0.0]\n    local A = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]\n    local b = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n    while cnt < n_plane_points:\n        local new_pos = pose_trans(t_base_target, p[cos(angle * cnt) * radius, sin(angle * cnt) * radius, 0.0, 0.0, 0.0, 0.0])\n        local blend_radius = norm(point_dist(get_actual_tcp_pose(), new_pos))/5\n        movel(new_pos, a = acceleration, v = velocity_move, r = blend_radius)\n        ur_move_until_force(max_distance + norm(retract_distance), direction, velocity_search, acceleration, push_force)\n        local movement = normalize(direction * -1) * 0.0005\n        local target_pose = pose_trans(get_actual_tcp_pose(), p[movement[0], movement[1], movement[2], 0, 0, 0])\n        movel(target_pose)\n        sleep(0.2)\n        ur_move_until_force(max_distance + norm(retract_distance), direction, velocity_slow, acceleration, push_force)\n        sleep(0.2)\n        while (not is_steady()):\n            sync()\n        end\n        local poked_point = get_target_tcp_pose()\n        poked_point = pose_trans(inv(t_base_target), poked_point)\n        A[cnt, 0] = poked_point[0]\n        A[cnt, 1] = poked_point[1]\n        A[cnt, 2] = 1.0\n        b[cnt] = poked_point[2]\n        mean_point = mean_point + [poked_point[0], poked_point[1], poked_point[2]]\n        movel(new_pos, a = 0.2, v = velocity_move, r = blend_radius)\n        cnt = cnt + 1\n    end\n    mean_point = mean_point / n_plane_points\n    cnt = 0\n    while cnt < n_plane_points:\n        local cntj = 0\n        while cntj < 2:\n            A[cnt, cntj] = A[cnt, cntj] - mean_point[cntj]\n            cntj = cntj + 1\n        end\n        b[cnt] = b[cnt] - mean_point[2]\n        cnt = cnt + 1\n    end\n    local x1 = inv(transpose(A) * A) * transpose(A) * b\n    local x = normalize([x1[0], x1[1], -1])\n    local d = dot(mean_point, x)\n    local dval = dot(direction, x)\n    if dval < 0:\n        x = -x\n        dval = -dval\n    end\n    local eaa = [0.0, 0.0, 0.0]\n    local EPSILON = 1e-10\n    if norm(dval - 1) < EPSILON:\n        # if the projection is close to 1 then the angle between the vectors are almost 0 and we cannot\n        # reliably determine the perpendicular axis.\n        # A good approximation is therefore just to set the EAA equal to 0.\n        eaa = [0.0, 0.0, 0.0]\n    else:\n        local axis = cross(direction, x)\n        local eaa = normalize(axis) * acos(dval)\n    end\n    local t_base_target_aligned = pose_trans(t_base_target, p[0, 0, 0, eaa[0], eaa[1], eaa[2]])\n    movel(t_base_target_aligned, a = 0.2, v = velocity_move)\nend\n# End of Align to Plane\n# Start of Align Z to Nearest Axis\n###\n# Aligns the TCP Z axis to the nearest axis of the given frame\n# @param frame_id string frame_id to lookup frame\n###\ndef ur_align_z_to_nearest_axis(frame_id = \"world\"):\n    ###\n    # Given a reference frame as input this function returns a struct with the nearest\n    # pose which aligns the z-axis of the robot TCP with the z-axis of the given reference frame.\n    # The pose is in the reference of the given frame.\n    # @param frame bool frame\n    # @returns struct pose, distance, referencePose\n    ###\n    def get_aligned_z_pose(frame):\n        local actualPose = get_actual_tcp_pose()\n        local actualPoseInFrame = pose_trans(pose_inv(frame), actualPose)\n        # Create rotation vector and convert that to RPY representation\n        local actualRotInFrame = [actualPoseInFrame[3], actualPoseInFrame[4], actualPoseInFrame[5]]\n        local actRPY = rotvec2rpy(actualRotInFrame)\n        # Set RX and RY to 0 and convert back to rotation vector\n        local alignedRot = rpy2rotvec([0, 0, actRPY[2]])\n        local alignedRotFlipped = rpy2rotvec([PI, 0, actRPY[2]])\n        local zUpPose = actualPoseInFrame\n        zUpPose[3] = alignedRot[0]\n        zUpPose[4] = alignedRot[1]\n        zUpPose[5] = alignedRot[2]\n        zUpStruct = struct(pose = zUpPose, distance=pose_dist(actualPoseInFrame, zUpPose), referencePose=frame)\n        local zDownPose = actualPoseInFrame\n        zDownPose[3] = alignedRotFlipped[0]\n        zDownPose[4] = alignedRotFlipped[1]\n        zDownPose[5] = alignedRotFlipped[2]\n        local zDownStruct = struct(pose = zDownPose, distance=pose_dist(actualPoseInFrame, zDownPose), referencePose=frame)\n        # Return the solution which is closer to the current robot pose\n        if (zDownStruct.distance > zUpStruct.distance):\n            return zUpStruct\n        else:\n            return zDownStruct\n        end\n    end\n    local frame = get_pose(frame_id)\n    # Rotate the given frame so that Z can be align to X-Y-Z respectively \n    local rotZtoX = rpy2rotvec([0,0.5*PI,0])\n    local rotZtoY = rpy2rotvec([0.5*PI,0,0])\n    local rotZtoZ = rpy2rotvec([0,0,0])\n    # Get aligned poses for each of the rotated frames\n    local structAlignedToX = get_aligned_z_pose(pose_trans(frame, p[0,0,0,rotZtoX[0],rotZtoX[1],rotZtoX[2]]))\n    structAlignedToY = get_aligned_z_pose(pose_trans(frame, p[0,0,0,rotZtoY[0],rotZtoY[1],rotZtoY[2]]))\n    structAlignedToZ = get_aligned_z_pose(pose_trans(frame, p[0,0,0,rotZtoZ[0],rotZtoZ[1],rotZtoZ[2]]))\n    # Find the nearest alignement\n    local structAligned = structAlignedToZ\n    if(structAligned.distance > structAlignedToX.distance):\n        structAligned = structAlignedToX    \n    end\n    if(structAligned.distance > structAlignedToY.distance):\n        structAligned = structAlignedToY    \n    end\n    # Move the robot to the aligned pose\n    movel(pose_trans(get_actual_tcp_pose(), p[0,0,0.00001,0,0,0]), v = 0.1)\n    movel(pose_trans(structAligned.referencePose, structAligned.pose ), v = 0.1)\nend\n# End of Align Z to Nearest Axis\n# Start of Center to Object\n###\n# Centers to an object by touching the externals of it. It works well for fixtured or heavy parts.\n# @param push_force number Force the robot uses to determine if a contact has been achieved\n# @param velocity_move number Velocity in freespace\n# @param velocity_search number First move is used then search\n# @param acc_move number Acceleration in freespace\n# @param max_radius_search number Maximum search radius\n# @param num_fingers number Number of fingers that the gripper has\n###\ndef ur_center_to_object(push_force = 10, velocity_move = 0.10, velocity_search = 0.01, acc_move = 0.2, max_radius_search = 0.05, num_fingers = 3):\n    def compute_circle_center(p_list):\n        # Compute the circle center by circular regression\n        # Source: https://math.stackexchange.com/questions/2898295/how-to-quickly-fit-a-circle-by-given-random-arc-points\n        local itr = 0\n        local x = 0\n        local y = 1\n    \n        local m1 = [[0,0,0],[0,0,0],[0,0,0]]\n        local m2 = [[0,0],[0,0],[0,0]]\n        local m3 = [[0],[0],[0]]\n    \n        while(itr < get_list_length(p_list)):\n            local p = p_list[itr]\n    \n            if(p_list[itr] == p[0,0,0,0,0,0]):\n                break\n            end\n    \n            m1[0,0] = m1[0,0] + (p[x]*p[x])\n            m1[0,1] = m1[0,1] + (p[x]*p[y])\n            m1[0,2] = m1[0,2] + (p[x])\n    \n            m1[1,0] = m1[1,0] + (p[x]*p[y])\n            m1[1,1] = m1[1,1] + (p[y]*p[y])\n            m1[1,2] = m1[1,2] + (p[y])\n    \n            m1[2,0] = m1[2,0] + (p[x])\n            m1[2,1] = m1[2,1] + (p[y])\n    \n            m2[0,0] = m2[0,0] + (pow(p[x], 3))\n            m2[0,1] = m2[0,1] + (p[x] * pow(p[y], 2))\n    \n            m2[1,0] = m2[1,0] + (pow(p[y], 3))\n            m2[1,1] = m2[1,1] + (pow(p[x], 2) * p[y])\n    \n            m2[2,0] = m2[2,0] + (pow(p[x], 2))\n            m2[2,1] = m2[2,1] + (pow(p[y], 2))\n    \n            itr = itr +1\n        end\n    \n        if(itr < 2):\n            return p[0,0,0,0,0,0]\n        elif(itr > get_list_length(p_list)):\n            return p[0,0,0,0,0,0]\n        end\n    \n        m1[0,0] = 2 * m1[0,0]\n        m1[0,1] = 2 * m1[0,1]\n        m1[1,0] = 2 * m1[1,0]\n        m1[1,1] = 2 * m1[1,1]\n        m1[2,0] = 2 * m1[2,0]\n        m1[2,1] = 2 * m1[2,1]\n        m1[2,2] = itr\n        m3[0,0] = m2[0,0] + m2[0,1]\n        m3[1,0] = m2[1,0] + m2[1,1]\n        m3[2,0] = m2[2,0] + m2[2,1]\n    \n        local center = inv(m1) * m3\n    \n        return p[center[0,0], center[1,0],0,0,0,0]\n    end\n    \n    def sanity_checked_move(p_org, p_new, max_diff, acc, vel):\n        if (pose_dist(p_org, p_new) > max_diff):\n            movel(p_org, a = acc, v = vel)\n            popup(\"New pose is too far away from original. Returning to original\", title = \"Failed\", warning = False, error = True, blocking = True)\n        else:\n            movel(p_new, a = acc, v = vel)\n        end\n    end\n    # Start by zeroing the FT sensor\n    sleep(0.25)\n    zero_ftsensor()\n    local p_start = get_actual_tcp_pose()\n    local p0 = p[0,0,0,0,0,0]\n    local DIR_X = [1, 0, 0]\n    if (num_fingers == 2):\n        local dir_list = [DIR_X, -DIR_X, DIR_X, -DIR_X]\n        local start_offset = [p[0,0,0,0,0,0], p[0,0,0,0,0,0], p[0,0,0,0,0,0.35], p[0,0,0,0,0,0.35]]\n        local p_list = [p0, p0, p0, p0]\n    elif (num_fingers == 3):\n        local DIR_P1 = DIR_X\n        local DIR_P2 = [-1 / 2, sqrt(3.0) / 2.0, 0]\n        local DIR_P3 = [-1 / 2, -sqrt(3.0) / 2.0, 0]\n        local dir_list = [DIR_P1, DIR_P2, DIR_P3, DIR_P1, DIR_P2, DIR_P3]\n        local start_offset = [p[0,0,0,0,0,0], p[0,0,0,0,0,0], p[0,0,0,0,0,0], p[0,0,0,0,0,0.35], p[0,0,0,0,0,0.35], p[0,0,0,0,0,0.35]]\n        local p_list = [p0, p0, p0, p0, p0, p0]\n    else:\n        popup(\"Number of fingers not supported\")\n        halt\n    end\n    # Loop through directions\n    local it = 0\n    local dir_list_size = size(dir_list)\n    local dir_list_length = dir_list_size[0]\n    while(it < dir_list_length):\n        # Move to starting position if more than 3 positions is stored then calculate a new starting position\n        if(it < 3):\n            movel(pose_trans(p_start, start_offset[it]), a = acc_move, v = velocity_move)\n        else:\n            local p_start_temp = pose_trans(pose_trans(p_start, compute_circle_center(p_list)), start_offset[it])\n            local p_start_w_offset = pose_trans(p_start, start_offset[it])\n            sanity_checked_move(p_start_w_offset, p_start_temp, max_radius_search, acc_move, velocity_move)\n        end\n        local p_start_temp = get_actual_tcp_pose()\n        # Move into contact and store contact point\n        sleep(0.1)\n        local contact_point = ur_move_until_force(distance = max_radius_search, direction = [dir_list[it, 0], dir_list[it, 1], dir_list[it, 2]], velocity = velocity_search, acceleration = acc_move, stop_force = push_force)\n        \n        local dir = [dir_list[it, 0], dir_list[it, 1], dir_list[it, 2]]\n        dir = normalize(dir) * 0.05\n        contact_point = pose_trans(contact_point, p[dir[0], dir[1], dir[2], 0, 0, 0])\n        p_list[it] = pose_trans(pose_inv(p_start), contact_point)\n        # Move out of contact\n        movel(p_start_temp, a = acc_move, v = velocity_move)\n        it = it + 1\n    end\n    # Find circle center based on n stored  points\n    local center_offset_xy = compute_circle_center(p_list)\n    local p_center = pose_trans(p_start, center_offset_xy)\n    \n    # Move the robot to the center if it can\n    sanity_checked_move(p_start, p_center, max_radius_search, acc_move, velocity_move)\nend\n# End of Center to Object\n# Start of Move Into Contact\n###\n# Moves the robot into contact in the TCP direction set\n# @param force number Force that determines when a contact has been achieved\n# @param velocity number Velocity of the robot\n# @param acceleration number Acceleration of the robot\n# @param max_distance number Maximum distance that the robot searches\n# @param velocity_search number velocity_search\n# @param retract number Retract distance after a contact has been found\n# @param move_tcp_dir array TCP direction (3D vector)\n# @param zero_ft_on_start bool Determines if the force-torque sensor should be zeroed on start\n###\ndef ur_move_into_contact(force = 10, velocity = 0.05, acceleration = 0.1, max_distance = 0.25, retract = 0.0, move_tcp_dir = [0, 0, 1], zero_ft_on_start = True):\n    # Zero the force torque sensor\n    if (zero_ft_on_start):\n        sleep(0.25)\n        zero_ftsensor()\n    end\n    # Move the robot\n    ur_move_until_force(max_distance, move_tcp_dir, velocity, acceleration, force)\n    # If a retract distance is set, move the robot back to that position\n    if (retract != 0):\n        # Compute position offset from TCP direction and retract distance\n        local position = normalize(move_tcp_dir) * retract\n        movel(pose_trans(get_actual_tcp_pose(), p[position[0], position[1], position[2], 0, 0, 0]))\n    end\nend\n# End of Move Into Contact\n# Start of Retract\n###\n# Retract in the TCP direction set\n# @param distance number Retraction distance\n# @param direction array TCP direction to move in (3D vector)\n# @param acceleration number Acceleration used by the robot\n# @param velocity number Velocity used by the robot\n###\ndef ur_retract(distance = -0.1, direction = [0, 0, 1], acceleration = 0.4, velocity = 0.1):\n    local movement = normalize(direction) * distance\n    movel(pose_trans(get_actual_tcp_pose(), p[movement[0], movement[1], movement[2], 0, 0, 0]), a = acceleration, v = velocity)\nend\n# End of Retract","nodeIDList":[]}},"program":{"id":"3","programContent":{"guid":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6","contributedNode":{"type":"ur-program","version":"0.0.3","allowsChildren":true,"lockChildren":true,"parameters":{"name":"light_tower_10_13","symbolHistory":{"variables":[{"name":"cnt","valueType":"integer","programNodeMetadata":{"programNodeId":"0b1cb4f0-e174-c6ba-16ba-40d0fa3e2fd5","isSuppressed":false},"reference":{"id":"84127625-0571-e628-1378-dee4a186a8dc","_IDENTIFIER":"VariableReference"}},{"name":"Point_1","valueType":"waypoint","programNodeMetadata":{"programNodeId":"3d988b75-7718-4014-a68c-b4b866454a07","isSuppressed":false},"reference":{"id":"836c34f3-7d86-8c09-529e-2c1d0b9f7e99","_IDENTIFIER":"VariableReference"}},{"name":"Point","valueType":"waypoint","programNodeMetadata":{"programNodeId":"f7764806-d057-e0c8-beb1-157b1e8a5abf","isSuppressed":false},"reference":{"id":"0a225842-498e-bc71-f117-6275d2524767","_IDENTIFIER":"VariableReference"}},{"name":"base","valueType":"frame","reference":{"id":"583d3a7d-b103-aff9-502d-73d459fc2a0e","_IDENTIFIER":"VariableReference"}},{"name":"tcp","valueType":"frame","reference":{"id":"1debc310-2146-1b93-ebf3-6e257bfdd2da","_IDENTIFIER":"VariableReference"}},{"name":"world","valueType":"frame","reference":{"id":"ddca5ccc-8f81-8461-2a8f-935321f2bf01","_IDENTIFIER":"VariableReference"}},{"name":"flange","valueType":"frame","reference":{"id":"a284652e-3e38-9434-2e20-eae9dd10bd79","_IDENTIFIER":"VariableReference"}},{"name":"grid","valueType":"grid","reference":{"id":"af733917-cce3-4b11-fb24-7e6677ff572e","_IDENTIFIER":"VariableReference"}},{"name":"grid_iterator","valueType":"waypoint","reference":{"id":"68ebd02e-0a2d-ad92-c6de-c677a19dddf0","_IDENTIFIER":"VariableReference"}},{"name":"Joint_fast","valueType":"profile","reference":{"id":"66cc9640-9626-20a9-b6be-e75938fdf603","_IDENTIFIER":"VariableReference"}},{"name":"Joint_slow","valueType":"profile","reference":{"id":"0e781f7a-4120-999b-9eb9-c25c1dc8d0c8","_IDENTIFIER":"VariableReference"}},{"name":"Linear_fast","valueType":"profile","reference":{"id":"2faf9dcd-a026-b177-e610-2044e80f9d1a","_IDENTIFIER":"VariableReference"}},{"name":"Linear_slow","valueType":"profile","reference":{"id":"f9fc918f-21e5-f43d-8029-5ab979f2ce28","_IDENTIFIER":"VariableReference"}},{"name":"Process","valueType":"profile","reference":{"id":"854474bd-bfb7-9f87-49da-48a03f2d574c","_IDENTIFIER":"VariableReference"}},{"name":"Home","valueType":"waypoint","reference":{"id":"7622345a-0e52-2cf8-0ff6-3a6568b1e03a","_IDENTIFIER":"VariableReference"}},{"name":"var","valueType":"integer","programNodeMetadata":{"programNodeId":"005c535e-bb0c-4167-9b86-8064251941ec","isSuppressed":false},"reference":{"id":"accbf97a-fb00-6aa5-c8d5-f23b7c513f71","_IDENTIFIER":"VariableReference"}}],"functions":[],"modules":[{"name":"application","reference":{"id":"application-module-id","_IDENTIFIER":"ModuleReference"}}]}}},"children":[{"children":[],"contributedNode":{"type":"ur-modules","version":"0.0.1","allowsChildren":true,"lockChildren":false},"guid":"de644f4c-0701-73d2-9150-9df1d52ddded","parentId":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6"},{"children":[],"contributedNode":{"type":"ur-functions","version":"0.0.1","allowsChildren":true,"lockChildren":false},"guid":"a7c77472-75ca-8373-4ac8-dc60167c5887","parentId":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6"},{"children":[{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"name":"cnt","id":"84127625-0571-e628-1378-dee4a186a8dc","valueType":"integer","_IDENTIFIER":"VariableDeclaration","reference":false,"type":"$$Variable","declaredByID":"0b1cb4f0-e174-c6ba-16ba-40d0fa3e2fd5"},"selectedType":"VALUE","value":0},"valueType":"integer","waypointType":"teach"}},"guid":"0b1cb4f0-e174-c6ba-16ba-40d0fa3e2fd5","parentId":"1f2ea1bf-635d-582d-0ab5-da38795ae4e6","programLabel":[{"type":"primary","value":"cnt:"},{"type":"secondary","value":"0"}]}],"contributedNode":{"type":"ur-before-start","version":"0.0.1","allowsChildren":true},"guid":"1f2ea1bf-635d-582d-0ab5-da38795ae4e6","parentId":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6"},{"children":[],"contributedNode":{"type":"ur-configuration","version":"0.0.1","allowsChildren":true,"parameters":{}},"guid":"3712ecde-8a7a-412f-1a04-4f957a113b4a","parentId":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6"},{"children":[],"contributedNode":{"type":"ur-status","version":"0.0.1","allowsChildren":true,"parameters":{}},"guid":"b9e24af3-a524-b86c-18a5-bee20de853da","parentId":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6"},{"children":[{"children":[],"contributedNode":{"version":"0.0.1","type":"ur-joint-move","allowsChildren":false,"parameters":{"moveType":"moveJ","variable":{"entity":{"name":"Point_1","reference":false,"type":"$$Variable","valueType":"waypoint","id":"836c34f3-7d86-8c09-529e-2c1d0b9f7e99","_IDENTIFIER":"VariableDeclaration","declaredByID":"3d988b75-7718-4014-a68c-b4b866454a07"},"selectedType":"VALUE","value":"Point_1"},"waypoint":{"frame":"base","tcp":{"id":"9d2f3820-89cc-9b9d-0d28-d03387086ed9","name":"Tool_flange"},"qNear":{"base":1.9847335815429688,"shoulder":-2.096914907495016,"elbow":2.5490341822253626,"wrist1":-2.051805635491842,"wrist2":2.946820020675659,"wrist3":0.04913477227091789},"pose":{"x":{"entity":{"value":0.12740971093833367,"unit":"m"},"selectedType":"VALUE","value":0.12740971093833367},"y":{"entity":{"value":-0.20444009987253195,"unit":"m"},"selectedType":"VALUE","value":-0.20444009987253195},"z":{"entity":{"value":0.38082839592051015,"unit":"m"},"selectedType":"VALUE","value":0.38082839592051015},"rx":{"entity":{"value":0.22616008583506836,"unit":"rad"},"selectedType":"VALUE","value":0.22616008583506836},"ry":{"entity":{"value":-1.370772028082292,"unit":"rad"},"selectedType":"VALUE","value":-1.370772028082292},"rz":{"entity":{"value":0.4043396486803945,"unit":"rad"},"selectedType":"VALUE","value":0.4043396486803945}}},"advanced":{"speed":{"speed":{"entity":{"value":1.0471975511965976,"unit":"rad/s"},"selectedType":"VALUE","value":1.0471975511965976},"acceleration":{"entity":{"value":1.3962634015954636,"unit":"rad/s^2"},"selectedType":"VALUE","value":1.3962634015954636},"motionValue":"OptiMove","optiMoveSpeed":{"entity":{"value":10,"unit":"%"},"selectedType":"VALUE","value":"10"},"optiMoveAcceleration":{"entity":{"value":2,"unit":"%"},"selectedType":"VALUE","value":"2"}},"blend":{"enabled":false},"transform":{"transform":false}}}},"guid":"3d988b75-7718-4014-a68c-b4b866454a07","parentId":"af312817-a0dd-a65f-abfa-dcd0d9f1fb49","programLabel":[{"type":"primary","translationKey":"program-node-label.moves-to.name.default","interpolateParams":{"name":"Point_1"}},{"type":"secondary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"base"}},{"type":"secondary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"Tool_flange"}},{"type":"secondary","translationKey":"program-node-label.moves-to.speed","interpolateParams":{"speed":"10 %"}},{"type":"secondary","translationKey":"program-node-label.moves-to.acceleration","interpolateParams":{"acceleration":"2 %"}}]},{"children":[],"contributedNode":{"type":"ur-assignment","version":"0.0.3","allowsChildren":false,"parameters":{"variable":{"entity":{"id":"84127625-0571-e628-1378-dee4a186a8dc","_IDENTIFIER":"VariableReference"},"selectedType":"EXPRESSION","value":"cnt +1"},"valueType":"integer","waypointType":"teach"}},"guid":"005c535e-bb0c-4167-9b86-8064251941ec","parentId":"af312817-a0dd-a65f-abfa-dcd0d9f1fb49","programLabel":[{"type":"primary","value":"cnt:"},{"type":"secondary","value":"cnt +1"}]},{"children":[{"children":[{"children":[],"contributedNode":{"type":"ur-script","version":"0.0.1","parameters":{"name":"","expression":"protective_stop()","valid":true}},"guid":"89035f63-87a7-09db-cb93-b706286b9ec6","parentId":"1d227b83-bbd3-e915-6f3d-1b85697843c6","programLabel":"protective_stop()"}],"contributedNode":{"type":"ur-if","version":"0.0.3","allowsChildren":true,"parameters":{"expression":{"_IDENTIFIER":"Expression","expression":"cnt % 6 == 0"}}},"guid":"1d227b83-bbd3-e915-6f3d-1b85697843c6","parentId":"430d3ab3-abe0-03ae-4d71-c4cd988e068b","programLabel":[{"type":"secondary","value":"cnt % 6 == 0"}]}],"contributedNode":{"type":"ur-folder","version":"0.0.1","allowsChildren":true,"parameters":{"folderName":"simulate protective stop"}},"guid":"430d3ab3-abe0-03ae-4d71-c4cd988e068b","parentId":"af312817-a0dd-a65f-abfa-dcd0d9f1fb49","programLabel":"simulate protective stop"},{"children":[],"contributedNode":{"version":"0.0.1","type":"ur-joint-move","allowsChildren":false,"parameters":{"moveType":"moveJ","variable":{"entity":{"name":"Point","reference":false,"type":"$$Variable","valueType":"waypoint","id":"0a225842-498e-bc71-f117-6275d2524767","_IDENTIFIER":"VariableDeclaration","declaredByID":"f7764806-d057-e0c8-beb1-157b1e8a5abf"},"selectedType":"VALUE","value":"Point"},"waypoint":{"frame":"base","tcp":{"id":"9d2f3820-89cc-9b9d-0d28-d03387086ed9","name":"Tool_flange"},"qNear":{"base":1.4565414190292358,"shoulder":-2.0966388187804164,"elbow":2.548706595097677,"wrist1":-2.053514619866842,"wrist2":2.8531687259674072,"wrist3":0.04886492341756821},"pose":{"x":{"entity":{"value":0.009236127870901806,"unit":"m"},"selectedType":"VALUE","value":0.009236127870901806},"y":{"entity":{"value":-0.24085756721225615,"unit":"m"},"selectedType":"VALUE","value":-0.24085756721225615},"z":{"entity":{"value":0.39016147434983656,"unit":"m"},"selectedType":"VALUE","value":0.39016147434983656},"rx":{"entity":{"value":-0.13260115386319565,"unit":"rad"},"selectedType":"VALUE","value":-0.13260115386319565},"ry":{"entity":{"value":-1.2772094580145354,"unit":"rad"},"selectedType":"VALUE","value":-1.2772094580145354},"rz":{"entity":{"value":-0.03894421881206851,"unit":"rad"},"selectedType":"VALUE","value":-0.03894421881206851}}},"advanced":{"speed":{"speed":{"entity":{"value":1.0471975511965976,"unit":"rad/s"},"selectedType":"VALUE","value":1.0471975511965976},"acceleration":{"entity":{"value":1.3962634015954636,"unit":"rad/s^2"},"selectedType":"VALUE","value":1.3962634015954636},"motionValue":"OptiMove","optiMoveSpeed":{"entity":{"value":10,"unit":"%"},"selectedType":"VALUE","value":"10"},"optiMoveAcceleration":{"entity":{"value":2.5,"unit":"%"},"selectedType":"VALUE","value":"2.5"}},"blend":{"enabled":false},"transform":{"transform":false}}}},"guid":"f7764806-d057-e0c8-beb1-157b1e8a5abf","parentId":"af312817-a0dd-a65f-abfa-dcd0d9f1fb49","programLabel":[{"type":"primary","translationKey":"program-node-label.moves-to.name.default","interpolateParams":{"name":"Point"}},{"type":"secondary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"base"}},{"type":"secondary","translationKey":"program-node-label.single-value","interpolateParams":{"value":"Tool_flange"}},{"type":"secondary","translationKey":"program-node-label.moves-to.speed","interpolateParams":{"speed":"10 %"}},{"type":"secondary","translationKey":"program-node-label.moves-to.acceleration","interpolateParams":{"acceleration":"2.5 %"}}]}],"contributedNode":{"type":"ur-code","version":"0.0.1","allowsChildren":true,"lockChildren":false,"parameters":{"loopForever":true}},"guid":"af312817-a0dd-a65f-abfa-dcd0d9f1fb49","parentId":"8e3b0e48-5d9e-19b2-f939-40ff10f48cc6","programLabel":[{"type":"secondary","translationKey":"program-node-label.code.looping"},{"type":"secondary","translationKey":"program-node-label.code.enabled"}]}]},"programInformation":{"name":"light_tower_10_14","description":"Example for using logic programs to control light tower.\nCompatible with Polyscope 10.13.0","createdDate":1783503413207,"lastSavedDate":1783503415427,"lastModifiedDate":null,"programState":"FINAL","functionsBlockShown":false},"urscript":{"script":"global Point_1 = struct(p=p[0.12740971093833367, -0.20444009987253195, 0.38082839592051015, 0.22616008583506836, -1.370772028082292, 0.4043396486803945], frame=\"base\", q=[1.9847335815429688, -2.096914907495016, 2.5490341822253626, -2.051805635491842, 2.946820020675659, 0.04913477227091789])\nglobal Point = struct(p=p[0.009236127870901806, -0.24085756721225615, 0.39016147434983656, -0.13260115386319565, -1.2772094580145354, -0.03894421881206851], frame=\"base\", q=[1.4565414190292358, -2.0966388187804164, 2.548706595097677, -2.053514619866842, 2.8531687259674072, 0.04886492341756821])\n$ 1 \"ur-program\"\n$ 2 \"ur-modules\"\n$ 3 \"ur-functions\"\n$ 4 \"ur-before-start\"\n$ 5 \"ur-assignment\"\nglobal cnt = 0\n$ 6 \"ur-code\"\nwhile (True):\n  $ 7 \"ur-joint-move\"\n  set_tcp(p[0, 0, 0, 0, 0, 0], \"Tool_flange\")\n  optimovej(get_inverse_kin(convert_pose(Point_1.p, Point_1.frame, \"base\"), qnear=Point_1.q), a=0.02, v=0.1)\n  $ 8 \"ur-assignment\"\n  cnt = cnt +1\n  $ 9 \"ur-folder\"\n  $ 10 \"ur-if\"\n  if (cnt % 6 == 0):\n    $ 11 \"ur-script\"\n    protective_stop()\n  end\n  $ 12 \"ur-joint-move\"\n  set_tcp(p[0, 0, 0, 0, 0, 0], \"Tool_flange\")\n  optimovej(get_inverse_kin(convert_pose(Point.p, Point.frame, \"base\"), qnear=Point.q), a=0.025, v=0.1)\nend","nodeIDList":["00000000-0000-0000-0000-000000000000","8e3b0e48-5d9e-19b2-f939-40ff10f48cc6","de644f4c-0701-73d2-9150-9df1d52ddded","a7c77472-75ca-8373-4ac8-dc60167c5887","1f2ea1bf-635d-582d-0ab5-da38795ae4e6","0b1cb4f0-e174-c6ba-16ba-40d0fa3e2fd5","af312817-a0dd-a65f-abfa-dcd0d9f1fb49","3d988b75-7718-4014-a68c-b4b866454a07","005c535e-bb0c-4167-9b86-8064251941ec","430d3ab3-abe0-03ae-4d71-c4cd988e068b","1d227b83-bbd3-e915-6f3d-1b85697843c6","89035f63-87a7-09db-cb93-b706286b9ec6","f7764806-d057-e0c8-beb1-157b1e8a5abf"]}}}