From 2cd64b3531097f4265106c343036312856b0fd04 Mon Sep 17 00:00:00 2001 From: Eleni Alexi Date: Sun, 5 Mar 2023 20:35:14 +0100 Subject: [PATCH 1/2] Assignment_01 --- .../eleni_alexi/assignment_01.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 lecture_02/assignment_01/eleni_alexi/assignment_01.py diff --git a/lecture_02/assignment_01/eleni_alexi/assignment_01.py b/lecture_02/assignment_01/eleni_alexi/assignment_01.py new file mode 100644 index 0000000..80a7d81 --- /dev/null +++ b/lecture_02/assignment_01/eleni_alexi/assignment_01.py @@ -0,0 +1,32 @@ +"""Assignment 01: Project box to xy-plane +""" +from compas.artists import Artist +from compas.artists import MeshArtist +from compas.datastructures import Mesh +from compas.geometry import Box +from compas.geometry import Frame +from compas.geometry import Plane +from compas.geometry import Projection + +# Define a Frame, which is not in the origin and a bit tilted to the world frame +frame = Frame([10, 4, 8], [1, -0.75, 0], [0, 0.25, -0.2]) + +# Create a Box with that frame +box = Box(frame, 4, 3, 5) + +# Create a perspective Projection Transformation to project onto the xy-plane from a single point +P = Projection.from_plane_and_point(Plane.worldXY(), [5, 3, 2]) + +# Create a Mesh from the Box +mesh = Mesh.from_shape(box) + +# Apply the Projection onto the mesh +mesh_projected = mesh.transformed(P) + +# Create artists +artist1 = Artist(box) +artist2 = MeshArtist(mesh_projected) + +# Draw all and add to a list +a = [artist1.draw()] +a.extend(artist2.draw_edges(color="#00ff00")) From dc8b80941b1f7ba03c87f49ef84016f3110b8e2a Mon Sep 17 00:00:00 2001 From: Eleni Alexi Date: Mon, 27 Mar 2023 00:15:05 +0200 Subject: [PATCH 2/2] Submission of assignment_03 --- .../eleni_alexi/assignment_03.ghx | 5263 +++++++++++++++++ 1 file changed, 5263 insertions(+) create mode 100644 lecture_04/assignment_03/eleni_alexi/assignment_03.ghx diff --git a/lecture_04/assignment_03/eleni_alexi/assignment_03.ghx b/lecture_04/assignment_03/eleni_alexi/assignment_03.ghx new file mode 100644 index 0000000..a43df49 --- /dev/null +++ b/lecture_04/assignment_03/eleni_alexi/assignment_03.ghx @@ -0,0 +1,5263 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + c4f913db-409d-41a9-88e1-f6f90989047d + Shaded + 1 + + 100;150;0;0 + + + 100;0;150;0 + + + + + + 637527254194888879 + + assignment_03.ghx + + + + + 0 + + + + + + 190 + 127 + + 0.27249065 + + + + + 0 + + + + + + + 0 + + + + + 1 + + + + + GhPython, Version=7.22.22255.5001, Culture=neutral, PublicKeyToken=null + 7.22.22255.5001 + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + 58 + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + bfe572e7-d997-4c3c-8488-4e03d01804ea + b278407c-79b3-49ef-a2c8-ee682b33d9ef + 6fe2e9d2-130c-4a02-b347-a1c6b831fc5a + 9a4be73c-3082-4c74-be27-41c7c1688c53 + 4 + 3dd78fb5-3c65-4715-b2db-b9489d44fd71 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + d5ffda3e-a3ab-4688-9de8-1d9d9e2789e3 + 4b0a07e0-a378-4f92-8f0a-6c1f1fb427f2 + 1d31a79f-b7ba-423f-944c-23f606999dae + eaec99d4-5f03-4209-953f-02aee1235de3 + 4a5bf47a-b0af-4831-a451-6b776364bb7e + 5 + 5a4ca04f-0f26-4978-bcce-92edaa3c4b8e + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + 781a5de8-c54c-4805-927f-519a45da032f + 4b0a07e0-a378-4f92-8f0a-6c1f1fb427f2 + 1d31a79f-b7ba-423f-944c-23f606999dae + eaec99d4-5f03-4209-953f-02aee1235de3 + 4a5bf47a-b0af-4831-a451-6b776364bb7e + 20c7f0ab-fd13-4bd7-a130-c6fe893d2a0b + 47c152bc-c823-4835-aad3-3bf5c281e892 + d19cf29a-0512-4632-b4e0-ecc00c5b8487 + 2ceac33a-a5ff-4a42-8067-32e6a2c7fbee + ac227038-eb23-4cb5-94d8-f63bb92375a4 + b3787c61-219b-4ed9-b49f-1e7dd56236b1 + b395bfb0-5717-46c4-924c-a3ba167b1e0d + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 78471367-17af-4599-8661-808ba87f82a6 + bfa816f1-e4c0-482e-9515-4b540fd2f427 + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + 16 + 8b8d6fbf-db19-4267-9188-c4fdd76620b6 + Group + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 4e66fe1b-29b3-4955-9524-ca986decd9ac + Data + Robot + false + 1d61c641-0916-464a-87c2-32a0e2aba39d + 1 + + + + + + 1254 + 170 + 50 + 20 + + + 1279.353 + 180.9772 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 119.7138 + + + 272.0458 + 119.7138 + + + 272.0458 + 139.8124 + + + 46.70692 + 139.8124 + + A quick note + Cambria + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + false + Scribble + Scribble + 22 + 1) Load robot from ROS + + + + + + 41.70692 + 114.7138 + 235.3389 + 30.09864 + + + 46.70692 + 119.7138 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + aacb02be-ffde-4997-b910-3a5670a6e5b1 + Data + Target planes + false + c3f7a590-7e15-4cd6-9cb7-0edc2d08461c + 1 + + + + + + 1224 + 586 + 78 + 20 + + + 1263.809 + 596.9482 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;240;218;146 + + A group of Grasshopper objects + 0c3c0677-cbf3-46be-b539-e48399697bc7 + de6b7a53-8f17-48cc-bb14-1aedc473dd1c + 04770360-9eb5-44e4-911f-142deec44bdc + aacb02be-ffde-4997-b910-3a5670a6e5b1 + 50ee1702-2c6a-4092-b68b-7fd9ec30c129 + 9dbe68e7-ae2d-4df4-89a9-ae0ec5759854 + d17c9d6f-7bf6-411c-816c-4c1caad151b9 + 5198e705-e320-4edc-a605-c0d644613445 + 59dd3c95-dc56-4c53-87d2-b1faf15cb474 + ad125eb0-443d-48ef-83b7-476151411f85 + fa02b341-ed3c-4a4e-bc94-374e2b36b813 + c0bde1c9-cb42-4e8f-b3b9-8ca0e06bda59 + ba084858-317f-49aa-8843-0755aabd650e + 13 + cf91e427-c398-45be-b915-f55275cc67b7 + Group + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + d385349b-7e03-4362-b9d0-eacd34e2562b + Data + Pickup plane + false + b442c091-2518-4ef1-aac8-21775ba7c449 + 1 + + + + + + 1229 + 350 + 75 + 20 + + + 1266.929 + 360.6916 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;240;218;146 + + A group of Grasshopper objects + d385349b-7e03-4362-b9d0-eacd34e2562b + 66c3b06d-1415-476b-875b-53498de1860a + c9e84bc7-5f07-46ef-9e42-32f7d85d0c13 + 39a429c7-2480-4ff8-8f4c-5bd8a47369a7 + 224add91-1cc7-47af-8c77-af2d42147144 + ff0bbdd7-eb5b-4ed6-a652-505db2c0ac8c + 8060f212-ae75-42c7-8587-1d473d2e2638 + 7 + 3c032157-3bf9-40ee-9b12-e4e807d15ccc + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 281.4785 + + + 269.3387 + 281.4785 + + + 269.3387 + 301.5771 + + + 46.70692 + 301.5771 + + A quick note + Cambria + ff0bbdd7-eb5b-4ed6-a652-505db2c0ac8c + false + Scribble + Scribble + 22 + 2) Define pick-up plane + + + + + + 41.70692 + 276.4785 + 232.6318 + 30.09863 + + + 46.70692 + 281.4785 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 469.1947 + + + 263.9891 + 469.1947 + + + 263.9891 + 489.4222 + + + 46.70692 + 489.4222 + + A quick note + Cambria + 9dbe68e7-ae2d-4df4-89a9-ae0ec5759854 + false + Scribble + Scribble + 22 + 3) Define target planes + + + + + + 41.70692 + 464.1947 + 227.2822 + 30.22754 + + + 46.70692 + 469.1947 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Robot Visualize + + + + + """ +Visualizes the robot. + +COMPAS FAB v0.27.0 +""" +from compas.artists import Artist +from compas.geometry import Frame +from compas.geometry import Transformation +from compas_fab.robots import PlanningScene +from ghpythonlib.componentbase import executingcomponent as component + + +class RobotVisualize(component): + def RunScript( + self, + robot, + group, + configuration, + show_visual, + show_collision, + show_frames, + show_base_frame, + show_end_effector_frame, + show_cm, + show_acm, + ): + + visual = None + collision = None + collision_meshes = None + attached_meshes = None + frames = None + base_frame = None + ee_frame = None + + if robot: + show_visual = True if show_visual is None else show_visual + show_cm = True if show_cm is None else show_cm + show_acm = True if show_acm is None else show_acm + configuration = configuration or robot.zero_configuration() + + robot.update(configuration, visual=show_visual, collision=show_collision) + compas_frames = robot.transformed_frames(configuration, group) + + if show_visual: + visual = robot.artist.draw_visual() + + if show_collision: + collision = robot.artist.draw_collision() + + if show_base_frame: + base_compas_frame = compas_frames[0] + artist = Artist(base_compas_frame) + base_frame = artist.draw() + + if show_end_effector_frame: + ee_compas_frame = robot.forward_kinematics( + configuration, group, options=dict(solver="model") + ) + artist = Artist(ee_compas_frame) + ee_frame = artist.draw() + + if show_frames: + frames = [] + for compas_frame in compas_frames[1:]: + artist = Artist(compas_frame) + frame = artist.draw() + frames.append(frame) + + if show_cm or show_acm: + scene = PlanningScene(robot) + scene = robot.client.get_planning_scene() + + collision_meshes = [] + attached_meshes = [] + + if show_cm: + for co in scene.world.collision_objects: + header = co.header + frame_id = header.frame_id + cms = co.to_collision_meshes() + + for cm in cms: + if cm.frame != Frame.worldXY(): + t = Transformation.from_frame(cm.frame) + mesh = cm.mesh.transformed(t) + else: + mesh = cm.mesh + + collision_meshes.append(Artist(mesh).draw()) + + if show_acm: + for aco in scene.robot_state.attached_collision_objects: + for acm in aco.to_attached_collision_meshes(): + frame_id = aco.object["header"]["frame_id"] + frame = robot.forward_kinematics( + configuration, options=dict(link=frame_id) + ) + t = Transformation.from_frame(frame) + + # Local CM frame + if ( + acm.collision_mesh.frame + and acm.collision_mesh.frame != Frame.worldXY() + ): + t = t * Transformation.from_frame( + acm.collision_mesh.frame + ) + + mesh = acm.collision_mesh.mesh.transformed(t) + + attached_meshes.append(Artist(mesh).draw()) + + return ( + visual, + collision, + collision_meshes, + attached_meshes, + frames, + base_frame, + ee_frame, + ) + + Visualizes the robot. +COMPAS FAB v0.27.0 + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEQAACxEBf2RfkQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/zt2jtm9VSLEg+9ud2bnn9nZu1spiuJfyRqXSdb4F3ZvX1vigmfOXzP8FQm/iEJ8iH7qjyZUIUZiIgjseb9HvjMxE4jbE4jt2Lo0CGca0BOI3Ti8nzGFdYTFv9cShAWlUzyK6zC/E9aGHFFbND8Q1c5TBwHPgiQPYU4C2uZFPVEbNa/aA9wqg5wIE2RP6AuSsH2DAzV/2Q49aRPtwzYzTW5VBXKwC+sjIvQ+qiiso52IWSG00B941CKfwA7UDs0qqiUJ61nnD5z10ffALe2hb48x8Ws88lEIhWWLqBnC4jQBRIUsStYosdxbUx6croFgAJcWo6st5sE+ruw28EiMbfs3xbjBnxWKEw8quw1SEEvEgaQtCQydWJv1zjb3OpFoisT8G2KMJNINYlBWq8t2NfQakWCKxH48cAlNg+CT8AmPvUYkCArmq82JRmydnJeCa+sbX42dvfsgPk31ogko2L7kX9m+GpcJYLXR/AzjqD0QTUDBCyWA5v5hlSTQTfWiCSiQX4X91H5l8+jUzgHeUi2oGZZN1rg8ipVvhzuVIxcFIsQAAAAASUVORK5CYII= + + false + 7a58f25a-3dc8-4dfa-bf0f-35404273569e + true + true + Robot Visualize + Robot Visualize + + + + + + 2356 + 139 + 257 + 204 + + + 2503 + 241 + + + + + + 10 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 7 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + 439bbb30-bb2a-4f39-bfd6-8205cd93fd09 + robot + robot + true + 0 + true + 619d4216-bdfd-4395-b679-83b02e397c53 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 2358 + 141 + 130 + 20 + + + 2424.5 + 151 + + + + + + + + true + The planning group used for end-effector and base visualization. + ad36f822-0439-4ba3-b51a-c348f6f591ec + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 2358 + 161 + 130 + 20 + + + 2424.5 + 171 + + + + + + + + true + The robot's full configuration. + 9fb95b19-f673-4906-9998-b63a5811ea88 + configuration + configuration + true + 0 + true + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2358 + 181 + 130 + 20 + + + 2424.5 + 191 + + + + + + + + true + Whether or not to show the robot's visual meshes. + 22d8ace2-7a15-4a22-9430-2f721280765e + show_visual + show_visual + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 201 + 130 + 20 + + + 2424.5 + 211 + + + + + + + + true + Whether or not to show the robot's collision meshes. + ad827435-eaa9-47db-8456-0f04c22dde3a + show_collision + show_collision + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 221 + 130 + 20 + + + 2424.5 + 231 + + + + + + + + true + Whether or not to show the robot's joint frames. + 35824dc3-741e-4a85-9d9f-f350f6328850 + show_frames + show_frames + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 241 + 130 + 20 + + + 2424.5 + 251 + + + + + + + + true + Whether or not to show the robot's base frame. + 5c36de85-2908-4ed4-8bfb-be05a5fc15a0 + show_base_frame + show_base_frame + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 261 + 130 + 20 + + + 2424.5 + 271 + + + + + + + + true + Whether or not to show the robot's end-effector frame. + 43679585-4dff-44fc-8144-04d51b6597a3 + show_end_effector_frame + show_end_effector_frame + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 281 + 130 + 20 + + + 2424.5 + 291 + + + + + + + + true + Whether or not to show the collision meshes (if any). + b0245b8b-4b25-480e-8434-34500dd361dd + show_cm + show_cm + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 301 + 130 + 20 + + + 2424.5 + 311 + + + + + + + + true + Whether or not to show the attached collision meshes (if any). + c258dd5f-afd6-4742-9840-e8ae6df45c59 + show_acm + show_acm + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2358 + 321 + 130 + 20 + + + 2424.5 + 331 + + + + + + + + Rhino meshes of the robot's visual geometry (if any). + b51fd205-41de-4772-b77b-54118aa40c2c + visual + visual + false + 0 + + + + + + 2518 + 141 + 93 + 28 + + + 2564.5 + 155.2857 + + + + + + + + Rhino meshes of the robot's collision geometry (if any). + 3fd4309e-805a-4b2a-8b39-fb39cda51d21 + collision + collision + false + 0 + + + + + + 2518 + 169 + 93 + 29 + + + 2564.5 + 183.8571 + + + + + + + + Rhino meshes of the scene's collision meshes (if any). + ba8f5aaf-7d4f-4021-b0f3-328651e5f766 + collision_meshes + collision_meshes + false + 0 + + + + + + 2518 + 198 + 93 + 28 + + + 2564.5 + 212.4286 + + + + + + + + Rhino meshes of the scene's attached collision meshes (if any). + 00b4652c-1968-4bef-b124-5b86f4dc25bc + attached_meshes + attached_meshes + false + 0 + + + + + + 2518 + 226 + 93 + 29 + + + 2564.5 + 241 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 243eeb3c-e1ad-4233-9a1a-b0ec9fd1c962 + frames + frames + false + 0 + + + + + + 2518 + 255 + 93 + 28 + + + 2564.5 + 269.5714 + + + + + + + + The robot's base frame as a Rhino plane (if any). + 91fd1995-e0da-4f23-a4c6-afeefc044dee + base_frame + base_frame + false + 0 + + + + + + 2518 + 283 + 93 + 29 + + + 2564.5 + 298.1429 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + 5a2c4711-ae2f-4f0f-b633-afc7c8fccfd2 + ee_frame + ee_frame + false + 0 + + + + + + 2518 + 312 + 93 + 29 + + + 2564.5 + 326.7143 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 50.37684 + 690.4287 + + + 321.2411 + 690.4287 + + + 321.2411 + 710.5273 + + + 50.37684 + 710.5273 + + A quick note + Cambria + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + false + Scribble + Scribble + 22 + 4) Solve IK for pick-up plane + + + + + + 45.37684 + 685.4287 + 280.8643 + 30.09863 + + + 50.37684 + 690.4287 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + Data + Pickup config + false + 725931a4-9be8-4740-816a-ef06340d7d84 + 1 + + + + + + 1230 + 788 + 78 + 20 + + + 1269.547 + 798.5506 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 77.25994 + 714.5523 + + + 242.5334 + 714.5523 + + + 242.5334 + 729.2632 + + + 77.25994 + 729.2632 + + A quick note + Cambria + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + false + Scribble + Scribble + 16 + Results in pickup config + + + + + + 72.25994 + 709.5523 + 175.2734 + 24.71094 + + + 77.25994 + 714.5523 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;240;218;146 + + A group of Grasshopper objects + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + fb4c5d39-e0a5-4c45-b606-72de43c589ac + b96209a7-93e4-4212-b096-c83e82b4da7b + 98209ace-c305-4683-b351-d9b9daf31e36 + 6 + 3962a36b-d451-45d1-acb9-c99a5708db90 + Group + + + + + + + + + + + 00027467-0d24-4fa7-b178-8dc0ac5f42ec + Value List + + + + + Provides a list of preset values to choose from + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 2 + 3 + Value List + Value List + false + 0 + + + + + 0 + Pickup config + false + + + + + 1 + Trajectory + true + + + + + + 1531 + 171 + 183 + 22 + + + 1591 + 171 + + + + + + + + + + eeafc956-268e-461d-8e73-ee05c6f72c01 + Stream Filter + + + + + Filters a collection of input streams + 471af287-d88e-43f4-9bb2-98daa088f633 + Stream Filter + Stream Filter + + + + + + 2011 + 153 + 112 + 97 + + + 2078 + 202 + + + + + + 3 + 2e3ab970-8545-46bb-836c-1c11e5610bce + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + Index of Gate stream + fde7ac2c-1b3d-473c-8b2b-4addc4d52e1a + Gate + Gate + false + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 1 + + + + + + 2013 + 155 + 50 + 31 + + + 2039.5 + 170.5 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + 2 + Input stream at index 0 + e6a67ce5-d55f-4ec2-a44c-573291be81a5 + false + Stream 0 + Stream 0 + true + a38644b3-ef3b-4bc2-bf1d-8843907a4a1f + 1 + + + + + + 2013 + 186 + 50 + 31 + + + 2039.5 + 201.5 + + + + + + + + 2 + Input stream at index 1 + 14985ec3-7977-426f-bc6b-ad27afc61e04 + false + Stream 1 + Stream 1 + true + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 2013 + 217 + 50 + 31 + + + 2039.5 + 232.5 + + + + + + + + 2 + Filtered stream + ddfd1927-535b-4f08-acf1-f1762fa62a54 + false + Stream + S(1) + false + 0 + + + + + + 2093 + 155 + 28 + 93 + + + 2107 + 201.5 + + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;0;155;194 + + A group of Grasshopper objects + 7a58f25a-3dc8-4dfa-bf0f-35404273569e + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 471af287-d88e-43f4-9bb2-98daa088f633 + 766f518e-d29b-4814-a406-a45e5ded4a64 + e4b338fe-125d-4929-92e1-4e17c08f9b3b + f53212f5-507f-4bda-b372-34bf2b7020a3 + a38644b3-ef3b-4bc2-bf1d-8843907a4a1f + e9d20ac9-0dbc-44cb-9f48-878ae446678f + 619d4216-bdfd-4395-b679-83b02e397c53 + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + 10 + ca0ff086-508f-4122-8664-195d1a456efe + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 1582.769 + 120.3864 + + + 1707.131 + 120.3864 + + + 1707.131 + 135.9303 + + + 1582.769 + 135.9303 + + A quick note + Cambria + 766f518e-d29b-4814-a406-a45e5ded4a64 + false + Scribble + Scribble + 22 + Visualization + + + + + + 1577.769 + 115.3864 + 134.3623 + 25.54395 + + + 1582.769 + 120.3864 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + b96209a7-93e4-4212-b096-c83e82b4da7b + Data + Pickup plane + false + d385349b-7e03-4362-b9d0-eacd34e2562b + 1 + 2 + + + + + + 74 + 774 + 75 + 20 + + + 111.7065 + 784.5817 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 98209ace-c305-4683-b351-d9b9daf31e36 + Data + Robot + false + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 1 + 2 + + + + + + 75 + 745 + 50 + 20 + + + 100.2518 + 755.806 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 50.37684 + 900.5037 + + + 383.6102 + 900.5037 + + + 383.6102 + 920.6777 + + + 50.37684 + 920.6777 + + A quick note + Cambria + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + false + Scribble + Scribble + 22 + 5) Plan trajectory to selected plane + + + + + + 45.37684 + 895.5037 + 343.2334 + 30.17401 + + + 50.37684 + 900.5037 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 78.78633 + 927.3895 + + + 318.5051 + 927.3895 + + + 318.5051 + 942.1004 + + + 78.78633 + 942.1004 + + A quick note + Cambria + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + false + Scribble + Scribble + 16 + From pickup config to target plane + + + + + + 73.78633 + 922.3895 + 249.7187 + 24.71094 + + + 78.78633 + 927.3895 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 55db7485-e593-4762-a166-64303d976c7a + Data + Target planes + false + aacb02be-ffde-4997-b910-3a5670a6e5b1 + 1 + 2 + + + + + + 76 + 1010 + 78 + 20 + + + 115.8316 + 1020.879 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 538c02c6-6b3b-4712-a784-dda0bc63f847 + Data + Robot + false + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 1 + 2 + + + + + + 77 + 949 + 50 + 20 + + + 102.0346 + 959.4109 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + c666c109-2ccb-4c50-90cd-00130af76eaa + Data + Pickup config + false + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + 1 + 2 + + + + + + 77 + 973 + 78 + 20 + + + 116.3639 + 983.7234 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + e4b338fe-125d-4929-92e1-4e17c08f9b3b + Number Slider + Number Slider + false + 0 + + + + + + 1591 + 205 + 203 + 20 + + + 1591.409 + 205.586 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 54 + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + List Item + List Item + + + + + + 2147 + 187 + 99 + 70 + + + 2197 + 222 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 2e3ab970-8545-46bb-836c-1c11e5610bce + cb95db89-6165-43b6-9c41-5702bc5bf137 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Base list + 39c89e61-bc93-43d0-a501-c5bba7a3da6e + List + List + false + ddfd1927-535b-4f08-acf1-f1762fa62a54 + 1 + + + + + + 2149 + 189 + 33 + 22 + + + 2167 + 200 + + + + + + + + Item index + 83d287eb-3d9d-4785-b735-156766b364e7 + Index + Index + false + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + + + + + + 2149 + 211 + 33 + 22 + + + 2167 + 222 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 60da4aea-66d4-49fc-8aa9-a5189edc913b + Wrap + Wrap + false + 0 + + + + + + 2149 + 233 + 33 + 22 + + + 2167 + 244 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + false + Item + Item + false + 0 + + + + + + 2212 + 189 + 32 + 66 + + + 2228 + 222 + + + + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + bcf27a28-24e5-4d31-8438-444d7fe511cb + Data + Trajectory + false + 6a82fb40-9974-4860-aee0-8d4a46d91877 + 1 + + + + + + 1247 + 1065 + 61 + 20 + + + 1278.064 + 1075.174 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + configs = trajectory.points + GhPython provides a Python script component + + 182 + 182 + + + 558 + 571 + + true + true + 2 + false + f53212f5-507f-4bda-b372-34bf2b7020a3 + false + true + GhPython Script + get configs + + + + + + 1704 + 315 + 132 + 28 + + + 1774 + 329 + + + + + + 1 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 50f68354-3c25-4a84-a5f7-ddaf267be516 + trajectory + trajectory + true + 0 + true + e9d20ac9-0dbc-44cb-9f48-878ae446678f + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1706 + 317 + 53 + 24 + + + 1734 + 329 + + + + + + + + Script output configs. + a4b043bc-8e30-4b4c-bb40-e7f42497696d + configs + configs + false + 0 + + + + + + 1789 + 317 + 45 + 24 + + + 1811.5 + 329 + + + + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + a38644b3-ef3b-4bc2-bf1d-8843907a4a1f + Data + Pickup config + false + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + 1 + 2 + + + + + + 1591 + 300 + 78 + 20 + + + 1630.11 + 310.7518 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + e9d20ac9-0dbc-44cb-9f48-878ae446678f + Data + Trajectory + false + bcf27a28-24e5-4d31-8438-444d7fe511cb + 1 + 2 + + + + + + 1591 + 324 + 61 + 20 + + + 1621.626 + 334.0815 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 619d4216-bdfd-4395-b679-83b02e397c53 + Data + Robot + false + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 1 + 2 + + + + + + 1591 + 275 + 50 + 20 + + + 1616.464 + 285.9058 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;240;218;146 + + A group of Grasshopper objects + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + 55db7485-e593-4762-a166-64303d976c7a + 97392278-c93e-4240-86e9-5e59dc2eb992 + 4a09e38e-e49b-43a1-809e-f310b5a4c3e2 + 1f8b3c58-8382-468d-8885-a179a0ad05e0 + 538c02c6-6b3b-4712-a784-dda0bc63f847 + c666c109-2ccb-4c50-90cd-00130af76eaa + 13b3eb29-3c6d-41ba-80fe-d6214ebc9674 + 9d4e5cda-5bb7-42fe-acfa-968fa6c6c067 + cd76efff-9d02-4eb1-b6dd-080d6a0e6d4d + bcf27a28-24e5-4d31-8438-444d7fe511cb + 12 + 4c3c7466-b1c2-4942-9ac0-63cb70a5b6b7 + Group + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + ecc8c71a-07d9-4980-90b1-a3cd2f8081a6 + Panel + Panel + false + 0 + 0 + Define multiple target planes in any way you like, for example, +reference a curve from Rhino, divide it and assign a plane to each point + +Make sure all planes are oriented in a way that makes sense +for the robot to reach it as well. + + + + + + -530 + 485 + 523 + 96 + + 0 + 0 + 0 + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + fb166dfc-4abf-4aa5-9ecf-d86922966dfe + Panel + Panel + false + 0 + 0 + Define one pick-up plane in any way you like, +for example, reference a point from Rhino and assign a plane to it. + +Make sure the plane is oriented in a way that makes sense +for the robot to reach it. You can check this by observing the +results of the IK solution for this pickup-plane. + + + + + + -536 + 293 + 529 + 96 + + 0 + 0 + 0 + + -535.2353 + 293.4706 + + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + c7cc41e4-23fe-4958-87c2-e75feb10ebac + Panel + Panel + false + 0 + 0 + Load the robot from ROS. + +Make sure ROS/MoveIt is running before you start (ie. "Compose up"). + + + + + + -536 + 124 + 529 + 96 + + 0 + 0 + 0 + + -535.2353 + 124.4706 + + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 3f032319-94be-407d-8e0f-7615f6976834 + Panel + Panel + false + 0 + 0 + Use inverse kinematics of the robot to find +a feasible configuration to reach the pickup plane. + +You can use the COMPAS FAB component or +code it in a GHPython component. + + + + + + -526 + 720 + 523 + 96 + + 0 + 0 + 0 + + -525.9183 + 720.1496 + + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 1f02a236-cf56-4437-8d21-1243b22a7b8e + Panel + Panel + false + 0 + 0 + With the pickup config and a list of target planes, you are ready to compute the solution trajectory for each plane. + +First create a constraint from the selected plane, then use the plan free-space motion to calculate a trajectory. + + + + + + -526 + 981 + 523 + 96 + + 0 + 0 + 0 + + -525.6831 + 981.9144 + + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + ROS Robot + + + + + """ +Load robot directly from ROS. + +COMPAS FAB v0.27.0 +""" +from compas_ghpython.artists import RobotModelArtist +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.ghpython.components import create_id + + +class ROSRobot(component): + def RunScript(self, ros_client, load): + key = create_id(self, 'robot') + + if ros_client and ros_client.is_connected and load: + # Load URDF from ROS + st[key] = ros_client.load_robot(load_geometry=True, precision='12f') + st[key].artist = RobotModelArtist(st[key].model) + + robot = st.get(key, None) + if robot: # client sometimes need to be restarted, without needing to reload geometry + robot.client = ros_client + return robot + + Load robot directly from ROS. +COMPAS FAB v0.27.0 + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAFbSURBVEhLvZTBUcMwEEVTAiWkhJSQElICJVABkxIYLlxz4pwSUgIlpAQ6MP/Z+mZlrUM8GHbmjaXVarX+a3nTdd2fkjrXJHUuQfYgnnim65lzCbKzYPApDs16NRmqOYmLYOM+rkdkj+IqmPgJ7N2OcZNNLE437AXJjoG4zpjCtsL7P5oDSkC/KN7Ec5m/CMuQUcki24nxzacLDN4Fh7yWOQcgG+OMSkbZKE8/ryZDYgZ+wkFwCK9vaKjXezlkyIR8TK5jTg9KEG9hHUmC9lVFJQ45SeZCkDA2vJWobHRD3TRX1BxS4omLDSe+ug/Vht5Ry2Mu0zgjoxAKy4toHEOwE0dm78Qtcmf+1YyNW0LuHF47finmmMXfInUCyUJiw6HpT22O1Glk8Qsxpyx2jtRpZL9ueOsYbm1M9hPItpvmMa3j+yYvYbb5reMfDuBX4Z/avdwv0dqkzvXoNl8X2cTgqAi1xAAAAABJRU5ErkJggg== + + false + ab593567-c8a9-41b6-a139-48485f0cb186 + true + true + ROS Robot + Robot + + + + + + 1040 + 124 + 124 + 44 + + + 1110 + 146 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + eb6129e1-205f-47fe-acf5-f865004466df + ros_client + ros_client + true + 0 + true + 81306d18-7341-4293-a6ca-682afeaebc5a + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1042 + 126 + 53 + 20 + + + 1070 + 136 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + c9493747-6eb0-41c6-bfef-b24b514a4ff5 + load + load + true + 0 + true + 3b9b2473-06fe-42df-8ab5-c73ce8bda61a + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1042 + 146 + 53 + 20 + + + 1070 + 156 + + + + + + + + The robot. + 1d61c641-0916-464a-87c2-32a0e2aba39d + robot + robot + false + 0 + + + + + + 1125 + 126 + 37 + 40 + + + 1143.5 + 146 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 3b9b2473-06fe-42df-8ab5-c73ce8bda61a + Boolean Toggle + Boolean Toggle + false + 0 + true + + + + + + 851 + 145 + 146 + 22 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + ROS Connect + + + + + """ +Connect or disconnect to ROS. + +COMPAS FAB v0.27.0 +""" +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.backends import RosClient +from compas_fab.ghpython.components import create_id + + +class ROSConnect(component): + def RunScript(self, ip, port, connect): + ros_client = None + + ip = ip or '127.0.0.1' + port = port or 9090 + + key = create_id(self, 'ros_client') + ros_client = st.get(key, None) + + if ros_client: + st[key].close() + if connect: + st[key] = RosClient(ip, port) + st[key].run(5) + + ros_client = st.get(key, None) + is_connected = ros_client.is_connected if ros_client else False + return (ros_client, is_connected) + + Connect or disconnect to ROS. +COMPAS FAB v0.27.0 + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAHWSURBVEhLtZQ9juJAEEa5AXMD9gZwA3wEbgARIXADHBBMgkCrlQghJGNuwNwAwslAIpkMh5v1fq/WzTaeYki8LT1hf/Xb3WUaIYT/iivWiSvWiSvWiSs6ZOJNPFuF2IgfwmKriTyW1+s1TKfT0G63FdF4SLfbDev1WiFWaEC8lzBlQvKYmF8KeYzH49Bqtcyv3+8r1FbHSxp5EQVdEZR09v4Nlhx/iqJ5iSODw+GQOh8FRT3fSEdYU81mU4++k3I2stVq9UFiCpxOp9Dr9ew54V3kolp0yW7x2e/3dwZDa4NxNpv9jgW4h+FwiE5C4PmITZzFbWpEbom9AloDDGJTFMXrbrczx/L8GdNH/hwfGrs5x3ugsWoA3ZzLd87TzpLpwFmLIj3Bd2GMRqNfWZaF7Xb7U+/HeG/cg1aRJn/BIPKoibe4CwotFgvb9iMY1ejLvWlN0gIdjGISNcGWjwTHGX8GnZfJ+aKl/EsmuzmZIYEiaIHtV7tOKRPzrdxOIU1EAZsgwfne2QSFOH+CDQZhPp9/5nkeLpfLUtqXuPuXv/dQlEUYx+wbmCCGAl/73/H4KmimBR8RL8+gmYfJwRVBi0Je5ze8uCquWCeuWCeuWCeuWB+h8Qe29eD9QdtraQAAAABJRU5ErkJggg== + + false + 2dc1673c-3581-4bf5-9e37-a300bda76544 + true + true + ROS Connect + ROS + + + + + + 417 + 119 + 153 + 64 + + + 480 + 151 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ip address ROS. Defaults to 127.0.0.1. + 290bad8d-9ca9-46f9-80bf-c792bec95ff9 + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 419 + 121 + 46 + 20 + + + 443.5 + 131 + + + + + + + + true + The port of ROS. Defaults to 9090. + 1213c2b5-f15b-4530-b2f5-47e4af565d07 + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 419 + 141 + 46 + 20 + + + 443.5 + 151 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + d12d2ff5-944a-4680-905e-01b9337d158d + connect + connect + true + 0 + true + 69ff600a-6b2b-4690-ac2b-257830b5e241 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 419 + 161 + 46 + 20 + + + 443.5 + 171 + + + + + + + + The ROS client. + 81306d18-7341-4293-a6ca-682afeaebc5a + ros_client + ros_client + false + 0 + + + + + + 495 + 121 + 73 + 30 + + + 531.5 + 136 + + + + + + + + True if connection established. + 65001fed-bc8c-493a-bc3d-ddd80a8a5b78 + is_connected + is_connected + false + 0 + + + + + + 495 + 151 + 73 + 30 + + + 531.5 + 166 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 69ff600a-6b2b-4690-ac2b-257830b5e241 + Boolean Toggle + Boolean Toggle + false + 0 + true + + + + + + 221 + 160 + 146 + 22 + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 7767f1a2-122c-4a59-9eca-fe080069c13d + Panel + Panel + false + 0 + 65001fed-bc8c-493a-bc3d-ddd80a8a5b78 + 1 + Double click to edit panel content… + + + + + + 608 + 139 + 182 + 55 + + 0 + 0 + 0 + + 608.5533 + 139.0185 + + + + + + + 209;128;165;207 + + true + true + true + false + false + true + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas.geometry import Plane + +pickup_plane = Plane([0.2, 0.5, 0.4], [0, 0.5, -1]) + + GhPython provides a Python script component + + 1139 + 172 + + + 643 + 671 + + true + false + false + 8060f212-ae75-42c7-8587-1d473d2e2638 + false + true + GhPython Script + GhPython Script + + + + + + 1048 + 260 + 105 + 119 + + + 1062 + 320 + + + + + + 0 + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + The execution information, as output and error streams + e154455e-a24d-4817-9a38-8f5bbc221940 + out + out + false + 0 + + + + + + 1077 + 262 + 74 + 57 + + + 1114 + 290.75 + + + + + + + + Script output pickup_plane. + b442c091-2518-4ef1-aac8-21775ba7c449 + pickup_plane + pickup_plane + false + 0 + + + + + + 1077 + 319 + 74 + 58 + + + 1114 + 348.25 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Inverse Kinematics + + + + + """ +Calculate the robot's inverse kinematic for a given plane. + +COMPAS FAB v0.27.0 +""" +from compas_rhino.conversions import RhinoPlane +from ghpythonlib.componentbase import executingcomponent as component + + +class InverseKinematics(component): + def RunScript(self, robot, plane, start_configuration, group): + configuration = None + if robot and robot.client and robot.client.is_connected and plane: + frame = RhinoPlane.from_geometry(plane).to_compas_frame() + configuration = robot.inverse_kinematics(frame, start_configuration, group) + return configuration + + Calculate the robot's inverse kinematic for a given plane. +COMPAS FAB v0.27.0 + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAGBSURBVEhLtZSxccMwDEVVp/IAKTSCigzgLm26pNQIHkET+DSCRtAIKjKAqtQaQRsw/8sADZGwLd3ZuHsn8JMARBJSEUJ4Ka74TFxxC+/n39LTU1xRQZIajCAIM+jBt/gHL87iigyUREw6gRY0oBNNOXnxFldEIBMyQZfoLPwnc2S08x6ZgKBKgnvVYDVo3j4+f6BzJ9wdd8Z1d+8iEyRBDIR9ATrK6liwbrkH2BFUdm7RUwEBA5h0DGsAnck8mcwmHgAHhH68/FVyguTL9nUM6yRQC1g8jbQxXh0FydMjsm83A97HCVid2J0Mms8rUEqB5ZJhugM+V30PYzE6LGyL3i5AkJxtqgUYPKdrZO4g8xxYYiNkQRaYvmFs2RRYBUZZx2LNat4OUmC9BNbe/BZckcC4fTok6++t+OIluV6ue/5byYWiKIGeqbLp1+yRC9dWsx9R/HD2kgvXxPxFtOLHvt5LLuTHQ2626SNy4dLX9uOh/5Iu4r/l6M3vwRWfRyj+AbsLc3z7FG5SAAAAAElFTkSuQmCC + + false + b643018f-8350-4f91-9e82-f5438e586692 + true + true + Inverse Kinematics + IK + + + + + + 569 + 729 + 207 + 84 + + + 684 + 771 + + + + + + 4 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + c1a66c41-d796-4ce6-ab11-c14a743d742b + robot + robot + true + 0 + true + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 571 + 731 + 98 + 20 + + + 621.5 + 741 + + + + + + + + true + The plane or frame to calculate the inverse kinematic for. + 522ff86b-f40b-4a85-93b7-92c27bb5668b + plane + plane + true + 0 + true + b96209a7-93e4-4212-b096-c83e82b4da7b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 571 + 751 + 98 + 20 + + + 621.5 + 761 + + + + + + + + true + If passed, calculates the inverse such that the joint positions differ the least from the start_configuration. Defaults to the zero configuration. + b0a47e7f-02ab-4e77-823c-c864072e2b7d + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 571 + 771 + 98 + 20 + + + 621.5 + 781 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + b5be3337-917a-4a40-8c76-fa63e8cd2c5e + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 571 + 791 + 98 + 20 + + + 621.5 + 801 + + + + + + + + The planning group's configuration. + 725931a4-9be8-4740-816a-ef06340d7d84 + configuration + configuration + false + 0 + + + + + + 699 + 731 + 75 + 80 + + + 736.5 + 771 + + + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + 5198e705-e320-4edc-a605-c0d644613445 + Curve + Curve + false + 0 + + + + + + 52 + 503 + 50 + 20 + + + 77.54815 + 513.8308 + + + + + + 1 + + + + + 1 + {0} + + + + + -1 + + Y2BkYGD4DwQgGgR4mIBEWFBGZl6+c35ubn6ejkJYalFxZn6erbmekREQGZma6pkaGBjqKDiX5pSUFqXa5qWWlhQl5ugoBJQm5WQme6dWhuRnp+bZmpoaGVkYplqaJ5ubmpoaG7CCLJEEm63nnpqfm1pSVKnnV1qUVOxcWlSWygKUZS+DWMaVWJSckVmWapySy5lfkJqXB1LFkpJYkghSxMHBwQRyp4A6A4MRkE4v5+XhZAYy+EHESqA1TL/qmRjmQj31+z8TgwjUf5KC6+MCua8I7v/HINDMqPTBS6pS/A9QPhWqVoAZqhDkGg4GdPDBHkMIIr4fXYQLu0IwsBM8GXLz6SZ7CH3I/s5M3f9HI85A+Zfse0N/r/Sffx2DBrnnTevrxLbWg/tjnA8YXNv3ZH9AEjuPeePs/QJvzob99d26f9LqBj+xkKf7D9zY37fcos1+xeV5Rb0Oe+x3FFwp+KLxbP+PRvvZj/cftOd5xWiq+vCK/Zp7E7k3Wj/ezzRnzfXzaZfsvTyfXZ7Wed++c07KrrBDt/Yr8HvVnL9+x97wRRW3Mecj+w2z7U6qvjyxX6BU+3CY/mP71zPLAs4ueGBvsGf35/x1hfu1wg5w57o9t5+l8vyexLH79hcaFmnfdl1hv2BCdFJk9Qv7msNS7/7XMzXAwoIbTziNglFAewAA + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Plan Motion + + + + + """ +Calculate a motion path. + +COMPAS FAB v0.27.0 +""" +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.ghpython.components import create_id + + +class PlanMotion(component): + def RunScript(self, robot, goal_constraints, start_configuration, group, attached_collision_meshes, path_constraints, planner_id, compute): + + key = create_id(self, 'trajectory') + + path_constraints = list(path_constraints) if path_constraints else None + attached_collision_meshes = list(attached_collision_meshes) if attached_collision_meshes else None + planner_id = str(planner_id) if planner_id else 'RRTConnect' + + if robot and robot.client and robot.client.is_connected and start_configuration and goal_constraints and compute: + st[key] = robot.plan_motion(goal_constraints, + start_configuration=start_configuration, + group=group, + options=dict( + attached_collision_meshes=attached_collision_meshes, + path_constraints=path_constraints, + planner_id=planner_id, + )) + + trajectory = st.get(key, None) + return trajectory + + Calculate a motion path. +COMPAS FAB v0.27.0 + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAGNSURBVEhLtZTNbQIxEIUpgQ5ICRTAgRJyibimBErgEIkaInGgAyiBDpICuOeYnHJByuZ93vFm7B0SQBtLH4znPeO/MaOmaf6VMDkkYXJIwuS1qI3FVhzEXsw7zRs9ajOxE5tI96i9CgJPmuTcgLUzvokN32e89yJ7PfukBwMmxqcgwY+fLD4G/pVpNYekBwNeBD/4JGaWYxICdjOp/FPTalZJ92YbkFdbnL3ag+Do1j5vWr0L7mSctMD8bqa0epenQgjefd7pd2IORb7otGe/FAufN408gbqlBmocI4srd1502rIk6K1SjcnRl7Vmet55utwuX3T+PoYjmoh2SHEQ/DoBx8Ak4eNSC1dpGmOLe0v5LmgviWqAR29yHnbwJeoK49UTQLG7bKCWP8yQ2Xqj+fIj5C6692B9gpP3J80M/EER1Ex7A9odEKRXrcbbeBYc7a7nN1O+3Jqips27EEzCffhxvQeY/Onjih2Yn5rPBUEirKzkTR8X3sEt/AQXVNEthMkhCZNDEiaHoxl9A6glDpIGAdZaAAAAAElFTkSuQmCC + + false + 68409182-98df-4931-932f-b1840ab80086 + true + true + Plan Motion + Plan Motion + + + + + + 947 + 917 + 224 + 164 + + + 1098 + 999 + + + + + + 8 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + 61a28696-97c1-4315-af16-3c72c43c2879 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 949 + 919 + 134 + 20 + + + 1017.5 + 929 + + + + + + + + 1 + true + The goal to be achieved, defined in a set of constraints. Constraints can be very specific, for example defining value domains for each joint, such that the goal configuration is included, or defining a volume in space, to which a specific robot link (e.g. the end-effector) is required to move to. + 10b7cf5e-4b56-455d-953b-538b93394c95 + goal_constraints + goal_constraints + true + 1 + true + 6d4f8ad8-045c-4803-94a0-023c587ea907 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 949 + 939 + 134 + 20 + + + 1017.5 + 949 + + + + + + + + true + The robot's full configuration, i.e. values for all configurable joints of the entire robot, at the starting position. Defaults to the all-zero configuration. + 28411011-44f3-451e-82fe-18fa2143e258 + start_configuration + start_configuration + true + 0 + true + c666c109-2ccb-4c50-90cd-00130af76eaa + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 949 + 959 + 134 + 20 + + + 1017.5 + 969 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 22d97da7-7d27-4ffb-93ed-3bfad4275ef7 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 949 + 979 + 134 + 20 + + + 1017.5 + 989 + + + + + + + + 1 + true + A list of attached collision meshes to be included for planning. + cac379f8-682d-449e-86c1-b9600cdd5dcb + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 949 + 999 + 134 + 20 + + + 1017.5 + 1009 + + + + + + + + 1 + true + Optional constraints that can be imposed along the solution path. Note that path calculation won't work if the start_configuration violates these constraints. Defaults to None. + 4cf7d942-9e27-4bd1-9ee7-b9781f60d2f8 + path_constraints + path_constraints + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 949 + 1019 + 134 + 20 + + + 1017.5 + 1029 + + + + + + + + true + The name of the algorithm used for path planning. Defaults to 'RRTConnect' + c71541a0-4798-4b27-ba90-ed4af194dbdb + planner_id + planner_id + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 949 + 1039 + 134 + 20 + + + 1017.5 + 1049 + + + + + + + + true + If True, calculates a trajectory. + 61a79bdb-dede-460b-b1ba-92a072e356c9 + compute + compute + true + 0 + true + 1c073ce2-e1aa-4dab-8e63-ca4202845527 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 949 + 1059 + 134 + 20 + + + 1017.5 + 1069 + + + + + + + + The calculated trajectory. + 6a82fb40-9974-4860-aee0-8d4a46d91877 + trajectory + trajectory + false + 0 + + + + + + 1113 + 919 + 56 + 160 + + + 1141 + 999 + + + + + + + + + + + + + + 2162e72e-72fc-4bf8-9459-d4d82fa8aa14 + Divide Curve + + + + + Divide a curve into equal length segments + 59dd3c95-dc56-4c53-87d2-b1faf15cb474 + Divide Curve + Divide Curve + + + + + + 723 + 485 + 134 + 96 + + + 776 + 533 + + + + + + Curve to divide + 414bcbef-8204-45b7-83d1-8df9aacbfae6 + Curve + Curve + false + 5198e705-e320-4edc-a605-c0d644613445 + 1 + + + + + + 725 + 487 + 36 + 30 + + + 744.5 + 502.3333 + + + + + + + + Number of segments + decaf631-857e-4efb-814a-f8640454bc8f + Count + Count + false + ad125eb0-443d-48ef-83b7-476151411f85 + 1 + + + + + + 725 + 517 + 36 + 31 + + + 744.5 + 533 + + + + + + 1 + + + + + 1 + {0} + + + + + 10 + + + + + + + + + + + Split segments at kinks + 5b318337-0422-4d37-b1ce-ceceee2cb012 + Kinks + Kinks + false + 0 + + + + + + 725 + 548 + 36 + 31 + + + 744.5 + 563.6666 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Division points + 727b25db-1284-4c6e-9436-bb77b6758e82 + Points + Points + false + 0 + + + + + + 791 + 487 + 64 + 30 + + + 823 + 502.3333 + + + + + + + + 1 + Tangent vectors at division points + ff360acf-d5a3-4264-82d3-9ab41bfddde1 + Tangents + Tangents + false + 0 + + + + + + 791 + 517 + 64 + 31 + + + 823 + 533 + + + + + + + + 1 + Parameter values at division points + d3bbdcdf-3fea-4a4b-915a-859e05760cca + Parameters + Parameters + false + 0 + + + + + + 791 + 548 + 64 + 31 + + + 823 + 563.6666 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + ad125eb0-443d-48ef-83b7-476151411f85 + Number Slider + Number Slider + false + 0 + + + + + + 491 + 522 + 203 + 20 + + + 491.7134 + 522.0391 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 5 + + + + + + + + + cfb6b17f-ca82-4f5d-b604-d4f69f569de3 + Plane Normal + + + + + Create a plane perpendicular to a vector. + c0bde1c9-cb42-4e8f-b3b9-8ca0e06bda59 + Plane Normal + Plane Normal + + + + + + 1043 + 476 + 107 + 102 + + + 1097 + 527 + + + + + + Origin of plane + 8a92108d-1b5d-4577-88c6-e3ea12c7b4d0 + Origin + Origin + false + 727b25db-1284-4c6e-9436-bb77b6758e82 + 1 + + + + + + 1045 + 478 + 37 + 49 + + + 1065 + 502.5 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + Z-Axis direction of plane + 64468661-ddfd-4e63-8689-fcb723ac49d5 + Z-Axis + Z-Axis + false + 234c3f49-bda1-44b1-80d0-c937404c6983 + 1 + + + + + + 1045 + 527 + 37 + 49 + + + 1065 + 551.5 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 1 + + + + + + + + + + + + Plane definition + c3f7a590-7e15-4cd6-9cb7-0edc2d08461c + Plane + Plane + false + 0 + + + + + + 1112 + 478 + 36 + 98 + + + 1130 + 527 + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Constraints From Plane + + + + + """ +Create a position and an orientation constraint from a plane calculated for the group's end-effector link. + +COMPAS FAB v0.27.0 +""" +import math + +from compas_rhino.conversions import RhinoPlane +from ghpythonlib.componentbase import executingcomponent as component + + +class ConstraintsFromPlane(component): + def RunScript(self, robot, plane, group, tolerance_position, tolerance_xaxis, tolerance_yaxis, tolerance_zaxis): + goal_constraints = None + if robot and plane: + tolerance_position = tolerance_position or 0.001 + tolerance_xaxis = tolerance_xaxis or 1. + tolerance_yaxis = tolerance_yaxis or 1. + tolerance_zaxis = tolerance_zaxis or 1. + + frame = RhinoPlane.from_geometry(plane).to_compas_frame() + tolerances_axes = [math.radians(tolerance_xaxis), math.radians(tolerance_yaxis), math.radians(tolerance_zaxis)] + goal_constraints = robot.constraints_from_frame(frame, tolerance_position, tolerances_axes, group) + + return goal_constraints + + Create a position and an orientation constraint from a plane calculated for the group's end-effector link. +COMPAS FAB v0.27.0 + + 208 + 208 + + + 558 + 571 + + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAHfSURBVEhLtZUxS8NAGIaPdhDUoVRRxNaeCC4qZHAV6g8QOjkHx04Z/AEZOzgUHV3yD8zslMFBcCn4B0onwSVO4nS+3/Uu3LVfm1RweMjde/meL7mcVSil/hU2nEWI5waXV4ENXSCXYMitVYENXSAPwYhbqwIbukCeAgz+tk1s6AJxbhr0uPUy2NACaWDkRMLdUwYbWiCNnAZj7p4y2NACaeY0ICR33zLY0AXSGGTcWhXY0GVZg6OODMHS5mxIvAjRpeumeBqs1dM3GotH0QXFcYU8BhjO11vYEPIQKDC4aV18iyBWECdgAkbypN2HeERyQw4SMPeNvAnhyC1J8070Ic6B2rnankqlnOCa6fFUbhsFrq9MTkQQN8DXxu26llOT+n3t/fD4YEBzqsW1axp4PyuL5DlITaZfGw16nbPWZ+e0/VN7qNGWqa3r5odtQGAc0RwUf/VW3gMZiID3igQK6On0BwWvaDTcu9xN2+f7uoFZI/QbAdq6mGo90SJMsd6eVaBaVrgIFNEeF+ceY++YYkxvSvLIZkVxFVA4NILQzGcb2KOrvxvhCcpAYQOMjYTktiE9uZUXT094gipAIIE9/y60fZ6c8CarAFkAbCP6TWL/480FqwCpPr7c2hQlfgEp2YYU5C2cFwAAAABJRU5ErkJggg== + + false + 98de56d0-0109-4346-a038-417d62516505 + true + true + Constraints From Plane + Constraints From Plane + + + + + + 579 + 928 + 193 + 144 + + + 692 + 1000 + + + + + + 7 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + b4080034-2d7d-4843-a9b9-07c1a3f36be4 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 581 + 930 + 96 + 20 + + + 630.5 + 940 + + + + + + + + true + The plane or frame from which we create position and orientation constraints. + be5683be-2380-4376-9780-53550e2542b4 + plane + plane + true + 0 + true + 5aa53b64-60ae-4a5b-8aa6-319581d52d78 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 581 + 950 + 96 + 20 + + + 630.5 + 960 + + + + + + + + true + The planning group for which we specify the constraint. Defaults to the robot's main planning group. + 435b7d25-1b1a-4632-954d-644a1d5d976a + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 581 + 970 + 96 + 20 + + + 630.5 + 980 + + + + + + + + true + The allowed tolerance to the frame's position (defined in the robot's units). Defaults to 0.001 + 972e7c72-0a37-4e2d-a37e-2554467b606b + tolerance_position + tolerance_position + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 581 + 990 + 96 + 20 + + + 630.5 + 1000 + + + + + + + + true + The allowed tolerance of the frame's X-axis in degrees. + 82d2212a-8793-4cd3-9540-76de237bab4b + tolerance_xaxis + tolerance_xaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 581 + 1010 + 96 + 20 + + + 630.5 + 1020 + + + + + + + + true + The allowed tolerance of the frame's Y-axis in degrees. + 15d152ae-5c52-4cee-9591-dcdaa7574696 + tolerance_yaxis + tolerance_yaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 581 + 1030 + 96 + 20 + + + 630.5 + 1040 + + + + + + + + true + The allowed tolerance of the frame's Z-axis in degrees. + fc17614a-cb08-479d-994e-5557daa902bb + tolerance_zaxis + tolerance_zaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 581 + 1050 + 96 + 20 + + + 630.5 + 1060 + + + + + + + + A list containing a position and an orientation constraint. + 6d4f8ad8-045c-4803-94a0-023c587ea907 + constraints + constraints + false + 0 + + + + + + 707 + 930 + 63 + 140 + + + 738.5 + 1000 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + b930119e-7c9a-45fa-8b91-3b736c0e60dd + List Item + List Item + + + + + + 344 + 1006 + 99 + 70 + + + 394 + 1041 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 2e3ab970-8545-46bb-836c-1c11e5610bce + cb95db89-6165-43b6-9c41-5702bc5bf137 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Base list + 41b7346d-2bb0-4df5-8462-5e03a7653ff7 + List + List + false + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 346 + 1008 + 33 + 22 + + + 364 + 1019 + + + + + + + + Item index + 62a19621-735c-41a3-aac4-aec39509d62e + Index + Index + false + 5754fd71-2780-4a26-b165-4fe1ba42420f + 1 + + + + + + 346 + 1030 + 33 + 22 + + + 364 + 1041 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 7897f3bd-d554-44b7-9c15-7918ffe18b8d + Wrap + Wrap + false + 0 + + + + + + 346 + 1052 + 33 + 22 + + + 364 + 1063 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 028876ab-7174-409d-be84-5148019b080f + false + Item + Item + false + 0 + + + + + + 409 + 1008 + 32 + 66 + + + 425 + 1041 + + + + + + + + + + + + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + 5aa53b64-60ae-4a5b-8aa6-319581d52d78 + Plane + Plane + false + 028876ab-7174-409d-be84-5148019b080f + 1 + + + + + + 471 + 1032 + 50 + 20 + + + 496.0858 + 1042.967 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 5754fd71-2780-4a26-b165-4fe1ba42420f + Number Slider + i + false + 0 + + + + + + 182 + 1032 + 140 + 20 + + + 182.6725 + 1032.568 + + + + + + 3 + 1 + 1 + 12 + 0 + 0 + 0 + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + 1c073ce2-e1aa-4dab-8e63-ca4202845527 + Button + Button + false + 0 + + + + + + 792 + 1058 + 103 + 22 + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + ba084858-317f-49aa-8843-0755aabd650e + Negative + Negative + + + + + + 907 + 509 + 108 + 72 + + + 958 + 545 + + + + + + Input value + 30cdb7e9-3cfd-4741-85fb-ae4292d210c3 + Value + Value + false + ff360acf-d5a3-4264-82d3-9ab41bfddde1 + 1 + + + + + + 909 + 511 + 34 + 68 + + + 927.5 + 545 + + + + + + + + Output value + 234c3f49-bda1-44b1-80d0-c937404c6983 + Result + Result + false + 0 + + + + + + 973 + 511 + 40 + 68 + + + 993 + 545 + + + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file