diff --git a/lecture_04/assignment_03/assignment_03-yocheng-lee-2.ghx b/lecture_04/assignment_03/assignment_03-yocheng-lee-2.ghx new file mode 100644 index 0000000..0772296 --- /dev/null +++ b/lecture_04/assignment_03/assignment_03-yocheng-lee-2.ghx @@ -0,0 +1,6280 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + c4f913db-409d-41a9-88e1-f6f90989047d + Shaded + 1 + + 100;150;0;0 + + + 100;0;150;0 + + + + + + 637527254194888879 + + assignment_03-yocheng-lee.ghx + + + + + 0 + + + + + + 118 + -543 + + 1.384083 + + + + + 0 + + + + + + + 0 + + + + + 2 + + + + + GhPython, Version=7.28.23058.3001, Culture=neutral, PublicKeyToken=null + 7.28.23058.3001 + + 00000000-0000-0000-0000-000000000000 + + + + + + + Pufferfish, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null + 3.0.0.0 + Michael Pryor + 1c9de8a1-315f-4c56-af06-8f69fee80a7a + Pufferfish + 3.0.0.0 + + + + + + + 62 + + + + + 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 + 5d051c72-528a-498d-a91b-f91e344562b4 + baea3a7f-42ad-4480-b62c-39cd2f8c2e8a + 18 + 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 + 846547a4-0964-4bea-b2e5-d3fd03e0ff69 + 1 + + + + + + 1254 + 168 + 50 + 24 + + + 1279.353 + 180.9772 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 119.7138 + + + 272.0458 + 119.7138 + + + 272.0458 + 139.8124 + + + 46.70692 + 139.8124 + + A quick note + Cambria + 82091d9c-f1c0-4207-8d3d-b1dca673d5df + false + Scribble + Scribble + 22 + 1) Load robot from ROS + + + + + + 41.70692 + 114.7138 + 235.3389 + 30.09864 + + + 46.70692 + 119.7138 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + aacb02be-ffde-4997-b910-3a5670a6e5b1 + Data + Target planes + false + 44d4a187-3a93-413f-992e-d4cc7e2e19ad + 1 + + + + + + 1240 + 476 + 50 + 24 + + + 1265.041 + 488.8133 + + + + + + + + + + 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 + 37fef6aa-0c60-4da4-9d31-1ae0bdd95cd2 + d6cabb95-93fe-48fe-9b1b-2070fdd10e56 + 3974a64b-9fea-4aa6-a9ad-21315ef8260a + b171143f-e5e1-4bc8-92f7-eb329037f691 + 11 + 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 + 3a86f18b-7506-4d48-8a5c-6048a1108886 + 1 + + + + + + 1242 + 320 + 50 + 24 + + + 1267.779 + 332.6416 + + + + + + + + + + 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 + 13d747bd-3e05-4a41-8ea0-75bad3d5248b + dd675efd-9233-4ad4-bb47-4b8f4932cc90 + 68575641-3532-400d-95f0-a0242e51e625 + eb5acce9-f665-4261-a8bc-ffd4947a64da + 0bd900d0-2016-4c53-af3b-1c52cf194064 + 11 + 3c032157-3bf9-40ee-9b12-e4e807d15ccc + Group + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 281.4785 + + + 269.3387 + 281.4785 + + + 269.3387 + 301.5771 + + + 46.70692 + 301.5771 + + A quick note + Cambria + ff0bbdd7-eb5b-4ed6-a652-505db2c0ac8c + false + Scribble + Scribble + 22 + 2) Define pick-up plane + + + + + + 41.70692 + 276.4785 + 232.6318 + 30.09863 + + + 46.70692 + 281.4785 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 431.5476 + + + 263.9891 + 431.5476 + + + 263.9891 + 451.7751 + + + 46.70692 + 451.7751 + + A quick note + Cambria + 9dbe68e7-ae2d-4df4-89a9-ae0ec5759854 + false + Scribble + Scribble + 22 + 3) Define target planes + + + + + + 41.70692 + 426.5476 + 227.2822 + 30.22754 + + + 46.70692 + 431.5476 + + + + + + + + + + 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/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/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 + + + + + + 2220 + 498 + 257 + 204 + + + 2367 + 600 + + + + + + 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 + + + + + + 2222 + 500 + 130 + 20 + + + 2288.5 + 510 + + + + + + + + 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 + + + + + + 2222 + 520 + 130 + 20 + + + 2288.5 + 530 + + + + + + + + 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 + + + + + + 2222 + 540 + 130 + 20 + + + 2288.5 + 550 + + + + + + + + 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 + + + + + + 2222 + 560 + 130 + 20 + + + 2288.5 + 570 + + + + + + + + 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 + + + + + + 2222 + 580 + 130 + 20 + + + 2288.5 + 590 + + + + + + + + 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 + + + + + + 2222 + 600 + 130 + 20 + + + 2288.5 + 610 + + + + + + + + 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 + + + + + + 2222 + 620 + 130 + 20 + + + 2288.5 + 630 + + + + + + + + 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 + + + + + + 2222 + 640 + 130 + 20 + + + 2288.5 + 650 + + + + + + + + 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 + + + + + + 2222 + 660 + 130 + 20 + + + 2288.5 + 670 + + + + + + + + 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 + + + + + + 2222 + 680 + 130 + 20 + + + 2288.5 + 690 + + + + + + + + Rhino meshes of the robot's visual geometry (if any). + b51fd205-41de-4772-b77b-54118aa40c2c + visual + visual + false + 0 + + + + + + 2382 + 500 + 93 + 28 + + + 2428.5 + 514.2857 + + + + + + + + Rhino meshes of the robot's collision geometry (if any). + 3fd4309e-805a-4b2a-8b39-fb39cda51d21 + collision + collision + false + 0 + + + + + + 2382 + 528 + 93 + 29 + + + 2428.5 + 542.8571 + + + + + + + + Rhino meshes of the scene's collision meshes (if any). + ba8f5aaf-7d4f-4021-b0f3-328651e5f766 + collision_meshes + collision_meshes + false + 0 + + + + + + 2382 + 557 + 93 + 28 + + + 2428.5 + 571.4286 + + + + + + + + Rhino meshes of the scene's attached collision meshes (if any). + 00b4652c-1968-4bef-b124-5b86f4dc25bc + attached_meshes + attached_meshes + false + 0 + + + + + + 2382 + 585 + 93 + 29 + + + 2428.5 + 600 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 243eeb3c-e1ad-4233-9a1a-b0ec9fd1c962 + frames + frames + false + 0 + + + + + + 2382 + 614 + 93 + 28 + + + 2428.5 + 628.5714 + + + + + + + + The robot's base frame as a Rhino plane (if any). + 91fd1995-e0da-4f23-a4c6-afeefc044dee + base_frame + base_frame + false + 0 + + + + + + 2382 + 642 + 93 + 29 + + + 2428.5 + 657.1429 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + 5a2c4711-ae2f-4f0f-b633-afc7c8fccfd2 + ee_frame + ee_frame + false + 0 + + + + + + 2382 + 671 + 93 + 29 + + + 2428.5 + 685.7143 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 651.1613 + + + 317.5712 + 651.1613 + + + 317.5712 + 671.2599 + + + 46.70692 + 671.2599 + + A quick note + Cambria + fccb98c9-c6e5-4caa-8384-ca0ddf85fd1f + false + Scribble + Scribble + 22 + 4) Solve IK for pick-up plane + + + + + + 41.70692 + 646.1613 + 280.8643 + 30.09863 + + + 46.70692 + 651.1613 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + 02bc89eb-6961-419b-a5c7-ecf1d7beb296 + Data + Pickup config + false + 1d8af690-69c5-4c9f-b553-1a05f97e8281 + 1 + + + + + + 1242 + 734 + 50 + 24 + + + 1267.176 + 746.6949 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 73.59002 + 675.2849 + + + 238.8635 + 675.2849 + + + 238.8635 + 689.9958 + + + 73.59002 + 689.9958 + + A quick note + Cambria + 6e5b9db8-970d-4e5b-bf3d-6ec1c492b072 + false + Scribble + Scribble + 16 + Results in pickup config + + + + + + 68.59002 + 670.2849 + 175.2734 + 24.71094 + + + 73.59002 + 675.2849 + + + + + + + + + + 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 + df49cbca-ec61-4dc7-8c55-18e7e63a3700 + 5c90bf29-e6aa-4294-8822-68408c74406a + 8 + 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 + + + + + + 1455 + 530 + 123 + 22 + + + + + + + + + + eeafc956-268e-461d-8e73-ee05c6f72c01 + Stream Filter + + + + + Filters a collection of input streams + 471af287-d88e-43f4-9bb2-98daa088f633 + Stream Filter + Filter + + + + + + 1910 + 529 + 77 + 64 + + + 1942 + 561 + + + + + + 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 + + + + + + 1912 + 531 + 15 + 20 + + + 1921 + 541 + + + + + + 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 + + + + + + 1912 + 551 + 15 + 20 + + + 1921 + 561 + + + + + + + + 2 + Input stream at index 1 + 14985ec3-7977-426f-bc6b-ad27afc61e04 + false + Stream 1 + 1 + true + a4b043bc-8e30-4b4c-bb40-e7f42497696d + 1 + + + + + + 1912 + 571 + 15 + 20 + + + 1921 + 581 + + + + + + + + 2 + Filtered stream + ddfd1927-535b-4f08-acf1-f1762fa62a54 + false + Stream + S(1) + false + 0 + + + + + + 1957 + 531 + 28 + 60 + + + 1971 + 561 + + + + + + + + + + + + + + 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 + + 1448 + 480.4395 + + + 1572.363 + 480.4395 + + + 1572.363 + 495.9834 + + + 1448 + 495.9834 + + A quick note + Cambria + 766f518e-d29b-4814-a406-a45e5ded4a64 + false + Scribble + Scribble + 22 + Visualization + + + + + + 1443 + 475.4395 + 134.3623 + 25.54395 + + + 1448 + 480.4395 + + + + + + + + + + 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 + + + + + + 77 + 724 + 50 + 24 + + + 102.6684 + 736.2081 + + + + + + + + + + 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 + + + + + + 77 + 696 + 50 + 24 + + + 102.0198 + 708.5996 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 46.70692 + 861.2363 + + + 379.9403 + 861.2363 + + + 379.9403 + 881.4102 + + + 46.70692 + 881.4102 + + A quick note + Cambria + ba94b074-3f68-4274-8b84-f87aa5c4cb3e + false + Scribble + Scribble + 22 + 5) Plan trajectory to selected plane + + + + + + 41.70692 + 856.2363 + 343.2334 + 30.17383 + + + 46.70692 + 861.2363 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + false + + 75.11641 + 888.1221 + + + 314.8351 + 888.1221 + + + 314.8351 + 902.833 + + + 75.11641 + 902.833 + + A quick note + Cambria + 01b0a494-be40-47b6-bdc4-7c92967b9f38 + false + Scribble + Scribble + 16 + From pickup config to target plane + + + + + + 70.11641 + 883.1221 + 249.7187 + 24.71094 + + + 75.11641 + 888.1221 + + + + + + + + + + 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 + + + + + + 81 + 988 + 50 + 24 + + + 106.0911 + 1000.628 + + + + + + + + + + 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 + + + + + + 82 + 931 + 50 + 24 + + + 107.0106 + 943.0975 + + + + + + + + + + 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 + + + + + + 81 + 959 + 50 + 24 + + + 106.6234 + 971.4724 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + e4b338fe-125d-4929-92e1-4e17c08f9b3b + Number Slider + + false + 0 + + + + + + 1456 + 565 + 160 + 20 + + + 1456.641 + 565.639 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 21 + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + df7fb28b-31b3-40c8-ab8a-ec66c12ea055 + List Item + Item + + + + + + 2027 + 549 + 64 + 64 + + + 2061 + 581 + + + + + + 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 + + + + + + 2029 + 551 + 17 + 20 + + + 2039 + 561 + + + + + + + + Item index + 83d287eb-3d9d-4785-b735-156766b364e7 + Index + i + false + e4b338fe-125d-4929-92e1-4e17c08f9b3b + 1 + + + + + + 2029 + 571 + 17 + 20 + + + 2039 + 581 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 60da4aea-66d4-49fc-8aa9-a5189edc913b + Wrap + W + false + 0 + + + + + + 2029 + 591 + 17 + 20 + + + 2039 + 601 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 4ca3f55b-10fb-41c3-9f24-2b4809b96eeb + false + Item + i + false + 0 + + + + + + 2076 + 551 + 13 + 60 + + + 2082.5 + 581 + + + + + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + bcf27a28-24e5-4d31-8438-444d7fe511cb + Data + Trajectory + false + 4e17b2ad-e9af-41eb-b6a5-7585e1f6e333 + 1 + + + + + + 1246 + 954 + 50 + 24 + + + 1271.31 + 966.862 + + + + + + + + + + 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 + + + + + + 1554 + 673 + 132 + 28 + + + 1624 + 687 + + + + + + 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 + + + + + + 1556 + 675 + 53 + 24 + + + 1584 + 687 + + + + + + + + Script output configs. + a4b043bc-8e30-4b4c-bb40-e7f42497696d + configs + configs + false + 0 + + + + + + 1639 + 675 + 45 + 24 + + + 1661.5 + 687 + + + + + + + + + + + + + + 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 + + + + + + 1473 + 652 + 50 + 24 + + + 1498.681 + 664.9339 + + + + + + + + + + 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 + + + + + + 1474 + 676 + 50 + 24 + + + 1499.197 + 688.2636 + + + + + + + + + + 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 + + + + + + 1474 + 628 + 50 + 24 + + + 1499.035 + 640.0879 + + + + + + + + + + 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 + d93333c1-6121-4133-94e5-b1cdbd79792d + 8a1cd44e-8393-4da1-ba94-6a53dd4e3f37 + 54d5165c-c7b9-4b61-a3f4-725adfe6cedb + 15 + 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 + 485 + 523 + 96 + + 0 + 0 + 0 + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + fb166dfc-4abf-4aa5-9ecf-d86922966dfe + Panel + + false + 0 + 0 + Define one pick-up plane in any way you like, +for example, reference a point from Rhino and assign a plane to it. + +Make sure the plane is oriented in a way that makes sense +for the robot to reach it. You can check this by observing the +results of the IK solution for this pickup-plane. + + + + + + -536 + 293 + 529 + 96 + + 0 + 0 + 0 + + -535.2353 + 293.4706 + + + + + + 3 + + 255;255;250;90 + + true + true + true + false + false + true + + + + + Courier New + 8 + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + c7cc41e4-23fe-4958-87c2-e75feb10ebac + Panel + + 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 + 680 + 523 + 96 + + 0 + 0 + 0 + + -529.5882 + 680.8822 + + + + + + 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 + 942 + 523 + 96 + + 0 + 0 + 0 + + -529.353 + 942.6469 + + + + + + 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/xhBQAAAAlwSFlzAAALDwAACw8BkvkDpQAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC + + false + 5d051c72-528a-498d-a91b-f91e344562b4 + true + true + ROS Connect + ROS + + + + + + 329 + 114 + 153 + 64 + + + 392 + 146 + + + + + + 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. + 9f8ec376-61c8-4a5a-9978-8260b3433971 + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 331 + 116 + 46 + 20 + + + 355.5 + 126 + + + + + + + + true + The port of ROS. Defaults to 9090. + 606cb857-159f-4994-b643-f4573ca19d5f + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 331 + 136 + 46 + 20 + + + 355.5 + 146 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + f3e97277-64e0-4595-adcd-93143d53f341 + connect + connect + true + 0 + true + f9dd4743-5ef1-4938-a2ce-b61e2f89ff71 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 331 + 156 + 46 + 20 + + + 355.5 + 166 + + + + + + + + The ROS client. + 1c3a0665-a31f-4f6b-a343-89073c77e7a7 + ros_client + ros_client + false + 0 + + + + + + 407 + 116 + 73 + 30 + + + 443.5 + 131 + + + + + + + + True if connection established. + 17ce31a9-caeb-4613-ab0b-fb88664811c6 + is_connected + is_connected + false + 0 + + + + + + 407 + 146 + 73 + 30 + + + 443.5 + 161 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + f9dd4743-5ef1-4938-a2ce-b61e2f89ff71 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 106 + 163 + 104 + 22 + + + + + + + + + + 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/xhBQAAAAlwSFlzAAALDwAACw8BkvkDpQAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC + + false + baea3a7f-42ad-4480-b62c-39cd2f8c2e8a + true + true + ROS Robot + Robot + + + + + + 525 + 137 + 124 + 44 + + + 595 + 159 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + f7ba96f4-94e2-4197-b4a3-31f6a0ca2f34 + ros_client + ros_client + true + 0 + true + 1c3a0665-a31f-4f6b-a343-89073c77e7a7 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 527 + 139 + 53 + 20 + + + 555 + 149 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + e89e10b5-2ece-44bd-87f9-1811ce89ed0b + load + load + true + 0 + true + f9dd4743-5ef1-4938-a2ce-b61e2f89ff71 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 527 + 159 + 53 + 20 + + + 555 + 169 + + + + + + + + The robot. + 846547a4-0964-4bea-b2e5-d3fd03e0ff69 + robot + robot + false + 0 + + + + + + 610 + 139 + 37 + 40 + + + 628.5 + 159 + + + + + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDwAACw8BkvkDpQAAAYFJREFUSEu1lLFxwzAMRVWn8gApNIKKDOAubbqk1AgeQRP4NIJG0AgqMoCq1BpBGzD/ywANkbAt3dm4eyfwkwBEElIRQngprvhMXHEL7+ff0tNTXFFBkhqMIAgz6MG3+AcvzuKKDJRETDqBFjSgE005efEWV0QgEzJBl+gs/CdzZLTzHpmAoEqCe9VgNWjePj5/oHMn3B13xnV37yITJEEMhH0BOsrqWLBuuQfYEVR2btFTAQEDmHQMawCdyTyZzCYeAAeEfrz8VXKC5Mv2dQzrJFALWDyNtDFeHQXJ0yOybzcD3scJWJ3YnQyazytQSoHlkmG6Az5XfQ9jMTosbIveLkCQnG2qBRg8p2tk7iDzHFhiI2RBFpi+YWzZFFgFRlnHYs1q3g5SYL0E1t78FlyRwLh9OiTr76344iW5Xq57/lvJhaIogZ6psunX7JEL11azH1H8cPaSC9fE/EW04se+3ksu5MdDbrbpI3Lh0tf246H/ki7iv+Xoze/BFZ9HKP4BuwtzfPsUblIAAAAASUVORK5CYII= + + false + df49cbca-ec61-4dc7-8c55-18e7e63a3700 + true + true + Inverse Kinematics + IK + + + + + + 504 + 704 + 207 + 84 + + + 619 + 746 + + + + + + 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. + 249e3fc8-1590-4989-8d02-71555d17803d + robot + robot + true + 0 + true + 846547a4-0964-4bea-b2e5-d3fd03e0ff69 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 506 + 706 + 98 + 20 + + + 556.5 + 716 + + + + + + + + true + The plane or frame to calculate the inverse kinematic for. + 7f79fc84-f4dc-442f-b7ec-2c6ef6d32d53 + plane + plane + true + 0 + true + b96209a7-93e4-4212-b096-c83e82b4da7b + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 506 + 726 + 98 + 20 + + + 556.5 + 736 + + + + + + + + true + If passed, calculates the inverse such that the joint positions differ the least from the start_configuration. Defaults to the zero configuration. + 8aab3d36-825a-4b59-a5df-f5a5a92c336a + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 506 + 746 + 98 + 20 + + + 556.5 + 756 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + fd831072-ab33-48dd-88f3-f5635811e6b2 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 506 + 766 + 98 + 20 + + + 556.5 + 776 + + + + + + + + The planning group's configuration. + 1d8af690-69c5-4c9f-b553-1a05f97e8281 + configuration + configuration + false + 0 + + + + + + 634 + 706 + 75 + 80 + + + 671.5 + 746 + + + + + + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + 13d747bd-3e05-4a41-8ea0-75bad3d5248b + Point + Pt + false + 0 + + + + + + 351 + 300 + 50 + 24 + + + 376.125 + 312 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0.367606789217143 + 0.00801042536875041 + -0.0177049653487109 + + + + + + + + + + + + + + cfb6b17f-ca82-4f5d-b604-d4f69f569de3 + Plane Normal + + + + + Create a plane perpendicular to a vector. + dd675efd-9233-4ad4-bb47-4b8f4932cc90 + Plane Normal + Pl + + + + + + 444 + 300 + 65 + 44 + + + 476 + 322 + + + + + + Origin of plane + a4967eb6-ce45-4b5a-a8bb-b57de9bc5816 + Origin + O + false + 13d747bd-3e05-4a41-8ea0-75bad3d5248b + 1 + + + + + + 446 + 302 + 15 + 20 + + + 455 + 312 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + Z-Axis direction of plane + 6f2ccb4f-ad90-40cb-aa81-912ca1f36990 + Z-Axis + Z + false + 1f4c1d7b-92ac-410e-b8cf-de51d8691d13 + 1 + + + + + + 446 + 322 + 15 + 20 + + + 455 + 332 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 1 + + + + + + + + + + + + Plane definition + 3a86f18b-7506-4d48-8a5c-6048a1108886 + Plane + P + false + 0 + + + + + + 491 + 302 + 16 + 40 + + + 499 + 322 + + + + + + + + + + + + 9103c240-a6a9-4223-9b42-dbd19bf38e2b + Unit Z + + + + + Unit vector parallel to the world {z} axis. + 68575641-3532-400d-95f0-a0242e51e625 + Unit Z + Z + + + + + + 230 + 332 + 63 + 28 + + + 259 + 346 + + + + + + Unit multiplication + 1ec380b2-779c-4e5e-b32f-e1e05e1eaa2d + Factor + F + false + 0 + + + + + + 232 + 334 + 12 + 24 + + + 239.5 + 346 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {z} vector + 351348f7-2844-4518-aa54-7e8529b995cf + Unit vector + V + false + 0 + + + + + + 274 + 334 + 17 + 24 + + + 282.5 + 346 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + eb5acce9-f665-4261-a8bc-ffd4947a64da + Negative + Neg + + + + + + 346 + 332 + 61 + 28 + + + 375 + 346 + + + + + + Input value + 28852126-05f6-43ae-8988-6d8909c2ffdf + Value + x + false + 351348f7-2844-4518-aa54-7e8529b995cf + 1 + + + + + + 348 + 334 + 12 + 24 + + + 355.5 + 346 + + + + + + + + Output value + 1f4c1d7b-92ac-410e-b8cf-de51d8691d13 + Result + y + false + 0 + + + + + + 390 + 334 + 15 + 24 + + + 397.5 + 346 + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + b171143f-e5e1-4bc8-92f7-eb329037f691 + Curve + Crv + false + 0 + + + + + + 208 + 454 + 50 + 24 + + + 233.0004 + 466.4636 + + + + + + 1 + + + + + 1 + {0} + + + + + -1 + 43639750-9237-4727-820a-25d58c828462 + + + + + + + + + + + + + 2162e72e-72fc-4bf8-9459-d4d82fa8aa14 + Divide Curve + + + + + Divide a curve into equal length segments + true + 37fef6aa-0c60-4da4-9d31-1ae0bdd95cd2 + Divide Curve + Divide + + + + + + 301 + 454 + 65 + 64 + + + 333 + 486 + + + + + + Curve to divide + 17b7b741-c039-457b-bc69-9a5f2f8e5819 + Curve + C + false + b171143f-e5e1-4bc8-92f7-eb329037f691 + 1 + + + + + + 303 + 456 + 15 + 20 + + + 312 + 466 + + + + + + + + Number of segments + c4252d68-c3f0-4449-bc33-3963a1f5b379 + Count + N + false + 29e2f8ae-0691-4716-b2aa-ed4e1856e898 + 1 + + + + + + 303 + 476 + 15 + 20 + + + 312 + 486 + + + + + + 1 + + + + + 1 + {0} + + + + + 10 + + + + + + + + + + + Split segments at kinks + c67cd2ce-aeaf-48f1-b87d-ae648d16cb78 + Kinks + K + false + 0 + + + + + + 303 + 496 + 15 + 20 + + + 312 + 506 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Division points + 02d756d0-695e-4b84-977a-5211a88fe540 + Points + P + false + 0 + + + + + + 348 + 456 + 16 + 20 + + + 356 + 466 + + + + + + + + 1 + Tangent vectors at division points + ff7cd25b-7346-40cf-93bd-b862456b2fad + Tangents + T + false + 0 + + + + + + 348 + 476 + 16 + 20 + + + 356 + 486 + + + + + + + + 1 + Parameter values at division points + 9f8a284b-b097-43d8-8703-768571059955 + Parameters + t + false + 0 + + + + + + 348 + 496 + 16 + 20 + + + 356 + 506 + + + + + + + + + + + + 2a5cfb31-028a-4b34-b4e1-9b20ae15312e + Cross Product + + + + + Compute vector cross product. + d6cabb95-93fe-48fe-9b1b-2070fdd10e56 + Cross Product + XProd + + + + + + 434 + 491 + 66 + 64 + + + 466 + 523 + + + + + + First vector + 7677fda3-a48e-4b19-9a38-3848beb2729e + Vector A + A + false + ff7cd25b-7346-40cf-93bd-b862456b2fad + 1 + + + + + + 436 + 493 + 15 + 20 + + + 445 + 503 + + + + + + + + Second vector + ab1ebaa3-5740-431c-8fc9-a779c8b99336 + Vector B + B + false + 351348f7-2844-4518-aa54-7e8529b995cf + 1 + + + + + + 436 + 513 + 15 + 20 + + + 445 + 523 + + + + + + + + Unitize output + 45f1c846-268d-49fd-a50d-dcd25e91cccc + Unitize + U + false + 0 + + + + + + 436 + 533 + 15 + 20 + + + 445 + 543 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Cross product vector + 633bc054-2115-4c2b-8be8-c286377bce3d + Vector + V + false + 0 + + + + + + 481 + 493 + 17 + 30 + + + 489.5 + 508 + + + + + + + + Vector length + 8243a1a9-6216-4bc2-93b0-d7d17da9a8c7 + Length + L + false + 0 + + + + + + 481 + 523 + 17 + 30 + + + 489.5 + 538 + + + + + + + + + + + + bc3e379e-7206-4e7b-b63a-ff61f4b38a3e + Construct Plane + + + + + Construct a plane from an origin point and {x}, {y} axes. + true + 3974a64b-9fea-4aa6-a9ad-21315ef8260a + Construct Plane + Pl + + + + + + 523 + 456 + 68 + 64 + + + 555 + 488 + + + + + + Origin of plane + ada5ea08-627b-4ef2-9244-2c11db2d896f + Origin + O + false + 02d756d0-695e-4b84-977a-5211a88fe540 + 1 + + + + + + 525 + 458 + 15 + 20 + + + 534 + 468 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + X-Axis direction of plane + 07101ef1-80e2-4825-a3da-9039e03fb50f + X-Axis + X + false + ff7cd25b-7346-40cf-93bd-b862456b2fad + 1 + + + + + + 525 + 478 + 15 + 20 + + + 534 + 488 + + + + + + 1 + + + + + 1 + {0} + + + + + + 1 + 0 + 0 + + + + + + + + + + + + Y-Axis direction of plane + c37c73c0-ad8c-442c-941a-484cdb43364c + Y-Axis + Y + false + 633bc054-2115-4c2b-8be8-c286377bce3d + 1 + + + + + + 525 + 498 + 15 + 20 + + + 534 + 508 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + 0 + + + + + + + + + + + + Constructed plane + 44d4a187-3a93-413f-992e-d4cc7e2e19ad + Plane + Pl + false + 0 + + + + + + 570 + 458 + 19 + 60 + + + 579.5 + 488 + + + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAYFJREFUSEu1lLFxwzAMRVWn8gApNIKKDOAubbqk1AgeQRP4NIJG0AgqMoCq1BpBGzD/ywANkbAt3dm4eyfwkwBEElIRQngprvhMXHEL7+ff0tNTXFFBkhqMIAgz6MG3+AcvzuKKDJRETDqBFjSgE005efEWV0QgEzJBl+gs/CdzZLTzHpmAoEqCe9VgNWjePj5/oHMn3B13xnV37yITJEEMhH0BOsrqWLBuuQfYEVR2btFTAQEDmHQMawCdyTyZzCYeAAeEfrz8VXKC5Mv2dQzrJFALWDyNtDFeHQXJ0yOybzcD3scJWJ3YnQyazytQSoHlkmG6Az5XfQ9jMTosbIveLkCQnG2qBRg8p2tk7iDzHFhiI2RBFpi+YWzZFFgFRlnHYs1q3g5SYL0E1t78FlyRwLh9OiTr76344iW5Xq57/lvJhaIogZ6psunX7JEL11azH1H8cPaSC9fE/EW04se+3ksu5MdDbrbpI3Lh0tf246H/ki7iv+Xoze/BFZ9HKP4BuwtzfPsUblIAAAAASUVORK5CYII= + + false + 0bd900d0-2016-4c53-af3b-1c52cf194064 + true + true + Inverse Kinematics + IK + + + + + + 652 + 287 + 207 + 84 + + + 767 + 329 + + + + + + 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. + a98f5131-0055-48d7-a0c2-fe32212117c6 + robot + robot + true + 0 + true + 846547a4-0964-4bea-b2e5-d3fd03e0ff69 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 654 + 289 + 98 + 20 + + + 704.5 + 299 + + + + + + + + true + The plane or frame to calculate the inverse kinematic for. + 84d72e79-136b-457e-8f5b-27843e5bf7b3 + plane + plane + true + 0 + true + 3a86f18b-7506-4d48-8a5c-6048a1108886 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 654 + 309 + 98 + 20 + + + 704.5 + 319 + + + + + + + + true + If passed, calculates the inverse such that the joint positions differ the least from the start_configuration. Defaults to the zero configuration. + 1682b475-974e-4465-847b-6f521d231a4b + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 654 + 329 + 98 + 20 + + + 704.5 + 339 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 9da8c8d9-ac45-43a1-8553-97c0c52b171a + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 654 + 349 + 98 + 20 + + + 704.5 + 359 + + + + + + + + The planning group's configuration. + ac00155a-4a35-4e0d-98f3-e0b82a464386 + configuration + configuration + false + 0 + + + + + + 782 + 289 + 75 + 80 + + + 819.5 + 329 + + + + + + + + + + + + + + 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 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAd9JREFUSEu1lTFLw0AYho92ENShVFHE1p4ILipkcBXqDxA6OQfHThn8ARk7OBQdXfIPzOyUwUFwKfgHSifBJU7idL7f9S7ctV+bVHB4yN17+Z4vuZxVKKX+FTacRYjnBpdXgQ1dIJdgyK1VgQ1dIA/BiFurAhu6QJ4CDP62TWzoAnFuGvS49TLY0AJpYOREwt1TBhtaII2cBmPunjLY0AJp5jQgJHffMtjQBdIYZNxaFdjQZVmDo44MwdLmbEi8CNGl66Z4GqzV0zcai0fRBcVxhTwGGM7XW9gQ8hAoMLhpXXyLIFYQJ2ACRvKk3Yd4RHJDDhIw9428CeHILUnzTvQhzoHaudqeSqWc4Jrp8VRuGwWur0xORBA3wNfG7bqWU5P6fe398PhgQHOqxbVrGng/K4vkOUhNpl8bDXqds9Zn57T9U3uo0Zaprevmh21AYBzRHBR/9VbeAxmIgPeKBAro6fQHBa9oNNy73E3b5/u6gVkj9BsB2rqYaj3RIkyx3p5VoFpWuAgU0R4X5x5j75hiTG9K8shmRXEVUDg0gtDMZxvYo6u/G+EJykBhA4yNhOS2IT25lRdPT3iCKkAggT3/LrR9npzwJqsAWQBsI/pNYv/jzQWrAKk+vtzaFCV+ASnZhhTkLZwXAAAAAElFTkSuQmCC + + false + d93333c1-6121-4133-94e5-b1cdbd79792d + true + true + Constraints From Plane + Constraints From Plane + + + + + + 501 + 973 + 193 + 144 + + + 614 + 1045 + + + + + + 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. + cbf6a458-85d1-42a7-94f7-416fdfa1b2f0 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 503 + 975 + 96 + 20 + + + 552.5 + 985 + + + + + + + + true + The plane or frame from which we create position and orientation constraints. + 87942239-75a1-43f9-98a8-39af07ed3dbf + plane + plane + true + 0 + true + 1b843cc6-0c2b-4427-85b3-c5303911f7e9 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 503 + 995 + 96 + 20 + + + 552.5 + 1005 + + + + + + + + true + The planning group for which we specify the constraint. Defaults to the robot's main planning group. + 5f458976-1a25-4cf2-bb59-977ecaa69acf + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 503 + 1015 + 96 + 20 + + + 552.5 + 1025 + + + + + + + + true + The allowed tolerance to the frame's position (defined in the robot's units). Defaults to 0.001 + f4df44e0-61e9-4a9c-adc5-322c77ee723c + tolerance_position + tolerance_position + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 503 + 1035 + 96 + 20 + + + 552.5 + 1045 + + + + + + + + true + The allowed tolerance of the frame's X-axis in degrees. + 38431b6b-d582-43ce-b820-9189820976ff + tolerance_xaxis + tolerance_xaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 503 + 1055 + 96 + 20 + + + 552.5 + 1065 + + + + + + + + true + The allowed tolerance of the frame's Y-axis in degrees. + 27304578-70c5-46fe-966d-55f6d2a284f3 + tolerance_yaxis + tolerance_yaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 503 + 1075 + 96 + 20 + + + 552.5 + 1085 + + + + + + + + true + The allowed tolerance of the frame's Z-axis in degrees. + 745b4728-c179-4f50-ad5c-43f1ca9fb8f8 + tolerance_zaxis + tolerance_zaxis + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 503 + 1095 + 96 + 20 + + + 552.5 + 1105 + + + + + + + + A list containing a position and an orientation constraint. + 1a96f4f6-fa5c-4bec-8121-df8feb673fae + constraints + constraints + false + 0 + + + + + + 629 + 975 + 63 + 140 + + + 660.5 + 1045 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + 8a1cd44e-8393-4da1-ba94-6a53dd4e3f37 + List Item + Item + + + + + + 240 + 988 + 64 + 64 + + + 274 + 1020 + + + + + + 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 + 5adfeb6c-e7f6-49be-a873-3d13194ccef5 + List + L + false + 55db7485-e593-4762-a166-64303d976c7a + 1 + + + + + + 242 + 990 + 17 + 20 + + + 252 + 1000 + + + + + + + + Item index + 3c505437-9eea-46c1-ab35-c8afc8032305 + Index + i + false + 0 + + + + + + 242 + 1010 + 17 + 20 + + + 252 + 1020 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 578930d2-94b0-4edd-8d4a-cd8a25689009 + Wrap + W + false + 0 + + + + + + 242 + 1030 + 17 + 20 + + + 252 + 1040 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 1b843cc6-0c2b-4427-85b3-c5303911f7e9 + false + Item + i + false + 0 + + + + + + 289 + 990 + 13 + 60 + + + 295.5 + 1020 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Plan Motion + + + + + """ +Calculate a motion path. + +COMPAS FAB v0.27.0 +""" +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.ghpython.components import create_id + + +class PlanMotion(component): + def RunScript(self, robot, goal_constraints, start_configuration, group, attached_collision_meshes, path_constraints, planner_id, compute): + + key = create_id(self, 'trajectory') + + path_constraints = list(path_constraints) if path_constraints else None + attached_collision_meshes = list(attached_collision_meshes) if attached_collision_meshes else None + planner_id = str(planner_id) if planner_id else 'RRTConnect' + + if robot and robot.client and robot.client.is_connected and start_configuration and goal_constraints and compute: + st[key] = robot.plan_motion(goal_constraints, + start_configuration=start_configuration, + group=group, + options=dict( + attached_collision_meshes=attached_collision_meshes, + path_constraints=path_constraints, + planner_id=planner_id, + )) + + trajectory = st.get(key, None) + return trajectory + + Calculate a motion path. +COMPAS FAB v0.27.0 + true + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDwAACw8BkvkDpQAAAY1JREFUSEu1lM1tAjEQhSmBDkgJFMCBEnKJuKYESuAQiRoicaADKIEOkgK455icckHK5n3e8WbsHRJAG0sfjOc9478xo6Zp/pUwOSRhckjC5LWojcVWHMRezDvNGz1qM7ETm0j3qL0KAk+a5NyAtTO+iQ3fZ7z3Ins9+6QHAybGpyDBj58sPgb+lWk1h6QHA14EP/gkZpZjEgJ2M6n8U9NqVkn3ZhuQV1ucvdqD4OjWPm9avQvuZJy0wPxuprR6l6dCCN593ul3Yg5Fvui0Z78UC583jTyBuqUGahwjiyt3XnTasiTorVKNydGXtWZ63nm63C5fdP4+hiOaiHZIcRD8OgHHwCTh41ILV2kaY4t7S/kuaC+JaoBHb3IedvAl6grj1RNAsbtsoJY/zJDZeqP58iPkLrr3YH2Ck/cnzQz8QRHUTHsD2h0QpFetxtt4Fhztruc3U77cmqKmzbsQTMJ9+HG9B5j86eOKHZifms8FQSKsrORNHxfewS38BBdU0S2EySEJk0MSJoejGX0DqCUOkgYB1loAAAAASUVORK5CYII= + + false + 54d5165c-c7b9-4b61-a3f4-725adfe6cedb + true + true + Plan Motion + Plan Motion + + + + + + 895 + 884 + 224 + 164 + + + 1046 + 966 + + + + + + 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. + 3ab0c3a7-74d4-4e20-8d40-f9d959596a64 + robot + robot + true + 0 + true + 538c02c6-6b3b-4712-a784-dda0bc63f847 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 897 + 886 + 134 + 20 + + + 965.5 + 896 + + + + + + + + 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. + e4550953-1c4d-4196-accf-09e0629aecf8 + goal_constraints + goal_constraints + true + 1 + true + 1a96f4f6-fa5c-4bec-8121-df8feb673fae + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 897 + 906 + 134 + 20 + + + 965.5 + 916 + + + + + + + + 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. + 045b29a2-7cdc-4ea7-b8be-65710ec81364 + start_configuration + start_configuration + true + 0 + true + c666c109-2ccb-4c50-90cd-00130af76eaa + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 897 + 926 + 134 + 20 + + + 965.5 + 936 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + bc8ad3dc-fbe4-440a-98c4-151f7e612cbb + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 897 + 946 + 134 + 20 + + + 965.5 + 956 + + + + + + + + 1 + true + A list of attached collision meshes to be included for planning. + 8ef44a5c-ec14-4d30-9c85-7fed0cea4feb + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 897 + 966 + 134 + 20 + + + 965.5 + 976 + + + + + + + + 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. + 79c1632c-fba5-40b8-a628-530ad610655d + path_constraints + path_constraints + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 897 + 986 + 134 + 20 + + + 965.5 + 996 + + + + + + + + true + The name of the algorithm used for path planning. Defaults to 'RRTConnect' + 59c97f48-1889-4f3b-b990-cedd3ddf9849 + planner_id + planner_id + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 897 + 1006 + 134 + 20 + + + 965.5 + 1016 + + + + + + + + true + If True, calculates a trajectory. + 2dd1af7b-a420-4d72-8c10-01811c07df29 + compute + compute + true + 0 + true + e8dd8875-225b-4b6d-a8de-4f454ff7d868 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 897 + 1026 + 134 + 20 + + + 965.5 + 1036 + + + + + + + + The calculated trajectory. + 4e17b2ad-e9af-41eb-b6a5-7585e1f6e333 + trajectory + trajectory + false + 0 + + + + + + 1061 + 886 + 56 + 160 + + + 1089 + 966 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + e8dd8875-225b-4b6d-a8de-4f454ff7d868 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 735 + 1033 + 104 + 22 + + + + + + + + + + b83c36e8-c587-4607-a4b3-d9fdad45d185 + 1c9de8a1-315f-4c56-af06-8f69fee80a7a + Flip Plane + + + + + Flip a plane by specified axes with the option of using a guide plane. + 711d6fa3-3862-4211-a255-f8c00962a10d + Flip Plane + FlipPln + + + + + + 701 + 443 + 67 + 104 + + + 734 + 495 + + + + + + Plane to flip + abc3aafd-8660-4da2-b7a9-b9b7e034def6 + Plane + Pl + false + 44d4a187-3a93-413f-992e-d4cc7e2e19ad + 1 + + + + + + 703 + 445 + 16 + 20 + + + 712.5 + 455 + + + + + + + + Optional guide plane to determine if the plane should flip, based on the guide plane axis angle to the axis of plane to flip + 70ee89b8-6d85-4c25-a81f-6e6012e6adde + Guide + G + true + 0 + + + + + + 703 + 465 + 16 + 20 + + + 712.5 + 475 + + + + + + + + Flip the planes X axis + 46e3bfc4-b95f-44bc-908c-be468fd2a325 + Flip X + X + false + 0 + + + + + + 703 + 485 + 16 + 20 + + + 712.5 + 495 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Flip the planes Y axis + 21e47292-bdcc-4ecc-9890-bf40fedfefdc + Flip Y + Y + false + 0 + + + + + + 703 + 505 + 16 + 20 + + + 712.5 + 515 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Flip the planes Z axis + 1352c30f-e3c9-4c38-800e-8703728f4f9d + Flip Z + Z + false + 0 + + + + + + 703 + 525 + 16 + 20 + + + 712.5 + 535 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Resulting flipped plane + a4e35366-aed9-4624-91f1-08abb1a092fd + Flipped + F + false + 0 + + + + + + 749 + 445 + 17 + 50 + + + 757.5 + 470 + + + + + + + + True if plane was flipped, False if plane was not flipped + 4aa67233-ed42-4970-aca1-04b6a9204c9f + Result Boolean + R + false + 0 + + + + + + 749 + 495 + 17 + 50 + + + 757.5 + 520 + + + + + + + + + + + + c75b62fa-0a33-4da7-a5bd-03fd0068fd93 + Length + + + + + Measure the length of a curve. + 82925fd3-04a6-43fd-b0d9-4f5ac76f5164 + Length + Length + + + + + + 165 + 582 + 113 + 28 + + + 217 + 596 + + + + + + Curve to measure + 3dd9f0a4-4130-46ee-b15a-60a50b2081ed + Curve + Curve + false + b171143f-e5e1-4bc8-92f7-eb329037f691 + 1 + + + + + + 167 + 584 + 35 + 24 + + + 186 + 596 + + + + + + + + Curve length + 22324d9c-1db7-4119-ab0a-f29b2d26ecec + Length + Length + false + 0 + + + + + + 232 + 584 + 44 + 24 + + + 254 + 596 + + + + + + + + + + + + 9c85271f-89fa-4e9f-9f4a-d75802120ccc + Division + + + + + Mathematical division + 3088c1eb-5774-4a52-a45b-0c5e5ceb855a + Division + Division + + + + + + 313 + 584 + 88 + 44 + + + 344 + 606 + + + + + + Item to divide (dividend) + 47da8bfe-c1da-4f74-a11b-b06932d38c73 + A + A + false + 22324d9c-1db7-4119-ab0a-f29b2d26ecec + 1 + + + + + + 315 + 586 + 14 + 20 + + + 323.5 + 596 + + + + + + + + Item to divide with (divisor) + 3811c975-ae02-4230-a028-5535d140cbbe + B + B + false + 2ce4c58d-2617-4b79-8e81-14b3460140bb + 1 + + + + + + 315 + 606 + 14 + 20 + + + 323.5 + 616 + + + + + + + + The result of the Division + 5f710da3-94ce-40e4-825e-975b6ea5a40f + Result + Result + false + 0 + + + + + + 359 + 586 + 40 + 40 + + + 379 + 606 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 2ce4c58d-2617-4b79-8e81-14b3460140bb + Number Slider + Number Slider + false + 0 + + + + + + 80 + 610 + 203 + 20 + + + 80.59531 + 610.9491 + + + + + + 2 + 1 + 0 + 0.1 + 0 + 0 + 0.05 + + + + + + + + + 2e3ab970-8545-46bb-836c-1c11e5610bce + Integer + + + + + Contains a collection of integer numbers + 29e2f8ae-0691-4716-b2aa-ed4e1856e898 + Integer + Integer + false + 5f710da3-94ce-40e4-825e-975b6ea5a40f + 1 + + + + + + 441 + 596 + 50 + 24 + + + 466.0125 + 608.345 + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file