diff --git a/lecture_02/assignment_01/ana-ascic/assignment_01.py b/lecture_02/assignment_01/ana-ascic/assignment_01.py new file mode 100644 index 0000000..1d631db --- /dev/null +++ b/lecture_02/assignment_01/ana-ascic/assignment_01.py @@ -0,0 +1,32 @@ +from compas.artists import Artist +from compas.datastructures import Mesh +from compas.geometry import Box +from compas.geometry import Frame +from compas.geometry import Plane +from compas.geometry import Projection +from compas.geometry import Vector + +# Define a Frame, which is not in the origin and a bit tilted to the world frame +frame = Frame.from_points([1, 1, 0], [1, 0, -0.1], [2, 1, 0.1]) + +# Create a Box with that frame +box = Box(frame, 1, 1, 1) # xsize, ysize, zsize + +# Create a Projection (can be orthogonal, parallel or perspective) +projection_plane = Plane([0, 0, 0], [0, 0, 1]) +P = Projection.from_plane_and_direction(projection_plane, [0, 0, 1]) + +# Create a Mesh from the Box +mesh = Mesh.from_shape(box) + +# Apply the Projection onto the mesh +mesh_projected = mesh.transformed(P) +print(mesh_projected) + +# Create artists +artist1 = Artist(box) +artist2 = Artist(mesh_projected) + +# Draw and all to a list +artist1.draw() +artist2.draw_edges(color="#00ff00") diff --git a/lecture_04/assignment_03/ana_ascic/Assignment_03_Ana_Ascic.ghx b/lecture_04/assignment_03/ana_ascic/Assignment_03_Ana_Ascic.ghx new file mode 100644 index 0000000..2741102 --- /dev/null +++ b/lecture_04/assignment_03/ana_ascic/Assignment_03_Ana_Ascic.ghx @@ -0,0 +1,6532 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + c4f913db-409d-41a9-88e1-f6f90989047d + Shaded + 1 + + 100;150;0;0 + + + 100;0;150;0 + + + + + + 637527254194888879 + + Assignment_03_Ana_Ascic.ghx + + + + + 0 + + + + + + 93 + 126 + + 0.264820516 + + + + + 0 + + + + + + + 0 + + + + + 2 + + + + + GhPython, Version=7.23.22282.13002, Culture=neutral, PublicKeyToken=null + 7.23.22282.13002 + + 00000000-0000-0000-0000-000000000000 + + + + + + + Bifocals, Version=0.5.0.0, Culture=neutral, PublicKeyToken=null + 0.5.0.0 + Marc Syp + 9bde5adf-1aa6-414c-a1d4-8832edea1934 + Bifocals + + + + + + + + 93 + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + bfe572e7-d997-4c3c-8488-4e03d01804ea + b278407c-79b3-49ef-a2c8-ee682b33d9ef + 6fe2e9d2-130c-4a02-b347-a1c6b831fc5a + 9a4be73c-3082-4c74-be27-41c7c1688c53 + 4 + 3dd78fb5-3c65-4715-b2db-b9489d44fd71 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + d5ffda3e-a3ab-4688-9de8-1d9d9e2789e3 + 4b0a07e0-a378-4f92-8f0a-6c1f1fb427f2 + 1d31a79f-b7ba-423f-944c-23f606999dae + eaec99d4-5f03-4209-953f-02aee1235de3 + 4a5bf47a-b0af-4831-a451-6b776364bb7e + 5 + 5a4ca04f-0f26-4978-bcce-92edaa3c4b8e + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + 781a5de8-c54c-4805-927f-519a45da032f + 4b0a07e0-a378-4f92-8f0a-6c1f1fb427f2 + 1d31a79f-b7ba-423f-944c-23f606999dae + eaec99d4-5f03-4209-953f-02aee1235de3 + 4a5bf47a-b0af-4831-a451-6b776364bb7e + 20c7f0ab-fd13-4bd7-a130-c6fe893d2a0b + 47c152bc-c823-4835-aad3-3bf5c281e892 + d19cf29a-0512-4632-b4e0-ecc00c5b8487 + 2ceac33a-a5ff-4a42-8067-32e6a2c7fbee + ac227038-eb23-4cb5-94d8-f63bb92375a4 + b3787c61-219b-4ed9-b49f-1e7dd56236b1 + b395bfb0-5717-46c4-924c-a3ba167b1e0d + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 78471367-17af-4599-8661-808ba87f82a6 + bfa816f1-e4c0-482e-9515-4b540fd2f427 + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + 16 + 8b8d6fbf-db19-4267-9188-c4fdd76620b6 + Group + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 4e66fe1b-29b3-4955-9524-ca986decd9ac + Data + Robot + false + 719e44b4-a570-4557-a293-38bd52d8e0aa + 1 + + + + + + 1253 + 236 + 50 + 24 + + + 1278.277 + 248.7911 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 119.7138 + + + 277.9325 + 119.7138 + + + 277.9325 + 140.371 + + + 46.70692 + 140.371 + + A quick note + Arial + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + false + Scribble + Scribble + 22 + 1) Load robot from ROS + + + + + + 41.70692 + 114.7138 + 241.2256 + 30.65723 + + + 46.70692 + 119.7138 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + aacb02be-ffde-4997-b910-3a5670a6e5b1 + Data + Target planes + false + ff4d28eb-524d-4dc4-9be3-ce58d5542d8e + 1 + + + + + + 1241 + 696 + 50 + 24 + + + 1266.447 + 708.7734 + + + + + + + + + + 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 + 7 + 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 + f2bf12c1-6e84-497b-8e17-1f0525f46d47 + 1 + + + + + + 1241 + 460 + 50 + 24 + + + 1266.929 + 472.6987 + + + + + + + + + + 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 + 49ff36e7-8d17-4ffe-bf0d-e8f5e6b3746c + 7 + 3c032157-3bf9-40ee-9b12-e4e807d15ccc + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 393.4856 + + + 271.369 + 393.4856 + + + 271.369 + 414.132 + + + 46.70692 + 414.132 + + A quick note + Arial + ff0bbdd7-eb5b-4ed6-a652-505db2c0ac8c + false + Scribble + Scribble + 22 + 2) Define pick-up plane + + + + + + 41.70692 + 388.4856 + 234.6621 + 30.64648 + + + 46.70692 + 393.4856 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 581.2018 + + + 267.5126 + 581.2018 + + + 267.5126 + 601.8483 + + + 46.70692 + 601.8483 + + A quick note + Arial + 9dbe68e7-ae2d-4df4-89a9-ae0ec5759854 + false + Scribble + Scribble + 22 + 3) Define target planes + + + + + + 41.70692 + 576.2018 + 230.8056 + 30.64655 + + + 46.70692 + 581.2018 + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAkQahUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAvZJREFUSA3lVM9LVHEQn68s6UaySkJgWU9DIZB2s4JkkZ4WBV6ysEMHa0/RqfTUse0faDckjE6WdCkJiegQZZv0qKDCrTByQV/YLyJyZYN1U/o2n7dvlreu7a1LDXzfzHzm8535fufNe0T/vWita0yt+6H/SjO2vdRjmy481puHJtPHtO5ZWUR5AZxi+xzFF1Nk+GopfXAHxeNKJbwcsbu1jkyN2NHlbx+3+Oo2vodGzB8MP7rXRZFGpWz4RQWaH+hENmnt9W7oHQh3ThMZ33lhA+TLiB2RhODO9hkhm6jmwDgNY/8aozU5c6QmBK4PD8is1kZHLB+s7go8WRswPs/FrPMTy9STfU1GJmEdyjOLn+19Rr9SKs0olnlJ61CKi8VdWoXQ7zII298amMqML7Qv5qhOYr46Z7O4RXpDPnEB62bf21bFfTf4BDYYTbfSkz/tN0FcERpYx0D48LtlMjMTFIIPyU0nQ7+yPwKwpR14f+1E/R9i1jm0zT7eaCBOHDAdgx+4Ht6DTAVeJFoncdHA9mgdxYHAxSQZ12Zt2NA8s6ZwiwoggKQ4jSTBptWKIAF4khg8FAVWSM4GWmRyixICSpvEh8bopfYp04uJjeIXecLOENmNbqslBl00pgBwi9GY9RC2VzCu3pfnjZWzC1MkJCSp7Q1fFV/02Ig97NpHWWt3nXUxqFpe/Lk4sRsAICUFAN5uoGiFf90CbBF8WOgx+zd5zbv4TldD7eeFIhBwHFm1AHpZfyoo34pw6dPlpPzUrrggbiNJpRiKly+AzU+VimKeYYtg9vGvYr+QgG2cHHIyr0iKO+6qN3CJ1NNnRMQWPT9qneBrVLM/42IogNPLTe67uKNKpqhtSce/Dlo8deUlM36dFu4MEb8rXdncNph9NXGad6DoVu/Okht4fwle4krbH+x0IG6bWnz7TNrjbZ0TLymwMtGffN/6eqps2eWE9VKuyuWVFCj8riVRcxcNpygsblld1bK7ITf9vMklvWCN9Y/Jb6iJVEHfYlmCAAAAAElFTkSuQmCC + + false + 7a58f25a-3dc8-4dfa-bf0f-35404273569e + true + true + Robot Visualize + Robot Visualize + + + + + + 2358 + 139 + 253 + 204 + + + 2503 + 241 + + + + + + 10 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 7 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + 439bbb30-bb2a-4f39-bfd6-8205cd93fd09 + robot + robot + true + 0 + true + 619d4216-bdfd-4395-b679-83b02e397c53 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 2360 + 141 + 128 + 20 + + + 2425.5 + 151 + + + + + + + + true + The planning group used for end-effector and base visualization. + ad36f822-0439-4ba3-b51a-c348f6f591ec + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 2360 + 161 + 128 + 20 + + + 2425.5 + 171 + + + + + + + + true + The robot's full configuration. + 9fb95b19-f673-4906-9998-b63a5811ea88 + configuration + configuration + true + 0 + true + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2360 + 181 + 128 + 20 + + + 2425.5 + 191 + + + + + + + + true + Whether or not to show the robot's visual meshes. + 22d8ace2-7a15-4a22-9430-2f721280765e + show_visual + show_visual + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 201 + 128 + 20 + + + 2425.5 + 211 + + + + + + + + true + Whether or not to show the robot's collision meshes. + ad827435-eaa9-47db-8456-0f04c22dde3a + show_collision + show_collision + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 221 + 128 + 20 + + + 2425.5 + 231 + + + + + + + + true + Whether or not to show the robot's joint frames. + 35824dc3-741e-4a85-9d9f-f350f6328850 + show_frames + show_frames + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 241 + 128 + 20 + + + 2425.5 + 251 + + + + + + + + true + Whether or not to show the robot's base frame. + 5c36de85-2908-4ed4-8bfb-be05a5fc15a0 + show_base_frame + show_base_frame + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 261 + 128 + 20 + + + 2425.5 + 271 + + + + + + + + true + Whether or not to show the robot's end-effector frame. + 43679585-4dff-44fc-8144-04d51b6597a3 + show_end_effector_frame + show_end_effector_frame + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 281 + 128 + 20 + + + 2425.5 + 291 + + + + + + + + true + Whether or not to show the collision meshes (if any). + b0245b8b-4b25-480e-8434-34500dd361dd + show_cm + show_cm + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 301 + 128 + 20 + + + 2425.5 + 311 + + + + + + + + true + Whether or not to show the attached collision meshes (if any). + c258dd5f-afd6-4742-9840-e8ae6df45c59 + show_acm + show_acm + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 2360 + 321 + 128 + 20 + + + 2425.5 + 331 + + + + + + + + Rhino meshes of the robot's visual geometry (if any). + b51fd205-41de-4772-b77b-54118aa40c2c + visual + visual + false + 0 + + + + + + 2518 + 141 + 91 + 28 + + + 2563.5 + 155.2857 + + + + + + + + Rhino meshes of the robot's collision geometry (if any). + 3fd4309e-805a-4b2a-8b39-fb39cda51d21 + collision + collision + false + 0 + + + + + + 2518 + 169 + 91 + 29 + + + 2563.5 + 183.8571 + + + + + + + + Rhino meshes of the scene's collision meshes (if any). + ba8f5aaf-7d4f-4021-b0f3-328651e5f766 + collision_meshes + collision_meshes + false + 0 + + + + + + 2518 + 198 + 91 + 28 + + + 2563.5 + 212.4286 + + + + + + + + Rhino meshes of the scene's attached collision meshes (if any). + 00b4652c-1968-4bef-b124-5b86f4dc25bc + attached_meshes + attached_meshes + false + 0 + + + + + + 2518 + 226 + 91 + 29 + + + 2563.5 + 241 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 243eeb3c-e1ad-4233-9a1a-b0ec9fd1c962 + frames + frames + false + 0 + + + + + + 2518 + 255 + 91 + 28 + + + 2563.5 + 269.5714 + + + + + + + + The robot's base frame as a Rhino plane (if any). + 91fd1995-e0da-4f23-a4c6-afeefc044dee + base_frame + base_frame + false + 0 + + + + + + 2518 + 283 + 91 + 29 + + + 2563.5 + 298.1429 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + 5a2c4711-ae2f-4f0f-b633-afc7c8fccfd2 + ee_frame + ee_frame + false + 0 + + + + + + 2518 + 312 + 91 + 29 + + + 2563.5 + 326.7143 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 763.1684 + + + 321.8788 + 763.1684 + + + 321.8788 + 783.8149 + + + 46.70692 + 783.8149 + + A quick note + Arial + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + false + Scribble + Scribble + 22 + 4) Solve IK for pick-up plane + + + + + + 41.70692 + 758.1684 + 285.1719 + 30.64648 + + + 46.70692 + 763.1684 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + Data + Pickup config + false + c7efcbd4-341c-4f07-8a0f-c88562a0bf77 + 1 + + + + + + 1240 + 859 + 50 + 24 + + + 1265.877 + 871.2903 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 73.59002 + 787.292 + + + 239.3478 + 787.292 + + + 239.3478 + 802.3076 + + + 73.59002 + 802.3076 + + A quick note + Arial + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + false + Scribble + Scribble + 16 + Results in pickup config + + + + + + 68.59002 + 782.292 + 175.7578 + 25.01563 + + + 73.59002 + 787.292 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;240;218;146 + + A group of Grasshopper objects + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + fb4c5d39-e0a5-4c45-b606-72de43c589ac + b96209a7-93e4-4212-b096-c83e82b4da7b + 98209ace-c305-4683-b351-d9b9daf31e36 + 6 + 3962a36b-d451-45d1-acb9-c99a5708db90 + Group + + + + + + + + + + + 00027467-0d24-4fa7-b178-8dc0ac5f42ec + Value List + + + + + Provides a list of preset values to choose from + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 2 + 3 + Value List + List + false + 0 + + + + + 0 + Pickup config + false + + + + + 1 + Trajectory + true + + + + + + 1591 + 171 + 120 + 22 + + + + + + + + + + eeafc956-268e-461d-8e73-ee05c6f72c01 + Stream Filter + + + + + Filters a collection of input streams + 471af287-d88e-43f4-9bb2-98daa088f633 + Stream Filter + Filter + + + + + + 2051 + 170 + 69 + 64 + + + 2078 + 202 + + + + + + 3 + 2e3ab970-8545-46bb-836c-1c11e5610bce + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + Index of Gate stream + fde7ac2c-1b3d-473c-8b2b-4addc4d52e1a + Gate + G + false + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 1 + + + + + + 2053 + 172 + 10 + 20 + + + 2059.5 + 182 + + + + + + 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 + + + + + + 2053 + 192 + 10 + 20 + + + 2059.5 + 202 + + + + + + + + 2 + Input stream at index 1 + 14985ec3-7977-426f-bc6b-ad27afc61e04 + false + Stream 1 + 1 + true + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 2053 + 212 + 10 + 20 + + + 2059.5 + 222 + + + + + + + + 2 + Filtered stream + ddfd1927-535b-4f08-acf1-f1762fa62a54 + false + Stream + S(1) + false + 0 + + + + + + 2093 + 172 + 25 + 60 + + + 2105.5 + 202 + + + + + + + + + + + + + + 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 + 4b787d3b-2696-4409-a6bd-026612d8a100 + 11 + ca0ff086-508f-4122-8664-195d1a456efe + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 1582.769 + 120.3864 + + + 1704.274 + 120.3864 + + + 1704.274 + 136.3923 + + + 1582.769 + 136.3923 + + A quick note + Arial + 766f518e-d29b-4814-a406-a45e5ded4a64 + false + Scribble + Scribble + 22 + Visualization + + + + + + 1577.769 + 115.3864 + 131.5049 + 26.00586 + + + 1582.769 + 120.3864 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + b96209a7-93e4-4212-b096-c83e82b4da7b + Data + Pickup plane + false + d385349b-7e03-4362-b9d0-eacd34e2562b + 1 + 2 + + + + + + 87 + 860 + 50 + 24 + + + 112.255 + 872.7887 + + + + + + + + + + 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 + + + + + + 84 + 832 + 50 + 24 + + + 109.9397 + 844.7522 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 973.2434 + + + 383.6249 + 973.2434 + + + 383.6249 + 993.8899 + + + 46.70692 + 993.8899 + + A quick note + Arial + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + false + Scribble + Scribble + 22 + 5) Plan trajectory to selected plane + + + + + + 41.70692 + 968.2434 + 346.918 + 30.64648 + + + 46.70692 + 973.2434 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 75.11641 + 1000.129 + + + 315.0461 + 1000.129 + + + 315.0461 + 1015.145 + + + 75.11641 + 1015.145 + + A quick note + Arial + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + false + Scribble + Scribble + 16 + From pickup config to target plane + + + + + + 70.11641 + 995.1292 + 249.9297 + 25.01563 + + + 75.11641 + 1000.129 + + + + + + + + + + 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 + + + + + + 84 + 1108 + 50 + 24 + + + 109.1617 + 1120.619 + + + + + + + + + + 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 + + + + + + 79 + 1047 + 50 + 24 + + + 104.7967 + 1059.036 + + + + + + + + + + 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 + + + + + + 84 + 1079 + 50 + 24 + + + 109.694 + 1091.463 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + e4b338fe-125d-4929-92e1-4e17c08f9b3b + Number Slider + + false + 0 + + + + + + 1894 + 318 + 160 + 20 + + + 1894.949 + 318.4406 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 51 + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + List Item + Item + + + + + + 2168 + 190 + 58 + 64 + + + 2197 + 222 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 2e3ab970-8545-46bb-836c-1c11e5610bce + cb95db89-6165-43b6-9c41-5702bc5bf137 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Base list + 39c89e61-bc93-43d0-a501-c5bba7a3da6e + List + L + false + ddfd1927-535b-4f08-acf1-f1762fa62a54 + 1 + + + + + + 2170 + 192 + 12 + 20 + + + 2177.5 + 202 + + + + + + + + Item index + 83d287eb-3d9d-4785-b735-156766b364e7 + Index + i + false + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + + + + + + 2170 + 212 + 12 + 20 + + + 2177.5 + 222 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 60da4aea-66d4-49fc-8aa9-a5189edc913b + Wrap + W + false + 0 + + + + + + 2170 + 232 + 12 + 20 + + + 2177.5 + 242 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + false + Item + i + false + 0 + + + + + + 2212 + 192 + 12 + 60 + + + 2218 + 222 + + + + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + bcf27a28-24e5-4d31-8438-444d7fe511cb + Data + Trajectory + false + c585a498-df95-483a-86fb-5ea173abae46 + 1 + + + + + + 1249 + 1167 + 50 + 24 + + + 1274.394 + 1179.99 + + + + + + + + + + 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 + + + + + + 1709 + 320 + 124 + 28 + + + 1775 + 334 + + + + + + 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 + + + + + + 1711 + 322 + 49 + 24 + + + 1737 + 334 + + + + + + + + Script output configs. + a4b043bc-8e30-4b4c-bb40-e7f42497696d + configs + configs + false + 0 + + + + + + 1790 + 322 + 41 + 24 + + + 1810.5 + 334 + + + + + + + + + + + + + + 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 + + + + + + 1597 + 272 + 50 + 24 + + + 1622.007 + 284.4187 + + + + + + + + + + 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 + + + + + + 1596 + 322 + 50 + 24 + + + 1621.626 + 334.0815 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 619d4216-bdfd-4395-b679-83b02e397c53 + Data + Robot + false + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 1 + 2 + + + + + + 1598 + 236 + 50 + 24 + + + 1623.554 + 248.9058 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;240;218;146 + + A group of Grasshopper objects + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + 55db7485-e593-4762-a166-64303d976c7a + 97392278-c93e-4240-86e9-5e59dc2eb992 + 4a09e38e-e49b-43a1-809e-f310b5a4c3e2 + 1f8b3c58-8382-468d-8885-a179a0ad05e0 + 538c02c6-6b3b-4712-a784-dda0bc63f847 + c666c109-2ccb-4c50-90cd-00130af76eaa + 13b3eb29-3c6d-41ba-80fe-d6214ebc9674 + 9d4e5cda-5bb7-42fe-acfa-968fa6c6c067 + cd76efff-9d02-4eb1-b6dd-080d6a0e6d4d + bcf27a28-24e5-4d31-8438-444d7fe511cb + 12 + 4c3c7466-b1c2-4942-9ac0-63cb70a5b6b7 + Group + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + ecc8c71a-07d9-4980-90b1-a3cd2f8081a6 + Panel + + false + 0 + 0 + Define multiple target planes in any way you like, for example, +reference a curve from Rhino, divide it and assign a plane to each point + +Make sure all planes are oriented in a way that makes sense +for the robot to reach it as well. + + + + + + -530 + 597 + 523 + 96 + + 0 + 0 + 0 + + -530 + 597.0071 + + + + + + 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. + + + + + + -536 + 405 + 529 + 96 + + 0 + 0 + 0 + + -535.2353 + 405.4777 + + + + + + 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"). + + + + + + -536 + 124 + 529 + 96 + + 0 + 0 + 0 + + -535.2353 + 124.4706 + + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 3f032319-94be-407d-8e0f-7615f6976834 + Panel + + 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. + + + + + + -530 + 792 + 523 + 96 + + 0 + 0 + 0 + + -529.5882 + 792.8893 + + + + + + 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. + + + + + + -530 + 1054 + 523 + 96 + + 0 + 0 + 0 + + -529.353 + 1054.654 + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAkQahUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAgNJREFUSA3tkzGO2kAUhodU6XCXEt8AcgKcEwTEAezcYHMCTJcuEKVEwnsCLA4AvgGmQemAghrnBJPvt+yVF2yy5a60T/rwzHv/zHvzZjDm3d5EB6y1HsTwP8sQROC++GCIp5fLxY7HY9vtdi0LG+n3+3axWLDEKlGgJC39NBmihyzLfnqeZ3a7nSGBGQwGtXJ0Jo5jczqdjO/7Jooi6T7XiuVkc0eVqCpNK5Ul+JuwbJ7rdWLptFetEQy2221VnOJzasWFk3gP8qLa7TZDq/W15q1Wqz+qgqg9HA6W1uRjzQsSviE8S8qeU50Wv91sNvYDg2uLcGz2+71bBhzHMaPR6JH5pEBjbTyGFFwoLXNdtxzffAM8yq6n9mO5XOaVFP2Pb9TGlHolKe/tWN6DXt/1miMOIbH6adXLTqdjJcZiGIBXsl6vf/PKmNpfkJb3pseBZS1tVpiOfIEJhKAkvLz463A4NCQyYRiaXq+nUK3pmc5ms1ybpqmhVd+rQq3UkR5KJwkcSHVZOkURv/tV5XoUWKR9qifQXIsfIYDcEOpkU/BVlf5QTabLhb/St1qtULrrBBE+H75AAk9WJPJw9J6cxnycz+fB+Xz+xJOe4Y/ZOKnEbxKo2iO0YQIJNJlLIIQOfIMIXmQuqgTu9rqIq18BNNp1i6pCl4m4Z8m94HvsdXTgH0pwlf0IpKxlAAAAAElFTkSuQmCC + + false + f7a508d2-0660-4a56-b714-b92e852c29fc + true + true + ROS Connect + ROS + + + + + + 219 + 183 + 146 + 64 + + + 278 + 215 + + + + + + 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. + da3682bb-2adf-4341-91c1-37d6d37a932b + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 221 + 185 + 42 + 20 + + + 243.5 + 195 + + + + + + + + true + The port of ROS. Defaults to 9090. + 02d9b347-b099-4e3c-9fb3-f31d16bcf675 + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 221 + 205 + 42 + 20 + + + 243.5 + 215 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + 755dcf7e-8034-4c54-b5b5-8257866156d8 + connect + connect + true + 0 + true + 6a222111-70b8-49a8-bc4f-2392cbe44c84 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 221 + 225 + 42 + 20 + + + 243.5 + 235 + + + + + + + + The ROS client. + c2ee2bb2-4780-4bb6-91bf-ded954426171 + ros_client + ros_client + false + 0 + + + + + + 293 + 185 + 70 + 30 + + + 328 + 200 + + + + + + + + True if connection established. + ca4cdb30-4504-4489-8adf-d57f640542c3 + is_connected + is_connected + false + 0 + + + + + + 293 + 215 + 70 + 30 + + + 328 + 230 + + + + + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAkQahUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAV9JREFUSA3tlLFNxEAQRQ0ixwE5W4JTIpYOXIJLoALkEpyRugSXsCWYhNh04A6O9087h7VanzlkAiS+9G5m/szO2nfSFcW/iqLkS3gGxV/RwNYDzFBv3aCn6CGADnpYU0NjAi23qDyAg6OuLIkxEB/hA+5BegIXIRzV8Gl9zVZgD6fzb9EjfMmRHmCEV3iJdUccYq5+So23VEXhzbi2hFjG/J34AHexVpgXeZqmPdUhHbJ6JLG3sCet8ToIC7TE+jojldCC/AmyqnADaEhLGnCQymG0oOWaHWCKuaKHrDxuAyU4aEELHOSkuQk0I1qQd1YjXTtgMZw54eh5UPyWPFO2eBnl76aeTcvlyifYTY5NM6SXtHi7qWVTeoEu3fwRL3mCKXNJf8mCrVnPQPoWquX/WB0nc0vXPH1t1dpty/8im1kdtoEk3lLXiXcqcxecmnskN5klfcbbsoatgb/b/wQi83WCx3scQQAAAABJRU5ErkJggg== + + false + 885db968-3932-4501-845c-88d779f8e8e8 + true + true + ROS Robot + Robot + + + + + + 527 + 188 + 115 + 44 + + + 594 + 210 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + 6d782e0d-e4bc-48f5-85cb-003176c8756e + ros_client + ros_client + true + 0 + true + c2ee2bb2-4780-4bb6-91bf-ded954426171 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 529 + 190 + 50 + 20 + + + 555.5 + 200 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + 50fb14a3-855c-4ef1-828e-1567b961f5bd + load + load + true + 0 + true + 42c77848-a1db-42f2-9bd1-eb74f0637124 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 529 + 210 + 50 + 20 + + + 555.5 + 220 + + + + + + + + The robot. + 719e44b4-a570-4557-a293-38bd52d8e0aa + robot + robot + false + 0 + + + + + + 609 + 190 + 31 + 40 + + + 624.5 + 210 + + + + + + + + + + + + + + aced9701-8be9-4860-bc37-7e22622afff4 + 9bde5adf-1aa6-414c-a1d4-8832edea1934 + Bifocals + + + + + true + Add floating labels to all components, with a few exceptions. Double-click to activate/deactivate, see right click menu for options. + true + e4e158e0-5dee-461f-a252-d42b45e1a81c + Bifocals + Bifocals + true + + + + + + 36 + 20 + 40 + 28 + + + 62 + 34 + + + + + + 1 + List of component names to exclude + e31303cb-a109-44ca-a6a0-49d6c7906a6c + Exceptions + E + true + 0 + + + + + + 38 + 22 + 9 + 24 + + + 44 + 34 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 4e66fe1b-29b3-4955-9524-ca986decd9ac + 1 + f421f52a-7d08-49a8-8e9c-4e5a9ad9c2af + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + aacb02be-ffde-4997-b910-3a5670a6e5b1 + 1 + 32e9fb95-0df1-45f9-b6a7-1c305c9c1488 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + d385349b-7e03-4362-b9d0-eacd34e2562b + 1 + 49ff36e7-8d17-4ffe-bf0d-e8f5e6b3746c + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 7a58f25a-3dc8-4dfa-bf0f-35404273569e + 1 + 4b787d3b-2696-4409-a6bd-026612d8a100 + Group + Robot Visualize + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + 1 + e62a1bc8-c1d1-4853-9a6e-086d9440bb0f + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 137a3255-a54e-4e4c-a9c3-e6d902b2a8bb + 1 + 2e806a7c-8f3a-4589-8f41-49c74d6772e6 + Group + Value List + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 471af287-d88e-43f4-9bb2-98daa088f633 + 1 + 320be22f-381c-4e72-af9d-07fb5fdf0daf + Group + Stream Filter + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + b96209a7-93e4-4212-b096-c83e82b4da7b + 1 + af153731-b462-4d68-b280-c3718e3c9ef5 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 98209ace-c305-4683-b351-d9b9daf31e36 + 1 + d409f04f-f273-49c2-aef5-5fa091e4e866 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 55db7485-e593-4762-a166-64303d976c7a + 1 + 82753f75-cad0-4993-9cb9-9f122073d002 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 88ccc4eb-8fe7-4579-a78f-ae0271df7471 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + c666c109-2ccb-4c50-90cd-00130af76eaa + 1 + 38b7fa85-2fa0-41e2-bf29-f4ca3687a51a + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + 1 + d6048390-a040-4c07-9004-11b38e84ca70 + Group + List Item + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + bcf27a28-24e5-4d31-8438-444d7fe511cb + 1 + d6ad11ed-cae1-43a7-9ddf-bdf0020db50b + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + f53212f5-507f-4bda-b372-34bf2b7020a3 + 1 + 7304c148-1452-429d-8424-614b24c87e99 + Group + GhPython Script + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + a38644b3-ef3b-4bc2-bf1d-8843907a4a1f + 1 + e058d766-ffee-4f9b-9059-e724f609b2a0 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + e9d20ac9-0dbc-44cb-9f48-878ae446678f + 1 + 3672f36b-776e-435f-a2e2-e7d6b0a3a9c5 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 619d4216-bdfd-4395-b679-83b02e397c53 + 1 + 828010a5-8af9-4206-a83e-80dc8635e1b5 + Group + Data + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + f7a508d2-0660-4a56-b714-b92e852c29fc + 1 + f61ef14b-1316-48f3-9674-499e06ab5207 + Group + ROS Connect + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 885db968-3932-4501-845c-88d779f8e8e8 + 1 + d0975f5d-897c-413b-8486-0e96c7bdc36e + Group + ROS Robot + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 6a222111-70b8-49a8-bc4f-2392cbe44c84 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 92 + 224 + 99 + 22 + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 42c77848-a1db-42f2-9bd1-eb74f0637124 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 389 + 229 + 99 + 22 + + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + bef990b8-6554-4e49-a84a-66a03cf62785 + Point + Pt + false + 0 + + + + + + 118 + 449 + 50 + 24 + + + 143.4242 + 461.2071 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0.72130644647305 + -0.332587234234773 + 0.0695684857918585 + + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + bef990b8-6554-4e49-a84a-66a03cf62785 + 1 + f26a1742-4314-4905-9f00-8ddf9c2a898b + Group + Point + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + ca778ca9-eba8-4874-a594-b48f628f436b + 1 + 33d368a9-7b09-4e37-941a-3e6cbcfbc176 + Group + Plane Origin + + + + + + + + + + 17b7152b-d30d-4d50-b9ef-c9fe25576fc2 + XY Plane + + + + + World XY plane. + 66ee0d17-42b5-4264-84c1-c24800739645 + XY Plane + XY + + + + + + 272 + 447 + 56 + 28 + + + 299 + 461 + + + + + + Origin of plane + ed08f469-eb34-4c38-8067-4387d49ad373 + Origin + O + false + bef990b8-6554-4e49-a84a-66a03cf62785 + 1 + + + + + + 274 + 449 + 10 + 24 + + + 280.5 + 461 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World XY plane + 6ebbab30-d201-4581-b0ae-76d46d1dc67a + Plane + P + false + 0 + + + + + + 314 + 449 + 12 + 24 + + + 320 + 461 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 66ee0d17-42b5-4264-84c1-c24800739645 + 1 + c3c7b5d4-6c44-4a51-9c53-51a9eddfe14b + Group + XY Plane + + + + + + + + + + c73e1ed0-82a2-40b0-b4df-8f10e445d60b + Flip Plane + + + + + Flip or swap the axes of a plane + d18f07b3-80b1-4c5b-a8d5-3785f9067db4 + Flip Plane + PFlip + + + + + + 386 + 410 + 55 + 84 + + + 412 + 452 + + + + + + Plane to adjust + 17cf73b5-7d46-455e-9f26-188619fd1cbb + Plane + P + false + 6ebbab30-d201-4581-b0ae-76d46d1dc67a + 1 + + + + + + 388 + 412 + 9 + 20 + + + 394 + 422 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Reverse the x-axis direction + 77d96464-525b-4828-8890-1db29fc681ee + Reverse X + X + false + 0 + + + + + + 388 + 432 + 9 + 20 + + + 394 + 442 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Reverse the y-axis direction + 5de70b52-a576-4d05-afce-41210de3588f + Reverse Y + Y + false + 0 + + + + + + 388 + 452 + 9 + 20 + + + 394 + 462 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Swap the x and y axis directions + 84c63f4d-199c-4473-b69e-b8ef2af5ef46 + Swap axes + S + false + 0 + + + + + + 388 + 472 + 9 + 20 + + + 394 + 482 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Flipped plane + f2bf12c1-6e84-497b-8e17-1f0525f46d47 + Plane + P + false + 0 + + + + + + 427 + 412 + 12 + 80 + + + 433 + 452 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + d18f07b3-80b1-4c5b-a8d5-3785f9067db4 + 1 + 9d1b1d95-7e8b-4e12-b3aa-0fe546a85a11 + Group + Flip Plane + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + 18ccb647-7a4f-4c05-8dc1-8a2cbd2a7727 + Curve + Crv + false + 0 + + + + + + 122 + 639 + 50 + 24 + + + 147.6425 + 651.0333 + + + + + + 1 + + + + + 1 + {0} + + + + + -1 + + Y2BkYGD4DwQgGgR4mIBEeFBGZl6+c35ubn6ejkJYalFxZn6erbmekbGekZGRhZGeobGBgZGOgnNpTklpUaptXmppSVFijo5CQGlSTmayd2plSH52ap6tqSlQtWGqpXmyuampqbEBK8gWSbDheu6p+bmpJUWVen6lRUnFzqVFZaksQFn2MohtXIlFyRmZZanGKbmc+QWpeXkgVSwpiSWJIEUcHBxMIIcKqDMwGAFpw2peHk5mIIMfRHQCrWH6Vc/EUAv11e//TAwiUA9KCq6PC+S+Irj/H4NAM6PSBy+pSvE/QHlXqFoBZqhCsGsY0MEHewwhiPh+dBFO7ArB4IIUT9Rsj5P2EPqmvYxIZ3PJt0dQ/ksMGuQOj/uL/HdpPbO/MXfPRdvcC/afFHs+b/x41f7IKfaD1XMe28e8vue71H2PvZRWxZscs3P2As+UODW3PLM/8P3q7zlRjfth4qs8i0KaZr+wj5gZ/GDvi137ba6nVT0TOWx/7dXk2llzn9tnar5Qdn1/Cq7eQuo2w57kR/ZpsRznV8Sc2c+wIrO96e8Re8vbW9d6NTyy/zU78+iWVfvh6o2kQ5/+r2dqgPmVG084jIJRQAUAAA== + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 18ccb647-7a4f-4c05-8dc1-8a2cbd2a7727 + 1 + 24435058-87f8-4b58-8282-834308ddb0bb + Group + Curve + + + + + + + + + + 2162e72e-72fc-4bf8-9459-d4d82fa8aa14 + Divide Curve + + + + + Divide a curve into equal length segments + 222091a0-d5a4-4262-a6fe-17bd9c5a9d3e + Divide Curve + Divide + + + + + + 388 + 639 + 56 + 64 + + + 415 + 671 + + + + + + Curve to divide + 0110adb3-02d3-4b61-94a8-5c44523a63ed + Curve + C + false + 18ccb647-7a4f-4c05-8dc1-8a2cbd2a7727 + 1 + + + + + + 390 + 641 + 10 + 20 + + + 396.5 + 651 + + + + + + + + Number of segments + 20285b96-2a81-4620-84c7-420b0fb4bf3b + Count + N + false + c8b9dd26-d312-4882-957f-488116a058f5 + 1 + + + + + + 390 + 661 + 10 + 20 + + + 396.5 + 671 + + + + + + 1 + + + + + 1 + {0} + + + + + 10 + + + + + + + + + + + Split segments at kinks + 6f51f461-3d72-4abc-88d3-2292da786b05 + Kinks + K + false + 0 + + + + + + 390 + 681 + 10 + 20 + + + 396.5 + 691 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Division points + f5b51811-8dda-4e00-8de7-33f88befb918 + Points + P + false + 0 + + + + + + 430 + 641 + 12 + 20 + + + 436 + 651 + + + + + + + + 1 + Tangent vectors at division points + 4d4e47e3-9e5c-42c8-a447-627958b07305 + Tangents + T + false + 0 + + + + + + 430 + 661 + 12 + 20 + + + 436 + 671 + + + + + + + + 1 + Parameter values at division points + cae1d30a-de8b-4e85-ac86-aeedcd470af2 + Parameters + t + false + 0 + + + + + + 430 + 681 + 12 + 20 + + + 436 + 691 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 222091a0-d5a4-4262-a6fe-17bd9c5a9d3e + 1 + 66a30261-5381-47a6-a92b-e4b0f10625be + Group + Divide Curve + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + c8b9dd26-d312-4882-957f-488116a058f5 + Number Slider + + false + 0 + + + + + + 201 + 664 + 158 + 20 + + + 201.3177 + 664.9373 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 20 + + + + + + + + + c73e1ed0-82a2-40b0-b4df-8f10e445d60b + Flip Plane + + + + + Flip or swap the axes of a plane + 5a5b1376-e1e7-4b91-adfd-91cb3fbfbeb4 + Flip Plane + PFlip + + + + + + 654 + 639 + 55 + 84 + + + 680 + 681 + + + + + + Plane to adjust + 5cc57e87-8ecb-404a-b31e-846186dda5a5 + Plane + P + false + 74310599-2299-4cdc-a100-d622fd566eed + 1 + + + + + + 656 + 641 + 9 + 20 + + + 662 + 651 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Reverse the x-axis direction + 37cfb919-74c8-427b-b622-309f860488be + Reverse X + X + false + 0 + + + + + + 656 + 661 + 9 + 20 + + + 662 + 671 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Reverse the y-axis direction + 9dbb59ed-013c-4088-aa07-99795de7d647 + Reverse Y + Y + false + 0 + + + + + + 656 + 681 + 9 + 20 + + + 662 + 691 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Swap the x and y axis directions + 643c439c-ad71-4054-9033-d7e69b4f43d9 + Swap axes + S + false + 0 + + + + + + 656 + 701 + 9 + 20 + + + 662 + 711 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Flipped plane + ff4d28eb-524d-4dc4-9be3-ce58d5542d8e + Plane + P + false + 0 + + + + + + 695 + 641 + 12 + 80 + + + 701 + 681 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 5a5b1376-e1e7-4b91-adfd-91cb3fbfbeb4 + 1 + c7e21c19-85d4-43df-aa90-9aa300e0ad88 + Group + Flip Plane + + + + + + + + + + 17b7152b-d30d-4d50-b9ef-c9fe25576fc2 + XY Plane + + + + + World XY plane. + c6663ac0-1f67-47a2-8438-1c3fa3416c58 + XY Plane + XY + + + + + + 510 + 637 + 56 + 28 + + + 537 + 651 + + + + + + Origin of plane + 2c1cbd3f-091f-4f96-9dd2-7b851385b9f8 + Origin + O + false + f5b51811-8dda-4e00-8de7-33f88befb918 + 1 + + + + + + 512 + 639 + 10 + 24 + + + 518.5 + 651 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World XY plane + 74310599-2299-4cdc-a100-d622fd566eed + Plane + P + false + 0 + + + + + + 552 + 639 + 12 + 24 + + + 558 + 651 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + c6663ac0-1f67-47a2-8438-1c3fa3416c58 + 1 + ea612213-7753-4afd-98b3-49c7d7f76d16 + Group + XY Plane + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAkQahUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAd5JREFUSA3lU08rBGEcfkebEmXJDe0QB0qGC+WAqwtHTsY32P0G8wm0DsJtcpES+wVkFFdWSW47yEXKbHJBvZ6n3nd7rRkN7UH51dPz+/u872/+CPFvrSKlnWb5zHdNc1K61wfV/Gt4Ocq+ppa2auvEaDA0JnamNy+2JA6xLCv6TsOKK2IwO3wu/OfgdD7T1X3TuWSXmjMierkT9tPe6bKeGShMFQLLKuo4NY+/yWLP6okcuZW+OcSD+3Yfrlgj+vejsllP5a9L6XB46EyWjAEXvte7cbY4KaXHmr1dCdmX9l3UtChQN7iAojSQrzUzia1UPAN2lJ9Mg4cy4O2MDg8+DwgNnoFvCgeqxj76uiaaEHyyTIeIPiWEsOviHOIj4AkIlT8N1kbf08GXA9rHRPn98T5nPFtbNVO4CqwABeAYYE7bLBzmaMmPisJ1L9nHgATItdXh01yANW6dBwKAMTnZ+JkaXxGHiTjLIskaRU3k45rjcq4aLMUVVc4Bl1VfBPaA1EZh3sxNPfGDxix69drOD+ZStVLcB3hABDTUbKiVAX17MnMNswBKFA0V0y8Cv7IvPxpUbKXkg9eU7yhuCNU/Hm5QaoiyEuFtI4DCBH3mfmVWwlQWeS0aJPT8jfQHhqO/T/FXHeAAAAAASUVORK5CYII= + + false + 7166598e-fdb6-4234-89c7-ebb18efe5a88 + true + true + Inverse Kinematics + IK + + + + + + 391 + 803 + 199 + 84 + + + 503 + 845 + + + + + + 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. + d7f71b55-bd7b-4734-8720-8ef66007c48f + robot + robot + true + 0 + true + 98209ace-c305-4683-b351-d9b9daf31e36 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 393 + 805 + 95 + 20 + + + 442 + 815 + + + + + + + + true + The plane or frame to calculate the inverse kinematic for. + 6648caea-9170-42c5-bd52-97ddf5519d94 + plane + plane + true + 0 + true + b96209a7-93e4-4212-b096-c83e82b4da7b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 393 + 825 + 95 + 20 + + + 442 + 835 + + + + + + + + true + If passed, calculates the inverse such that the joint positions differ the least from the start_configuration. Defaults to the zero configuration. + 4349dcf2-c1b5-46a1-8ce0-5f5e0da1a216 + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 393 + 845 + 95 + 20 + + + 442 + 855 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 3365538b-6293-4a57-8d10-eae45d1b961c + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 393 + 865 + 95 + 20 + + + 442 + 875 + + + + + + + + The planning group's configuration. + c7efcbd4-341c-4f07-8a0f-c88562a0bf77 + configuration + configuration + false + 0 + + + + + + 518 + 805 + 70 + 80 + + + 553 + 845 + + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 7166598e-fdb6-4234-89c7-ebb18efe5a88 + 1 + 308cbb75-c1de-48e9-a986-53520e117a1a + Group + Inverse Kinematics + + + + + + + + + + 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 + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAkQahUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAnpJREFUSA3NVU1oE1EQnqwRuonVHJqmHkzXWm1L7J9eerLrpeKhEASPxYD4Q0/pqZcWtzdBDwWPHrqXWuile1KMINuiNSLFRehBpNIUG5QqptiaBiKvM4/sZotuNrtQ8MHbmTdv3vfNzJvHAvwfg0UOMQ4mAbBpvwRCHQdlgE2chzaYBpBhmIWvMtWRwRszelN6SsWFgPUB7JyoICY9IVecXQhAroKu2vSq1U1zIdizRZ1vxXuQ3AB97DMFoKj7OMiPuGRQG3bk2vVUT1eiJrkjAfalTPAxgAYxmA+TDgxtDKx2/fZ9S9r9vTvI97x8EDz1CuFQ3r91arAIfQqDIqiwABvwEozhO0OjiXMdxplWidE8e7qtMNB/UWXFOu7IBCeCComaYDAKs1CAx8Cah5s4aEd7+waVhwgI3CTKzM5ja1fHgRIR+GuAmeo214xVgCdYmkD4YwgaPxyDXz07sPbw83Yk3pglj+z7ldTdkdRl0semJlWSfw175AZAAdca2XBK3JlBsq0/viV1x0vCI4FRNtEbTV8pchMseeVqmtbpm7et9g7QJnqQIY1Tw6mj0UBpjQcTivxiSZfXcuv3QqL4NtQpZn8c/ymVP/0ZOJIXYgg6Rc7lcrkht/llPBwKL7ZEo3pmSVc4gYXkoAxdkhUCd9h2NOOZuvAtAOoWe98Tsb1ElCmtqVTmoQOXbBqd5MnmmEp9Tw/sXz7q/Nw02Re0p1RqPjwRLGaXlaPBYG555d0MRb9XKkUIhSKnd4Hr3u7OrrGAGFjn6PjxViM8QI+p98J5nokJQlIQhG0kUbTnz3gW9j1fOj0o86FRyRjz98erSU6loVLVctoHD3jn5Goj/8kAAAAASUVORK5CYII= + + false + b09e2598-caee-4b14-97b4-47de244a8cd5 + true + true + Constraints From Plane + Constraints From Plane + + + + + + 504 + 1019 + 185 + 144 + + + 613 + 1091 + + + + + + 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. + 25f7424d-8e38-49e4-95e2-943cfef87d54 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 506 + 1021 + 92 + 20 + + + 553.5 + 1031 + + + + + + + + true + The plane or frame from which we create position and orientation constraints. + d530936d-0669-4f3d-901b-f12ff2b52462 + plane + plane + true + 0 + true + edf1a385-c3b3-463f-8f60-01dae2d8a239 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 506 + 1041 + 92 + 20 + + + 553.5 + 1051 + + + + + + + + true + The planning group for which we specify the constraint. Defaults to the robot's main planning group. + 085e5404-eb11-479b-8390-7f1551111883 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 506 + 1061 + 92 + 20 + + + 553.5 + 1071 + + + + + + + + true + The allowed tolerance to the frame's position (defined in the robot's units). Defaults to 0.001 + 9bfca129-feb8-4cdf-b744-2f95e957124e + tolerance_position + tolerance_position + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 506 + 1081 + 92 + 20 + + + 553.5 + 1091 + + + + + + + + true + The allowed tolerance of the frame's X-axis in degrees. + 643c090b-6c75-4986-a59e-5393ff8fad9d + tolerance_xaxis + tolerance_xaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 506 + 1101 + 92 + 20 + + + 553.5 + 1111 + + + + + + + + true + The allowed tolerance of the frame's Y-axis in degrees. + b09eb7b1-d786-4506-a566-0d5f9b82c5b3 + tolerance_yaxis + tolerance_yaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 506 + 1121 + 92 + 20 + + + 553.5 + 1131 + + + + + + + + true + The allowed tolerance of the frame's Z-axis in degrees. + 7ba79f68-3681-4fda-8cae-e4518e912974 + tolerance_zaxis + tolerance_zaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 506 + 1141 + 92 + 20 + + + 553.5 + 1151 + + + + + + + + A list containing a position and an orientation constraint. + d4fb8895-4ad5-43c6-8ea7-4eec53a05777 + constraints + constraints + false + 0 + + + + + + 628 + 1021 + 59 + 140 + + + 657.5 + 1091 + + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + b09e2598-caee-4b14-97b4-47de244a8cd5 + 1 + 363a1bc5-dff0-4c3c-95b4-d94991d5aad0 + Group + Constraints From Plane + + + + + + + + + + 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 + + 61 + 135 + + + 1339 + 500 + + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAKgAgAEAAAAAQAAABigAwAEAAAAAQAAABgAAAAAkQahUgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAYVJREFUSA3tkzFOAzEQRQ3iAHuDzRH2ACm2oU+DaDkCR9gCiZIaiWJbquQIlqBPCsoUdFQoVDRIwPtoRjLWkBQIqnzpa8Z/vmdsb5LSHv/0Ag1zRpjhAvZwJ6Y45vBmpzOlFZ6Piv22fZeF+YlcQxQjzBDr5lrrJiFaVPEVyqjmb5aviTUGBPlqZrQQS1Q1vIBTc2iIGugWrWkeOpK6udaDG+rop1XTEics9HRijQGhHKJv0tQmX2/M7Kd3PZuueoQJYm8kxND1z+FpUJbupwzKX99Kw+ubf/POrUl0Sg1XXYMiaI8OkKOiayrKFA2QZ2216IZLajsH6HQZ/nTNbafU3vq7pUNEx4SkgRnewwjPiDqlblJCja/gHYxulzoKL1CbnSN5jRZBnFv0utbap594iAWqNy6jBtd4R5DHb6H/xTXMUINCZNSysed94NYTaMgGZuje6A+YjjAIep4IkX6L8Rg+wJltkm9leRg6VJn8NIoj/DUOig4T8jNbPxJHy/fhb1/gE+R2gvpd1fGJAAAAAElFTkSuQmCC + + false + 532715f7-4ab2-4d65-a96a-aa9a18630b84 + true + true + Plan Motion + Plan Motion + + + + + + 860 + 1014 + 219 + 164 + + + 1010 + 1096 + + + + + + 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. + 989f16de-0402-494f-bad9-228276097fe3 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 862 + 1016 + 133 + 20 + + + 930 + 1026 + + + + + + + + 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. + 922147e9-6525-4b7f-a708-2257fd706087 + goal_constraints + goal_constraints + true + 1 + true + d4fb8895-4ad5-43c6-8ea7-4eec53a05777 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 862 + 1036 + 133 + 20 + + + 930 + 1046 + + + + + + + + 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. + 99067e51-c5fb-4774-9655-05272c32c4e1 + start_configuration + start_configuration + true + 0 + true + c666c109-2ccb-4c50-90cd-00130af76eaa + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 862 + 1056 + 133 + 20 + + + 930 + 1066 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 3367bf87-c4ef-4f8e-96e8-b2456da52d31 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 862 + 1076 + 133 + 20 + + + 930 + 1086 + + + + + + + + 1 + true + A list of attached collision meshes to be included for planning. + b1099745-7487-4faf-8d8a-5b0a40990622 + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 862 + 1096 + 133 + 20 + + + 930 + 1106 + + + + + + + + 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. + 00471d9e-c318-4923-a027-29a3aa62ef56 + path_constraints + path_constraints + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 862 + 1116 + 133 + 20 + + + 930 + 1126 + + + + + + + + true + The name of the algorithm used for path planning. Defaults to 'RRTConnect' + 8f092f58-dd11-4d81-8657-1d4b84fb5d30 + planner_id + planner_id + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 862 + 1136 + 133 + 20 + + + 930 + 1146 + + + + + + + + true + If True, calculates a trajectory. + 74946313-f65f-4c7d-990c-8dcda92ee57e + compute + compute + true + 0 + true + e5d451ae-6dba-4792-a33f-18b63c1ac0dd + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 862 + 1156 + 133 + 20 + + + 930 + 1166 + + + + + + + + The calculated trajectory. + c585a498-df95-483a-86fb-5ea173abae46 + trajectory + trajectory + false + 0 + + + + + + 1025 + 1016 + 52 + 160 + + + 1051 + 1096 + + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 532715f7-4ab2-4d65-a96a-aa9a18630b84 + 1 + 87ab29fa-e2f0-4895-9763-dbc8d02d2740 + Group + Plan Motion + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + 54445fbc-5cae-43b2-ac6a-663e8b56dc3a + List Item + Item + + + + + + 283 + 1115 + 58 + 64 + + + 312 + 1147 + + + + + + 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 + ea5850b8-949b-4e24-b20d-f5e15effe25f + List + L + false + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 285 + 1117 + 12 + 20 + + + 292.5 + 1127 + + + + + + + + Item index + 4ff9550c-9f44-4576-aed5-efea7fb642a0 + Index + i + false + 7efb9e32-32e3-4ab8-b80c-6e5618ba249e + 1 + + + + + + 285 + 1137 + 12 + 20 + + + 292.5 + 1147 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 0894ee60-cb3f-4f33-bce7-8a9aca5c9676 + Wrap + W + false + 0 + + + + + + 285 + 1157 + 12 + 20 + + + 292.5 + 1167 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 3bb14927-e469-427e-b8f5-e2eb5bd995eb + false + Item + i + false + 0 + + + + + + 327 + 1117 + 12 + 60 + + + 333 + 1147 + + + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + 54445fbc-5cae-43b2-ac6a-663e8b56dc3a + 1 + 956a71b0-05ce-42d8-a6f8-f261768d185b + Group + List Item + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 7efb9e32-32e3-4ab8-b80c-6e5618ba249e + Number Slider + + false + 0 + + + + + + 83 + 1144 + 157 + 20 + + + 83.95053 + 1144.425 + + + + + + 3 + 1 + 1 + 20 + 0 + 0 + 13 + + + + + + + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + edf1a385-c3b3-463f-8f60-01dae2d8a239 + Plane + Pln + false + 3bb14927-e469-427e-b8f5-e2eb5bd995eb + 1 + + + + + + 369 + 1135 + 50 + 24 + + + 394.0137 + 1147.396 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 0;100;150;75 + + A group of Grasshopper objects + edf1a385-c3b3-463f-8f60-01dae2d8a239 + 1 + 0976b642-9390-4335-ac16-0882a881a1a5 + Group + Plane + + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + e5d451ae-6dba-4792-a33f-18b63c1ac0dd + Button + Button + false + 0 + + + + + + 712 + 1155 + 99 + 22 + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file diff --git a/lecture_04/assignment_03/ana_ascic/Assignment_03_Ana_Ascic.png b/lecture_04/assignment_03/ana_ascic/Assignment_03_Ana_Ascic.png new file mode 100644 index 0000000..12a97ea Binary files /dev/null and b/lecture_04/assignment_03/ana_ascic/Assignment_03_Ana_Ascic.png differ