From db57df609d6c57e45691fdfa449c97711c75576c Mon Sep 17 00:00:00 2001 From: Pedram Mirabian Date: Mon, 27 Mar 2023 15:53:38 +0200 Subject: [PATCH 1/2] assignment 3 submission --- .../pedram_mirabian/assignment_03.ghx | 8114 +++++++++++++++++ 1 file changed, 8114 insertions(+) create mode 100644 lecture_04/assignment_03/pedram_mirabian/assignment_03.ghx diff --git a/lecture_04/assignment_03/pedram_mirabian/assignment_03.ghx b/lecture_04/assignment_03/pedram_mirabian/assignment_03.ghx new file mode 100644 index 0000000..78755a8 --- /dev/null +++ b/lecture_04/assignment_03/pedram_mirabian/assignment_03.ghx @@ -0,0 +1,8114 @@ + + + + + + + + 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 + + + + + + 447 + -2 + + 0.554631948 + + + + + 0 + + + + + + + 0 + + + + + 2 + + + + + GhPython, Version=7.28.23058.3001, Culture=neutral, PublicKeyToken=null + 7.28.23058.3001 + + 00000000-0000-0000-0000-000000000000 + + + + + + + Colibri.Grasshopper, Version=0.2.6348.33183, Culture=neutral, PublicKeyToken=null + 0.2.6348.33183 + CORE studio | Thornton Tomasetti + b96948a9-4599-447d-b3bc-18f88e319755 + Colibri + 0.2.6348.33183 + + + + + + + 78 + + + + + 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 + a298b4f5-76b8-480b-a23a-60abe1f4ed19 + 32c27bd7-6d02-4446-81d2-23365043a6d7 + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + 19 + 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 + d8c50254-7cc8-4fd1-926a-f175e9f4c8fb + 1 + + + + + + 1245 + 109 + 50 + 24 + + + 1270.338 + 121.4783 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 60.21488 + + + 263.0308 + 60.21488 + + + 263.0308 + 80.31352 + + + 37.69194 + 80.31352 + + A quick note + Cambria + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + false + Scribble + Scribble + 22 + 1) Load robot from ROS + + + + + + 32.69194 + 55.21488 + 235.3388 + 30.09864 + + + 37.69194 + 60.21488 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + aacb02be-ffde-4997-b910-3a5670a6e5b1 + Data + Target planes + false + 327f7bb4-1b04-42d2-80ef-20f3aaef28d1 + 1 + + + + + + 1245 + 450 + 50 + 24 + + + 1270.118 + 462.9615 + + + + + + + + + + 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 + 67637025-d631-4ccb-8f5c-a2fd3e2df5d2 + 0bd0e8e4-ca4a-4b2b-b46f-c02991a91871 + 6b9b95af-bb42-49a8-b9b0-dcb941375504 + 7d3934ec-a2d7-4f4a-8673-509eb4a8e1d6 + 6821e4d6-b3ba-4cc6-b546-59ee150f03b6 + 54d38872-c258-4603-b313-9571b20b5477 + eb72f1ba-c840-4e9e-b362-4cbfa4d95255 + 34730cb1-b040-4596-b3ea-cc9cb3d78048 + 2cf3bc62-8c4e-494c-9e32-6671540acd41 + e3ef1898-b1b3-4341-b410-807efe4882fd + 500becd1-670a-47dc-97e7-d56fe0691e2b + 594d094d-2ac4-48c3-a91c-3e119876b383 + 19 + 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 + 4be27a3e-5aee-4db6-9377-b78978d5886b + 1 + + + + + + 1245 + 244 + 50 + 24 + + + 1270.338 + 256.1927 + + + + + + + + + + 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 + 6b717484-727b-49ec-be28-225884d8fe07 + 5285ae71-e847-4c91-8327-c3c0e5eeecbf + 9ef394c4-6355-4465-bb6d-0f5bf317b24b + 9 + 3c032157-3bf9-40ee-9b12-e4e807d15ccc + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 221.9796 + + + 260.3237 + 221.9796 + + + 260.3237 + 242.0782 + + + 37.69194 + 242.0782 + + A quick note + Cambria + ff0bbdd7-eb5b-4ed6-a652-505db2c0ac8c + false + Scribble + Scribble + 22 + 2) Define pick-up plane + + + + + + 32.69194 + 216.9796 + 232.6318 + 30.09863 + + + 37.69194 + 221.9796 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 409.6958 + + + 254.9741 + 409.6958 + + + 254.9741 + 429.9233 + + + 37.69194 + 429.9233 + + A quick note + Cambria + 9dbe68e7-ae2d-4df4-89a9-ae0ec5759854 + false + Scribble + Scribble + 22 + 3) Define target planes + + + + + + 32.69194 + 404.6958 + 227.2822 + 30.22754 + + + 37.69194 + 409.6958 + + + + + + + + + + 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/xhBQAAAAlwSFlzAAALEAAACxABrSO9dQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/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 + + + + + + 2187 + 79 + 271 + 204 + + + 2342 + 181 + + + + + + 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 + + + + + + 2189 + 81 + 138 + 20 + + + 2259.5 + 91 + + + + + + + + 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 + + + + + + 2189 + 101 + 138 + 20 + + + 2259.5 + 111 + + + + + + + + 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 + + + + + + 2189 + 121 + 138 + 20 + + + 2259.5 + 131 + + + + + + + + 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 + + + + + + 2189 + 141 + 138 + 20 + + + 2259.5 + 151 + + + + + + + + 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 + + + + + + 2189 + 161 + 138 + 20 + + + 2259.5 + 171 + + + + + + + + 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 + + + + + + 2189 + 181 + 138 + 20 + + + 2259.5 + 191 + + + + + + + + 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 + + + + + + 2189 + 201 + 138 + 20 + + + 2259.5 + 211 + + + + + + + + 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 + + + + + + 2189 + 221 + 138 + 20 + + + 2259.5 + 231 + + + + + + + + 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 + + + + + + 2189 + 241 + 138 + 20 + + + 2259.5 + 251 + + + + + + + + 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 + + + + + + 2189 + 261 + 138 + 20 + + + 2259.5 + 271 + + + + + + + + Rhino meshes of the robot's visual geometry (if any). + b51fd205-41de-4772-b77b-54118aa40c2c + visual + visual + false + 0 + + + + + + 2357 + 81 + 99 + 28 + + + 2406.5 + 95.28571 + + + + + + + + Rhino meshes of the robot's collision geometry (if any). + 3fd4309e-805a-4b2a-8b39-fb39cda51d21 + collision + collision + false + 0 + + + + + + 2357 + 109 + 99 + 29 + + + 2406.5 + 123.8571 + + + + + + + + Rhino meshes of the scene's collision meshes (if any). + ba8f5aaf-7d4f-4021-b0f3-328651e5f766 + collision_meshes + collision_meshes + false + 0 + + + + + + 2357 + 138 + 99 + 28 + + + 2406.5 + 152.4286 + + + + + + + + Rhino meshes of the scene's attached collision meshes (if any). + 00b4652c-1968-4bef-b124-5b86f4dc25bc + attached_meshes + attached_meshes + false + 0 + + + + + + 2357 + 166 + 99 + 29 + + + 2406.5 + 181 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 243eeb3c-e1ad-4233-9a1a-b0ec9fd1c962 + frames + frames + false + 0 + + + + + + 2357 + 195 + 99 + 28 + + + 2406.5 + 209.5714 + + + + + + + + The robot's base frame as a Rhino plane (if any). + 91fd1995-e0da-4f23-a4c6-afeefc044dee + base_frame + base_frame + false + 0 + + + + + + 2357 + 223 + 99 + 29 + + + 2406.5 + 238.1429 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + 5a2c4711-ae2f-4f0f-b633-afc7c8fccfd2 + ee_frame + ee_frame + false + 0 + + + + + + 2357 + 252 + 99 + 29 + + + 2406.5 + 266.7143 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 591.6624 + + + 308.5562 + 591.6624 + + + 308.5562 + 611.761 + + + 37.69194 + 611.761 + + A quick note + Cambria + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + false + Scribble + Scribble + 22 + 4) Solve IK for pick-up plane + + + + + + 32.69194 + 586.6624 + 280.8642 + 30.09863 + + + 37.69194 + 591.6624 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + Data + Pickup config + false + aad53aa1-b80e-4a58-ad85-ae26cd7ae7ce + 1 + + + + + + 1245 + 662 + 50 + 24 + + + 1270.118 + 674.7843 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 64.57504 + 615.786 + + + 229.8485 + 615.786 + + + 229.8485 + 630.4969 + + + 64.57504 + 630.4969 + + A quick note + Cambria + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + false + Scribble + Scribble + 16 + Results in pickup config + + + + + + 59.57504 + 610.786 + 175.2735 + 24.71094 + + + 64.57504 + 615.786 + + + + + + + + + + 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 + 99e8dfb1-1f62-40df-83c8-ac756f18fc76 + 7 + 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 + List + false + 0 + + + + + 0 + Pickup config + false + + + + + 1 + Trajectory + true + + + + + + 1430 + 111 + 145 + 22 + + + + + + + + + + eeafc956-268e-461d-8e73-ee05c6f72c01 + Stream Filter + + + + + Filters a collection of input streams + true + 471af287-d88e-43f4-9bb2-98daa088f633 + Stream Filter + Filter + + + + + + 1885 + 110 + 80 + 64 + + + 1917 + 142 + + + + + + 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 + G + false + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 1 + + + + + + 1887 + 112 + 15 + 20 + + + 1896 + 122 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + 2 + Input stream at index 0 + e6a67ce5-d55f-4ec2-a44c-573291be81a5 + false + Stream 0 + 0 + true + a38644b3-ef3b-4bc2-bf1d-8843907a4a1f + 1 + + + + + + 1887 + 132 + 15 + 20 + + + 1896 + 142 + + + + + + + + 2 + Input stream at index 1 + 14985ec3-7977-426f-bc6b-ad27afc61e04 + false + Stream 1 + 1 + true + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 1887 + 152 + 15 + 20 + + + 1896 + 162 + + + + + + + + 2 + Filtered stream + ddfd1927-535b-4f08-acf1-f1762fa62a54 + false + Stream + S(1) + false + 0 + + + + + + 1932 + 112 + 31 + 60 + + + 1947.5 + 142 + + + + + + + + + + + + + + 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 + + 1423.564 + 60.88748 + + + 1547.927 + 60.88748 + + + 1547.927 + 76.43143 + + + 1423.564 + 76.43143 + + A quick note + Cambria + 766f518e-d29b-4814-a406-a45e5ded4a64 + false + Scribble + Scribble + 22 + Visualization + + + + + + 1418.564 + 55.88748 + 134.3623 + 25.54395 + + + 1423.564 + 60.88748 + + + + + + + + + + 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 + + + + + + 61 + 692 + 50 + 24 + + + 86.97993 + 704.5718 + + + + + + + + + + 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 + + + + + + 61 + 649 + 50 + 24 + + + 86.86352 + 661.9973 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 801.7374 + + + 370.9253 + 801.7374 + + + 370.9253 + 821.9113 + + + 37.69194 + 821.9113 + + A quick note + Cambria + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + false + Scribble + Scribble + 22 + 5) Plan trajectory to selected plane + + + + + + 32.69194 + 796.7374 + 343.2333 + 30.17383 + + + 37.69194 + 801.7374 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 66.10143 + 828.6232 + + + 305.8201 + 828.6232 + + + 305.8201 + 843.3341 + + + 66.10143 + 843.3341 + + A quick note + Cambria + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + false + Scribble + Scribble + 16 + From pickup config to target plane + + + + + + 61.10143 + 823.6232 + 249.7187 + 24.71094 + + + 66.10143 + 828.6232 + + + + + + + + + + 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 + + + + + + 61 + 958 + 50 + 24 + + + 86.32721 + 970.766 + + + + + + + + + + 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 + + + + + + 61 + 879 + 50 + 24 + + + 86.32721 + 891.5822 + + + + + + + + + + 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 + + + + + + 61 + 917 + 50 + 24 + + + 86.13693 + 929.8961 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + e4b338fe-125d-4929-92e1-4e17c08f9b3b + Number Slider + indx + false + 0 + + + + + + 1432 + 153 + 190 + 20 + + + 1432.204 + 153.0871 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 45 + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + true + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + List Item + Item + + + + + + 2002 + 130 + 64 + 64 + + + 2036 + 162 + + + + + + 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 + L + false + ddfd1927-535b-4f08-acf1-f1762fa62a54 + 1 + + + + + + 2004 + 132 + 17 + 20 + + + 2014 + 142 + + + + + + + + Item index + 83d287eb-3d9d-4785-b735-156766b364e7 + Index + i + false + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + + + + + + 2004 + 152 + 17 + 20 + + + 2014 + 162 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 60da4aea-66d4-49fc-8aa9-a5189edc913b + Wrap + W + false + 0 + + + + + + 2004 + 172 + 17 + 20 + + + 2014 + 182 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + false + Item + i + false + 0 + + + + + + 2051 + 132 + 13 + 60 + + + 2057.5 + 162 + + + + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + bcf27a28-24e5-4d31-8438-444d7fe511cb + Data + Trajectory + false + d8f3f718-83db-4fdb-b0e2-677ddf0af13b + 1 + + + + + + 1245 + 882 + 50 + 24 + + + 1270.339 + 894.4081 + + + + + + + + + + 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 + + + + + + 1541 + 255 + 136 + 28 + + + 1613 + 269 + + + + + + 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 + + + + + + 1543 + 257 + 55 + 24 + + + 1572 + 269 + + + + + + + + Script output configs. + a4b043bc-8e30-4b4c-bb40-e7f42497696d + configs + configs + false + 0 + + + + + + 1628 + 257 + 47 + 24 + + + 1651.5 + 269 + + + + + + + + + + + + + + 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 + + + + + + 1432 + 231 + 50 + 24 + + + 1457.421 + 243.6929 + + + + + + + + + + 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 + + + + + + 1432 + 275 + 50 + 24 + + + 1457.259 + 287.8766 + + + + + + + + + + 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 + + + + + + 1432 + 187 + 50 + 24 + + + 1457.259 + 199.2409 + + + + + + + + + + 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 + d46a99fc-10c2-4500-9e8a-dfbe9bfd7053 + 3e4974ad-17b0-42eb-a4fa-deb9905b4270 + 83f55d60-30e4-4af9-8dd5-142229b90651 + 21c061b3-4cb9-4823-b1e7-b410d9dcea12 + bb378d71-1cb7-4e65-b7cd-fb5958362b31 + 95fb500e-4230-4acd-ac66-c2bbe444c30f + b39c5b06-0ad5-4b24-b121-ff80b45f5f1c + f4fef57a-4fdb-43ee-9af9-5c0729f0b29c + 6886afd1-eba5-4a75-8cd4-bffd7e538e7c + dd22a394-29b9-4a6e-bc37-fe093c684662 + 583ad785-6f9e-4700-b910-de767de8c20a + 76ef7d5e-4104-4a94-b6e8-c68f66ee2de9 + 09702919-f8d5-4c5c-8e55-67f0e0a3c3d7 + 25 + 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 + + 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. + + + + + + -540 + 425 + 523 + 161 + + 0 + 0 + 0 + + -539.015 + 425.5011 + + + + + + 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 + + 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. + + + + + + -545 + 234 + 529 + 151 + + 0 + 0 + 0 + + -544.2502 + 234.2423 + + + + + + 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 + + false + 0 + 0 + Load the robot from ROS. + +Make sure ROS/MoveIt is running before you start (ie. "Compose up"). + + + + + + -545 + 64 + 529 + 96 + + 0 + 0 + 0 + + -544.2502 + 64.97168 + + + + + + 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 + + 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. + + + + + + -539 + 621 + 523 + 146 + + 0 + 0 + 0 + + -538.6031 + 621.8457 + + + + + + 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 + + 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. + + + + + + -539 + 883 + 523 + 137 + + 0 + 0 + 0 + + -538.368 + 883.4205 + + + + + + 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 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEQAACxEBf2RfkQAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC + + false + a298b4f5-76b8-480b-a23a-60abe1f4ed19 + true + true + ROS Connect + ROS + + + + + + 518 + 34 + 158 + 64 + + + 582 + 66 + + + + + + 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. + 1b8520c9-e181-4181-a80b-ac7d720afe16 + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 520 + 36 + 47 + 20 + + + 545 + 46 + + + + + + + + true + The port of ROS. Defaults to 9090. + 8f5b51a1-6f57-45fa-aa83-4861bf53fe47 + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 520 + 56 + 47 + 20 + + + 545 + 66 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + a5f74744-4f97-40a2-bde6-19e32ab05a36 + connect + connect + true + 0 + true + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 520 + 76 + 47 + 20 + + + 545 + 86 + + + + + + + + The ROS client. + a55f6fce-0c9b-46a0-93a3-33e25a08a291 + ros_client + ros_client + false + 0 + + + + + + 597 + 36 + 77 + 30 + + + 635.5 + 51 + + + + + + + + True if connection established. + 9c50f802-026a-4d74-8873-b493098d6689 + is_connected + is_connected + false + 0 + + + + + + 597 + 66 + 77 + 30 + + + 635.5 + 81 + + + + + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEQAACxEBf2RfkQAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC + + false + 32c27bd7-6d02-4446-81d2-23365043a6d7 + true + true + ROS Robot + Robot + + + + + + 828 + 98 + 127 + 44 + + + 901 + 120 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + d690cb07-b7bd-45c3-b14b-43e4a25dc506 + ros_client + ros_client + true + 0 + true + a55f6fce-0c9b-46a0-93a3-33e25a08a291 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 830 + 100 + 56 + 20 + + + 859.5 + 110 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + f01c52a8-ac5b-44bd-9744-dc31a9f89e9a + load + load + true + 0 + true + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 830 + 120 + 56 + 20 + + + 859.5 + 130 + + + + + + + + The robot. + d8c50254-7cc8-4fd1-926a-f175e9f4c8fb + robot + robot + false + 0 + + + + + + 916 + 100 + 37 + 40 + + + 934.5 + 120 + + + + + + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + 1 + 51f11481-2e02-4ca5-b090-bc1bab2149a4 + Point + Start Point + false + 0 + + + + + + 43 + 254 + 67 + 20 + + + 77.01717 + 264.5011 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0.369968259844404 + 0.206073737566678 + 0.00706759272081525 + + + + + + + + + + + + + + bc3e379e-7206-4e7b-b63a-ff61f4b38a3e + Construct Plane + + + + + Construct a plane from an origin point and {x}, {y} axes. + 6b717484-727b-49ec-be28-225884d8fe07 + Construct Plane + Pl + + + + + + 524 + 223 + 69 + 64 + + + 556 + 255 + + + + + + Origin of plane + dc0decf0-6bbb-444b-ba11-e73072ea1756 + Origin + O + false + 51f11481-2e02-4ca5-b090-bc1bab2149a4 + 1 + + + + + + 526 + 225 + 15 + 20 + + + 535 + 235 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + X-Axis direction of plane + 6cf6cc49-8eb5-46fe-8d11-389bf84e54da + X-Axis + X + false + e12188d7-cfec-4c23-ba01-99e16dba26ad + 1 + + + + + + 526 + 245 + 15 + 20 + + + 535 + 255 + + + + + + 1 + + + + + 1 + {0} + + + + + + 1 + 0 + 0 + + + + + + + + + + + + Y-Axis direction of plane + 6e5e695a-8b21-4a6a-91a0-aa6b47278782 + Y-Axis + Y + false + 6bba1374-a661-4419-9431-9e5e6c2974bd + 1 + + + + + + 526 + 265 + 15 + 20 + + + 535 + 275 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + 0 + + + + + + + + + + + + Constructed plane + 4be27a3e-5aee-4db6-9377-b78978d5886b + Plane + Pl + false + 0 + + + + + + 571 + 225 + 20 + 60 + + + 581 + 255 + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + 1 + 67637025-d631-4ccb-8f5c-a2fd3e2df5d2 + Curve + Guide Polyline + false + 0 + + + + + + 43 + 444 + 86 + 20 + + + 86.43102 + 454.7016 + + + + + + 1 + + + + + 1 + {0} + + + + + -1 + + Y2BkYGD4DwQgGgR4mIBEWFBGZl6+c35ubn6ejkJYalFxZn6erbmekYWekbGBqYWesYGBoY6Cc2lOSWlRqm1eamlJUWKOjkJAaVJOZrJ3amVIfnZqnq2pqZGRhWGqpXmyuampqbEBK8gSGbDZeu6p+bmpJUWVegH5OZU5mXmpzqVFZaksQAXsZRD7uBKLkjMyy1KNU3I58wtS8/JKi5KKWVISSxJBijg4OJhAThVQZ2AwAtKuj/l4OJmBDH4QsRWImX7VMzGshHrr938mBhEo+9mV637uLy8L7n/KINDMqPTBb87u23+A8oVQeQGQCUZqz5bMXXbDPmOV9/PZgU/toXIMNYH7PFxWvbBXPVUgK9/xEC7OoHM3gFHttn24yPqLHmn39lvFNKkYrL1sz8yAAK6PQ0P/XLpl31L8Z908q3dgOfWWF7b/65kaYGq4GegKAA== + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + + + + + afb96615-c59a-45c9-9cac-e27acb1c7ca0 + Explode + + + + + Explode a curve into smaller segments. + true + 0bd0e8e4-ca4a-4b2b-b46f-c02991a91871 + Explode + Explode + + + + + + 154 + 442 + 66 + 44 + + + 186 + 464 + + + + + + Curve to explode + ffc01871-a2a3-442c-bcbc-8edc3da109b1 + Curve + C + false + 67637025-d631-4ccb-8f5c-a2fd3e2df5d2 + 1 + + + + + + 156 + 444 + 15 + 20 + + + 165 + 454 + + + + + + + + Recursive decomposition until all segments are atomic + be07aa47-8815-4674-af5f-43882605e794 + Recursive + R + false + 0 + + + + + + 156 + 464 + 15 + 20 + + + 165 + 474 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + 1 + Exploded segments that make up the base curve + 394bf9b5-7b2e-4366-bfa6-1b21123a255b + Segments + S + false + 0 + + + + + + 201 + 444 + 17 + 20 + + + 209.5 + 454 + + + + + + + + 1 + Vertices of the exploded segments + cc771d2e-9224-4b91-b8d4-51b13843aa0f + Vertices + V + false + 0 + + + + + + 201 + 464 + 17 + 20 + + + 209.5 + 474 + + + + + + + + + + + + 2b2a4145-3dff-41d4-a8de-1ea9d29eef33 + Interpolate + + + + + Create an interpolated curve through a set of points. + 6b9b95af-bb42-49a8-b9b0-dcb941375504 + Interpolate + IntCrv + + + + + + 252 + 442 + 67 + 84 + + + 284 + 484 + + + + + + 1 + Interpolation points + 49be928c-17dc-4149-b557-3726a2989791 + Vertices + V + false + cc771d2e-9224-4b91-b8d4-51b13843aa0f + 1 + + + + + + 254 + 444 + 15 + 20 + + + 263 + 454 + + + + + + + + Curve degree + 21b465ae-d17d-4f6c-8dc1-33b56d2d8818 + Degree + D + false + 0 + + + + + + 254 + 464 + 15 + 20 + + + 263 + 474 + + + + + + 1 + + + + + 1 + {0} + + + + + 3 + + + + + + + + + + + Periodic curve + b5054a74-a432-4fad-a3cc-09c82e9e7033 + Periodic + P + false + 0 + + + + + + 254 + 484 + 15 + 20 + + + 263 + 494 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Knot spacing (0=uniform, 1=chord, 2=sqrtchord) + f90b28e3-24a5-44ca-acc5-f73e94b338dd + KnotStyle + K + false + 0 + + + + + + 254 + 504 + 15 + 20 + + + 263 + 514 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Resulting nurbs curve + 4cbfc128-1b11-4079-8403-9db3ed92b7b4 + Curve + C + false + 0 + + + + + + 299 + 444 + 18 + 26 + + + 308 + 457.3333 + + + + + + + + Curve length + 18278cf7-e10f-489c-802f-b5f9c73ab575 + Length + L + false + 0 + + + + + + 299 + 470 + 18 + 27 + + + 308 + 484 + + + + + + + + Curve domain + bbe8ef03-5062-43d9-934a-a6888efddc21 + Domain + D + false + 0 + + + + + + 299 + 497 + 18 + 27 + + + 308 + 510.6667 + + + + + + + + + + + + 2162e72e-72fc-4bf8-9459-d4d82fa8aa14 + Divide Curve + + + + + Divide a curve into equal length segments + true + 7d3934ec-a2d7-4f4a-8673-509eb4a8e1d6 + Divide Curve + Divide + + + + + + 349 + 445 + 66 + 64 + + + 381 + 477 + + + + + + Curve to divide + fa1feb8e-a622-4782-aa8c-54c3d2531a6b + Curve + C + false + 4cbfc128-1b11-4079-8403-9db3ed92b7b4 + 1 + + + + + + 351 + 447 + 15 + 20 + + + 360 + 457 + + + + + + + + Number of segments + 9cbaf26c-6878-4366-abb3-6192119b8ae5 + Count + N + false + 6821e4d6-b3ba-4cc6-b546-59ee150f03b6 + 1 + + + + + + 351 + 467 + 15 + 20 + + + 360 + 477 + + + + + + 1 + + + + + 1 + {0} + + + + + 10 + + + + + + + + + + + Split segments at kinks + 61781adb-5d0c-447f-a389-fdece5b2e9e6 + Kinks + K + false + 0 + + + + + + 351 + 487 + 15 + 20 + + + 360 + 497 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + 1 + Division points + 380c21cc-24ad-4d25-96d2-bfec93ec1f6f + Points + P + false + 0 + + + + + + 396 + 447 + 17 + 20 + + + 404.5 + 457 + + + + + + + + 1 + Tangent vectors at division points + e4cbb353-7546-41e0-9684-4f40884ea17e + Tangents + T + false + 0 + + + + + + 396 + 467 + 17 + 20 + + + 404.5 + 477 + + + + + + + + 1 + Parameter values at division points + 82881e89-30b8-42e4-8197-f4fe55a191a4 + Parameters + t + false + 0 + + + + + + 396 + 487 + 17 + 20 + + + 404.5 + 497 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 6821e4d6-b3ba-4cc6-b546-59ee150f03b6 + Number Slider + + false + 0 + + + + + + 43 + 530 + 163 + 20 + + + 43.26382 + 530.2399 + + + + + + 3 + 1 + 1 + 10 + 1 + 0 + 4 + + + + + + + + + bc3e379e-7206-4e7b-b63a-ff61f4b38a3e + Construct Plane + + + + + Construct a plane from an origin point and {x}, {y} axes. + true + 54d38872-c258-4603-b313-9571b20b5477 + Construct Plane + Pl + + + + + + 1019 + 430 + 69 + 64 + + + 1051 + 462 + + + + + + Origin of plane + 63342e99-5634-4d22-b2e3-e37a958651fe + Origin + O + false + 380c21cc-24ad-4d25-96d2-bfec93ec1f6f + 1 + + + + + + 1021 + 432 + 15 + 20 + + + 1030 + 442 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + X-Axis direction of plane + fa6573ed-9023-43c1-9681-0e732a98f718 + X-Axis + X + false + c1fadd78-75ac-48cf-b405-2d6661672e89 + 1 + + + + + + 1021 + 452 + 15 + 20 + + + 1030 + 462 + + + + + + 1 + + + + + 1 + {0} + + + + + + 1 + 0 + 0 + + + + + + + + + + + + Y-Axis direction of plane + c4b6fe75-e251-49df-a97d-db5e90f7f060 + Y-Axis + Y + false + 75483f7d-b2dd-4d47-ac88-1b2bf513e118 + 1 + + + + + + 1021 + 472 + 15 + 20 + + + 1030 + 482 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + 0 + + + + + + + + + + + + Constructed plane + 327f7bb4-1b04-42d2-80ef-20f3aaef28d1 + Plane + Pl + false + 0 + + + + + + 1066 + 432 + 20 + 60 + + + 1076 + 462 + + + + + + + + + + + + 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 + 99e8dfb1-1f62-40df-83c8-ac756f18fc76 + true + true + Inverse Kinematics + IK + + + + + + 509 + 632 + 214 + 84 + + + 629 + 674 + + + + + + 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. + 7e856d49-b5bb-4bd0-9949-185696817278 + robot + robot + true + 0 + true + 98209ace-c305-4683-b351-d9b9daf31e36 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 511 + 634 + 103 + 20 + + + 564 + 644 + + + + + + + + true + The plane or frame to calculate the inverse kinematic for. + e58ca0af-27ef-40e2-ab03-998ecfc69765 + plane + plane + true + 0 + true + b96209a7-93e4-4212-b096-c83e82b4da7b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 511 + 654 + 103 + 20 + + + 564 + 664 + + + + + + + + true + If passed, calculates the inverse such that the joint positions differ the least from the start_configuration. Defaults to the zero configuration. + ea6954e8-dda5-4131-b1cc-f0b3975a4092 + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 511 + 674 + 103 + 20 + + + 564 + 684 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 8e9b0427-154a-47f4-8d1f-f53c9f5647f5 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 511 + 694 + 103 + 20 + + + 564 + 704 + + + + + + + + The planning group's configuration. + aad53aa1-b80e-4a58-ad85-ae26cd7ae7ce + configuration + configuration + false + 0 + + + + + + 644 + 634 + 77 + 80 + + + 682.5 + 674 + + + + + + + + + + + + + + d3d195ea-2d59-4ffa-90b1-8b7ff3369f69 + Unit Y + + + + + Unit vector parallel to the world {y} axis. + 5285ae71-e847-4c91-8327-c3c0e5eeecbf + Unit Y + Y + + + + + + 435 + 246 + 65 + 28 + + + 466 + 260 + + + + + + Unit multiplication + 351b54f3-f360-4af2-a23d-db5ce0f4d89e + Factor + F + false + 0 + + + + + + 437 + 248 + 14 + 24 + + + 445.5 + 260 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {y} vector + e12188d7-cfec-4c23-ba01-99e16dba26ad + Unit vector + V + false + 0 + + + + + + 481 + 248 + 17 + 24 + + + 489.5 + 260 + + + + + + + + + + + + 79f9fbb3-8f1d-4d9a-88a9-f7961b1012cd + Unit X + + + + + Unit vector parallel to the world {x} axis. + 9ef394c4-6355-4465-bb6d-0f5bf317b24b + Unit X + X + + + + + + 435 + 274 + 65 + 28 + + + 466 + 288 + + + + + + Unit multiplication + f2460375-95e2-4613-baaa-035c258b22ec + Factor + F + false + 0 + + + + + + 437 + 276 + 14 + 24 + + + 445.5 + 288 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {x} vector + 6bba1374-a661-4419-9431-9e5e6c2974bd + Unit vector + V + false + 0 + + + + + + 481 + 276 + 17 + 24 + + + 489.5 + 288 + + + + + + + + + + + + 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 + + 128 + 128 + + + 1171 + 943 + + true + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAGNSURBVEhLtZTNbQIxEIUpgQ5ICRTAgRJyibimBErgEIkaInGgAyiBDpICuOeYnHJByuZ93vFm7B0SQBtLH4znPeO/MaOmaf6VMDkkYXJIwuS1qI3FVhzEXsw7zRs9ajOxE5tI96i9CgJPmuTcgLUzvokN32e89yJ7PfukBwMmxqcgwY+fLD4G/pVpNYekBwNeBD/4JGaWYxICdjOp/FPTalZJ92YbkFdbnL3ag+Do1j5vWr0L7mSctMD8bqa0epenQgjefd7pd2IORb7otGe/FAufN408gbqlBmocI4srd1502rIk6K1SjcnRl7Vmet55utwuX3T+PoYjmoh2SHEQ/DoBx8Ak4eNSC1dpGmOLe0v5LmgviWqAR29yHnbwJeoK49UTQLG7bKCWP8yQ2Xqj+fIj5C6692B9gpP3J80M/EER1Ex7A9odEKRXrcbbeBYc7a7nN1O+3Jqips27EEzCffhxvQeY/Onjih2Yn5rPBUEirKzkTR8X3sEt/AQXVNEthMkhCZNDEiaHoxl9A6glDpIGAdZaAAAAAElFTkSuQmCC + + false + d46a99fc-10c2-4500-9e8a-dfbe9bfd7053 + true + true + Plan Motion + Plan Motion + + + + + + 918 + 811 + 235 + 164 + + + 1078 + 893 + + + + + + 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. + d083a2f2-e808-43f8-85a5-b013e031fcf3 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 920 + 813 + 143 + 20 + + + 993 + 823 + + + + + + + + 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. + 833df342-7a83-4b11-8a1c-25b14ea0e772 + goal_constraints + goal_constraints + true + 1 + true + 67129582-389a-46c5-a939-1fa904a8f14a + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 920 + 833 + 143 + 20 + + + 993 + 843 + + + + + + + + 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. + a7955c8d-c68b-4785-95c3-9f0cca1d1cc1 + start_configuration + start_configuration + true + 0 + true + c666c109-2ccb-4c50-90cd-00130af76eaa + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 920 + 853 + 143 + 20 + + + 993 + 863 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + c0d60cdb-0fca-433d-a5d8-8320b9889690 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 920 + 873 + 143 + 20 + + + 993 + 883 + + + + + + + + 1 + true + A list of attached collision meshes to be included for planning. + 993b8eb0-e4a6-4a5f-89d8-4b2779d51be8 + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 920 + 893 + 143 + 20 + + + 993 + 903 + + + + + + + + 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. + 38cf49ce-3976-41d9-aecf-90433d61fb69 + path_constraints + path_constraints + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 920 + 913 + 143 + 20 + + + 993 + 923 + + + + + + + + true + The name of the algorithm used for path planning. Defaults to 'RRTConnect' + 170370fe-0acf-4014-8931-8edd954ddd5b + planner_id + planner_id + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 920 + 933 + 143 + 20 + + + 993 + 943 + + + + + + + + true + If True, calculates a trajectory. + 8fc7428c-639f-4fb1-b58d-7786183b944b + compute + compute + true + 0 + true + bb378d71-1cb7-4e65-b7cd-fb5958362b31 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 920 + 953 + 143 + 20 + + + 993 + 963 + + + + + + + + The calculated trajectory. + d8f3f718-83db-4fdb-b0e2-677ddf0af13b + trajectory + trajectory + false + 0 + + + + + + 1093 + 813 + 58 + 160 + + + 1122 + 893 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + true + 3e4974ad-17b0-42eb-a4fa-deb9905b4270 + List Item + Item + + + + + + 221 + 958 + 64 + 64 + + + 255 + 990 + + + + + + 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 + cc652879-9cd7-4aaa-9cdd-b976429d4ac7 + List + L + false + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 223 + 960 + 17 + 20 + + + 233 + 970 + + + + + + + + Item index + a9c1de3c-4b9f-4941-8a54-d82ca469353d + Index + i + false + 583ad785-6f9e-4700-b910-de767de8c20a + 1 + + + + + + 223 + 980 + 17 + 20 + + + 233 + 990 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 044c5aec-4e6e-481f-ab50-15a90ff1f158 + Wrap + W + false + 0 + + + + + + 223 + 1000 + 17 + 20 + + + 233 + 1010 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 6eec36d2-0480-440c-97e7-8b4890df2083 + false + Item + i + false + 0 + + + + + + 270 + 960 + 13 + 60 + + + 276.5 + 990 + + + + + + + + + + + + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + true + 83f55d60-30e4-4af9-8dd5-142229b90651 + Plane + Last Plane + false + 6eec36d2-0480-440c-97e7-8b4890df2083 + 1 + + + + + + 326 + 978 + 50 + 24 + + + 351.3705 + 990.6206 + + + + + + + + + + 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 + true + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAHfSURBVEhLtZUxS8NAGIaPdhDUoVRRxNaeCC4qZHAV6g8QOjkHx04Z/AEZOzgUHV3yD8zslMFBcCn4B0onwSVO4nS+3/Uu3LVfm1RweMjde/meL7mcVSil/hU2nEWI5waXV4ENXSCXYMitVYENXSAPwYhbqwIbukCeAgz+tk1s6AJxbhr0uPUy2NACaWDkRMLdUwYbWiCNnAZj7p4y2NACaeY0ICR33zLY0AXSGGTcWhXY0GVZg6OODMHS5mxIvAjRpeumeBqs1dM3GotH0QXFcYU8BhjO11vYEPIQKDC4aV18iyBWECdgAkbypN2HeERyQw4SMPeNvAnhyC1J8070Ic6B2rnankqlnOCa6fFUbhsFrq9MTkQQN8DXxu26llOT+n3t/fD4YEBzqsW1axp4PyuL5DlITaZfGw16nbPWZ+e0/VN7qNGWqa3r5odtQGAc0RwUf/VW3gMZiID3igQK6On0BwWvaDTcu9xN2+f7uoFZI/QbAdq6mGo90SJMsd6eVaBaVrgIFNEeF+ceY++YYkxvSvLIZkVxFVA4NILQzGcb2KOrvxvhCcpAYQOMjYTktiE9uZUXT094gipAIIE9/y60fZ6c8CarAFkAbCP6TWL/480FqwCpPr7c2hQlfgEp2YYU5C2cFwAAAABJRU5ErkJggg== + + false + 21c061b3-4cb9-4823-b1e7-b410d9dcea12 + true + true + Constraints From Plane + Constraints From Plane + + + + + + 474 + 884 + 201 + 144 + + + 591 + 956 + + + + + + 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. + 21edf791-2c60-4666-aadc-0e2e5ad8671d + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 476 + 886 + 100 + 20 + + + 527.5 + 896 + + + + + + + + true + The plane or frame from which we create position and orientation constraints. + b928a6a8-d7a2-47c6-8406-6545d8875480 + plane + plane + true + 0 + true + 83f55d60-30e4-4af9-8dd5-142229b90651 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 476 + 906 + 100 + 20 + + + 527.5 + 916 + + + + + + + + true + The planning group for which we specify the constraint. Defaults to the robot's main planning group. + a0e2b7fe-8dc1-42e9-a042-fe9504c3e743 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 476 + 926 + 100 + 20 + + + 527.5 + 936 + + + + + + + + true + The allowed tolerance to the frame's position (defined in the robot's units). Defaults to 0.001 + 843116b6-7a99-4639-9142-8a30ff4e83ee + tolerance_position + tolerance_position + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 946 + 100 + 20 + + + 527.5 + 956 + + + + + + + + true + The allowed tolerance of the frame's X-axis in degrees. + 676f1aff-e9c4-4803-b10b-18346a75c2bf + tolerance_xaxis + tolerance_xaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 966 + 100 + 20 + + + 527.5 + 976 + + + + + + + + true + The allowed tolerance of the frame's Y-axis in degrees. + 383c45e2-545a-4816-aecf-af8c88834fe2 + tolerance_yaxis + tolerance_yaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 986 + 100 + 20 + + + 527.5 + 996 + + + + + + + + true + The allowed tolerance of the frame's Z-axis in degrees. + e768cbf1-d825-4bc8-90d0-93a2d504580c + tolerance_zaxis + tolerance_zaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 1006 + 100 + 20 + + + 527.5 + 1016 + + + + + + + + A list containing a position and an orientation constraint. + 67129582-389a-46c5-a939-1fa904a8f14a + constraints + constraints + false + 0 + + + + + + 606 + 886 + 67 + 140 + + + 639.5 + 956 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + bb378d71-1cb7-4e65-b7cd-fb5958362b31 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 795 + 952 + 104 + 22 + + + + + + + + + + 74a79561-b3b2-4e12-beb4-d79ec0ed378a + b96948a9-4599-447d-b3bc-18f88e319755 + Colibri Iterator + + + + + Generates design iterations from a collection of sliders, panels, or valueLists. + b45f1bc5-1dbc-4460-bc15-f65f15416b0a + Colibri Iterator + Iterator + false + false + + + + + + 2303 + 356 + 143 + 86 + + + 2374 + 388 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Please connect a Slider, Panel, or ValueList + b6ce4532-d22d-4840-aa3e-1458a9a81e9c + false + Input + indx + true + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + 1 + + + + + + 2305 + 358 + 54 + 20 + + + 2333.5 + 368 + + + + + + + + 1 + Please connect a Slider, Panel, or ValueList + 729edd68-bc55-4011-b45a-0985b1507cb8 + false + Input + Input[N] + true + 0 + 1 + + + + + + 2305 + 378 + 54 + 20 + + + 2333.5 + 388 + + + + + + + + (Optional) Connect the Colibri 'Iteration Selection' component here to define a subset of the design space to iterate over. + f97257bc-f713-4cf7-966c-938d605dac75 + false + Selection + Selection + true + ef4729f2-1ae6-4420-b4a8-4937184b3170 + 1 + + + + + + 2305 + 398 + 54 + 20 + + + 2333.5 + 408 + + + + + + + + This item is one of values from Slider_indx + bb74caa8-bea6-416b-9257-95b15410f754 + false + Value + indx + false + 0 + + + + + + 2389 + 358 + 55 + 20 + + + 2416.5 + 368 + + + + + + + + This item is one of values from Input[N] + e43e2db9-e826-4e4f-9100-c372be29b3db + false + Item + Value[N] + false + 0 + + + + + + 2389 + 378 + 55 + 20 + + + 2416.5 + 388 + + + + + + + + 1 + Contains a collection of genes (variables) which defines a unique ID of each iteration. Connet to the Colibri Aggregator + bd3d79da-0077-4256-b7ca-ce388696f6e8 + false + Iteration Genome + Genome + false + 0 + + + + + + 2389 + 398 + 55 + 20 + + + 2416.5 + 408 + + + + + + + + + + + + + + 7dab01df-60be-477a-83d0-ff37a89d6a5a + b96948a9-4599-447d-b3bc-18f88e319755 + Iteration Selection + + + + + Generates an iteration selection for the Colibri Iterator. This allows you to iterate over a subset of the design space instead of taking every step along every slider/dropdown/panel. + +Use 'Divisions' to define granularity - how many steps to take on any given input. + +Use 'Domain' to break the design space up into chunks that can be solved in parallel on different machines. + bd8ce4f5-8709-42dd-9e57-75e031a46205 + Iteration Selection + Selection + + + + + + 2125 + 386 + 144 + 44 + + + 2195 + 408 + + + + + + 1 + Number of steps to take along the corresponding Iterator input. This should be a list of integers of the same length as the list of Iterator inputs. + + 0: for all values + 1: for current position + >1: numbers to be evenly picked. + c99bd7bb-8bc5-43c0-a339-f8432fb1f752 + Divisions + Divisions + true + 0 + + + + + + 2127 + 388 + 53 + 20 + + + 2155 + 398 + + + + + + + + 1 + Set the target domain of all iteration combinations to solve. For example, if your total number of iterations is 100 and you want to run half of the computations on one machine and half on another, input '0 to 49' for machine A, and '50 to 99' for machine B. Use "Construct Domain" for 1d domain. + +Domain setting comes after Divisions setting. + 751ea45e-305a-46a6-afc5-b4def0b0a77b + Domain + Domain + true + 1dee039c-096d-45a6-930e-88161082ae5f + 1 + + + + + + 2127 + 408 + 53 + 20 + + + 2155 + 418 + + + + + + + + Selections for Iterator + ef4729f2-1ae6-4420-b4a8-4937184b3170 + Selection + Selection + false + 0 + + + + + + 2210 + 388 + 57 + 40 + + + 2238.5 + 408 + + + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + 20a4242c-c527-4451-9658-aad15dbdf6b8 + Construct Domain + Dom + + + + + + 2029 + 396 + 78 + 44 + + + 2077 + 418 + + + + + + Start value of numeric domain + 339dd6cd-048e-4fb0-b553-088dfbb82e9c + Domain start + A + false + 0 + + + + + + 2031 + 398 + 31 + 20 + + + 2056 + 408 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + c4adedd1-29a3-468b-8924-f0f2ca7f72fc + x-1 + Domain end + B + false + 0340bcd6-1377-40b3-bf55-5a9762eca73a + 1 + + + + + + 2031 + 418 + 31 + 20 + + + 2056 + 428 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + 1dee039c-096d-45a6-930e-88161082ae5f + Domain + I + false + 0 + + + + + + 2092 + 398 + 13 + 40 + + + 2098.5 + 418 + + + + + + + + + + + + 1817fd29-20ae-4503-b542-f0fb651e67d7 + List Length + + + + + Measure the length of a list. + 211d4673-5231-4dc1-a18b-4459d8e8cbc7 + List Length + Lng + + + + + + 1937 + 414 + 65 + 28 + + + 1968 + 428 + + + + + + 1 + Base list + 2d3be744-afb4-477e-ad65-9386c22b7769 + List + L + false + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 1939 + 416 + 14 + 24 + + + 1947.5 + 428 + + + + + + + + Number of items in L + 0340bcd6-1377-40b3-bf55-5a9762eca73a + Length + L + false + 0 + + + + + + 1983 + 416 + 17 + 24 + + + 1991.5 + 428 + + + + + + + + + + + + 4c4e56eb-2f04-43f9-95a3-cc46a14f495a + Line + + + + + Create a line between two points. + true + eb72f1ba-c840-4e9e-b362-4cbfa4d95255 + Line + Ln + + + + + + 509 + 465 + 66 + 44 + + + 541 + 487 + + + + + + Line start point + ced25bbe-fd85-4efb-bc59-aaf7e7ad13cf + Start Point + A + false + 34730cb1-b040-4596-b3ea-cc9cb3d78048 + 1 + + + + + + 511 + 467 + 15 + 20 + + + 520 + 477 + + + + + + + + Line end point + b50d2f6e-45ad-459f-93c2-f4362738b2e2 + End Point + B + false + 380c21cc-24ad-4d25-96d2-bfec93ec1f6f + 1 + + + + + + 511 + 487 + 15 + 20 + + + 520 + 497 + + + + + + + + Line segment + ecbe8b9f-ceec-4017-9dad-cda0d21119ce + Line + L + false + 0 + + + + + + 556 + 467 + 17 + 40 + + + 564.5 + 487 + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 34730cb1-b040-4596-b3ea-cc9cb3d78048 + Panel + + false + 0 + 0 + 0,0,0 + + + + + + 511 + 509 + 65 + 20 + + 0 + 0 + 0 + + 511.0194 + 509.5011 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + d2da1306-259a-4994-85a4-672d8a4c7805 + Unit Vector + + + + + Unitize vector. + 2cf3bc62-8c4e-494c-9e32-6671540acd41 + Unit Vector + Unit + + + + + + 813 + 448 + 65 + 28 + + + 844 + 462 + + + + + + Base vector + e6ad331d-c361-43a0-b4ae-413f02e742d3 + Vector + V + false + ecbe8b9f-ceec-4017-9dad-cda0d21119ce + 1 + + + + + + 815 + 450 + 14 + 24 + + + 823.5 + 462 + + + + + + + + Unit vector + c1fadd78-75ac-48cf-b405-2d6661672e89 + Vector + V + false + 0 + + + + + + 859 + 450 + 17 + 24 + + + 867.5 + 462 + + + + + + + + + + + + 9103c240-a6a9-4223-9b42-dbd19bf38e2b + Unit Z + + + + + Unit vector parallel to the world {z} axis. + e3ef1898-b1b3-4341-b410-807efe4882fd + Unit Z + Z + + + + + + 730 + 526 + 65 + 28 + + + 761 + 540 + + + + + + Unit multiplication + ea928df1-ede9-4bb2-b3b7-f3c0ce0e795e + Factor + F + false + 0 + + + + + + 732 + 528 + 14 + 24 + + + 740.5 + 540 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {z} vector + c497f0a0-a892-4d8a-84b0-ee8af72e3b49 + Unit vector + V + false + 0 + + + + + + 776 + 528 + 17 + 24 + + + 784.5 + 540 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 500becd1-670a-47dc-97e7-d56fe0691e2b + Negative + Neg + + + + + + 813 + 526 + 61 + 28 + + + 842 + 540 + + + + + + Input value + 5c12f7ac-3b07-440d-833c-f1ca69697166 + Value + x + false + c497f0a0-a892-4d8a-84b0-ee8af72e3b49 + 1 + + + + + + 815 + 528 + 12 + 24 + + + 822.5 + 540 + + + + + + + + Output value + 52109beb-5db2-4c0f-8d61-a4304100cf4a + Result + y + false + 0 + + + + + + 857 + 528 + 15 + 24 + + + 864.5 + 540 + + + + + + + + + + + + 2a5cfb31-028a-4b34-b4e1-9b20ae15312e + Cross Product + + + + + Compute vector cross product. + 594d094d-2ac4-48c3-a91c-3e119876b383 + Cross Product + XProd + + + + + + 928 + 465 + 66 + 64 + + + 960 + 497 + + + + + + First vector + 37fbccc4-0cba-4362-8f03-221f99af550f + Vector A + A + false + 52109beb-5db2-4c0f-8d61-a4304100cf4a + 1 + + + + + + 930 + 467 + 15 + 20 + + + 939 + 477 + + + + + + + + Second vector + 267f6144-b691-489d-b30f-d5ceb4dda0ad + Vector B + B + false + c1fadd78-75ac-48cf-b405-2d6661672e89 + 1 + + + + + + 930 + 487 + 15 + 20 + + + 939 + 497 + + + + + + + + Unitize output + fc6b1d86-0167-4daa-848e-54713567b2ba + Unitize + U + false + 0 + + + + + + 930 + 507 + 15 + 20 + + + 939 + 517 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Cross product vector + 75483f7d-b2dd-4d47-ac88-1b2bf513e118 + Vector + V + false + 0 + + + + + + 975 + 467 + 17 + 30 + + + 983.5 + 482 + + + + + + + + Vector length + 0705adb9-84ee-4c40-87b5-61922434c722 + Length + L + false + 0 + + + + + + 975 + 497 + 17 + 30 + + + 983.5 + 512 + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Trajectory Visualize + + + + + """ +Visualizes a trajectory. + +COMPAS FAB v0.27.0 +""" +from compas_ghpython import draw_frame +from compas_ghpython import list_to_ghtree +from ghpythonlib.componentbase import executingcomponent as component + + +class TrajectoryVisualize(component): + def RunScript(self, robot, group, trajectory): + start_configuration = None + configurations = [] + fraction = 0. + time = 0. + + planes = [] + positions = [] + velocities = [] + accelerations = [] + + if robot and trajectory: + group = group or robot.main_group_name + + for c in trajectory.points: + configurations.append(robot.merge_group_with_full_configuration(c, trajectory.start_configuration, group)) + frame = robot.forward_kinematics(c, group, options=dict(solver='model')) + planes.append(draw_frame(frame)) + positions.append(c.positions) + velocities.append(c.velocities) + accelerations.append(c.accelerations) + + start_configuration = trajectory.start_configuration + fraction = trajectory.fraction + time = trajectory.time_from_start + + P = list_to_ghtree(list(zip(*positions))) + V = list_to_ghtree(list(zip(*velocities))) + A = list_to_ghtree(list(zip(*accelerations))) + + # return outputs if you have them; here I try it for you: + return (start_configuration, configurations, fraction, time, planes, P, V, A) + + Visualizes a trajectory. +COMPAS FAB v0.27.0 + true + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAHiSURBVEhLtZMxS0JhFIZNNJASEqesuOLUFIJT4CC0R4u4BEm/wCnXQMKmfkGDQ1NLLtHq0BgUDUFwi36BNrUU3s57OcfO/e4xKuzCg973fc/5znfvdxNBEPwrpjhLTHGWmOJfWD253iEGzCGxBN0MCxTqckHV8gXym0TgMIBnFgAKvKlwlXgnGlOyd5xzKcfCXOARpxxCY/k/JmK7Yc+iFglyGM1h+kQ4MWvYUbiYUdMn3OavxFIkyOHJ5I6Ox9QgLgjP8YrEC6EXaMKbhFQYC2BS3/CkuOV67NeYomhWCFO2iMiU7I0ILBCekCn+SGuRAOAG5pSk4dgC60VjqLBW65EQkBAKDA9NMOWt4WHneLR0+6VHQoAC8jWaUxaOrqgqIZwrr5rKrzyyPhTdbYAvEp85mLwo5eMkBZmN2ofbqNC5fGYNHIuui3soVuAcl8VXOS+7tdtTzerQ83udsdIqkpeiMjd16UlQIA3fQZDMZMNm6eXSGbT5tfUH3M+l0vc6L0U4u9YC046jv7C5HS6QyhfCbDKzKDto66wUTNtBX4cF0r38ftfnhkGufqAfT0lnddGP3oGGriduOuTfm1hG31DDb0+RC11tbixEHk+YcYXfQFdFNQe5WMYVZo0pzo4g8QkeesDrM2SJXwAAAABJRU5ErkJggg== + + false + 95fb500e-4230-4acd-ac66-c2bbe444c30f + true + true + Trajectory Visualize + Trajectory Visualize + + + + + + 775 + 1032 + 195 + 164 + + + 847 + 1114 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 8 + 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 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + edde686f-204f-47be-8520-b79aa7dc65d3 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 777 + 1034 + 55 + 53 + + + 806 + 1060.667 + + + + + + + + true + The planning group for which this trajectory was planned. + c25cf05d-dcce-4cc3-ae5a-bd891dbda46f + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 777 + 1087 + 55 + 53 + + + 806 + 1114 + + + + + + + + true + The calculated trajectory. + ac602dcb-6087-4505-8e57-1241456a8452 + trajectory + trajectory + true + 0 + true + d8f3f718-83db-4fdb-b0e2-677ddf0af13b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 777 + 1140 + 55 + 54 + + + 806 + 1167.333 + + + + + + + + The start configuration of the trajectory. + 8bf7717f-26b2-4a07-a518-f4dd73104e5d + start_configuration + start_configuration + false + 0 + + + + + + 862 + 1034 + 106 + 20 + + + 915 + 1044 + + + + + + + + The full configurations along the trajectory. + 815ad035-0665-4142-8cc8-13a8a5d65aad + configurations + configurations + false + 0 + + + + + + 862 + 1054 + 106 + 20 + + + 915 + 1064 + + + + + + + + Indicates the fraction of requested trajectory that was calculated, e.g. 1 means the full trajectory was found. + 4f7aa954-5b60-4d97-8aa9-d7a347fe3886 + fraction + fraction + false + 0 + + + + + + 862 + 1074 + 106 + 20 + + + 915 + 1084 + + + + + + + + The time which is needed to execute that trajectory at full speed. + 144ca078-5f7b-4fbc-ad0b-ef24836fce93 + time + time + false + 0 + + + + + + 862 + 1094 + 106 + 20 + + + 915 + 1104 + + + + + + + + The planes of the robot's end-effector. + ad3d5874-850d-4881-9ad2-d0454e55e63b + planes + planes + false + 0 + + + + + + 862 + 1114 + 106 + 20 + + + 915 + 1124 + + + + + + + + The positions along the trajectory + a5cb0b6f-22bf-4772-96b5-90fd68545f77 + P + P + false + 0 + + + + + + 862 + 1134 + 106 + 20 + + + 915 + 1144 + + + + + + + + The velocities along the trajectory + 77fefa66-b1ce-492c-bf82-10d92be5aa0a + V + V + false + 0 + + + + + + 862 + 1154 + 106 + 20 + + + 915 + 1164 + + + + + + + + The accelerations along the trajectory + 340e9d74-c0eb-498a-8529-127a39920d63 + A + A + false + 0 + + + + + + 862 + 1174 + 106 + 20 + + + 915 + 1184 + + + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + b39c5b06-0ad5-4b24-b121-ff80b45f5f1c + Panel + Fraction + false + 0 + 4f7aa954-5b60-4d97-8aa9-d7a347fe3886 + 1 + Double click to edit panel content… + + + + + + 994 + 1066 + 160 + 38 + + 0 + 0 + 0 + + 994.8337 + 1066.563 + + + + + + 2 + + 255;255;255;255 + + false + false + true + false + false + true + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + f4fef57a-4fdb-43ee-9af9-5c0729f0b29c + Custom Preview + Preview + + + + + + + 474 + 1066 + 48 + 44 + + + 508 + 1088 + + + + + + Geometry to preview + true + 22f328b0-180f-4102-b160-9a0badf8950b + Geometry + G + false + 83f55d60-30e4-4af9-8dd5-142229b90651 + 1 + + + + + + 476 + 1068 + 17 + 20 + + + 486 + 1078 + + + + + + + + The material override + bc236b0f-0c14-486e-9eb9-61b0be66dec0 + Material + M + false + 6886afd1-eba5-4a75-8cd4-bffd7e538e7c + 1 + + + + + + 476 + 1088 + 17 + 20 + + + 486 + 1098 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 6886afd1-eba5-4a75-8cd4-bffd7e538e7c + Colour Swatch + Swatch + false + 0 + + 255;0;168;34 + + + + + + + 351 + 1088 + 91 + 20 + + + 351.7155 + 1088.701 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 154;56;217;62 + + A group of Grasshopper objects + b45f1bc5-1dbc-4460-bc15-f65f15416b0a + bd8ce4f5-8709-42dd-9e57-75e031a46205 + 20a4242c-c527-4451-9658-aad15dbdf6b8 + 211d4673-5231-4dc1-a18b-4459d8e8cbc7 + 4 + 640d87f0-43fc-4e15-bae6-7b3c42b0dcd8 + Group + Animate + + + + + + + + + + cc14daa5-911a-4fcc-8b3b-1149bf7f2eeb + Point List + + + + + Displays details about lists of points + dd22a394-29b9-4a6e-bc37-fe093c684662 + Point List + Points + + + + + + 221 + 914 + 45 + 44 + + + 252 + 936 + + + + + + 1 + Points to display + true + 1dbf85b7-0b4d-4899-8957-a2c28941f59e + Points + P + true + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 223 + 916 + 14 + 20 + + + 231.5 + 926 + + + + + + + + Optional text size (in Rhino units) + b4c8a290-1ca7-44eb-8afc-770870ed714a + Size + S + true + 0 + + + + + + 223 + 936 + 14 + 20 + + + 231.5 + 946 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.075 + + + + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 583ad785-6f9e-4700-b910-de767de8c20a + Panel + Target Plane + false + 0 + 0 + 4 + + + + + + 61 + 990 + 85 + 38 + + 0 + 0 + 0 + + 61.79988 + 990.5011 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + 76ef7d5e-4104-4a94-b6e8-c68f66ee2de9 + Custom Preview + Preview + + + + + + + 1104 + 1112 + 48 + 44 + + + 1138 + 1134 + + + + + + Geometry to preview + true + c1f1462d-8127-446e-badf-7c82d09b2de7 + Geometry + G + false + ad3d5874-850d-4881-9ad2-d0454e55e63b + 1 + + + + + + 1106 + 1114 + 17 + 20 + + + 1116 + 1124 + + + + + + + + The material override + b67b237f-6c46-44f9-82ab-afd6f2404b05 + Material + M + false + 09702919-f8d5-4c5c-8e55-67f0e0a3c3d7 + 1 + + + + + + 1106 + 1134 + 17 + 20 + + + 1116 + 1144 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 09702919-f8d5-4c5c-8e55-67f0e0a3c3d7 + Colour Swatch + Swatch + false + 0 + + 255;199;199;199 + + + + + + + 994 + 1135 + 91 + 20 + + + 994.7195 + 1135.847 + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + Boolean Toggle + Connect? + false + 0 + true + + + + + + 338 + 119 + 118 + 22 + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file From 86251d4bd6584831ee649aca4de2ed15c685487a Mon Sep 17 00:00:00 2001 From: Pedram Mirabian Date: Mon, 24 Apr 2023 16:05:28 +0200 Subject: [PATCH 2/2] Submission 3 late? --- lecture_04/assignment_03/assignment_03.ghx | 8114 ++++++++++++++++++++ 1 file changed, 8114 insertions(+) create mode 100644 lecture_04/assignment_03/assignment_03.ghx diff --git a/lecture_04/assignment_03/assignment_03.ghx b/lecture_04/assignment_03/assignment_03.ghx new file mode 100644 index 0000000..78755a8 --- /dev/null +++ b/lecture_04/assignment_03/assignment_03.ghx @@ -0,0 +1,8114 @@ + + + + + + + + 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 + + + + + + 447 + -2 + + 0.554631948 + + + + + 0 + + + + + + + 0 + + + + + 2 + + + + + GhPython, Version=7.28.23058.3001, Culture=neutral, PublicKeyToken=null + 7.28.23058.3001 + + 00000000-0000-0000-0000-000000000000 + + + + + + + Colibri.Grasshopper, Version=0.2.6348.33183, Culture=neutral, PublicKeyToken=null + 0.2.6348.33183 + CORE studio | Thornton Tomasetti + b96948a9-4599-447d-b3bc-18f88e319755 + Colibri + 0.2.6348.33183 + + + + + + + 78 + + + + + 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 + a298b4f5-76b8-480b-a23a-60abe1f4ed19 + 32c27bd7-6d02-4446-81d2-23365043a6d7 + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + 19 + 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 + d8c50254-7cc8-4fd1-926a-f175e9f4c8fb + 1 + + + + + + 1245 + 109 + 50 + 24 + + + 1270.338 + 121.4783 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 60.21488 + + + 263.0308 + 60.21488 + + + 263.0308 + 80.31352 + + + 37.69194 + 80.31352 + + A quick note + Cambria + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + false + Scribble + Scribble + 22 + 1) Load robot from ROS + + + + + + 32.69194 + 55.21488 + 235.3388 + 30.09864 + + + 37.69194 + 60.21488 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + aacb02be-ffde-4997-b910-3a5670a6e5b1 + Data + Target planes + false + 327f7bb4-1b04-42d2-80ef-20f3aaef28d1 + 1 + + + + + + 1245 + 450 + 50 + 24 + + + 1270.118 + 462.9615 + + + + + + + + + + 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 + 67637025-d631-4ccb-8f5c-a2fd3e2df5d2 + 0bd0e8e4-ca4a-4b2b-b46f-c02991a91871 + 6b9b95af-bb42-49a8-b9b0-dcb941375504 + 7d3934ec-a2d7-4f4a-8673-509eb4a8e1d6 + 6821e4d6-b3ba-4cc6-b546-59ee150f03b6 + 54d38872-c258-4603-b313-9571b20b5477 + eb72f1ba-c840-4e9e-b362-4cbfa4d95255 + 34730cb1-b040-4596-b3ea-cc9cb3d78048 + 2cf3bc62-8c4e-494c-9e32-6671540acd41 + e3ef1898-b1b3-4341-b410-807efe4882fd + 500becd1-670a-47dc-97e7-d56fe0691e2b + 594d094d-2ac4-48c3-a91c-3e119876b383 + 19 + 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 + 4be27a3e-5aee-4db6-9377-b78978d5886b + 1 + + + + + + 1245 + 244 + 50 + 24 + + + 1270.338 + 256.1927 + + + + + + + + + + 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 + 6b717484-727b-49ec-be28-225884d8fe07 + 5285ae71-e847-4c91-8327-c3c0e5eeecbf + 9ef394c4-6355-4465-bb6d-0f5bf317b24b + 9 + 3c032157-3bf9-40ee-9b12-e4e807d15ccc + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 221.9796 + + + 260.3237 + 221.9796 + + + 260.3237 + 242.0782 + + + 37.69194 + 242.0782 + + A quick note + Cambria + ff0bbdd7-eb5b-4ed6-a652-505db2c0ac8c + false + Scribble + Scribble + 22 + 2) Define pick-up plane + + + + + + 32.69194 + 216.9796 + 232.6318 + 30.09863 + + + 37.69194 + 221.9796 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 409.6958 + + + 254.9741 + 409.6958 + + + 254.9741 + 429.9233 + + + 37.69194 + 429.9233 + + A quick note + Cambria + 9dbe68e7-ae2d-4df4-89a9-ae0ec5759854 + false + Scribble + Scribble + 22 + 3) Define target planes + + + + + + 32.69194 + 404.6958 + 227.2822 + 30.22754 + + + 37.69194 + 409.6958 + + + + + + + + + + 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/xhBQAAAAlwSFlzAAALEAAACxABrSO9dQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/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 + + + + + + 2187 + 79 + 271 + 204 + + + 2342 + 181 + + + + + + 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 + + + + + + 2189 + 81 + 138 + 20 + + + 2259.5 + 91 + + + + + + + + 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 + + + + + + 2189 + 101 + 138 + 20 + + + 2259.5 + 111 + + + + + + + + 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 + + + + + + 2189 + 121 + 138 + 20 + + + 2259.5 + 131 + + + + + + + + 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 + + + + + + 2189 + 141 + 138 + 20 + + + 2259.5 + 151 + + + + + + + + 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 + + + + + + 2189 + 161 + 138 + 20 + + + 2259.5 + 171 + + + + + + + + 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 + + + + + + 2189 + 181 + 138 + 20 + + + 2259.5 + 191 + + + + + + + + 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 + + + + + + 2189 + 201 + 138 + 20 + + + 2259.5 + 211 + + + + + + + + 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 + + + + + + 2189 + 221 + 138 + 20 + + + 2259.5 + 231 + + + + + + + + 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 + + + + + + 2189 + 241 + 138 + 20 + + + 2259.5 + 251 + + + + + + + + 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 + + + + + + 2189 + 261 + 138 + 20 + + + 2259.5 + 271 + + + + + + + + Rhino meshes of the robot's visual geometry (if any). + b51fd205-41de-4772-b77b-54118aa40c2c + visual + visual + false + 0 + + + + + + 2357 + 81 + 99 + 28 + + + 2406.5 + 95.28571 + + + + + + + + Rhino meshes of the robot's collision geometry (if any). + 3fd4309e-805a-4b2a-8b39-fb39cda51d21 + collision + collision + false + 0 + + + + + + 2357 + 109 + 99 + 29 + + + 2406.5 + 123.8571 + + + + + + + + Rhino meshes of the scene's collision meshes (if any). + ba8f5aaf-7d4f-4021-b0f3-328651e5f766 + collision_meshes + collision_meshes + false + 0 + + + + + + 2357 + 138 + 99 + 28 + + + 2406.5 + 152.4286 + + + + + + + + Rhino meshes of the scene's attached collision meshes (if any). + 00b4652c-1968-4bef-b124-5b86f4dc25bc + attached_meshes + attached_meshes + false + 0 + + + + + + 2357 + 166 + 99 + 29 + + + 2406.5 + 181 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 243eeb3c-e1ad-4233-9a1a-b0ec9fd1c962 + frames + frames + false + 0 + + + + + + 2357 + 195 + 99 + 28 + + + 2406.5 + 209.5714 + + + + + + + + The robot's base frame as a Rhino plane (if any). + 91fd1995-e0da-4f23-a4c6-afeefc044dee + base_frame + base_frame + false + 0 + + + + + + 2357 + 223 + 99 + 29 + + + 2406.5 + 238.1429 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + 5a2c4711-ae2f-4f0f-b633-afc7c8fccfd2 + ee_frame + ee_frame + false + 0 + + + + + + 2357 + 252 + 99 + 29 + + + 2406.5 + 266.7143 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 591.6624 + + + 308.5562 + 591.6624 + + + 308.5562 + 611.761 + + + 37.69194 + 611.761 + + A quick note + Cambria + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + false + Scribble + Scribble + 22 + 4) Solve IK for pick-up plane + + + + + + 32.69194 + 586.6624 + 280.8642 + 30.09863 + + + 37.69194 + 591.6624 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + Data + Pickup config + false + aad53aa1-b80e-4a58-ad85-ae26cd7ae7ce + 1 + + + + + + 1245 + 662 + 50 + 24 + + + 1270.118 + 674.7843 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 64.57504 + 615.786 + + + 229.8485 + 615.786 + + + 229.8485 + 630.4969 + + + 64.57504 + 630.4969 + + A quick note + Cambria + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + false + Scribble + Scribble + 16 + Results in pickup config + + + + + + 59.57504 + 610.786 + 175.2735 + 24.71094 + + + 64.57504 + 615.786 + + + + + + + + + + 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 + 99e8dfb1-1f62-40df-83c8-ac756f18fc76 + 7 + 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 + List + false + 0 + + + + + 0 + Pickup config + false + + + + + 1 + Trajectory + true + + + + + + 1430 + 111 + 145 + 22 + + + + + + + + + + eeafc956-268e-461d-8e73-ee05c6f72c01 + Stream Filter + + + + + Filters a collection of input streams + true + 471af287-d88e-43f4-9bb2-98daa088f633 + Stream Filter + Filter + + + + + + 1885 + 110 + 80 + 64 + + + 1917 + 142 + + + + + + 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 + G + false + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 1 + + + + + + 1887 + 112 + 15 + 20 + + + 1896 + 122 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + 2 + Input stream at index 0 + e6a67ce5-d55f-4ec2-a44c-573291be81a5 + false + Stream 0 + 0 + true + a38644b3-ef3b-4bc2-bf1d-8843907a4a1f + 1 + + + + + + 1887 + 132 + 15 + 20 + + + 1896 + 142 + + + + + + + + 2 + Input stream at index 1 + 14985ec3-7977-426f-bc6b-ad27afc61e04 + false + Stream 1 + 1 + true + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 1887 + 152 + 15 + 20 + + + 1896 + 162 + + + + + + + + 2 + Filtered stream + ddfd1927-535b-4f08-acf1-f1762fa62a54 + false + Stream + S(1) + false + 0 + + + + + + 1932 + 112 + 31 + 60 + + + 1947.5 + 142 + + + + + + + + + + + + + + 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 + + 1423.564 + 60.88748 + + + 1547.927 + 60.88748 + + + 1547.927 + 76.43143 + + + 1423.564 + 76.43143 + + A quick note + Cambria + 766f518e-d29b-4814-a406-a45e5ded4a64 + false + Scribble + Scribble + 22 + Visualization + + + + + + 1418.564 + 55.88748 + 134.3623 + 25.54395 + + + 1423.564 + 60.88748 + + + + + + + + + + 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 + + + + + + 61 + 692 + 50 + 24 + + + 86.97993 + 704.5718 + + + + + + + + + + 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 + + + + + + 61 + 649 + 50 + 24 + + + 86.86352 + 661.9973 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 37.69194 + 801.7374 + + + 370.9253 + 801.7374 + + + 370.9253 + 821.9113 + + + 37.69194 + 821.9113 + + A quick note + Cambria + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + false + Scribble + Scribble + 22 + 5) Plan trajectory to selected plane + + + + + + 32.69194 + 796.7374 + 343.2333 + 30.17383 + + + 37.69194 + 801.7374 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 66.10143 + 828.6232 + + + 305.8201 + 828.6232 + + + 305.8201 + 843.3341 + + + 66.10143 + 843.3341 + + A quick note + Cambria + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + false + Scribble + Scribble + 16 + From pickup config to target plane + + + + + + 61.10143 + 823.6232 + 249.7187 + 24.71094 + + + 66.10143 + 828.6232 + + + + + + + + + + 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 + + + + + + 61 + 958 + 50 + 24 + + + 86.32721 + 970.766 + + + + + + + + + + 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 + + + + + + 61 + 879 + 50 + 24 + + + 86.32721 + 891.5822 + + + + + + + + + + 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 + + + + + + 61 + 917 + 50 + 24 + + + 86.13693 + 929.8961 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + e4b338fe-125d-4929-92e1-4e17c08f9b3b + Number Slider + indx + false + 0 + + + + + + 1432 + 153 + 190 + 20 + + + 1432.204 + 153.0871 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 45 + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + true + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + List Item + Item + + + + + + 2002 + 130 + 64 + 64 + + + 2036 + 162 + + + + + + 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 + L + false + ddfd1927-535b-4f08-acf1-f1762fa62a54 + 1 + + + + + + 2004 + 132 + 17 + 20 + + + 2014 + 142 + + + + + + + + Item index + 83d287eb-3d9d-4785-b735-156766b364e7 + Index + i + false + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + + + + + + 2004 + 152 + 17 + 20 + + + 2014 + 162 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 60da4aea-66d4-49fc-8aa9-a5189edc913b + Wrap + W + false + 0 + + + + + + 2004 + 172 + 17 + 20 + + + 2014 + 182 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + false + Item + i + false + 0 + + + + + + 2051 + 132 + 13 + 60 + + + 2057.5 + 162 + + + + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + bcf27a28-24e5-4d31-8438-444d7fe511cb + Data + Trajectory + false + d8f3f718-83db-4fdb-b0e2-677ddf0af13b + 1 + + + + + + 1245 + 882 + 50 + 24 + + + 1270.339 + 894.4081 + + + + + + + + + + 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 + + + + + + 1541 + 255 + 136 + 28 + + + 1613 + 269 + + + + + + 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 + + + + + + 1543 + 257 + 55 + 24 + + + 1572 + 269 + + + + + + + + Script output configs. + a4b043bc-8e30-4b4c-bb40-e7f42497696d + configs + configs + false + 0 + + + + + + 1628 + 257 + 47 + 24 + + + 1651.5 + 269 + + + + + + + + + + + + + + 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 + + + + + + 1432 + 231 + 50 + 24 + + + 1457.421 + 243.6929 + + + + + + + + + + 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 + + + + + + 1432 + 275 + 50 + 24 + + + 1457.259 + 287.8766 + + + + + + + + + + 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 + + + + + + 1432 + 187 + 50 + 24 + + + 1457.259 + 199.2409 + + + + + + + + + + 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 + d46a99fc-10c2-4500-9e8a-dfbe9bfd7053 + 3e4974ad-17b0-42eb-a4fa-deb9905b4270 + 83f55d60-30e4-4af9-8dd5-142229b90651 + 21c061b3-4cb9-4823-b1e7-b410d9dcea12 + bb378d71-1cb7-4e65-b7cd-fb5958362b31 + 95fb500e-4230-4acd-ac66-c2bbe444c30f + b39c5b06-0ad5-4b24-b121-ff80b45f5f1c + f4fef57a-4fdb-43ee-9af9-5c0729f0b29c + 6886afd1-eba5-4a75-8cd4-bffd7e538e7c + dd22a394-29b9-4a6e-bc37-fe093c684662 + 583ad785-6f9e-4700-b910-de767de8c20a + 76ef7d5e-4104-4a94-b6e8-c68f66ee2de9 + 09702919-f8d5-4c5c-8e55-67f0e0a3c3d7 + 25 + 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 + + 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. + + + + + + -540 + 425 + 523 + 161 + + 0 + 0 + 0 + + -539.015 + 425.5011 + + + + + + 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 + + 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. + + + + + + -545 + 234 + 529 + 151 + + 0 + 0 + 0 + + -544.2502 + 234.2423 + + + + + + 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 + + false + 0 + 0 + Load the robot from ROS. + +Make sure ROS/MoveIt is running before you start (ie. "Compose up"). + + + + + + -545 + 64 + 529 + 96 + + 0 + 0 + 0 + + -544.2502 + 64.97168 + + + + + + 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 + + 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. + + + + + + -539 + 621 + 523 + 146 + + 0 + 0 + 0 + + -538.6031 + 621.8457 + + + + + + 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 + + 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. + + + + + + -539 + 883 + 523 + 137 + + 0 + 0 + 0 + + -538.368 + 883.4205 + + + + + + 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 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEQAACxEBf2RfkQAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC + + false + a298b4f5-76b8-480b-a23a-60abe1f4ed19 + true + true + ROS Connect + ROS + + + + + + 518 + 34 + 158 + 64 + + + 582 + 66 + + + + + + 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. + 1b8520c9-e181-4181-a80b-ac7d720afe16 + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 520 + 36 + 47 + 20 + + + 545 + 46 + + + + + + + + true + The port of ROS. Defaults to 9090. + 8f5b51a1-6f57-45fa-aa83-4861bf53fe47 + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 520 + 56 + 47 + 20 + + + 545 + 66 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + a5f74744-4f97-40a2-bde6-19e32ab05a36 + connect + connect + true + 0 + true + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 520 + 76 + 47 + 20 + + + 545 + 86 + + + + + + + + The ROS client. + a55f6fce-0c9b-46a0-93a3-33e25a08a291 + ros_client + ros_client + false + 0 + + + + + + 597 + 36 + 77 + 30 + + + 635.5 + 51 + + + + + + + + True if connection established. + 9c50f802-026a-4d74-8873-b493098d6689 + is_connected + is_connected + false + 0 + + + + + + 597 + 66 + 77 + 30 + + + 635.5 + 81 + + + + + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEQAACxEBf2RfkQAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC + + false + 32c27bd7-6d02-4446-81d2-23365043a6d7 + true + true + ROS Robot + Robot + + + + + + 828 + 98 + 127 + 44 + + + 901 + 120 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + d690cb07-b7bd-45c3-b14b-43e4a25dc506 + ros_client + ros_client + true + 0 + true + a55f6fce-0c9b-46a0-93a3-33e25a08a291 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 830 + 100 + 56 + 20 + + + 859.5 + 110 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + f01c52a8-ac5b-44bd-9744-dc31a9f89e9a + load + load + true + 0 + true + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 830 + 120 + 56 + 20 + + + 859.5 + 130 + + + + + + + + The robot. + d8c50254-7cc8-4fd1-926a-f175e9f4c8fb + robot + robot + false + 0 + + + + + + 916 + 100 + 37 + 40 + + + 934.5 + 120 + + + + + + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + 1 + 51f11481-2e02-4ca5-b090-bc1bab2149a4 + Point + Start Point + false + 0 + + + + + + 43 + 254 + 67 + 20 + + + 77.01717 + 264.5011 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0.369968259844404 + 0.206073737566678 + 0.00706759272081525 + + + + + + + + + + + + + + bc3e379e-7206-4e7b-b63a-ff61f4b38a3e + Construct Plane + + + + + Construct a plane from an origin point and {x}, {y} axes. + 6b717484-727b-49ec-be28-225884d8fe07 + Construct Plane + Pl + + + + + + 524 + 223 + 69 + 64 + + + 556 + 255 + + + + + + Origin of plane + dc0decf0-6bbb-444b-ba11-e73072ea1756 + Origin + O + false + 51f11481-2e02-4ca5-b090-bc1bab2149a4 + 1 + + + + + + 526 + 225 + 15 + 20 + + + 535 + 235 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + X-Axis direction of plane + 6cf6cc49-8eb5-46fe-8d11-389bf84e54da + X-Axis + X + false + e12188d7-cfec-4c23-ba01-99e16dba26ad + 1 + + + + + + 526 + 245 + 15 + 20 + + + 535 + 255 + + + + + + 1 + + + + + 1 + {0} + + + + + + 1 + 0 + 0 + + + + + + + + + + + + Y-Axis direction of plane + 6e5e695a-8b21-4a6a-91a0-aa6b47278782 + Y-Axis + Y + false + 6bba1374-a661-4419-9431-9e5e6c2974bd + 1 + + + + + + 526 + 265 + 15 + 20 + + + 535 + 275 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + 0 + + + + + + + + + + + + Constructed plane + 4be27a3e-5aee-4db6-9377-b78978d5886b + Plane + Pl + false + 0 + + + + + + 571 + 225 + 20 + 60 + + + 581 + 255 + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + 1 + 67637025-d631-4ccb-8f5c-a2fd3e2df5d2 + Curve + Guide Polyline + false + 0 + + + + + + 43 + 444 + 86 + 20 + + + 86.43102 + 454.7016 + + + + + + 1 + + + + + 1 + {0} + + + + + -1 + + Y2BkYGD4DwQgGgR4mIBEWFBGZl6+c35ubn6ejkJYalFxZn6erbmekYWekbGBqYWesYGBoY6Cc2lOSWlRqm1eamlJUWKOjkJAaVJOZrJ3amVIfnZqnq2pqZGRhWGqpXmyuampqbEBK8gSGbDZeu6p+bmpJUWVegH5OZU5mXmpzqVFZaksQAXsZRD7uBKLkjMyy1KNU3I58wtS8/JKi5KKWVISSxJBijg4OJhAThVQZ2AwAtKuj/l4OJmBDH4QsRWImX7VMzGshHrr938mBhEo+9mV637uLy8L7n/KINDMqPTBb87u23+A8oVQeQGQCUZqz5bMXXbDPmOV9/PZgU/toXIMNYH7PFxWvbBXPVUgK9/xEC7OoHM3gFHttn24yPqLHmn39lvFNKkYrL1sz8yAAK6PQ0P/XLpl31L8Z908q3dgOfWWF7b/65kaYGq4GegKAA== + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + + + + + afb96615-c59a-45c9-9cac-e27acb1c7ca0 + Explode + + + + + Explode a curve into smaller segments. + true + 0bd0e8e4-ca4a-4b2b-b46f-c02991a91871 + Explode + Explode + + + + + + 154 + 442 + 66 + 44 + + + 186 + 464 + + + + + + Curve to explode + ffc01871-a2a3-442c-bcbc-8edc3da109b1 + Curve + C + false + 67637025-d631-4ccb-8f5c-a2fd3e2df5d2 + 1 + + + + + + 156 + 444 + 15 + 20 + + + 165 + 454 + + + + + + + + Recursive decomposition until all segments are atomic + be07aa47-8815-4674-af5f-43882605e794 + Recursive + R + false + 0 + + + + + + 156 + 464 + 15 + 20 + + + 165 + 474 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + 1 + Exploded segments that make up the base curve + 394bf9b5-7b2e-4366-bfa6-1b21123a255b + Segments + S + false + 0 + + + + + + 201 + 444 + 17 + 20 + + + 209.5 + 454 + + + + + + + + 1 + Vertices of the exploded segments + cc771d2e-9224-4b91-b8d4-51b13843aa0f + Vertices + V + false + 0 + + + + + + 201 + 464 + 17 + 20 + + + 209.5 + 474 + + + + + + + + + + + + 2b2a4145-3dff-41d4-a8de-1ea9d29eef33 + Interpolate + + + + + Create an interpolated curve through a set of points. + 6b9b95af-bb42-49a8-b9b0-dcb941375504 + Interpolate + IntCrv + + + + + + 252 + 442 + 67 + 84 + + + 284 + 484 + + + + + + 1 + Interpolation points + 49be928c-17dc-4149-b557-3726a2989791 + Vertices + V + false + cc771d2e-9224-4b91-b8d4-51b13843aa0f + 1 + + + + + + 254 + 444 + 15 + 20 + + + 263 + 454 + + + + + + + + Curve degree + 21b465ae-d17d-4f6c-8dc1-33b56d2d8818 + Degree + D + false + 0 + + + + + + 254 + 464 + 15 + 20 + + + 263 + 474 + + + + + + 1 + + + + + 1 + {0} + + + + + 3 + + + + + + + + + + + Periodic curve + b5054a74-a432-4fad-a3cc-09c82e9e7033 + Periodic + P + false + 0 + + + + + + 254 + 484 + 15 + 20 + + + 263 + 494 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Knot spacing (0=uniform, 1=chord, 2=sqrtchord) + f90b28e3-24a5-44ca-acc5-f73e94b338dd + KnotStyle + K + false + 0 + + + + + + 254 + 504 + 15 + 20 + + + 263 + 514 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Resulting nurbs curve + 4cbfc128-1b11-4079-8403-9db3ed92b7b4 + Curve + C + false + 0 + + + + + + 299 + 444 + 18 + 26 + + + 308 + 457.3333 + + + + + + + + Curve length + 18278cf7-e10f-489c-802f-b5f9c73ab575 + Length + L + false + 0 + + + + + + 299 + 470 + 18 + 27 + + + 308 + 484 + + + + + + + + Curve domain + bbe8ef03-5062-43d9-934a-a6888efddc21 + Domain + D + false + 0 + + + + + + 299 + 497 + 18 + 27 + + + 308 + 510.6667 + + + + + + + + + + + + 2162e72e-72fc-4bf8-9459-d4d82fa8aa14 + Divide Curve + + + + + Divide a curve into equal length segments + true + 7d3934ec-a2d7-4f4a-8673-509eb4a8e1d6 + Divide Curve + Divide + + + + + + 349 + 445 + 66 + 64 + + + 381 + 477 + + + + + + Curve to divide + fa1feb8e-a622-4782-aa8c-54c3d2531a6b + Curve + C + false + 4cbfc128-1b11-4079-8403-9db3ed92b7b4 + 1 + + + + + + 351 + 447 + 15 + 20 + + + 360 + 457 + + + + + + + + Number of segments + 9cbaf26c-6878-4366-abb3-6192119b8ae5 + Count + N + false + 6821e4d6-b3ba-4cc6-b546-59ee150f03b6 + 1 + + + + + + 351 + 467 + 15 + 20 + + + 360 + 477 + + + + + + 1 + + + + + 1 + {0} + + + + + 10 + + + + + + + + + + + Split segments at kinks + 61781adb-5d0c-447f-a389-fdece5b2e9e6 + Kinks + K + false + 0 + + + + + + 351 + 487 + 15 + 20 + + + 360 + 497 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + 1 + Division points + 380c21cc-24ad-4d25-96d2-bfec93ec1f6f + Points + P + false + 0 + + + + + + 396 + 447 + 17 + 20 + + + 404.5 + 457 + + + + + + + + 1 + Tangent vectors at division points + e4cbb353-7546-41e0-9684-4f40884ea17e + Tangents + T + false + 0 + + + + + + 396 + 467 + 17 + 20 + + + 404.5 + 477 + + + + + + + + 1 + Parameter values at division points + 82881e89-30b8-42e4-8197-f4fe55a191a4 + Parameters + t + false + 0 + + + + + + 396 + 487 + 17 + 20 + + + 404.5 + 497 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 6821e4d6-b3ba-4cc6-b546-59ee150f03b6 + Number Slider + + false + 0 + + + + + + 43 + 530 + 163 + 20 + + + 43.26382 + 530.2399 + + + + + + 3 + 1 + 1 + 10 + 1 + 0 + 4 + + + + + + + + + bc3e379e-7206-4e7b-b63a-ff61f4b38a3e + Construct Plane + + + + + Construct a plane from an origin point and {x}, {y} axes. + true + 54d38872-c258-4603-b313-9571b20b5477 + Construct Plane + Pl + + + + + + 1019 + 430 + 69 + 64 + + + 1051 + 462 + + + + + + Origin of plane + 63342e99-5634-4d22-b2e3-e37a958651fe + Origin + O + false + 380c21cc-24ad-4d25-96d2-bfec93ec1f6f + 1 + + + + + + 1021 + 432 + 15 + 20 + + + 1030 + 442 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + X-Axis direction of plane + fa6573ed-9023-43c1-9681-0e732a98f718 + X-Axis + X + false + c1fadd78-75ac-48cf-b405-2d6661672e89 + 1 + + + + + + 1021 + 452 + 15 + 20 + + + 1030 + 462 + + + + + + 1 + + + + + 1 + {0} + + + + + + 1 + 0 + 0 + + + + + + + + + + + + Y-Axis direction of plane + c4b6fe75-e251-49df-a97d-db5e90f7f060 + Y-Axis + Y + false + 75483f7d-b2dd-4d47-ac88-1b2bf513e118 + 1 + + + + + + 1021 + 472 + 15 + 20 + + + 1030 + 482 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + 0 + + + + + + + + + + + + Constructed plane + 327f7bb4-1b04-42d2-80ef-20f3aaef28d1 + Plane + Pl + false + 0 + + + + + + 1066 + 432 + 20 + 60 + + + 1076 + 462 + + + + + + + + + + + + 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 + 99e8dfb1-1f62-40df-83c8-ac756f18fc76 + true + true + Inverse Kinematics + IK + + + + + + 509 + 632 + 214 + 84 + + + 629 + 674 + + + + + + 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. + 7e856d49-b5bb-4bd0-9949-185696817278 + robot + robot + true + 0 + true + 98209ace-c305-4683-b351-d9b9daf31e36 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 511 + 634 + 103 + 20 + + + 564 + 644 + + + + + + + + true + The plane or frame to calculate the inverse kinematic for. + e58ca0af-27ef-40e2-ab03-998ecfc69765 + plane + plane + true + 0 + true + b96209a7-93e4-4212-b096-c83e82b4da7b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 511 + 654 + 103 + 20 + + + 564 + 664 + + + + + + + + true + If passed, calculates the inverse such that the joint positions differ the least from the start_configuration. Defaults to the zero configuration. + ea6954e8-dda5-4131-b1cc-f0b3975a4092 + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 511 + 674 + 103 + 20 + + + 564 + 684 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 8e9b0427-154a-47f4-8d1f-f53c9f5647f5 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 511 + 694 + 103 + 20 + + + 564 + 704 + + + + + + + + The planning group's configuration. + aad53aa1-b80e-4a58-ad85-ae26cd7ae7ce + configuration + configuration + false + 0 + + + + + + 644 + 634 + 77 + 80 + + + 682.5 + 674 + + + + + + + + + + + + + + d3d195ea-2d59-4ffa-90b1-8b7ff3369f69 + Unit Y + + + + + Unit vector parallel to the world {y} axis. + 5285ae71-e847-4c91-8327-c3c0e5eeecbf + Unit Y + Y + + + + + + 435 + 246 + 65 + 28 + + + 466 + 260 + + + + + + Unit multiplication + 351b54f3-f360-4af2-a23d-db5ce0f4d89e + Factor + F + false + 0 + + + + + + 437 + 248 + 14 + 24 + + + 445.5 + 260 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {y} vector + e12188d7-cfec-4c23-ba01-99e16dba26ad + Unit vector + V + false + 0 + + + + + + 481 + 248 + 17 + 24 + + + 489.5 + 260 + + + + + + + + + + + + 79f9fbb3-8f1d-4d9a-88a9-f7961b1012cd + Unit X + + + + + Unit vector parallel to the world {x} axis. + 9ef394c4-6355-4465-bb6d-0f5bf317b24b + Unit X + X + + + + + + 435 + 274 + 65 + 28 + + + 466 + 288 + + + + + + Unit multiplication + f2460375-95e2-4613-baaa-035c258b22ec + Factor + F + false + 0 + + + + + + 437 + 276 + 14 + 24 + + + 445.5 + 288 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {x} vector + 6bba1374-a661-4419-9431-9e5e6c2974bd + Unit vector + V + false + 0 + + + + + + 481 + 276 + 17 + 24 + + + 489.5 + 288 + + + + + + + + + + + + 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 + + 128 + 128 + + + 1171 + 943 + + true + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAGNSURBVEhLtZTNbQIxEIUpgQ5ICRTAgRJyibimBErgEIkaInGgAyiBDpICuOeYnHJByuZ93vFm7B0SQBtLH4znPeO/MaOmaf6VMDkkYXJIwuS1qI3FVhzEXsw7zRs9ajOxE5tI96i9CgJPmuTcgLUzvokN32e89yJ7PfukBwMmxqcgwY+fLD4G/pVpNYekBwNeBD/4JGaWYxICdjOp/FPTalZJ92YbkFdbnL3ag+Do1j5vWr0L7mSctMD8bqa0epenQgjefd7pd2IORb7otGe/FAufN408gbqlBmocI4srd1502rIk6K1SjcnRl7Vmet55utwuX3T+PoYjmoh2SHEQ/DoBx8Ak4eNSC1dpGmOLe0v5LmgviWqAR29yHnbwJeoK49UTQLG7bKCWP8yQ2Xqj+fIj5C6692B9gpP3J80M/EER1Ex7A9odEKRXrcbbeBYc7a7nN1O+3Jqips27EEzCffhxvQeY/Onjih2Yn5rPBUEirKzkTR8X3sEt/AQXVNEthMkhCZNDEiaHoxl9A6glDpIGAdZaAAAAAElFTkSuQmCC + + false + d46a99fc-10c2-4500-9e8a-dfbe9bfd7053 + true + true + Plan Motion + Plan Motion + + + + + + 918 + 811 + 235 + 164 + + + 1078 + 893 + + + + + + 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. + d083a2f2-e808-43f8-85a5-b013e031fcf3 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 920 + 813 + 143 + 20 + + + 993 + 823 + + + + + + + + 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. + 833df342-7a83-4b11-8a1c-25b14ea0e772 + goal_constraints + goal_constraints + true + 1 + true + 67129582-389a-46c5-a939-1fa904a8f14a + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 920 + 833 + 143 + 20 + + + 993 + 843 + + + + + + + + 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. + a7955c8d-c68b-4785-95c3-9f0cca1d1cc1 + start_configuration + start_configuration + true + 0 + true + c666c109-2ccb-4c50-90cd-00130af76eaa + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 920 + 853 + 143 + 20 + + + 993 + 863 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + c0d60cdb-0fca-433d-a5d8-8320b9889690 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 920 + 873 + 143 + 20 + + + 993 + 883 + + + + + + + + 1 + true + A list of attached collision meshes to be included for planning. + 993b8eb0-e4a6-4a5f-89d8-4b2779d51be8 + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 920 + 893 + 143 + 20 + + + 993 + 903 + + + + + + + + 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. + 38cf49ce-3976-41d9-aecf-90433d61fb69 + path_constraints + path_constraints + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 920 + 913 + 143 + 20 + + + 993 + 923 + + + + + + + + true + The name of the algorithm used for path planning. Defaults to 'RRTConnect' + 170370fe-0acf-4014-8931-8edd954ddd5b + planner_id + planner_id + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 920 + 933 + 143 + 20 + + + 993 + 943 + + + + + + + + true + If True, calculates a trajectory. + 8fc7428c-639f-4fb1-b58d-7786183b944b + compute + compute + true + 0 + true + bb378d71-1cb7-4e65-b7cd-fb5958362b31 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 920 + 953 + 143 + 20 + + + 993 + 963 + + + + + + + + The calculated trajectory. + d8f3f718-83db-4fdb-b0e2-677ddf0af13b + trajectory + trajectory + false + 0 + + + + + + 1093 + 813 + 58 + 160 + + + 1122 + 893 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + true + 3e4974ad-17b0-42eb-a4fa-deb9905b4270 + List Item + Item + + + + + + 221 + 958 + 64 + 64 + + + 255 + 990 + + + + + + 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 + cc652879-9cd7-4aaa-9cdd-b976429d4ac7 + List + L + false + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 223 + 960 + 17 + 20 + + + 233 + 970 + + + + + + + + Item index + a9c1de3c-4b9f-4941-8a54-d82ca469353d + Index + i + false + 583ad785-6f9e-4700-b910-de767de8c20a + 1 + + + + + + 223 + 980 + 17 + 20 + + + 233 + 990 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 044c5aec-4e6e-481f-ab50-15a90ff1f158 + Wrap + W + false + 0 + + + + + + 223 + 1000 + 17 + 20 + + + 233 + 1010 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 6eec36d2-0480-440c-97e7-8b4890df2083 + false + Item + i + false + 0 + + + + + + 270 + 960 + 13 + 60 + + + 276.5 + 990 + + + + + + + + + + + + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + true + 83f55d60-30e4-4af9-8dd5-142229b90651 + Plane + Last Plane + false + 6eec36d2-0480-440c-97e7-8b4890df2083 + 1 + + + + + + 326 + 978 + 50 + 24 + + + 351.3705 + 990.6206 + + + + + + + + + + 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 + true + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAHfSURBVEhLtZUxS8NAGIaPdhDUoVRRxNaeCC4qZHAV6g8QOjkHx04Z/AEZOzgUHV3yD8zslMFBcCn4B0onwSVO4nS+3/Uu3LVfm1RweMjde/meL7mcVSil/hU2nEWI5waXV4ENXSCXYMitVYENXSAPwYhbqwIbukCeAgz+tk1s6AJxbhr0uPUy2NACaWDkRMLdUwYbWiCNnAZj7p4y2NACaeY0ICR33zLY0AXSGGTcWhXY0GVZg6OODMHS5mxIvAjRpeumeBqs1dM3GotH0QXFcYU8BhjO11vYEPIQKDC4aV18iyBWECdgAkbypN2HeERyQw4SMPeNvAnhyC1J8070Ic6B2rnankqlnOCa6fFUbhsFrq9MTkQQN8DXxu26llOT+n3t/fD4YEBzqsW1axp4PyuL5DlITaZfGw16nbPWZ+e0/VN7qNGWqa3r5odtQGAc0RwUf/VW3gMZiID3igQK6On0BwWvaDTcu9xN2+f7uoFZI/QbAdq6mGo90SJMsd6eVaBaVrgIFNEeF+ceY++YYkxvSvLIZkVxFVA4NILQzGcb2KOrvxvhCcpAYQOMjYTktiE9uZUXT094gipAIIE9/y60fZ6c8CarAFkAbCP6TWL/480FqwCpPr7c2hQlfgEp2YYU5C2cFwAAAABJRU5ErkJggg== + + false + 21c061b3-4cb9-4823-b1e7-b410d9dcea12 + true + true + Constraints From Plane + Constraints From Plane + + + + + + 474 + 884 + 201 + 144 + + + 591 + 956 + + + + + + 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. + 21edf791-2c60-4666-aadc-0e2e5ad8671d + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 476 + 886 + 100 + 20 + + + 527.5 + 896 + + + + + + + + true + The plane or frame from which we create position and orientation constraints. + b928a6a8-d7a2-47c6-8406-6545d8875480 + plane + plane + true + 0 + true + 83f55d60-30e4-4af9-8dd5-142229b90651 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 476 + 906 + 100 + 20 + + + 527.5 + 916 + + + + + + + + true + The planning group for which we specify the constraint. Defaults to the robot's main planning group. + a0e2b7fe-8dc1-42e9-a042-fe9504c3e743 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 476 + 926 + 100 + 20 + + + 527.5 + 936 + + + + + + + + true + The allowed tolerance to the frame's position (defined in the robot's units). Defaults to 0.001 + 843116b6-7a99-4639-9142-8a30ff4e83ee + tolerance_position + tolerance_position + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 946 + 100 + 20 + + + 527.5 + 956 + + + + + + + + true + The allowed tolerance of the frame's X-axis in degrees. + 676f1aff-e9c4-4803-b10b-18346a75c2bf + tolerance_xaxis + tolerance_xaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 966 + 100 + 20 + + + 527.5 + 976 + + + + + + + + true + The allowed tolerance of the frame's Y-axis in degrees. + 383c45e2-545a-4816-aecf-af8c88834fe2 + tolerance_yaxis + tolerance_yaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 986 + 100 + 20 + + + 527.5 + 996 + + + + + + + + true + The allowed tolerance of the frame's Z-axis in degrees. + e768cbf1-d825-4bc8-90d0-93a2d504580c + tolerance_zaxis + tolerance_zaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 476 + 1006 + 100 + 20 + + + 527.5 + 1016 + + + + + + + + A list containing a position and an orientation constraint. + 67129582-389a-46c5-a939-1fa904a8f14a + constraints + constraints + false + 0 + + + + + + 606 + 886 + 67 + 140 + + + 639.5 + 956 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + bb378d71-1cb7-4e65-b7cd-fb5958362b31 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 795 + 952 + 104 + 22 + + + + + + + + + + 74a79561-b3b2-4e12-beb4-d79ec0ed378a + b96948a9-4599-447d-b3bc-18f88e319755 + Colibri Iterator + + + + + Generates design iterations from a collection of sliders, panels, or valueLists. + b45f1bc5-1dbc-4460-bc15-f65f15416b0a + Colibri Iterator + Iterator + false + false + + + + + + 2303 + 356 + 143 + 86 + + + 2374 + 388 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Please connect a Slider, Panel, or ValueList + b6ce4532-d22d-4840-aa3e-1458a9a81e9c + false + Input + indx + true + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + 1 + + + + + + 2305 + 358 + 54 + 20 + + + 2333.5 + 368 + + + + + + + + 1 + Please connect a Slider, Panel, or ValueList + 729edd68-bc55-4011-b45a-0985b1507cb8 + false + Input + Input[N] + true + 0 + 1 + + + + + + 2305 + 378 + 54 + 20 + + + 2333.5 + 388 + + + + + + + + (Optional) Connect the Colibri 'Iteration Selection' component here to define a subset of the design space to iterate over. + f97257bc-f713-4cf7-966c-938d605dac75 + false + Selection + Selection + true + ef4729f2-1ae6-4420-b4a8-4937184b3170 + 1 + + + + + + 2305 + 398 + 54 + 20 + + + 2333.5 + 408 + + + + + + + + This item is one of values from Slider_indx + bb74caa8-bea6-416b-9257-95b15410f754 + false + Value + indx + false + 0 + + + + + + 2389 + 358 + 55 + 20 + + + 2416.5 + 368 + + + + + + + + This item is one of values from Input[N] + e43e2db9-e826-4e4f-9100-c372be29b3db + false + Item + Value[N] + false + 0 + + + + + + 2389 + 378 + 55 + 20 + + + 2416.5 + 388 + + + + + + + + 1 + Contains a collection of genes (variables) which defines a unique ID of each iteration. Connet to the Colibri Aggregator + bd3d79da-0077-4256-b7ca-ce388696f6e8 + false + Iteration Genome + Genome + false + 0 + + + + + + 2389 + 398 + 55 + 20 + + + 2416.5 + 408 + + + + + + + + + + + + + + 7dab01df-60be-477a-83d0-ff37a89d6a5a + b96948a9-4599-447d-b3bc-18f88e319755 + Iteration Selection + + + + + Generates an iteration selection for the Colibri Iterator. This allows you to iterate over a subset of the design space instead of taking every step along every slider/dropdown/panel. + +Use 'Divisions' to define granularity - how many steps to take on any given input. + +Use 'Domain' to break the design space up into chunks that can be solved in parallel on different machines. + bd8ce4f5-8709-42dd-9e57-75e031a46205 + Iteration Selection + Selection + + + + + + 2125 + 386 + 144 + 44 + + + 2195 + 408 + + + + + + 1 + Number of steps to take along the corresponding Iterator input. This should be a list of integers of the same length as the list of Iterator inputs. + + 0: for all values + 1: for current position + >1: numbers to be evenly picked. + c99bd7bb-8bc5-43c0-a339-f8432fb1f752 + Divisions + Divisions + true + 0 + + + + + + 2127 + 388 + 53 + 20 + + + 2155 + 398 + + + + + + + + 1 + Set the target domain of all iteration combinations to solve. For example, if your total number of iterations is 100 and you want to run half of the computations on one machine and half on another, input '0 to 49' for machine A, and '50 to 99' for machine B. Use "Construct Domain" for 1d domain. + +Domain setting comes after Divisions setting. + 751ea45e-305a-46a6-afc5-b4def0b0a77b + Domain + Domain + true + 1dee039c-096d-45a6-930e-88161082ae5f + 1 + + + + + + 2127 + 408 + 53 + 20 + + + 2155 + 418 + + + + + + + + Selections for Iterator + ef4729f2-1ae6-4420-b4a8-4937184b3170 + Selection + Selection + false + 0 + + + + + + 2210 + 388 + 57 + 40 + + + 2238.5 + 408 + + + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + 20a4242c-c527-4451-9658-aad15dbdf6b8 + Construct Domain + Dom + + + + + + 2029 + 396 + 78 + 44 + + + 2077 + 418 + + + + + + Start value of numeric domain + 339dd6cd-048e-4fb0-b553-088dfbb82e9c + Domain start + A + false + 0 + + + + + + 2031 + 398 + 31 + 20 + + + 2056 + 408 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + c4adedd1-29a3-468b-8924-f0f2ca7f72fc + x-1 + Domain end + B + false + 0340bcd6-1377-40b3-bf55-5a9762eca73a + 1 + + + + + + 2031 + 418 + 31 + 20 + + + 2056 + 428 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + 1dee039c-096d-45a6-930e-88161082ae5f + Domain + I + false + 0 + + + + + + 2092 + 398 + 13 + 40 + + + 2098.5 + 418 + + + + + + + + + + + + 1817fd29-20ae-4503-b542-f0fb651e67d7 + List Length + + + + + Measure the length of a list. + 211d4673-5231-4dc1-a18b-4459d8e8cbc7 + List Length + Lng + + + + + + 1937 + 414 + 65 + 28 + + + 1968 + 428 + + + + + + 1 + Base list + 2d3be744-afb4-477e-ad65-9386c22b7769 + List + L + false + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 1939 + 416 + 14 + 24 + + + 1947.5 + 428 + + + + + + + + Number of items in L + 0340bcd6-1377-40b3-bf55-5a9762eca73a + Length + L + false + 0 + + + + + + 1983 + 416 + 17 + 24 + + + 1991.5 + 428 + + + + + + + + + + + + 4c4e56eb-2f04-43f9-95a3-cc46a14f495a + Line + + + + + Create a line between two points. + true + eb72f1ba-c840-4e9e-b362-4cbfa4d95255 + Line + Ln + + + + + + 509 + 465 + 66 + 44 + + + 541 + 487 + + + + + + Line start point + ced25bbe-fd85-4efb-bc59-aaf7e7ad13cf + Start Point + A + false + 34730cb1-b040-4596-b3ea-cc9cb3d78048 + 1 + + + + + + 511 + 467 + 15 + 20 + + + 520 + 477 + + + + + + + + Line end point + b50d2f6e-45ad-459f-93c2-f4362738b2e2 + End Point + B + false + 380c21cc-24ad-4d25-96d2-bfec93ec1f6f + 1 + + + + + + 511 + 487 + 15 + 20 + + + 520 + 497 + + + + + + + + Line segment + ecbe8b9f-ceec-4017-9dad-cda0d21119ce + Line + L + false + 0 + + + + + + 556 + 467 + 17 + 40 + + + 564.5 + 487 + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 34730cb1-b040-4596-b3ea-cc9cb3d78048 + Panel + + false + 0 + 0 + 0,0,0 + + + + + + 511 + 509 + 65 + 20 + + 0 + 0 + 0 + + 511.0194 + 509.5011 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + d2da1306-259a-4994-85a4-672d8a4c7805 + Unit Vector + + + + + Unitize vector. + 2cf3bc62-8c4e-494c-9e32-6671540acd41 + Unit Vector + Unit + + + + + + 813 + 448 + 65 + 28 + + + 844 + 462 + + + + + + Base vector + e6ad331d-c361-43a0-b4ae-413f02e742d3 + Vector + V + false + ecbe8b9f-ceec-4017-9dad-cda0d21119ce + 1 + + + + + + 815 + 450 + 14 + 24 + + + 823.5 + 462 + + + + + + + + Unit vector + c1fadd78-75ac-48cf-b405-2d6661672e89 + Vector + V + false + 0 + + + + + + 859 + 450 + 17 + 24 + + + 867.5 + 462 + + + + + + + + + + + + 9103c240-a6a9-4223-9b42-dbd19bf38e2b + Unit Z + + + + + Unit vector parallel to the world {z} axis. + e3ef1898-b1b3-4341-b410-807efe4882fd + Unit Z + Z + + + + + + 730 + 526 + 65 + 28 + + + 761 + 540 + + + + + + Unit multiplication + ea928df1-ede9-4bb2-b3b7-f3c0ce0e795e + Factor + F + false + 0 + + + + + + 732 + 528 + 14 + 24 + + + 740.5 + 540 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {z} vector + c497f0a0-a892-4d8a-84b0-ee8af72e3b49 + Unit vector + V + false + 0 + + + + + + 776 + 528 + 17 + 24 + + + 784.5 + 540 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 500becd1-670a-47dc-97e7-d56fe0691e2b + Negative + Neg + + + + + + 813 + 526 + 61 + 28 + + + 842 + 540 + + + + + + Input value + 5c12f7ac-3b07-440d-833c-f1ca69697166 + Value + x + false + c497f0a0-a892-4d8a-84b0-ee8af72e3b49 + 1 + + + + + + 815 + 528 + 12 + 24 + + + 822.5 + 540 + + + + + + + + Output value + 52109beb-5db2-4c0f-8d61-a4304100cf4a + Result + y + false + 0 + + + + + + 857 + 528 + 15 + 24 + + + 864.5 + 540 + + + + + + + + + + + + 2a5cfb31-028a-4b34-b4e1-9b20ae15312e + Cross Product + + + + + Compute vector cross product. + 594d094d-2ac4-48c3-a91c-3e119876b383 + Cross Product + XProd + + + + + + 928 + 465 + 66 + 64 + + + 960 + 497 + + + + + + First vector + 37fbccc4-0cba-4362-8f03-221f99af550f + Vector A + A + false + 52109beb-5db2-4c0f-8d61-a4304100cf4a + 1 + + + + + + 930 + 467 + 15 + 20 + + + 939 + 477 + + + + + + + + Second vector + 267f6144-b691-489d-b30f-d5ceb4dda0ad + Vector B + B + false + c1fadd78-75ac-48cf-b405-2d6661672e89 + 1 + + + + + + 930 + 487 + 15 + 20 + + + 939 + 497 + + + + + + + + Unitize output + fc6b1d86-0167-4daa-848e-54713567b2ba + Unitize + U + false + 0 + + + + + + 930 + 507 + 15 + 20 + + + 939 + 517 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Cross product vector + 75483f7d-b2dd-4d47-ac88-1b2bf513e118 + Vector + V + false + 0 + + + + + + 975 + 467 + 17 + 30 + + + 983.5 + 482 + + + + + + + + Vector length + 0705adb9-84ee-4c40-87b5-61922434c722 + Length + L + false + 0 + + + + + + 975 + 497 + 17 + 30 + + + 983.5 + 512 + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Trajectory Visualize + + + + + """ +Visualizes a trajectory. + +COMPAS FAB v0.27.0 +""" +from compas_ghpython import draw_frame +from compas_ghpython import list_to_ghtree +from ghpythonlib.componentbase import executingcomponent as component + + +class TrajectoryVisualize(component): + def RunScript(self, robot, group, trajectory): + start_configuration = None + configurations = [] + fraction = 0. + time = 0. + + planes = [] + positions = [] + velocities = [] + accelerations = [] + + if robot and trajectory: + group = group or robot.main_group_name + + for c in trajectory.points: + configurations.append(robot.merge_group_with_full_configuration(c, trajectory.start_configuration, group)) + frame = robot.forward_kinematics(c, group, options=dict(solver='model')) + planes.append(draw_frame(frame)) + positions.append(c.positions) + velocities.append(c.velocities) + accelerations.append(c.accelerations) + + start_configuration = trajectory.start_configuration + fraction = trajectory.fraction + time = trajectory.time_from_start + + P = list_to_ghtree(list(zip(*positions))) + V = list_to_ghtree(list(zip(*velocities))) + A = list_to_ghtree(list(zip(*accelerations))) + + # return outputs if you have them; here I try it for you: + return (start_configuration, configurations, fraction, time, planes, P, V, A) + + Visualizes a trajectory. +COMPAS FAB v0.27.0 + true + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAHiSURBVEhLtZMxS0JhFIZNNJASEqesuOLUFIJT4CC0R4u4BEm/wCnXQMKmfkGDQ1NLLtHq0BgUDUFwi36BNrUU3s57OcfO/e4xKuzCg973fc/5znfvdxNBEPwrpjhLTHGWmOJfWD253iEGzCGxBN0MCxTqckHV8gXym0TgMIBnFgAKvKlwlXgnGlOyd5xzKcfCXOARpxxCY/k/JmK7Yc+iFglyGM1h+kQ4MWvYUbiYUdMn3OavxFIkyOHJ5I6Ox9QgLgjP8YrEC6EXaMKbhFQYC2BS3/CkuOV67NeYomhWCFO2iMiU7I0ILBCekCn+SGuRAOAG5pSk4dgC60VjqLBW65EQkBAKDA9NMOWt4WHneLR0+6VHQoAC8jWaUxaOrqgqIZwrr5rKrzyyPhTdbYAvEp85mLwo5eMkBZmN2ofbqNC5fGYNHIuui3soVuAcl8VXOS+7tdtTzerQ83udsdIqkpeiMjd16UlQIA3fQZDMZMNm6eXSGbT5tfUH3M+l0vc6L0U4u9YC046jv7C5HS6QyhfCbDKzKDto66wUTNtBX4cF0r38ftfnhkGufqAfT0lnddGP3oGGriduOuTfm1hG31DDb0+RC11tbixEHk+YcYXfQFdFNQe5WMYVZo0pzo4g8QkeesDrM2SJXwAAAABJRU5ErkJggg== + + false + 95fb500e-4230-4acd-ac66-c2bbe444c30f + true + true + Trajectory Visualize + Trajectory Visualize + + + + + + 775 + 1032 + 195 + 164 + + + 847 + 1114 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 8 + 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 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + edde686f-204f-47be-8520-b79aa7dc65d3 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 777 + 1034 + 55 + 53 + + + 806 + 1060.667 + + + + + + + + true + The planning group for which this trajectory was planned. + c25cf05d-dcce-4cc3-ae5a-bd891dbda46f + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 777 + 1087 + 55 + 53 + + + 806 + 1114 + + + + + + + + true + The calculated trajectory. + ac602dcb-6087-4505-8e57-1241456a8452 + trajectory + trajectory + true + 0 + true + d8f3f718-83db-4fdb-b0e2-677ddf0af13b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 777 + 1140 + 55 + 54 + + + 806 + 1167.333 + + + + + + + + The start configuration of the trajectory. + 8bf7717f-26b2-4a07-a518-f4dd73104e5d + start_configuration + start_configuration + false + 0 + + + + + + 862 + 1034 + 106 + 20 + + + 915 + 1044 + + + + + + + + The full configurations along the trajectory. + 815ad035-0665-4142-8cc8-13a8a5d65aad + configurations + configurations + false + 0 + + + + + + 862 + 1054 + 106 + 20 + + + 915 + 1064 + + + + + + + + Indicates the fraction of requested trajectory that was calculated, e.g. 1 means the full trajectory was found. + 4f7aa954-5b60-4d97-8aa9-d7a347fe3886 + fraction + fraction + false + 0 + + + + + + 862 + 1074 + 106 + 20 + + + 915 + 1084 + + + + + + + + The time which is needed to execute that trajectory at full speed. + 144ca078-5f7b-4fbc-ad0b-ef24836fce93 + time + time + false + 0 + + + + + + 862 + 1094 + 106 + 20 + + + 915 + 1104 + + + + + + + + The planes of the robot's end-effector. + ad3d5874-850d-4881-9ad2-d0454e55e63b + planes + planes + false + 0 + + + + + + 862 + 1114 + 106 + 20 + + + 915 + 1124 + + + + + + + + The positions along the trajectory + a5cb0b6f-22bf-4772-96b5-90fd68545f77 + P + P + false + 0 + + + + + + 862 + 1134 + 106 + 20 + + + 915 + 1144 + + + + + + + + The velocities along the trajectory + 77fefa66-b1ce-492c-bf82-10d92be5aa0a + V + V + false + 0 + + + + + + 862 + 1154 + 106 + 20 + + + 915 + 1164 + + + + + + + + The accelerations along the trajectory + 340e9d74-c0eb-498a-8529-127a39920d63 + A + A + false + 0 + + + + + + 862 + 1174 + 106 + 20 + + + 915 + 1184 + + + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + b39c5b06-0ad5-4b24-b121-ff80b45f5f1c + Panel + Fraction + false + 0 + 4f7aa954-5b60-4d97-8aa9-d7a347fe3886 + 1 + Double click to edit panel content… + + + + + + 994 + 1066 + 160 + 38 + + 0 + 0 + 0 + + 994.8337 + 1066.563 + + + + + + 2 + + 255;255;255;255 + + false + false + true + false + false + true + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + f4fef57a-4fdb-43ee-9af9-5c0729f0b29c + Custom Preview + Preview + + + + + + + 474 + 1066 + 48 + 44 + + + 508 + 1088 + + + + + + Geometry to preview + true + 22f328b0-180f-4102-b160-9a0badf8950b + Geometry + G + false + 83f55d60-30e4-4af9-8dd5-142229b90651 + 1 + + + + + + 476 + 1068 + 17 + 20 + + + 486 + 1078 + + + + + + + + The material override + bc236b0f-0c14-486e-9eb9-61b0be66dec0 + Material + M + false + 6886afd1-eba5-4a75-8cd4-bffd7e538e7c + 1 + + + + + + 476 + 1088 + 17 + 20 + + + 486 + 1098 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 6886afd1-eba5-4a75-8cd4-bffd7e538e7c + Colour Swatch + Swatch + false + 0 + + 255;0;168;34 + + + + + + + 351 + 1088 + 91 + 20 + + + 351.7155 + 1088.701 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 154;56;217;62 + + A group of Grasshopper objects + b45f1bc5-1dbc-4460-bc15-f65f15416b0a + bd8ce4f5-8709-42dd-9e57-75e031a46205 + 20a4242c-c527-4451-9658-aad15dbdf6b8 + 211d4673-5231-4dc1-a18b-4459d8e8cbc7 + 4 + 640d87f0-43fc-4e15-bae6-7b3c42b0dcd8 + Group + Animate + + + + + + + + + + cc14daa5-911a-4fcc-8b3b-1149bf7f2eeb + Point List + + + + + Displays details about lists of points + dd22a394-29b9-4a6e-bc37-fe093c684662 + Point List + Points + + + + + + 221 + 914 + 45 + 44 + + + 252 + 936 + + + + + + 1 + Points to display + true + 1dbf85b7-0b4d-4899-8957-a2c28941f59e + Points + P + true + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 223 + 916 + 14 + 20 + + + 231.5 + 926 + + + + + + + + Optional text size (in Rhino units) + b4c8a290-1ca7-44eb-8afc-770870ed714a + Size + S + true + 0 + + + + + + 223 + 936 + 14 + 20 + + + 231.5 + 946 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.075 + + + + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 583ad785-6f9e-4700-b910-de767de8c20a + Panel + Target Plane + false + 0 + 0 + 4 + + + + + + 61 + 990 + 85 + 38 + + 0 + 0 + 0 + + 61.79988 + 990.5011 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + 76ef7d5e-4104-4a94-b6e8-c68f66ee2de9 + Custom Preview + Preview + + + + + + + 1104 + 1112 + 48 + 44 + + + 1138 + 1134 + + + + + + Geometry to preview + true + c1f1462d-8127-446e-badf-7c82d09b2de7 + Geometry + G + false + ad3d5874-850d-4881-9ad2-d0454e55e63b + 1 + + + + + + 1106 + 1114 + 17 + 20 + + + 1116 + 1124 + + + + + + + + The material override + b67b237f-6c46-44f9-82ab-afd6f2404b05 + Material + M + false + 09702919-f8d5-4c5c-8e55-67f0e0a3c3d7 + 1 + + + + + + 1106 + 1134 + 17 + 20 + + + 1116 + 1144 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 09702919-f8d5-4c5c-8e55-67f0e0a3c3d7 + Colour Swatch + Swatch + false + 0 + + 255;199;199;199 + + + + + + + 994 + 1135 + 91 + 20 + + + 994.7195 + 1135.847 + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + a5cb809e-5d60-4b64-aa40-f9c1e7bde0a2 + Boolean Toggle + Connect? + false + 0 + true + + + + + + 338 + 119 + 118 + 22 + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file