From cd6f43112c20df795b1792cd8052f38b9e6afbda Mon Sep 17 00:00:00 2001 From: LinCheWei Date: Mon, 21 Mar 2022 22:10:35 +0100 Subject: [PATCH 1/3] upload assignment 03 --- .../Lin_chewei/assignment-03.json | 1 + .../assignment_03/Lin_chewei/assignment_03.py | 60 + .../assignment_03/Lin_chewei/robot_ik.jpg | Bin 0 -> 106357 bytes .../Lin_chewei/solution_viewer.ghx | 2307 +++++++++++++++++ 4 files changed, 2368 insertions(+) create mode 100644 lecture_04/assignment_03/Lin_chewei/assignment-03.json create mode 100644 lecture_04/assignment_03/Lin_chewei/assignment_03.py create mode 100644 lecture_04/assignment_03/Lin_chewei/robot_ik.jpg create mode 100644 lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx diff --git a/lecture_04/assignment_03/Lin_chewei/assignment-03.json b/lecture_04/assignment_03/Lin_chewei/assignment-03.json new file mode 100644 index 0000000..3cd4b39 --- /dev/null +++ b/lecture_04/assignment_03/Lin_chewei/assignment-03.json @@ -0,0 +1 @@ +[{"dtype": "compas.robots/Configuration", "value": {"joint_values": [0.22544341204728363, -2.0968085857698457, -2.128177623592219, -0.4874039665304446, 1.5707951025366123, 1.7962398912533473], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-0.027166413891432185, -2.0032502003286217, -2.3434720084221143, -0.3683795965084574, 1.6704280842019585, 1.5434947470166338], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-0.36759775052655236, -1.9494596879232018, -2.4053871518660137, -0.4292859513624741, 1.754852352910178, 1.196575831466971], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-0.7516654957685005, -1.9465492727639666, -2.3061039799652217, -0.6617960819855494, 1.782294398644407, 0.7976109038045373], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.1073947485684787, -2.0174820314868875, -2.088910007947618, -0.9496168778794705, 1.737578262420177, 0.43439612569123875], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.4135740616616774, -2.1390635561297233, -1.8161799382694923, -1.2158479039195114, 1.6408770283030758, 0.14085464317423715], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.680609028110169, -2.219128636446844, -1.6828365453824001, -1.188851434662567, 1.5300835851476766, -0.10201498277241407], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.9354865452626713, -2.266674216902976, -1.6261868072769476, -1.0927872964634988, 1.4681305559295035, -0.35056289935626933], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-2.188250312646932, -2.301318770249356, -1.6023863102259377, -0.9703320935575104, 1.4570072257517943, -0.6082271089161407], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-2.4442081366746335, -2.351104061373698, -1.5437112211358086, -0.8817071181930184, 1.4944501181389513, -0.8709616133734153], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-2.6933975667893493, -2.432441064645617, -1.4030362191325068, -0.8769116919401005, 1.5707963226896162, -1.1226012405363799], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}] \ No newline at end of file diff --git a/lecture_04/assignment_03/Lin_chewei/assignment_03.py b/lecture_04/assignment_03/Lin_chewei/assignment_03.py new file mode 100644 index 0000000..b026e39 --- /dev/null +++ b/lecture_04/assignment_03/Lin_chewei/assignment_03.py @@ -0,0 +1,60 @@ +import os +import compas +from compas_fab.backends import RosClient +from compas_fab.robots import Configuration + +from compas.geometry import Frame +from compas.geometry import Point +from compas.geometry import Vector + + +# Step 1: Inside this function, complete the main part of the solution for the assignment: +# - Taking a robot and a list of frames as parameter, calculate a feasible configuration for each of the frames +# - Try to find an optimal start_configuration for each so that the motion from one config to the next is minimized +def calculate_ik_for_frames(robot, frames): + configs = [] + previous_config = robot.zero_configuration() + previous_config.joint_values = (0.15, -2.01, -1.08, -0.97, 1.55, 0.0) + + for frame in frames: + _config = robot.inverse_kinematics(frame, previous_config) + configs.append(_config) + previous_config = _config + + return configs + + +# Step 2: store all found configurations in a JSON file using compas.json_dump or compas.json_dumps +def store_configurations(configurations, filename): + compas.json_dump(configurations, filename) + + +# Use the following to test from the command line +# Or copy solution_viewer.ghx next to the folder where you created assignment_03.py to visualize the same in Grasshopper +if __name__ == '__main__': + + frames = [ + Frame(Point(-0.329, 0.059, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000)), + Frame(Point(-0.260, 0.129, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(-0.186, 0.194, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(-0.106, 0.252, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(-0.020, 0.299, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.074, 0.329, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.500)), + Frame(Point(0.172, 0.330, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.263, 0.295, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(0.339, 0.233, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(0.400, 0.155, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(0.448, 0.070, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000))] + + # Loads the robot from ROS + with RosClient('localhost') as client: + robot = client.load_robot() + + # Step 1: calculate IK solutions for each frame + configurations = calculate_ik_for_frames(robot, frames) + print("Found {} configurations".format(len(configurations))) + + # Step 2: store all configurations in a JSON file + filename = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'assignment-03.json') + store_configurations(configurations, filename) + print("Stored results in {}".format(filename)) diff --git a/lecture_04/assignment_03/Lin_chewei/robot_ik.jpg b/lecture_04/assignment_03/Lin_chewei/robot_ik.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39650d0e15e5c0b0327a61e7786e862d5544e8b1 GIT binary patch literal 106357 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 literal 0 HcmV?d00001 diff --git a/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx b/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx new file mode 100644 index 0000000..690841a --- /dev/null +++ b/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx @@ -0,0 +1,2307 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + 267186b6-22d4-4301-830e-efc68b78e363 + Shaded + 1 + + 100;150;0;0 + + + 100;0;150;0 + + + + + + 637515172939181553 + + solution_viewer.ghx + + + + + 0 + + + + + + -600 + -120 + + 1.17647052 + + + + + 0 + + + + + + + 0 + + + + + 1 + + + + + Elk.Mapping, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + 1.0.0.0 + timothy.b.logan@gmail.com + 00000000-0000-0000-0000-000000000000 + + + + + + + + + 19 + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + c7d255bb-e9cf-4deb-b4de-248fedfcc9fd + Boolean Toggle + Connect + false + 0 + true + + + + + + 31 + 228 + 113 + 22 + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 1e891ee1-8c8e-4909-bfa8-9478fe5871e0 + Boolean Toggle + Load + false + 0 + true + + + + + + 29 + 252 + 96 + 22 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + 16792f65-ce66-4c57-8894-6616e5c283b2 + c7d255bb-e9cf-4deb-b4de-248fedfcc9fd + 1e891ee1-8c8e-4909-bfa8-9478fe5871e0 + 84446ac2-e8f7-4c7d-9d31-dab3deade42d + eccb9686-8536-4332-975d-684efb918cee + ed6dd17e-9615-4209-9f27-8c842a439b86 + 6 + ca5efeaf-96ea-4f51-8b8c-044bf95f301c + Group + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + # NOTE: Don't write you solution here! +# Write the code in the assignment_03.py and if +# the file is located in the same folder as this GH file +# then Grasshopper will find it and import it +from compas_ghpython import unload_modules +from compas.geometry import Frame, Point, Vector +unload_modules('assignment_03') + +try: + from assignment_03 import calculate_ik_for_frames +except ImportError: + raise Exception("Please make sure you have the file assignment_03.py in the same location as this GH file") + +from compas_fab.ghpython.components import coerce_frame + +frames = [ + Frame(Point(-0.329, 0.059, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000)), + Frame(Point(-0.260, 0.129, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(-0.186, 0.194, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(-0.106, 0.252, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(-0.020, 0.299, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.074, 0.329, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.500)), + Frame(Point(0.172, 0.330, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.263, 0.295, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(0.339, 0.233, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(0.400, 0.155, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(0.448, 0.070, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000))] + +configuration = calculate_ik_for_frames(robot, frames) + + GhPython provides a Python script component + + 43 + 69 + + + 1114 + 826 + + true + true + false + 205c786a-b8cf-4a07-8455-eea7b91954d2 + false + true + GhPython Script + Python + + + + + + 785 + 241 + 156 + 44 + + + 844 + 263 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + ba3333a4-a4af-41c9-9db8-4a84ea6a37df + robot + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 787 + 243 + 42 + 20 + + + 809.5 + 253 + + + + + + + + 1 + true + Script input frames. + c640367c-4d94-4702-8a36-9b422631f663 + frames + frames + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 787 + 263 + 42 + 20 + + + 809.5 + 273 + + + + + + + + Script output configuration. + 66f1bdea-7701-4476-b28d-6ea50cb1a15e + configuration + configuration + false + 0 + + + + + + 859 + 243 + 80 + 40 + + + 899 + 263 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + 7198f137-5adf-40bd-9365-ce004651bcdf + List Item + Item + + + + + + 989 + 251 + 65 + 64 + + + 1024 + 283 + + + + + + 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 + a71a26e2-bc83-4c3a-bb49-8f2a379f82e6 + List + L + false + 66f1bdea-7701-4476-b28d-6ea50cb1a15e + 1 + + + + + + 991 + 253 + 18 + 20 + + + 1001.5 + 263 + + + + + + + + Item index + 7da95829-d7e8-4d73-b01e-2a3b037c616a + Index + i + false + 9c88f1df-80d2-4fc0-a569-528fab1a8314 + 1 + + + + + + 991 + 273 + 18 + 20 + + + 1001.5 + 283 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 5349e571-6e69-4fef-be96-8ba696ebf207 + Wrap + W + false + 0 + + + + + + 991 + 293 + 18 + 20 + + + 1001.5 + 303 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 6c5c47d3-b49d-4dbf-a287-2305b02558e7 + false + Item + i + false + 0 + + + + + + 1039 + 253 + 13 + 60 + + + 1045.5 + 283 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 9c88f1df-80d2-4fc0-a569-528fab1a8314 + Number Slider + + false + 0 + + + + + + 780 + 321 + 162 + 20 + + + 780.9314 + 321.8065 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 0 + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + 205c786a-b8cf-4a07-8455-eea7b91954d2 + 7198f137-5adf-40bd-9365-ce004651bcdf + 9c88f1df-80d2-4fc0-a569-528fab1a8314 + 716141ca-3bd8-4b27-8dca-290a69e4a2eb + 4 + a10ab389-c3a2-495c-979b-e89e0f6f17c4 + Group + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + ROS Connect + + + + + """ +Connect or disconnect to ROS. + +COMPAS FAB v0.22.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.22.0 + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC + + false + eccb9686-8536-4332-975d-684efb918cee + true + true + ROS Connect + ROS + + + + + + 176 + 187 + 159 + 64 + + + 241 + 219 + + + + + + 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. + cbcceb8e-d113-460c-8c91-6474031ab1a7 + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 178 + 189 + 48 + 20 + + + 203.5 + 199 + + + + + + + + true + The port of ROS. Defaults to 9090. + 23ab18d4-0816-4280-b382-e2cbdab4caa9 + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 178 + 209 + 48 + 20 + + + 203.5 + 219 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + da4e32db-96ba-40c4-b661-67c91677a2ed + connect + connect + true + 0 + true + c7d255bb-e9cf-4deb-b4de-248fedfcc9fd + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 178 + 229 + 48 + 20 + + + 203.5 + 239 + + + + + + + + The ROS client. + 20b3b82c-7d50-4449-b49c-d0195f7b838a + ros_client + ros_client + false + 0 + + + + + + 256 + 189 + 77 + 30 + + + 294.5 + 204 + + + + + + + + True if connection established. + f636540e-bf52-4933-9f75-bdfdc23e479c + is_connected + is_connected + false + 0 + + + + + + 256 + 219 + 77 + 30 + + + 294.5 + 234 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + ROS Robot + + + + + """ +Load robot directly from ROS. + +COMPAS FAB v0.22.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.22.0 + + 156 + 156 + + + 558 + 530 + + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC + + false + ed6dd17e-9615-4209-9f27-8c842a439b86 + true + true + ROS Robot + Robot + + + + + + 381 + 229 + 129 + 44 + + + 454 + 251 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + 9df689c7-f25f-4820-b9e3-e243f1ac71db + ros_client + ros_client + true + 0 + true + 20b3b82c-7d50-4449-b49c-d0195f7b838a + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 383 + 231 + 56 + 20 + + + 412.5 + 241 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + 28374d3d-390d-4b67-88a5-0746309c0629 + load + load + true + 0 + true + 1e891ee1-8c8e-4909-bfa8-9478fe5871e0 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 383 + 251 + 56 + 20 + + + 412.5 + 261 + + + + + + + + The robot. + d4bae7b0-750f-4b86-a929-7bf58d55c307 + robot + robot + false + 0 + + + + + + 469 + 231 + 39 + 40 + + + 488.5 + 251 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Robot Visualize + + + + + """ +Visualizes the robot. + +COMPAS FAB v0.22.0 +""" +from compas.geometry import Frame +from compas.geometry import Transformation +from compas_ghpython.artists import FrameArtist +from compas_ghpython.artists import MeshArtist +from ghpythonlib.componentbase import executingcomponent as component + + +class RobotVisualize(component): + def RunScript(self, robot, group, configuration, attached_collision_meshes, show_visual, show_collision, + show_frames, show_base_frame, show_end_effector_frame, show_acm): + + visual = None + collision = 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 + 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 = FrameArtist(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 = FrameArtist(ee_compas_frame) + ee_frame = artist.draw() + + if show_frames: + frames = [] + for compas_frame in compas_frames[1:]: + artist = FrameArtist(compas_frame) + frame = artist.draw() + frames.append(frame) + + if show_acm: + attached_meshes = [] + for acm in attached_collision_meshes: + frame = robot.forward_kinematics(configuration, options=dict(solver='model', link_name=acm.link_name)) + T = Transformation.from_frame_to_frame(Frame.worldXY(), frame) + mesh = acm.collision_mesh.mesh.transformed(T) + attached_meshes.append(MeshArtist(mesh).draw()) + + return (visual, collision, attached_meshes, frames, base_frame, ee_frame) + + Visualizes the robot. +COMPAS FAB v0.22.0 + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/zt2jtm9VSLEg+9ud2bnn9nZu1spiuJfyRqXSdb4F3ZvX1vigmfOXzP8FQm/iEJ8iH7qjyZUIUZiIgjseb9HvjMxE4jbE4jt2Lo0CGca0BOI3Ti8nzGFdYTFv9cShAWlUzyK6zC/E9aGHFFbND8Q1c5TBwHPgiQPYU4C2uZFPVEbNa/aA9wqg5wIE2RP6AuSsH2DAzV/2Q49aRPtwzYzTW5VBXKwC+sjIvQ+qiiso52IWSG00B941CKfwA7UDs0qqiUJ61nnD5z10ffALe2hb48x8Ws88lEIhWWLqBnC4jQBRIUsStYosdxbUx6croFgAJcWo6st5sE+ruw28EiMbfs3xbjBnxWKEw8quw1SEEvEgaQtCQydWJv1zjb3OpFoisT8G2KMJNINYlBWq8t2NfQakWCKxH48cAlNg+CT8AmPvUYkCArmq82JRmydnJeCa+sbX42dvfsgPk31ogko2L7kX9m+GpcJYLXR/AzjqD0QTUDBCyWA5v5hlSTQTfWiCSiQX4X91H5l8+jUzgHeUi2oGZZN1rg8ipVvhzuVIxcFIsQAAAAASUVORK5CYII= + + false + 10a49928-eb17-4269-a1f5-98ee19233fed + true + true + Robot Visualize + Robot Visualize + + + + + + 1248 + 226 + 278 + 204 + + + 1409 + 328 + + + + + + 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 + 6 + 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. + 5665115c-dc6f-4b96-b649-90363f6f156d + robot + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 1250 + 228 + 144 + 20 + + + 1323.5 + 238 + + + + + + + + true + The planning group used for end-effector and base visualization. + 19283912-83ba-4eb0-ba1c-6f5ac3311327 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 1250 + 248 + 144 + 20 + + + 1323.5 + 258 + + + + + + + + true + The robot's full configuration. + 1fca49ea-0635-4a0a-b95b-c9f257682b15 + configuration + configuration + true + 0 + true + 6c5c47d3-b49d-4dbf-a287-2305b02558e7 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1250 + 268 + 144 + 20 + + + 1323.5 + 278 + + + + + + + + 1 + true + A list of attached collision meshes. + 651066a0-4de6-4d81-960c-74dd5ebba2c2 + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1250 + 288 + 144 + 20 + + + 1323.5 + 298 + + + + + + + + true + Whether or not to show the robot's visual meshes. + fd6c0bb5-7a57-4ca6-81c0-035515585a87 + show_visual + show_visual + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 308 + 144 + 20 + + + 1323.5 + 318 + + + + + + + + true + Whether or not to show the robot's collision meshes. + dac981a0-3655-427f-83bb-869a928c361c + show_collision + show_collision + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 328 + 144 + 20 + + + 1323.5 + 338 + + + + + + + + true + Whether or not to show the robot's joint frames. + de2c0813-2228-47c0-a1fb-25fecad1fc57 + show_frames + show_frames + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 348 + 144 + 20 + + + 1323.5 + 358 + + + + + + + + true + Whether or not to show the robot's base frame. + 7639b92d-56d4-4e95-8462-1a3570422d31 + show_base_frame + show_base_frame + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 368 + 144 + 20 + + + 1323.5 + 378 + + + + + + + + true + Whether or not to show the robot's end-effector frame. + f438ee13-4ba8-4090-9a27-aaec8905fe02 + show_end_effector_frame + show_end_effector_frame + true + 0 + true + 5e3279a2-6f98-4b23-ae56-5659c1281c18 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 388 + 144 + 20 + + + 1323.5 + 398 + + + + + + + + true + Whether or not to show the attached collision meshes (if any). + 9222d70d-5e4f-4408-b727-43a01bb10333 + show_acm + show_acm + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 408 + 144 + 20 + + + 1323.5 + 418 + + + + + + + + The robot's visual Rhino meshes (if any). + d172c507-69c0-458a-97b9-642920bb140f + visual + visual + false + 0 + + + + + + 1424 + 228 + 100 + 33 + + + 1474 + 244.6667 + + + + + + + + The robot's collision Rhino meshes (if any). + d53f0b28-0a87-4e89-932c-575be550c6f7 + collision + collision + false + 0 + + + + + + 1424 + 261 + 100 + 33 + + + 1474 + 278 + + + + + + + + The attached collision Rhino meshes (if any). + 2069798a-a5d1-4168-afa3-d64cf6264cd8 + attached_meshes + attached_meshes + false + 0 + + + + + + 1424 + 294 + 100 + 34 + + + 1474 + 311.3333 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 8913b320-9e60-4c95-b721-c90ef3174981 + frames + frames + false + 0 + + + + + + 1424 + 328 + 100 + 33 + + + 1474 + 344.6667 + + + + + + + + The robot's base frame as a Rhino plane (if any). + ba6264fe-2f01-4ec7-abb3-24d0af02a5c3 + base_frame + base_frame + false + 0 + + + + + + 1424 + 361 + 100 + 33 + + + 1474 + 378 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + cc6cd5a6-9a99-4006-be91-e55a54aacf7e + ee_frame + ee_frame + false + 0 + + + + + + 1424 + 394 + 100 + 34 + + + 1474 + 411.3333 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas_fab.robots import Configuration + +config = Configuration.from_revolute_values(x) + + GhPython provides a Python script component + + 104 + 104 + + + 558 + 530 + + true + false + false + e49367ea-4c70-4652-b3b9-6da8dfa54119 + false + true + GhPython Script + Python + + + + + + 964 + 390 + 89 + 44 + + + 993 + 412 + + + + + + 1 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + true + The x script variable + 2986baae-8d51-4402-a267-2eb6653d2a04 + x + x + true + 1 + true + 179679fb-e408-4a60-841d-e86f0575518e + d5363987-91eb-4870-8a34-65cfa65f28a2 + 51bb5ab5-2448-4845-baf7-c80b4960a54b + c9c0291d-bdb2-42c8-8485-e09f9a01e4d2 + f51a9ad8-bd5b-46f4-8576-bd9a6a7d5983 + fb1d170e-71f6-47d3-8fe6-27b378224d69 + 6 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 966 + 392 + 12 + 40 + + + 973.5 + 412 + + + + + + + + The execution information, as output and error streams + 9c63e747-b6bc-4507-8627-1831850545be + out + out + false + 0 + + + + + + 1008 + 392 + 43 + 20 + + + 1029.5 + 402 + + + + + + + + Script output config. + b25441dd-5dac-44ea-ba56-2c253f774dd1 + a + config + false + 0 + + + + + + 1008 + 412 + 43 + 20 + + + 1029.5 + 422 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 179679fb-e408-4a60-841d-e86f0575518e + Number Slider + + false + 0 + + + + + + 777 + 404 + 162 + 20 + + + 777.0078 + 404.0164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 0.15 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + d5363987-91eb-4870-8a34-65cfa65f28a2 + Number Slider + + false + 0 + + + + + + 777 + 426 + 162 + 20 + + + 777.0078 + 426.8164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -2.01 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 51bb5ab5-2448-4845-baf7-c80b4960a54b + Number Slider + + false + 0 + + + + + + 777 + 448 + 162 + 20 + + + 777.0078 + 448.6164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -1.8 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + c9c0291d-bdb2-42c8-8485-e09f9a01e4d2 + Number Slider + + false + 0 + + + + + + 777 + 470 + 162 + 20 + + + 777.0078 + 470.4164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -0.97 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + f51a9ad8-bd5b-46f4-8576-bd9a6a7d5983 + Number Slider + + false + 0 + + + + + + 777 + 492 + 162 + 20 + + + 777.0078 + 492.2163 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 1.55 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + fb1d170e-71f6-47d3-8fe6-27b378224d69 + Number Slider + + false + 0 + + + + + + 777 + 514 + 162 + 20 + + + 777.0078 + 514.804 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -0.41 + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 5e3279a2-6f98-4b23-ae56-5659c1281c18 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 1072 + 378 + 106 + 22 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + e176611a-6234-442e-9cba-7f2bb739da1a + Data + Data + false + 0 + + + + + + 785 + 369 + 50 + 24 + + + 810.05 + 381.65 + + + + + + 1 + + + + + 11 + {0;0} + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.328996061987069 + 0.0589997863205354 + 0.0820025390807471 + 0.999999999999591 + -1.52205983500691E-07 + 8.91832180002542E-07 + -1.52204681098556E-07 + -0.999999999998922 + -1.46036671656503E-06 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.259999175301696 + 0.128999063702886 + 0.0819999383982555 + 0.999999999994021 + -2.5962333247904E-07 + -3.44831737824999E-06 + 8.47852179257528E-08 + -0.99503719925682 + 0.0995036285526145 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.185997720667743 + 0.193997166513972 + 0.0820000822653364 + 0.999999999962178 + -2.0518781610844E-06 + -8.45190313769696E-06 + -3.54466189313374E-07 + -0.980580420532091 + 0.196117410927695 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.105999771888304 + 0.251999039129915 + 0.0819999862265907 + 0.99999999999769 + -5.16465691036329E-07 + -2.0865212969713E-06 + 1.04874966631396E-07 + -0.957826031183761 + 0.287348732356268 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.0199996656424884 + 0.298999726514655 + 0.0820004161657311 + 0.999999999999868 + -2.27512691418152E-09 + -5.14002900926475E-07 + 1.88783653333669E-07 + -0.928476558342992 + 0.371391007709552 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.0740003579052222 + 0.32899951277318 + 0.0820003156010757 + 0.999999999999684 + 1.2490174103617E-07 + -7.8504484119603E-07 + 4.62798664588472E-07 + -0.894426896821608 + 0.44721418385585 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.172000020951436 + 0.329999925909599 + 0.0820000368004187 + 1 + 4.15666271307642E-10 + -1.39294003799795E-09 + 9.03261390553737E-10 + -0.92847668970332 + 0.37139067930895 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.262999939761616 + 0.294999931783999 + 0.0820000454835823 + 0.999999999999999 + -5.07083784980938E-09 + 3.74803633872345E-08 + -1.56268860098311E-08 + -0.957826276381033 + 0.287347915033404 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.338999871865215 + 0.232999946632596 + 0.0820000332816467 + 0.999999999999998 + 2.74710517237015E-09 + 6.87069333086127E-08 + -1.07807833663982E-08 + -0.980580665887247 + 0.196116184156543 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.399999846843165 + 0.154999957387238 + 0.0819999675182763 + 1 + 5.09819622561856E-09 + 2.32074528974202E-08 + 2.76366671573588E-09 + -0.995037189116082 + 0.0995037299600651 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.447999785027379 + 0.0699998851799913 + 0.0819999074090274 + 1 + 7.47030142795755E-10 + 5.71081739908766E-09 + 7.47030133763101E-10 + -1 + 1.58167446951156E-09 + + + + + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file From 062cdb439094560251b9cc371b6d90aa61b60742 Mon Sep 17 00:00:00 2001 From: LinCheWei Date: Mon, 21 Mar 2022 22:10:35 +0100 Subject: [PATCH 2/3] upload assignment 03 --- .../Lin_chewei/assignment-03.json | 1 + .../assignment_03/Lin_chewei/assignment_03.py | 62 + .../assignment_03/Lin_chewei/robot_ik.jpg | Bin 0 -> 106357 bytes .../Lin_chewei/solution_viewer.ghx | 2307 +++++++++++++++++ 4 files changed, 2370 insertions(+) create mode 100644 lecture_04/assignment_03/Lin_chewei/assignment-03.json create mode 100644 lecture_04/assignment_03/Lin_chewei/assignment_03.py create mode 100644 lecture_04/assignment_03/Lin_chewei/robot_ik.jpg create mode 100644 lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx diff --git a/lecture_04/assignment_03/Lin_chewei/assignment-03.json b/lecture_04/assignment_03/Lin_chewei/assignment-03.json new file mode 100644 index 0000000..3cd4b39 --- /dev/null +++ b/lecture_04/assignment_03/Lin_chewei/assignment-03.json @@ -0,0 +1 @@ +[{"dtype": "compas.robots/Configuration", "value": {"joint_values": [0.22544341204728363, -2.0968085857698457, -2.128177623592219, -0.4874039665304446, 1.5707951025366123, 1.7962398912533473], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-0.027166413891432185, -2.0032502003286217, -2.3434720084221143, -0.3683795965084574, 1.6704280842019585, 1.5434947470166338], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-0.36759775052655236, -1.9494596879232018, -2.4053871518660137, -0.4292859513624741, 1.754852352910178, 1.196575831466971], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-0.7516654957685005, -1.9465492727639666, -2.3061039799652217, -0.6617960819855494, 1.782294398644407, 0.7976109038045373], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.1073947485684787, -2.0174820314868875, -2.088910007947618, -0.9496168778794705, 1.737578262420177, 0.43439612569123875], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.4135740616616774, -2.1390635561297233, -1.8161799382694923, -1.2158479039195114, 1.6408770283030758, 0.14085464317423715], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.680609028110169, -2.219128636446844, -1.6828365453824001, -1.188851434662567, 1.5300835851476766, -0.10201498277241407], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-1.9354865452626713, -2.266674216902976, -1.6261868072769476, -1.0927872964634988, 1.4681305559295035, -0.35056289935626933], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-2.188250312646932, -2.301318770249356, -1.6023863102259377, -0.9703320935575104, 1.4570072257517943, -0.6082271089161407], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-2.4442081366746335, -2.351104061373698, -1.5437112211358086, -0.8817071181930184, 1.4944501181389513, -0.8709616133734153], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}, {"dtype": "compas.robots/Configuration", "value": {"joint_values": [-2.6933975667893493, -2.432441064645617, -1.4030362191325068, -0.8769116919401005, 1.5707963226896162, -1.1226012405363799], "joint_types": [0, 0, 0, 0, 0, 0], "joint_names": ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"]}}] \ No newline at end of file diff --git a/lecture_04/assignment_03/Lin_chewei/assignment_03.py b/lecture_04/assignment_03/Lin_chewei/assignment_03.py new file mode 100644 index 0000000..aa63050 --- /dev/null +++ b/lecture_04/assignment_03/Lin_chewei/assignment_03.py @@ -0,0 +1,62 @@ +import os +import compas +from compas_fab.backends import RosClient +from compas_fab.robots import Configuration + +from compas.geometry import Frame +from compas.geometry import Point +from compas.geometry import Vector + + +# Step 1: Inside this function, complete the main part of the solution for the assignment: +# - Taking a robot and a list of frames as parameter, calculate a feasible configuration for each of the frames +# - Try to find an optimal start_configuration for each so that the motion from one config to the next is minimized +def calculate_ik_for_frames(robot, frames): + configs = [] + previous_config = robot.zero_configuration() + previous_config.joint_values = (0.15, -2.01, -1.08, -0.97, 1.55, 0.0) + + # used previous ik result as the configuration for next ik calculation + + for frame in frames: + _config = robot.inverse_kinematics(frame, previous_config) + configs.append(_config) + previous_config = _config + + return configs + + +# Step 2: store all found configurations in a JSON file using compas.json_dump or compas.json_dumps +def store_configurations(configurations, filename): + compas.json_dump(configurations, filename) + + +# Use the following to test from the command line +# Or copy solution_viewer.ghx next to the folder where you created assignment_03.py to visualize the same in Grasshopper +if __name__ == '__main__': + + frames = [ + Frame(Point(-0.329, 0.059, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000)), + Frame(Point(-0.260, 0.129, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(-0.186, 0.194, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(-0.106, 0.252, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(-0.020, 0.299, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.074, 0.329, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.500)), + Frame(Point(0.172, 0.330, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.263, 0.295, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(0.339, 0.233, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(0.400, 0.155, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(0.448, 0.070, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000))] + + # Loads the robot from ROS + with RosClient('localhost') as client: + robot = client.load_robot() + + # Step 1: calculate IK solutions for each frame + configurations = calculate_ik_for_frames(robot, frames) + print("Found {} configurations".format(len(configurations))) + + # Step 2: store all configurations in a JSON file + filename = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'assignment-03.json') + store_configurations(configurations, filename) + print("Stored results in {}".format(filename)) diff --git a/lecture_04/assignment_03/Lin_chewei/robot_ik.jpg b/lecture_04/assignment_03/Lin_chewei/robot_ik.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39650d0e15e5c0b0327a61e7786e862d5544e8b1 GIT binary patch literal 106357 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 literal 0 HcmV?d00001 diff --git a/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx b/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx new file mode 100644 index 0000000..690841a --- /dev/null +++ b/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx @@ -0,0 +1,2307 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + 267186b6-22d4-4301-830e-efc68b78e363 + Shaded + 1 + + 100;150;0;0 + + + 100;0;150;0 + + + + + + 637515172939181553 + + solution_viewer.ghx + + + + + 0 + + + + + + -600 + -120 + + 1.17647052 + + + + + 0 + + + + + + + 0 + + + + + 1 + + + + + Elk.Mapping, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + 1.0.0.0 + timothy.b.logan@gmail.com + 00000000-0000-0000-0000-000000000000 + + + + + + + + + 19 + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + c7d255bb-e9cf-4deb-b4de-248fedfcc9fd + Boolean Toggle + Connect + false + 0 + true + + + + + + 31 + 228 + 113 + 22 + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 1e891ee1-8c8e-4909-bfa8-9478fe5871e0 + Boolean Toggle + Load + false + 0 + true + + + + + + 29 + 252 + 96 + 22 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + 16792f65-ce66-4c57-8894-6616e5c283b2 + c7d255bb-e9cf-4deb-b4de-248fedfcc9fd + 1e891ee1-8c8e-4909-bfa8-9478fe5871e0 + 84446ac2-e8f7-4c7d-9d31-dab3deade42d + eccb9686-8536-4332-975d-684efb918cee + ed6dd17e-9615-4209-9f27-8c842a439b86 + 6 + ca5efeaf-96ea-4f51-8b8c-044bf95f301c + Group + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + # NOTE: Don't write you solution here! +# Write the code in the assignment_03.py and if +# the file is located in the same folder as this GH file +# then Grasshopper will find it and import it +from compas_ghpython import unload_modules +from compas.geometry import Frame, Point, Vector +unload_modules('assignment_03') + +try: + from assignment_03 import calculate_ik_for_frames +except ImportError: + raise Exception("Please make sure you have the file assignment_03.py in the same location as this GH file") + +from compas_fab.ghpython.components import coerce_frame + +frames = [ + Frame(Point(-0.329, 0.059, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000)), + Frame(Point(-0.260, 0.129, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(-0.186, 0.194, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(-0.106, 0.252, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(-0.020, 0.299, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.074, 0.329, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.500)), + Frame(Point(0.172, 0.330, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.400)), + Frame(Point(0.263, 0.295, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.300)), + Frame(Point(0.339, 0.233, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.200)), + Frame(Point(0.400, 0.155, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.100)), + Frame(Point(0.448, 0.070, 0.082), Vector(1.000, 0.000, 0.000), Vector(0.000, -1.000, 0.000))] + +configuration = calculate_ik_for_frames(robot, frames) + + GhPython provides a Python script component + + 43 + 69 + + + 1114 + 826 + + true + true + false + 205c786a-b8cf-4a07-8455-eea7b91954d2 + false + true + GhPython Script + Python + + + + + + 785 + 241 + 156 + 44 + + + 844 + 263 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + ba3333a4-a4af-41c9-9db8-4a84ea6a37df + robot + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 787 + 243 + 42 + 20 + + + 809.5 + 253 + + + + + + + + 1 + true + Script input frames. + c640367c-4d94-4702-8a36-9b422631f663 + frames + frames + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 787 + 263 + 42 + 20 + + + 809.5 + 273 + + + + + + + + Script output configuration. + 66f1bdea-7701-4476-b28d-6ea50cb1a15e + configuration + configuration + false + 0 + + + + + + 859 + 243 + 80 + 40 + + + 899 + 263 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + 7198f137-5adf-40bd-9365-ce004651bcdf + List Item + Item + + + + + + 989 + 251 + 65 + 64 + + + 1024 + 283 + + + + + + 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 + a71a26e2-bc83-4c3a-bb49-8f2a379f82e6 + List + L + false + 66f1bdea-7701-4476-b28d-6ea50cb1a15e + 1 + + + + + + 991 + 253 + 18 + 20 + + + 1001.5 + 263 + + + + + + + + Item index + 7da95829-d7e8-4d73-b01e-2a3b037c616a + Index + i + false + 9c88f1df-80d2-4fc0-a569-528fab1a8314 + 1 + + + + + + 991 + 273 + 18 + 20 + + + 1001.5 + 283 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 5349e571-6e69-4fef-be96-8ba696ebf207 + Wrap + W + false + 0 + + + + + + 991 + 293 + 18 + 20 + + + 1001.5 + 303 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 6c5c47d3-b49d-4dbf-a287-2305b02558e7 + false + Item + i + false + 0 + + + + + + 1039 + 253 + 13 + 60 + + + 1045.5 + 283 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 9c88f1df-80d2-4fc0-a569-528fab1a8314 + Number Slider + + false + 0 + + + + + + 780 + 321 + 162 + 20 + + + 780.9314 + 321.8065 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 0 + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + 205c786a-b8cf-4a07-8455-eea7b91954d2 + 7198f137-5adf-40bd-9365-ce004651bcdf + 9c88f1df-80d2-4fc0-a569-528fab1a8314 + 716141ca-3bd8-4b27-8dca-290a69e4a2eb + 4 + a10ab389-c3a2-495c-979b-e89e0f6f17c4 + Group + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + ROS Connect + + + + + """ +Connect or disconnect to ROS. + +COMPAS FAB v0.22.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.22.0 + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC + + false + eccb9686-8536-4332-975d-684efb918cee + true + true + ROS Connect + ROS + + + + + + 176 + 187 + 159 + 64 + + + 241 + 219 + + + + + + 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. + cbcceb8e-d113-460c-8c91-6474031ab1a7 + ip + ip + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 178 + 189 + 48 + 20 + + + 203.5 + 199 + + + + + + + + true + The port of ROS. Defaults to 9090. + 23ab18d4-0816-4280-b382-e2cbdab4caa9 + port + port + true + 0 + true + 0 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 178 + 209 + 48 + 20 + + + 203.5 + 219 + + + + + + + + true + If True, connects to ROS. If False, disconnects from ROS. Defaults to False. + da4e32db-96ba-40c4-b661-67c91677a2ed + connect + connect + true + 0 + true + c7d255bb-e9cf-4deb-b4de-248fedfcc9fd + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 178 + 229 + 48 + 20 + + + 203.5 + 239 + + + + + + + + The ROS client. + 20b3b82c-7d50-4449-b49c-d0195f7b838a + ros_client + ros_client + false + 0 + + + + + + 256 + 189 + 77 + 30 + + + 294.5 + 204 + + + + + + + + True if connection established. + f636540e-bf52-4933-9f75-bdfdc23e479c + is_connected + is_connected + false + 0 + + + + + + 256 + 219 + 77 + 30 + + + 294.5 + 234 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + ROS Robot + + + + + """ +Load robot directly from ROS. + +COMPAS FAB v0.22.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.22.0 + + 156 + 156 + + + 558 + 530 + + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC + + false + ed6dd17e-9615-4209-9f27-8c842a439b86 + true + true + ROS Robot + Robot + + + + + + 381 + 229 + 129 + 44 + + + 454 + 251 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The ROS client. + 9df689c7-f25f-4820-b9e3-e243f1ac71db + ros_client + ros_client + true + 0 + true + 20b3b82c-7d50-4449-b49c-d0195f7b838a + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 383 + 231 + 56 + 20 + + + 412.5 + 241 + + + + + + + + true + If True, loads the robot from ROS. Defaults to False. + 28374d3d-390d-4b67-88a5-0746309c0629 + load + load + true + 0 + true + 1e891ee1-8c8e-4909-bfa8-9478fe5871e0 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 383 + 251 + 56 + 20 + + + 412.5 + 261 + + + + + + + + The robot. + d4bae7b0-750f-4b86-a929-7bf58d55c307 + robot + robot + false + 0 + + + + + + 469 + 231 + 39 + 40 + + + 488.5 + 251 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Robot Visualize + + + + + """ +Visualizes the robot. + +COMPAS FAB v0.22.0 +""" +from compas.geometry import Frame +from compas.geometry import Transformation +from compas_ghpython.artists import FrameArtist +from compas_ghpython.artists import MeshArtist +from ghpythonlib.componentbase import executingcomponent as component + + +class RobotVisualize(component): + def RunScript(self, robot, group, configuration, attached_collision_meshes, show_visual, show_collision, + show_frames, show_base_frame, show_end_effector_frame, show_acm): + + visual = None + collision = 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 + 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 = FrameArtist(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 = FrameArtist(ee_compas_frame) + ee_frame = artist.draw() + + if show_frames: + frames = [] + for compas_frame in compas_frames[1:]: + artist = FrameArtist(compas_frame) + frame = artist.draw() + frames.append(frame) + + if show_acm: + attached_meshes = [] + for acm in attached_collision_meshes: + frame = robot.forward_kinematics(configuration, options=dict(solver='model', link_name=acm.link_name)) + T = Transformation.from_frame_to_frame(Frame.worldXY(), frame) + mesh = acm.collision_mesh.mesh.transformed(T) + attached_meshes.append(MeshArtist(mesh).draw()) + + return (visual, collision, attached_meshes, frames, base_frame, ee_frame) + + Visualizes the robot. +COMPAS FAB v0.22.0 + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/zt2jtm9VSLEg+9ud2bnn9nZu1spiuJfyRqXSdb4F3ZvX1vigmfOXzP8FQm/iEJ8iH7qjyZUIUZiIgjseb9HvjMxE4jbE4jt2Lo0CGca0BOI3Ti8nzGFdYTFv9cShAWlUzyK6zC/E9aGHFFbND8Q1c5TBwHPgiQPYU4C2uZFPVEbNa/aA9wqg5wIE2RP6AuSsH2DAzV/2Q49aRPtwzYzTW5VBXKwC+sjIvQ+qiiso52IWSG00B941CKfwA7UDs0qqiUJ61nnD5z10ffALe2hb48x8Ws88lEIhWWLqBnC4jQBRIUsStYosdxbUx6croFgAJcWo6st5sE+ruw28EiMbfs3xbjBnxWKEw8quw1SEEvEgaQtCQydWJv1zjb3OpFoisT8G2KMJNINYlBWq8t2NfQakWCKxH48cAlNg+CT8AmPvUYkCArmq82JRmydnJeCa+sbX42dvfsgPk31ogko2L7kX9m+GpcJYLXR/AzjqD0QTUDBCyWA5v5hlSTQTfWiCSiQX4X91H5l8+jUzgHeUi2oGZZN1rg8ipVvhzuVIxcFIsQAAAAASUVORK5CYII= + + false + 10a49928-eb17-4269-a1f5-98ee19233fed + true + true + Robot Visualize + Robot Visualize + + + + + + 1248 + 226 + 278 + 204 + + + 1409 + 328 + + + + + + 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 + 6 + 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. + 5665115c-dc6f-4b96-b649-90363f6f156d + robot + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 1250 + 228 + 144 + 20 + + + 1323.5 + 238 + + + + + + + + true + The planning group used for end-effector and base visualization. + 19283912-83ba-4eb0-ba1c-6f5ac3311327 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 1250 + 248 + 144 + 20 + + + 1323.5 + 258 + + + + + + + + true + The robot's full configuration. + 1fca49ea-0635-4a0a-b95b-c9f257682b15 + configuration + configuration + true + 0 + true + 6c5c47d3-b49d-4dbf-a287-2305b02558e7 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1250 + 268 + 144 + 20 + + + 1323.5 + 278 + + + + + + + + 1 + true + A list of attached collision meshes. + 651066a0-4de6-4d81-960c-74dd5ebba2c2 + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1250 + 288 + 144 + 20 + + + 1323.5 + 298 + + + + + + + + true + Whether or not to show the robot's visual meshes. + fd6c0bb5-7a57-4ca6-81c0-035515585a87 + show_visual + show_visual + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 308 + 144 + 20 + + + 1323.5 + 318 + + + + + + + + true + Whether or not to show the robot's collision meshes. + dac981a0-3655-427f-83bb-869a928c361c + show_collision + show_collision + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 328 + 144 + 20 + + + 1323.5 + 338 + + + + + + + + true + Whether or not to show the robot's joint frames. + de2c0813-2228-47c0-a1fb-25fecad1fc57 + show_frames + show_frames + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 348 + 144 + 20 + + + 1323.5 + 358 + + + + + + + + true + Whether or not to show the robot's base frame. + 7639b92d-56d4-4e95-8462-1a3570422d31 + show_base_frame + show_base_frame + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 368 + 144 + 20 + + + 1323.5 + 378 + + + + + + + + true + Whether or not to show the robot's end-effector frame. + f438ee13-4ba8-4090-9a27-aaec8905fe02 + show_end_effector_frame + show_end_effector_frame + true + 0 + true + 5e3279a2-6f98-4b23-ae56-5659c1281c18 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 388 + 144 + 20 + + + 1323.5 + 398 + + + + + + + + true + Whether or not to show the attached collision meshes (if any). + 9222d70d-5e4f-4408-b727-43a01bb10333 + show_acm + show_acm + true + 0 + true + 0 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1250 + 408 + 144 + 20 + + + 1323.5 + 418 + + + + + + + + The robot's visual Rhino meshes (if any). + d172c507-69c0-458a-97b9-642920bb140f + visual + visual + false + 0 + + + + + + 1424 + 228 + 100 + 33 + + + 1474 + 244.6667 + + + + + + + + The robot's collision Rhino meshes (if any). + d53f0b28-0a87-4e89-932c-575be550c6f7 + collision + collision + false + 0 + + + + + + 1424 + 261 + 100 + 33 + + + 1474 + 278 + + + + + + + + The attached collision Rhino meshes (if any). + 2069798a-a5d1-4168-afa3-d64cf6264cd8 + attached_meshes + attached_meshes + false + 0 + + + + + + 1424 + 294 + 100 + 34 + + + 1474 + 311.3333 + + + + + + + + The robot's joint frames as Rhino planes (if any). + 8913b320-9e60-4c95-b721-c90ef3174981 + frames + frames + false + 0 + + + + + + 1424 + 328 + 100 + 33 + + + 1474 + 344.6667 + + + + + + + + The robot's base frame as a Rhino plane (if any). + ba6264fe-2f01-4ec7-abb3-24d0af02a5c3 + base_frame + base_frame + false + 0 + + + + + + 1424 + 361 + 100 + 33 + + + 1474 + 378 + + + + + + + + The robot's end-effector frame as a Rhino plane (if any). + cc6cd5a6-9a99-4006-be91-e55a54aacf7e + ee_frame + ee_frame + false + 0 + + + + + + 1424 + 394 + 100 + 34 + + + 1474 + 411.3333 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas_fab.robots import Configuration + +config = Configuration.from_revolute_values(x) + + GhPython provides a Python script component + + 104 + 104 + + + 558 + 530 + + true + false + false + e49367ea-4c70-4652-b3b9-6da8dfa54119 + false + true + GhPython Script + Python + + + + + + 964 + 390 + 89 + 44 + + + 993 + 412 + + + + + + 1 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + true + The x script variable + 2986baae-8d51-4402-a267-2eb6653d2a04 + x + x + true + 1 + true + 179679fb-e408-4a60-841d-e86f0575518e + d5363987-91eb-4870-8a34-65cfa65f28a2 + 51bb5ab5-2448-4845-baf7-c80b4960a54b + c9c0291d-bdb2-42c8-8485-e09f9a01e4d2 + f51a9ad8-bd5b-46f4-8576-bd9a6a7d5983 + fb1d170e-71f6-47d3-8fe6-27b378224d69 + 6 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 966 + 392 + 12 + 40 + + + 973.5 + 412 + + + + + + + + The execution information, as output and error streams + 9c63e747-b6bc-4507-8627-1831850545be + out + out + false + 0 + + + + + + 1008 + 392 + 43 + 20 + + + 1029.5 + 402 + + + + + + + + Script output config. + b25441dd-5dac-44ea-ba56-2c253f774dd1 + a + config + false + 0 + + + + + + 1008 + 412 + 43 + 20 + + + 1029.5 + 422 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 179679fb-e408-4a60-841d-e86f0575518e + Number Slider + + false + 0 + + + + + + 777 + 404 + 162 + 20 + + + 777.0078 + 404.0164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 0.15 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + d5363987-91eb-4870-8a34-65cfa65f28a2 + Number Slider + + false + 0 + + + + + + 777 + 426 + 162 + 20 + + + 777.0078 + 426.8164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -2.01 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 51bb5ab5-2448-4845-baf7-c80b4960a54b + Number Slider + + false + 0 + + + + + + 777 + 448 + 162 + 20 + + + 777.0078 + 448.6164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -1.8 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + c9c0291d-bdb2-42c8-8485-e09f9a01e4d2 + Number Slider + + false + 0 + + + + + + 777 + 470 + 162 + 20 + + + 777.0078 + 470.4164 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -0.97 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + f51a9ad8-bd5b-46f4-8576-bd9a6a7d5983 + Number Slider + + false + 0 + + + + + + 777 + 492 + 162 + 20 + + + 777.0078 + 492.2163 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 1.55 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + fb1d170e-71f6-47d3-8fe6-27b378224d69 + Number Slider + + false + 0 + + + + + + 777 + 514 + 162 + 20 + + + 777.0078 + 514.804 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -0.41 + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 5e3279a2-6f98-4b23-ae56-5659c1281c18 + Boolean Toggle + Toggle + false + 0 + true + + + + + + 1072 + 378 + 106 + 22 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + e176611a-6234-442e-9cba-7f2bb739da1a + Data + Data + false + 0 + + + + + + 785 + 369 + 50 + 24 + + + 810.05 + 381.65 + + + + + + 1 + + + + + 11 + {0;0} + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.328996061987069 + 0.0589997863205354 + 0.0820025390807471 + 0.999999999999591 + -1.52205983500691E-07 + 8.91832180002542E-07 + -1.52204681098556E-07 + -0.999999999998922 + -1.46036671656503E-06 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.259999175301696 + 0.128999063702886 + 0.0819999383982555 + 0.999999999994021 + -2.5962333247904E-07 + -3.44831737824999E-06 + 8.47852179257528E-08 + -0.99503719925682 + 0.0995036285526145 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.185997720667743 + 0.193997166513972 + 0.0820000822653364 + 0.999999999962178 + -2.0518781610844E-06 + -8.45190313769696E-06 + -3.54466189313374E-07 + -0.980580420532091 + 0.196117410927695 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.105999771888304 + 0.251999039129915 + 0.0819999862265907 + 0.99999999999769 + -5.16465691036329E-07 + -2.0865212969713E-06 + 1.04874966631396E-07 + -0.957826031183761 + 0.287348732356268 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + -0.0199996656424884 + 0.298999726514655 + 0.0820004161657311 + 0.999999999999868 + -2.27512691418152E-09 + -5.14002900926475E-07 + 1.88783653333669E-07 + -0.928476558342992 + 0.371391007709552 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.0740003579052222 + 0.32899951277318 + 0.0820003156010757 + 0.999999999999684 + 1.2490174103617E-07 + -7.8504484119603E-07 + 4.62798664588472E-07 + -0.894426896821608 + 0.44721418385585 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.172000020951436 + 0.329999925909599 + 0.0820000368004187 + 1 + 4.15666271307642E-10 + -1.39294003799795E-09 + 9.03261390553737E-10 + -0.92847668970332 + 0.37139067930895 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.262999939761616 + 0.294999931783999 + 0.0820000454835823 + 0.999999999999999 + -5.07083784980938E-09 + 3.74803633872345E-08 + -1.56268860098311E-08 + -0.957826276381033 + 0.287347915033404 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.338999871865215 + 0.232999946632596 + 0.0820000332816467 + 0.999999999999998 + 2.74710517237015E-09 + 6.87069333086127E-08 + -1.07807833663982E-08 + -0.980580665887247 + 0.196116184156543 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.399999846843165 + 0.154999957387238 + 0.0819999675182763 + 1 + 5.09819622561856E-09 + 2.32074528974202E-08 + 2.76366671573588E-09 + -0.995037189116082 + 0.0995037299600651 + + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0.447999785027379 + 0.0699998851799913 + 0.0819999074090274 + 1 + 7.47030142795755E-10 + 5.71081739908766E-09 + 7.47030133763101E-10 + -1 + 1.58167446951156E-09 + + + + + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file From ad9faf066b1ddd33af786d76536724b7e49dd115 Mon Sep 17 00:00:00 2001 From: LinCheWei Date: Wed, 30 Mar 2022 11:17:08 +0200 Subject: [PATCH 3/3] Update solution_viewer.ghx --- .../Lin_chewei/solution_viewer.ghx | 1895 ++++++++++++++++- 1 file changed, 1801 insertions(+), 94 deletions(-) diff --git a/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx b/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx index 690841a..0e41f74 100644 --- a/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx +++ b/lecture_04/assignment_03/Lin_chewei/solution_viewer.ghx @@ -48,10 +48,10 @@ - -600 - -120 + -1391 + -560 - 1.17647052 + 1.38408291 @@ -85,9 +85,9 @@ - 19 + 29 - + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a @@ -188,7 +188,7 @@ - + # NOTE: Don't write you solution here! # Write the code in the assignment_03.py and if # the file is located in the same folder as this GH file @@ -228,6 +228,7 @@ configuration = calculate_ik_for_frames(robot, frames) 1114 826 + true true true false @@ -362,9 +363,10 @@ configuration = calculate_ik_for_frames(robot, frames) - + 0 Retrieve a specific item from a list. + true 7198f137-5adf-40bd-9365-ce004651bcdf List Item Item @@ -629,7 +631,7 @@ configuration = calculate_ik_for_frames(robot, frames) - + """ Connect or disconnect to ROS. @@ -664,10 +666,11 @@ class ROSConnect(component): Connect or disconnect to ROS. COMPAS FAB v0.22.0 + true true true - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDQAACw0B7QfALAAAAdZJREFUSEu1lD2O4kAQRrkBcwP2BnADfARuABEhcAMcEEyCQKuVCCEkY27A3ADCyUAimQyHm/V+r9bNNp5iSLwtPWF/9dvdZRohhP+KK9aJK9aJK9aJKzpk4k08W4XYiB/CYquJPJbX6zVMp9PQbrcV0XhIt9sN6/VaIVZoQLyXMGVC8piYXwp5jMfj0Gq1zK/f7yvUVsdLGnkRBV0RlHT2/g2WHH+KonmJI4PD4ZA6HwVFPd9IR1hTzWZTj76Tcjay1Wr1QWIKnE6n0Ov17DnhXeSiWnTJbvHZ7/d3BkNrg3E2m/2OBbiH4XCITkLg+YhNnMVtakRuib0CWgMMYlMUxetutzPH8vwZ00f+HB8auznHe6CxagDdnMt3ztPOkunAWYsiPcF3YYxGo19ZloXtdvtT78d4b9yDVpEmf8Eg8qiJt7gLCi0WC9v2IxjV6Mu9aU3SAh2MYhI1wZaPBMcZfwadl8n5oqX8Sya7OZkhgSJoge1Xu04pE/Ot3E4hTUQBmyDB+d7ZBIU4f4INBmE+n3/meR4ul8tS2pe4+5e/91CURRjH7BuYIIYCX/vf8fgqaKYFHxEvz6CZh8nBFUGLQl7nN7y4Kq5YJ65YJ65YJ65YH6HxB7b14P1B22tpAAAAAElFTkSuQmCC false eccb9686-8536-4332-975d-684efb918cee @@ -859,7 +862,7 @@ COMPAS FAB v0.22.0 - + """ Load robot directly from ROS. @@ -896,10 +899,11 @@ COMPAS FAB v0.22.0 558 530 + true true true - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDQAACw0B7QfALAAAAVtJREFUSEu9lMFRwzAQRVMCJaSElJASUgIlUAGTEhguXHPinBJSAiWkBDow/9n6ZmWtQzwYduaNpdVqtf5redN13Z+SOtckdS5B9iCeeKbrmXMJsrNg8CkOzXo1Gao5iYtg4z6uR2SP4iqY+Ans3Y5xk00sTjfsBcmOgbjOmMK2wvs/mgNKQL8o3sRzmb8Iy5BRySLbifHNpwsM3gWHvJY5ByAb44xKRtkoTz+vJkNiBn7CQXAIr29oqNd7OWTIhHxMrmNOD0oQb2EdSYL2VUUlDjlJ5kKQMDa8lahsdEPdNFfUHFLiiYsNJ766D9WG3lHLYy7TOCOjEArLi2gcQ7ATR2bvxC1yZ/7VjI1bQu4cXjt+KeaYxd8idQLJQmLDoelPbY7UaWTxCzGnLHaO1Glkv2546xhubUz2E8i2m+YxreP7Ji9htvmt4x8O4Ffhn9q93C/R2qTO9eg2XxfZxOCoCLXEAAAAAElFTkSuQmCC false ed6dd17e-9615-4209-9f27-8c842a439b86 @@ -1103,7 +1107,7 @@ COMPAS FAB v0.22.0 true true - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDgAACw4BQL7hQQAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/zt2jtm9VSLEg+9ud2bnn9nZu1spiuJfyRqXSdb4F3ZvX1vigmfOXzP8FQm/iEJ8iH7qjyZUIUZiIgjseb9HvjMxE4jbE4jt2Lo0CGca0BOI3Ti8nzGFdYTFv9cShAWlUzyK6zC/E9aGHFFbND8Q1c5TBwHPgiQPYU4C2uZFPVEbNa/aA9wqg5wIE2RP6AuSsH2DAzV/2Q49aRPtwzYzTW5VBXKwC+sjIvQ+qiiso52IWSG00B941CKfwA7UDs0qqiUJ61nnD5z10ffALe2hb48x8Ws88lEIhWWLqBnC4jQBRIUsStYosdxbUx6croFgAJcWo6st5sE+ruw28EiMbfs3xbjBnxWKEw8quw1SEEvEgaQtCQydWJv1zjb3OpFoisT8G2KMJNINYlBWq8t2NfQakWCKxH48cAlNg+CT8AmPvUYkCArmq82JRmydnJeCa+sbX42dvfsgPk31ogko2L7kX9m+GpcJYLXR/AzjqD0QTUDBCyWA5v5hlSTQTfWiCSiQX4X91H5l8+jUzgHeUi2oGZZN1rg8ipVvhzuVIxcFIsQAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALDQAACw0B7QfALAAAAdhJREFUSEu1lLFKA0EQhlUIQVBMOhGLgGAtxAcIYmmRJpWNrZ2dhSCWqURtxC6VRSofIYWlhS8QyBMEOzvP/zt2jtm9VSLEg+9ud2bnn9nZu1spiuJfyRqXSdb4F3ZvX1vigmfOXzP8FQm/iEJ8iH7qjyZUIUZiIgjseb9HvjMxE4jbE4jt2Lo0CGca0BOI3Ti8nzGFdYTFv9cShAWlUzyK6zC/E9aGHFFbND8Q1c5TBwHPgiQPYU4C2uZFPVEbNa/aA9wqg5wIE2RP6AuSsH2DAzV/2Q49aRPtwzYzTW5VBXKwC+sjIvQ+qiiso52IWSG00B941CKfwA7UDs0qqiUJ61nnD5z10ffALe2hb48x8Ws88lEIhWWLqBnC4jQBRIUsStYosdxbUx6croFgAJcWo6st5sE+ruw28EiMbfs3xbjBnxWKEw8quw1SEEvEgaQtCQydWJv1zjb3OpFoisT8G2KMJNINYlBWq8t2NfQakWCKxH48cAlNg+CT8AmPvUYkCArmq82JRmydnJeCa+sbX42dvfsgPk31ogko2L7kX9m+GpcJYLXR/AzjqD0QTUDBCyWA5v5hlSTQTfWiCSiQX4X91H5l8+jUzgHeUi2oGZZN1rg8ipVvhzuVIxcFIsQAAAAASUVORK5CYII= false 10a49928-eb17-4269-a1f5-98ee19233fed @@ -1116,14 +1120,14 @@ COMPAS FAB v0.22.0 - 1248 - 226 + 1874 + 197 278 204 - 1409 - 328 + 2035 + 299 @@ -1168,14 +1172,14 @@ COMPAS FAB v0.22.0 - 1250 - 228 + 1876 + 199 144 20 - 1323.5 - 238 + 1949.5 + 209 @@ -1198,14 +1202,14 @@ COMPAS FAB v0.22.0 - 1250 - 248 + 1876 + 219 144 20 - 1323.5 - 258 + 1949.5 + 229 @@ -1221,7 +1225,7 @@ COMPAS FAB v0.22.0 true 0 true - 6c5c47d3-b49d-4dbf-a287-2305b02558e7 + 413f4b7d-50ca-45ce-9bd2-84a106772d59 1 87f87f55-5b71-41f4-8aea-21d494016f81 @@ -1229,14 +1233,14 @@ COMPAS FAB v0.22.0 - 1250 - 268 + 1876 + 239 144 20 - 1323.5 - 278 + 1949.5 + 249 @@ -1260,14 +1264,14 @@ COMPAS FAB v0.22.0 - 1250 - 288 + 1876 + 259 144 20 - 1323.5 - 298 + 1949.5 + 269 @@ -1290,14 +1294,14 @@ COMPAS FAB v0.22.0 - 1250 - 308 + 1876 + 279 144 20 - 1323.5 - 318 + 1949.5 + 289 @@ -1320,14 +1324,14 @@ COMPAS FAB v0.22.0 - 1250 - 328 + 1876 + 299 144 20 - 1323.5 - 338 + 1949.5 + 309 @@ -1350,14 +1354,14 @@ COMPAS FAB v0.22.0 - 1250 - 348 + 1876 + 319 144 20 - 1323.5 - 358 + 1949.5 + 329 @@ -1380,14 +1384,14 @@ COMPAS FAB v0.22.0 - 1250 - 368 + 1876 + 339 144 20 - 1323.5 - 378 + 1949.5 + 349 @@ -1411,14 +1415,14 @@ COMPAS FAB v0.22.0 - 1250 - 388 + 1876 + 359 144 20 - 1323.5 - 398 + 1949.5 + 369 @@ -1441,14 +1445,14 @@ COMPAS FAB v0.22.0 - 1250 - 408 + 1876 + 379 144 20 - 1323.5 - 418 + 1949.5 + 389 @@ -1467,14 +1471,14 @@ COMPAS FAB v0.22.0 - 1424 - 228 + 2050 + 199 100 33 - 1474 - 244.6667 + 2100 + 215.6667 @@ -1493,14 +1497,14 @@ COMPAS FAB v0.22.0 - 1424 - 261 + 2050 + 232 100 33 - 1474 - 278 + 2100 + 249 @@ -1519,14 +1523,14 @@ COMPAS FAB v0.22.0 - 1424 - 294 + 2050 + 265 100 34 - 1474 - 311.3333 + 2100 + 282.3333 @@ -1545,14 +1549,14 @@ COMPAS FAB v0.22.0 - 1424 - 328 + 2050 + 299 100 33 - 1474 - 344.6667 + 2100 + 315.6667 @@ -1571,14 +1575,14 @@ COMPAS FAB v0.22.0 - 1424 - 361 + 2050 + 332 100 33 - 1474 - 378 + 2100 + 349 @@ -1597,14 +1601,14 @@ COMPAS FAB v0.22.0 - 1424 - 394 + 2050 + 365 100 34 - 1474 - 411.3333 + 2100 + 382.3333 @@ -1624,7 +1628,7 @@ COMPAS FAB v0.22.0 - + from compas_fab.robots import Configuration config = Configuration.from_revolute_values(x) @@ -1638,6 +1642,7 @@ config = Configuration.from_revolute_values(x) 558 530 + true true false false @@ -1738,7 +1743,7 @@ config = Configuration.from_revolute_values(x) Script output config. b25441dd-5dac-44ea-ba56-2c253f774dd1 - a + config config false 0 @@ -2056,8 +2061,8 @@ config = Configuration.from_revolute_values(x) - 1072 - 378 + 1159 + 382 106 22 @@ -2074,8 +2079,9 @@ config = Configuration.from_revolute_values(x) - + Contains a collection of generic data + true e176611a-6234-442e-9cba-7f2bb739da1a Data Data @@ -2118,7 +2124,7 @@ config = Configuration.from_revolute_values(x) 0.999999999999591 -1.52205983500691E-07 8.91832180002542E-07 - -1.52204681098556E-07 + -1.52204681098557E-07 -0.999999999998922 -1.46036671656503E-06 @@ -2134,7 +2140,7 @@ config = Configuration.from_revolute_values(x) 0.999999999994021 -2.5962333247904E-07 -3.44831737824999E-06 - 8.47852179257528E-08 + 8.47852179257533E-08 -0.99503719925682 0.0995036285526145 @@ -2150,7 +2156,7 @@ config = Configuration.from_revolute_values(x) 0.999999999962178 -2.0518781610844E-06 -8.45190313769696E-06 - -3.54466189313374E-07 + -3.54466189313372E-07 -0.980580420532091 0.196117410927695 @@ -2214,8 +2220,8 @@ config = Configuration.from_revolute_values(x) 1 4.15666271307642E-10 -1.39294003799795E-09 - 9.03261390553737E-10 - -0.92847668970332 + 9.03261390553736E-10 + -0.928476689703321 0.37139067930895 @@ -2263,8 +2269,8 @@ config = Configuration.from_revolute_values(x) 5.09819622561856E-09 2.32074528974202E-08 2.76366671573588E-09 - -0.995037189116082 - 0.0995037299600651 + -0.995037189116083 + 0.0995037299600652 @@ -2292,6 +2298,1707 @@ config = Configuration.from_revolute_values(x) + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Plan Motion + + + + + """ +Calculate a motion path. + +COMPAS FAB v0.23.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.23.0 + + 26 + 26 + + + 558 + 530 + + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAGNSURBVEhLtZTNbQIxEIUpgQ5ICRTAgRJyibimBErgEIkaInGgAyiBDpICuOeYnHJByuZ93vFm7B0SQBtLH4znPeO/MaOmaf6VMDkkYXJIwuS1qI3FVhzEXsw7zRs9ajOxE5tI96i9CgJPmuTcgLUzvokN32e89yJ7PfukBwMmxqcgwY+fLD4G/pVpNYekBwNeBD/4JGaWYxICdjOp/FPTalZJ92YbkFdbnL3ag+Do1j5vWr0L7mSctMD8bqa0epenQgjefd7pd2IORb7otGe/FAufN408gbqlBmocI4srd1502rIk6K1SjcnRl7Vmet55utwuX3T+PoYjmoh2SHEQ/DoBx8Ak4eNSC1dpGmOLe0v5LmgviWqAR29yHnbwJeoK49UTQLG7bKCWP8yQ2Xqj+fIj5C6692B9gpP3J80M/EER1Ex7A9odEKRXrcbbeBYc7a7nN1O+3Jqips27EEzCffhxvQeY/Onjih2Yn5rPBUEirKzkTR8X3sEt/AQXVNEthMkhCZNDEiaHoxl9A6glDpIGAdZaAAAAAElFTkSuQmCC + + false + b5094db4-def9-4481-8aea-6b11da79c1e4 + true + true + Plan Motion + Plan Motion + + + + + + 1339 + 583 + 237 + 164 + + + 1500 + 665 + + + + + + 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. + 0925bfe8-6585-4b39-83bd-61aa7f76676d + robot + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 1341 + 585 + 144 + 20 + + + 1414.5 + 595 + + + + + + + + 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. + 4203eb38-581c-4e89-a579-18f1b8aaa100 + goal_constraints + goal_constraints + true + 1 + true + dc06fc26-c9fb-42f7-b166-dbedee774c54 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1341 + 605 + 144 + 20 + + + 1414.5 + 615 + + + + + + + + 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. + 353b9ef0-7ceb-42cd-bdc1-44e528f2cb5a + start_configuration + start_configuration + true + 0 + true + d21b302d-733d-43c3-99b7-ed76b289ccf2 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1341 + 625 + 144 + 20 + + + 1414.5 + 635 + + + + + + + + true + The planning group used for calculation. Defaults to the robot's main planning group. + 6a57f432-325c-4bde-9ec6-e50cc6a40947 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 1341 + 645 + 144 + 20 + + + 1414.5 + 655 + + + + + + + + 1 + true + A list of attached collision meshes to be included for planning. + 10373bc6-4f63-4879-9e40-9d61bd3b2cd5 + attached_collision_meshes + attached_collision_meshes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1341 + 665 + 144 + 20 + + + 1414.5 + 675 + + + + + + + + 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. + e598a986-1d3a-4f72-896d-67b9963501f3 + path_constraints + path_constraints + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1341 + 685 + 144 + 20 + + + 1414.5 + 695 + + + + + + + + true + The name of the algorithm used for path planning. Defaults to 'RRTConnect' + 811868ee-de48-49c2-8c37-399214e45ad9 + planner_id + planner_id + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 1341 + 705 + 144 + 20 + + + 1414.5 + 715 + + + + + + + + true + If True, calculates a trajectory. + d898a50d-c871-4183-911c-0a866f2010fb + compute + compute + true + 0 + true + 0e039002-4ace-4096-9c19-39d45feca304 + 1 + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1341 + 725 + 144 + 20 + + + 1414.5 + 735 + + + + + + + + The calculated trajectory. + ef509c78-ae6e-423b-8fb9-de1fa352953c + trajectory + trajectory + false + 0 + + + + + + 1515 + 585 + 59 + 160 + + + 1544.5 + 665 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + 00b1de58-fe69-4814-b75e-0502b3df897b + List Item + Item + + + + + + 991 + 683 + 65 + 64 + + + 1026 + 715 + + + + + + 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 + fee18168-7838-44a2-9eaf-27915eb404c9 + List + L + false + 66f1bdea-7701-4476-b28d-6ea50cb1a15e + 1 + + + + + + 993 + 685 + 18 + 20 + + + 1003.5 + 695 + + + + + + + + Item index + 2bb70c21-862c-4870-8ac1-cf4383ce74bd + Index + i + false + 65803e22-e03d-4119-84d2-9b18c4a45841 + 1 + + + + + + 993 + 705 + 18 + 20 + + + 1003.5 + 715 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 333ced2f-fc7e-46be-bf21-ee7607435227 + Wrap + W + false + 0 + + + + + + 993 + 725 + 18 + 20 + + + 1003.5 + 735 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + d21b302d-733d-43c3-99b7-ed76b289ccf2 + false + Item + i + false + 0 + + + + + + 1041 + 685 + 13 + 60 + + + 1047.5 + 715 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 65803e22-e03d-4119-84d2-9b18c4a45841 + Number Slider + + false + 0 + + + + + + 783 + 705 + 162 + 20 + + + 783.4814 + 705.1565 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 0 + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + 7972a781-fcad-4a57-a252-306c16d3e803 + List Item + Item + + + + + + 990 + 771 + 65 + 64 + + + 1025 + 803 + + + + + + 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 + 140d4327-f1e3-491e-bdcc-9ed0ee59a233 + List + L + false + 66f1bdea-7701-4476-b28d-6ea50cb1a15e + 1 + + + + + + 992 + 773 + 18 + 20 + + + 1002.5 + 783 + + + + + + + + Item index + 114346bd-6c36-43e3-b036-80561e5481e7 + Index + i + false + d4707977-5878-4e65-9fc1-6520d5f1ff16 + 1 + + + + + + 992 + 793 + 18 + 20 + + + 1002.5 + 803 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + c910915d-637b-436a-8cd9-bdc20a8fd94c + Wrap + W + false + 0 + + + + + + 992 + 813 + 18 + 20 + + + 1002.5 + 823 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 5724622f-add7-4b93-b0de-a03bb6db0ef2 + false + Item + i + false + 0 + + + + + + 1040 + 773 + 13 + 60 + + + 1046.5 + 803 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + d4707977-5878-4e65-9fc1-6520d5f1ff16 + Number Slider + + false + 0 + + + + + + 791 + 793 + 162 + 20 + + + 791.1313 + 793.7065 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 8 + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + goal_constraints = robot.constraints_from_configuration(config, +[0.1]*6, [0.1]*6) + GhPython provides a Python script component + + 52 + 52 + + + 558 + 530 + + true + false + false + 69358696-5598-48f9-b134-3be62b11ac5b + false + true + GhPython Script + Python + + + + + + 1099 + 771 + 168 + 44 + + + 1156 + 793 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + ccd6b604-f098-4f46-b47d-e31d7e76f08d + x + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 35915213-5534-4277-81b8-1bdc9e7383d2 + + + + + + 1101 + 773 + 40 + 20 + + + 1122.5 + 783 + + + + + + + + true + Script input config. + feaa9a74-0da6-4c61-a4cf-0a7214e722f9 + config + config + true + 0 + true + 5724622f-add7-4b93-b0de-a03bb6db0ef2 + 1 + 35915213-5534-4277-81b8-1bdc9e7383d2 + + + + + + 1101 + 793 + 40 + 20 + + + 1122.5 + 803 + + + + + + + + The execution information, as output and error streams + 2dd3c4e5-061d-4628-8b0f-4b37c2438998 + out + out + false + 0 + + + + + + 1171 + 773 + 94 + 20 + + + 1218 + 783 + + + + + + + + Script output goal_constraints. + dc06fc26-c9fb-42f7-b166-dbedee774c54 + a + goal_constraints + false + 0 + + + + + + 1171 + 793 + 94 + 20 + + + 1218 + 803 + + + + + + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + 0e039002-4ace-4096-9c19-39d45feca304 + Button + Button + false + 0 + + + + + + 1195 + 726 + 105 + 22 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + Trajectory Visualize + + + + + """ +Visualizes a trajectory. + +COMPAS FAB v0.23.0 +""" +from compas_ghpython import draw_frame +from compas_ghpython import list_to_ghtree +from ghpythonlib.componentbase import executingcomponent as component + + +class TrajectoryVisualize(component): + def RunScript(self, robot, group, trajectory): + start_configuration = None + configurations = [] + fraction = 0. + time = 0. + + planes = [] + positions = [] + velocities = [] + accelerations = [] + + if robot and trajectory: + group = group or robot.main_group_name + + for c in trajectory.points: + configurations.append(robot.merge_group_with_full_configuration(c, trajectory.start_configuration, group)) + frame = robot.forward_kinematics(c, group, options=dict(solver='model')) + planes.append(draw_frame(frame)) + positions.append(c.positions) + velocities.append(c.velocities) + accelerations.append(c.accelerations) + + start_configuration = trajectory.start_configuration + fraction = trajectory.fraction + time = trajectory.time_from_start + + P = list_to_ghtree(list(zip(*positions))) + V = list_to_ghtree(list(zip(*velocities))) + A = list_to_ghtree(list(zip(*accelerations))) + + # return outputs if you have them; here I try it for you: + return (start_configuration, configurations, fraction, time, planes, P, V, A) + + Visualizes a trajectory. +COMPAS FAB v0.23.0 + true + true + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAHiSURBVEhLtZMxS0JhFIZNNJASEqesuOLUFIJT4CC0R4u4BEm/wCnXQMKmfkGDQ1NLLtHq0BgUDUFwi36BNrUU3s57OcfO/e4xKuzCg973fc/5znfvdxNBEPwrpjhLTHGWmOJfWD253iEGzCGxBN0MCxTqckHV8gXym0TgMIBnFgAKvKlwlXgnGlOyd5xzKcfCXOARpxxCY/k/JmK7Yc+iFglyGM1h+kQ4MWvYUbiYUdMn3OavxFIkyOHJ5I6Ox9QgLgjP8YrEC6EXaMKbhFQYC2BS3/CkuOV67NeYomhWCFO2iMiU7I0ILBCekCn+SGuRAOAG5pSk4dgC60VjqLBW65EQkBAKDA9NMOWt4WHneLR0+6VHQoAC8jWaUxaOrqgqIZwrr5rKrzyyPhTdbYAvEp85mLwo5eMkBZmN2ofbqNC5fGYNHIuui3soVuAcl8VXOS+7tdtTzerQ83udsdIqkpeiMjd16UlQIA3fQZDMZMNm6eXSGbT5tfUH3M+l0vc6L0U4u9YC046jv7C5HS6QyhfCbDKzKDto66wUTNtBX4cF0r38ftfnhkGufqAfT0lnddGP3oGGriduOuTfm1hG31DDb0+RC11tbixEHk+YcYXfQFdFNQe5WMYVZo0pzo4g8QkeesDrM2SJXwAAAABJRU5ErkJggg== + + false + 871ff208-19c2-4cf6-84ff-59272508f238 + true + true + Trajectory Visualize + Trajectory Visualize + + + + + + 1689 + 509 + 198 + 164 + + + 1762 + 591 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 8 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + The robot. + 59eb3e16-ee68-4729-96d1-e737bb2bbab6 + robot + robot + true + 0 + true + d4bae7b0-750f-4b86-a929-7bf58d55c307 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 1691 + 511 + 56 + 53 + + + 1720.5 + 537.6667 + + + + + + + + true + The planning group for which this trajectory was planned. + e1020857-c012-4969-a50e-16f6743bbd23 + group + group + true + 0 + true + 0 + 37261734-eec7-4f50-b6a8-b8d1f3c4396b + + + + + + 1691 + 564 + 56 + 53 + + + 1720.5 + 591 + + + + + + + + true + The calculated trajectory. + 6698a6b9-c1f8-43d1-8c0c-1ca25887f8e1 + trajectory + trajectory + true + 0 + true + ef509c78-ae6e-423b-8fb9-de1fa352953c + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1691 + 617 + 56 + 54 + + + 1720.5 + 644.3334 + + + + + + + + The start configuration of the trajectory. + 122f1810-7687-4d98-bc4f-29960a34ca0b + start_configuration + start_configuration + false + 0 + + + + + + 1777 + 511 + 108 + 20 + + + 1831 + 521 + + + + + + + + The full configurations along the trajectory. + 4d6b08c4-577b-4ff5-b693-47e44827bac5 + configurations + configurations + false + 0 + + + + + + 1777 + 531 + 108 + 20 + + + 1831 + 541 + + + + + + + + Indicates the fraction of requested trajectory that was calculated, e.g. 1 means the full trajectory was found. + 8819ad14-3b9f-46a5-9e7c-2443d6971399 + fraction + fraction + false + 0 + + + + + + 1777 + 551 + 108 + 20 + + + 1831 + 561 + + + + + + + + The time which is needed to execute that trajectory at full speed. + 9dfb5357-c4b4-42de-9e80-278255c040ab + time + time + false + 0 + + + + + + 1777 + 571 + 108 + 20 + + + 1831 + 581 + + + + + + + + The planes of the robot's end-effector. + e23bb059-980f-48ba-845f-bd8eebf53eb0 + planes + planes + false + 0 + + + + + + 1777 + 591 + 108 + 20 + + + 1831 + 601 + + + + + + + + The positions along the trajectory + 0c81a3a7-14f9-4482-b237-2557c88efc87 + P + P + false + 0 + + + + + + 1777 + 611 + 108 + 20 + + + 1831 + 621 + + + + + + + + The velocities along the trajectory + 7df56f3f-f7ae-4cb6-a0c6-9c544f26c2ed + V + V + false + 0 + + + + + + 1777 + 631 + 108 + 20 + + + 1831 + 641 + + + + + + + + The accelerations along the trajectory + 4ecc7121-84c5-4585-abe6-feb8e42a25a8 + A + A + false + 0 + + + + + + 1777 + 651 + 108 + 20 + + + 1831 + 661 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + true + eddec187-c6b4-4a85-bf6d-826a6e3b4117 + List Item + Item + + + + + + 1697 + 396 + 65 + 64 + + + 1732 + 428 + + + + + + 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 + 54564c7d-1328-42c6-9e85-1975267ed45a + List + L + false + 4d6b08c4-577b-4ff5-b693-47e44827bac5 + 1 + + + + + + 1699 + 398 + 18 + 20 + + + 1709.5 + 408 + + + + + + + + Item index + 668e6f05-59cd-4725-8a0e-7654764867ce + Index + i + false + cd1f39f7-c7b1-4f55-b426-b32b1fcf49e4 + 1 + + + + + + 1699 + 418 + 18 + 20 + + + 1709.5 + 428 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + d27d40b3-645c-43e8-ad05-0d950aafedf9 + Wrap + W + false + 0 + + + + + + 1699 + 438 + 18 + 20 + + + 1709.5 + 448 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 413f4b7d-50ca-45ce-9bd2-84a106772d59 + false + Item + i + false + 0 + + + + + + 1747 + 398 + 13 + 60 + + + 1753.5 + 428 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + cd1f39f7-c7b1-4f55-b426-b32b1fcf49e4 + Number Slider + + false + 0 + + + + + + 1499 + 488 + 162 + 20 + + + 1499.15 + 488.95 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 0 + + + + + + @@ -2299,7 +4006,7 @@ config = Configuration.from_revolute_values(x) - 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