From 04f8768d5d27c307cd72e43d5f38f13598324a80 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Fri, 31 Jul 2026 14:05:21 +0200 Subject: [PATCH 1/9] Mount the library's tools along their Z axis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tools of the ToolLibrary were modelled reaching along their own +X, following REP 199, while every planning group of the RobotCellLibrary ends at a link whose +Z points away from the arm — `tool0` on the industrial robots, `panda_hand_tcp` on the Panda. The two conventions disagreed, so each cell carried the same rotation in its attachment frame to bridge them, and a tool authored against one robot did not necessarily fit another. Adopt the z+ convention for our tools, so a tool mounts on any robot of the library with an identity attachment frame. The tools are still modelled along +X internally and re-framed on the way out through `ToolModel.reframe_base`, which keeps the change to one line per tool and leaves the geometry untouched. The TCF follows the same convention: its Z axis states the direction the tool works in, so a `TargetMode.TOOL` target aligns the tool along the target's Z. Re-framing alone would have left the TCF's X axis running along the tool, which mounts the tool correctly but sends every tool-mode target off at 90 degrees. The printing tool is the exception, its nozzle points across the mounting axis, so its TCF is carried along with the geometry to keep pointing out of the nozzle. The beams the gripper cells hold are authored in TCF coordinates, so they were re-authored to match the rotated TCF and stay where they were. Nothing moves: the attached tools, their TCP positions and the grasped beams were compared against main and land in exactly the same place, down to the vertex. What changes is the orientation of the tool's base frame and of its TCF, which is the point. Note the `flange` link that some robot models ship is the opposite convention (REP 199 puts x+ away from the last link). Since only some models have one, picking it as the end effector link would leave the library with two mounting conventions depending on the robot, which is exactly what this commit removes; `get_end_effector_link_name` documents that. Requires the `reframe_base` support of the next compas_robots release. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 3 + .../02_set_robot_cell_state_attach_objects.py | 4 +- ...t_robot_cell_state_with_kinematic_tools.py | 5 +- .../03_forward_kinematics_target_mode.py | 10 +- .../files/01_ros_robot_cell_with_tools.py | 5 +- src/compas_fab/robots/robot_library.py | 155 +++++++++++------- src/compas_fab/robots/semantics.py | 25 +++ .../ros/test_doc_examples_integration.py | 6 +- tests/robots/test_robot_library.py | 84 ++++++++++ 9 files changed, 221 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6f3ed7ebb..415302cd92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added + ### Changed +* The tools in `ToolLibrary` now mount along the +Z axis of their base frame instead of +X. Every planning group in `RobotCellLibrary` ends at a link whose +Z points away from the arm (`tool0` for the industrial robots, `panda_hand_tcp` for the Panda), so with this the same tool attaches to any of them with an identity attachment frame — previously each cell carried a rotation to bridge the two conventions, and a tool authored for one robot did not necessarily fit another. Their TCF states the tool's working direction with its own Z axis too, so a `TargetMode.TOOL` target aligns the tool along the target's Z — previously the TCF's X axis ran along the tool, which put every tool-mode target 90 degrees out. The tools are still modelled along +X internally and re-framed on the way out via `ToolModel.reframe_base`. The beams held by the gripper cells are authored in TCF coordinates and were re-authored to match, so they stay put. Poses are unchanged: the attached tools and workpieces of every cell land exactly where they did, only the tool's base frame is now the end effector link's frame rather than a rotated version of it. Requires the `reframe_base` support of the next `compas_robots` release. + ### Removed diff --git a/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py b/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py index 62428b5239..695c5e8d51 100644 --- a/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py +++ b/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py @@ -31,8 +31,10 @@ robot_cell_state.rigid_body_states["beam"].frame = Frame([1.2, 0, 0], [0, 0, 1], [1, 0, 0]) # Attach the gripper to the robot + # The gripper mounts along z+, same as the last link of the UR5's planning group + # ('tool0'), so the attachment frame does not need any rotation. robot_cell_state.tool_states["gripper"].attached_to_group = robot_cell.main_group_name - robot_cell_state.tool_states["gripper"].attachment_frame = Frame([0, 0, 0], [0, 0, 1], [1, 0, 0]) + robot_cell_state.tool_states["gripper"].attachment_frame = Frame.worldXY() # Set the robot cell state in the planner planner.set_robot_cell_state(robot_cell_state) diff --git a/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py b/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py index 320009bd58..aa28540f51 100644 --- a/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py +++ b/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py @@ -1,5 +1,3 @@ -from compas.geometry import Frame - from compas_fab.backends import MoveItPlanner from compas_fab.backends import RosClient from compas_fab.robots import ToolLibrary @@ -16,11 +14,12 @@ gripper = ToolLibrary.kinematic_gripper() robot_cell.tool_models[gripper.name] = gripper # Attach the gripper to the robot + # The tools in the ToolLibrary mount along z+, same as the last link of the UR5's + # planning group ('tool0'), so no attachment_frame (i.e. no rotation) is needed here. robot_cell_state = robot_cell.default_cell_state() robot_cell_state.set_tool_attached_to_group( gripper.name, robot_cell.main_group_name, - attachment_frame=Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]), touch_links=["wrist_3_link"], # This is the link that the tool is attached to ) diff --git a/docs/backends/ros/files/03_forward_kinematics_target_mode.py b/docs/backends/ros/files/03_forward_kinematics_target_mode.py index 0406e0c40d..b154d6e589 100644 --- a/docs/backends/ros/files/03_forward_kinematics_target_mode.py +++ b/docs/backends/ros/files/03_forward_kinematics_target_mode.py @@ -21,11 +21,13 @@ # The default robot cell state already have the gripper and beam attached # We modify the robot's configuration here to a specific joint configuration robot_cell_state.robot_configuration.joint_values = [-2.238, -1.153, -2.174, 0.185, 0.667, 0.0] + # Offset across the tool axis: the TCF's Y, since its Z now runs along the tool robot_cell_state.rigid_body_states["beam"].attachment_frame = Frame( - [0.0, 0.0, -0.1], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0] + [0.0, -0.1, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0] ) - # Note that the values for these frames are not the same. + # Note that these frames sit at different origins. The gripper works along its + # mounting axis, so its TCF has the same orientation as the PCF. print("Robot Planner Coordinate Frame (PCF) relative to the world coordinate system (WCF):") frame = planner.forward_kinematics(robot_cell_state, TargetMode.ROBOT) print("- {}".format(frame)) @@ -44,7 +46,7 @@ >>> Robot Planner Coordinate Frame (PCF) relative to the world coordinate system (WCF): >>> - Frame(point=Point(x=0.300, y=0.100, z=0.500), xaxis=Vector(x=-0.000, y=-1.000, z=0.000), yaxis=Vector(x=-0.000, y=-0.000, z=-1.000)) >>> Tool Coordinate Frame (TCF) relative to the world coordinate system (WCF): ->>> - Frame(point=Point(x=0.350, y=0.100, z=0.500), xaxis=Vector(x=1.000, y=-0.000, z=-0.000), yaxis=Vector(x=-0.000, y=-1.000, z=0.000)) +>>> - Frame(point=Point(x=0.350, y=0.100, z=0.500), xaxis=Vector(x=-0.000, y=-1.000, z=0.000), yaxis=Vector(x=-0.000, y=-0.000, z=-1.000)) >>> Workpiece's Object Coordinate Frame (OCF) relative to the world coordinate system (WCF): ->>> - Frame(point=Point(x=0.350, y=0.100, z=0.600), xaxis=Vector(x=1.000, y=-0.000, z=-0.000), yaxis=Vector(x=-0.000, y=-1.000, z=0.000)) +>>> - Frame(point=Point(x=0.350, y=0.100, z=0.600), xaxis=Vector(x=-0.000, y=-1.000, z=0.000), yaxis=Vector(x=-0.000, y=-0.000, z=-1.000)) """ diff --git a/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py b/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py index 798c65057a..b879c8210e 100644 --- a/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py +++ b/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py @@ -31,7 +31,9 @@ robot_cell_state = robot_cell.default_cell_state() # Modify the tool state to attach the cone to the robot robot_cell_state.tool_states["cone"].attached_to_group = robot_cell.main_group_name - robot_cell_state.tool_states["cone"].attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) + # The tools in the ToolLibrary mount along z+, same as the last link of the UR5's + # planning group ('tool0'), so the attachment frame does not need any rotation. + robot_cell_state.tool_states["cone"].attachment_frame = Frame.worldXY() # Specify the link of the robot that the tool is allowed to collide with robot_cell_state.tool_states["cone"].touch_links = ["wrist_3_link"] # Move the robot to a different configuration @@ -62,7 +64,6 @@ robot_cell_state.set_tool_attached_to_group( gripper.name, robot_cell.main_group_name, - attachment_frame=Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]), touch_links=["wrist_3_link"], ) # Specify the location of the detached cone tool diff --git a/src/compas_fab/robots/robot_library.py b/src/compas_fab/robots/robot_library.py index daa8d5f981..54d53921f2 100644 --- a/src/compas_fab/robots/robot_library.py +++ b/src/compas_fab/robots/robot_library.py @@ -33,15 +33,23 @@ class ToolLibrary: The kinematic chain is represented similar to a RobotModel. The configuration of the kinematic chain can be described in the context of a RobotCell using [`ToolState`][compas_fab.robots.ToolState] objects in [`RobotCellState`][compas_fab.robots.RobotCellState].tool_states. - All the tools are modelled following [ROS REP 199](https://gavanderhoorn.github.io/rep/rep-0199.html) recommendations, - where the tool's base frame is attached to the link named 'flange' in the RobotModel. - The 'flange' link frame must have its Positive X (x+) point away from the last link. - - Note that this convention is present in many of Robots loaded from URDF files, but not all. - Be aware that the 'flange' link is not necessary equal to the 'tool0' frame displayed on the robot controller, - the orientation of the 'tool0' frame is robot-brand-dependent. - The rationale of using a consistent 'flange' frame is that any tool can be attached to any robot interchangeably - without additional rotations to align the tool model and the robot flange. + All the tools are modelled to reach along the Positive Z (z+) axis of their base frame, + which is the frame the robot's flange takes hold of them at. + This matches the planning groups of the robots in [`RobotCellLibrary`][compas_fab.robots.RobotCellLibrary], + which all end at a link whose z+ points away from the last link — `tool0` for the industrial + robots, `panda_hand_tcp` for the Panda. Any tool can therefore be attached to any of these + robots interchangeably, with no rotation in the attachment frame. + + Note that a `flange` link, where a robot model has one, follows the opposite convention: + [ROS REP 199](https://gavanderhoorn.github.io/rep/rep-0199.html) puts its x+ away from the + last link. Only some robot models ship one, which is why the z+ convention is used here. + Be aware also that the 'tool0' link is not necessary equal to the tool frame displayed on + the robot controller, though for the robots in this library it is. + + When modelling your own tool, you do not have to draw it along its Z axis to comply: + pass the `base_frame` of [`ToolModel`][compas_robots.ToolModel] (the `base_plane` input of the + `Tool From Mesh` Grasshopper component) to state where the flange takes hold of the geometry, + in the coordinate system you modelled in. Examples -------- @@ -50,17 +58,40 @@ class ToolLibrary: >>> tool = ToolLibrary.cone() >>> tool.name 'cone' + >>> tool.frame.point # the TCF reaches along z+ of the tool's base frame + Point(x=0.000, y=0.000, z=0.100) """ + # The tools below are modelled reaching along their own x+, following REP 199, and are + # re-framed onto the z+ convention of this library on the way out. Expressed the other + # way round: the flange takes hold of them at the plane whose z+ runs along their x+. + REP199_MOUNTING_PLANE = Frame([0.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]) + + @classmethod + def _mount_along_z(cls, tool_model: ToolModel, align_tcf: bool = True) -> ToolModel: + """Re-frame a tool modelled along x+ onto the z+ mounting convention of this library. + + The TCF's Z axis states the direction the tool works in, which is the axis a + `TargetMode.TOOL` target aligns the tool to. For a tool that works along the axis + it is mounted on — a cone drawing, a gripper approaching — that is the mounting + axis itself, so the TCF keeps its position and takes the orientation of the base + frame. Pass `align_tcf=False` for a tool that works in some other direction, and + the TCF is carried along with the geometry instead. + """ + tool_model.reframe_base(cls.REP199_MOUNTING_PLANE) + if align_tcf: + tool_model.frame = Frame(tool_model.frame.point, [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]) + return tool_model + @classmethod def cone(cls, load_geometry: bool = True, radius: float = 0.02, length: float = 0.1) -> ToolModel: """Create and return a cone as ToolModel, useful for simulating a drawing tool. - The cone points towards the positive X-axis of the tool frame. + The cone points towards the positive Z-axis of the tool's base frame. The tool has only one visual mesh, which is also used for collision mesh. The tool TCF is located at the tip of the cone, - it is a translation offset from T0CF by its length (default 0.1) along the X-axis of the T0CF. + it is a translation offset from the base frame by its length (default 0.1) along its Z-axis. The tool name is 'cone'. Parameters @@ -89,22 +120,21 @@ def cone(cls, load_geometry: bool = True, radius: float = 0.02, length: float = # tool_mesh = Mesh.from_stl(compas_fab.get("planning_scene/cone.stl")) tool_model.add_link("cone_link", visual_meshes=meshes, collision_meshes=meshes) - return tool_model + return cls._mount_along_z(tool_model) @classmethod def printing_tool(cls, load_geometry: bool = True, tool_size: float = 1.0) -> ToolModel: """Create and return a printing tool as ToolModel, useful for simulating a 3D printing tool. The Tool Frame is located at the tip of the tool, - equal to `Frame([0.2, 0.0, 1.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0])`. - It has the same orientation as its base frame. + equal to `Frame([0.0, 1.0, 0.2], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])`. Its Z-axis points out of the printing nozzle into the material being printed. Therefor, the printing targets should be defined with the Z-axis pointing towards the object being printed. The tool name is 'printing_tool'. Changing the `tool_size` parameter will scale the tool. - The default size is 1.0, corresponding to the tool tip being 1m away (Z-direction) from the base frame. + The default size is 1.0, corresponding to the tool tip being 1m away from the base frame. Parameters ---------- @@ -128,7 +158,9 @@ def printing_tool(cls, load_geometry: bool = True, tool_size: float = 1.0) -> To tool_model.add_link("printing_tool_link", visual_meshes=meshes, collision_meshes=meshes) - return tool_model + # The nozzle points across the mounting axis rather than along it, so the TCF is + # carried along with the geometry to keep its Z axis pointing out of the nozzle. + return cls._mount_along_z(tool_model, align_tcf=False) @classmethod def static_gripper(cls, load_geometry: bool = True) -> ToolModel: @@ -139,9 +171,9 @@ def static_gripper(cls, load_geometry: bool = True) -> ToolModel: The tool has three visual meshes representing the gripper body and the jaws. The visual mesh is also used for collision mesh. The tool TCF is located at the gripper face of the gripper, - it is a translation offset from T0CF by +0.1 along the X-axis of the T0CF. + it is a translation offset from the base frame by +0.1 along its Z-axis. The tool name is 'gripper'. - Bar material can be held with the gripper with the long axis matching the Z axis of the TCF. + Bar material can be held with the gripper with the long axis matching the Y axis of the TCF. Parameters ---------- @@ -177,7 +209,7 @@ def static_gripper(cls, load_geometry: bool = True) -> ToolModel: meshes.append(Mesh.from_shape(shape).transformed(t)) tool_model.add_link("gripper_body", visual_meshes=meshes, collision_meshes=meshes) - return tool_model + return cls._mount_along_z(tool_model) @classmethod def static_gripper_small(cls, load_geometry: bool = True) -> ToolModel: @@ -188,9 +220,9 @@ def static_gripper_small(cls, load_geometry: bool = True) -> ToolModel: The tool has three visual meshes representing the gripper body and the jaws. The visual mesh is also used for collision mesh. The tool TCF is located at the gripper face of the gripper, - it is a translation offset from T0CF by +0.1 along the X-axis of the T0CF. + it is a translation offset from the base frame by +0.1 along its Z-axis. The tool name is 'gripper'. - Bar material can be held with the gripper with the long axis matching the Z axis of the TCF. + Bar material can be held with the gripper with the long axis matching the Y axis of the TCF. Parameters ---------- @@ -226,7 +258,7 @@ def static_gripper_small(cls, load_geometry: bool = True) -> ToolModel: meshes.append(Mesh.from_shape(shape).transformed(t)) tool_model.add_link("gripper_body", visual_meshes=meshes, collision_meshes=meshes) - return tool_model + return cls._mount_along_z(tool_model) @classmethod def kinematic_gripper(cls, load_geometry: bool = True) -> ToolModel: @@ -244,9 +276,9 @@ def kinematic_gripper(cls, load_geometry: bool = True) -> ToolModel: The tool has the same visual and collision mesh. The tool's TCF is located at the tip of the gripper fingers, - which is a translation offset from T0CF by +0.15 along the X-axis of the T0CF. + which is a translation offset from the base frame by +0.15 along its Z-axis. The tool name is 'gripper'. - Bar material can be held with the gripper if the long axis of the bar matches the Z axis of the TCF. + Bar material can be held with the gripper if the long axis of the bar matches the Y axis of the TCF. Parameters ---------- @@ -262,7 +294,9 @@ def kinematic_gripper(cls, load_geometry: bool = True) -> ToolModel: tool_model = json_load(compas_fab.get("tool_library/kinematic_gripper/gripper.json")) assert isinstance(tool_model, ToolModel) - return tool_model + + # The serialized model is modelled along x+, like the programmatic tools above + return cls._mount_along_z(tool_model) class RigidBodyLibrary: @@ -597,10 +631,9 @@ def ur5_cone_tool(cls, load_geometry: bool = True) -> tuple[RobotCell, RobotCell # Attach the tool to the robot's main group touch_links = ["wrist_3_link"] - # UR5 has the last planning link as 'tool0' not 'flange', therefore the cone tool - # that is REP 199 compliant is attached with the following rotation to match. - attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) - robot_cell_state.set_tool_attached_to_group("cone", robot_cell.main_group_name, attachment_frame=attachment_frame, touch_links=touch_links) + # The cone of the ToolLibrary mounts along z+, same as the planning group's last + # link ('tool0'), so no rotation is needed in the attachment frame. + robot_cell_state.set_tool_attached_to_group("cone", robot_cell.main_group_name, touch_links=touch_links) # ------------------------------------------------------------------------ # Static Rigid Body Touch Links @@ -649,9 +682,9 @@ def ur5_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell, Ro # Load Rigid Bodies # --------------------------------------------------------------------- - # Z axis is the length of the beam, X axis points away from the robot + # Authored in the gripper's TCF: Y axis is the length of the beam, Z axis points away from the robot beam_length = 0.4 - beam = Box.from_corner_corner_height([0.0, -0.05, -beam_length * 0.5], [0.1, 0.05, -beam_length * 0.5], beam_length) + beam = Box.from_corner_corner_height([-0.05, -beam_length * 0.5, 0.0], [0.05, beam_length * 0.5, 0.0], 0.1) beam_mesh = Mesh.from_shape(beam) robot_cell.rigid_body_models["beam"] = RigidBody.from_mesh(beam_mesh) @@ -668,22 +701,20 @@ def ur5_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell, Ro # Tool Attachment # ------------------------------------------------------------------------ - # Attach the tool to the robot's main group - attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) + # Attach the tool to the robot's main group. + # The gripper of the ToolLibrary mounts along z+, same as the planning group's last + # link ('tool0'), so no rotation is needed in the attachment frame. # Gripper is allowed to touch the last link of the robot. - # However, do not use the following line to get the end effector link name, + # However, do not use the end effector link name as touch link, # because it is not guaranteed to be the last link that has geometry in the robot chain. - # ee_link_name = robot.get_end_effector_link_name(robot_cell.main_group_name) - - # Instead, check the robot model and hard code the actual link name. + # Instead, check the robot model and hard code the actual link name, + # or use `robot_cell.default_touch_links()`. touch_links = ["wrist_3_link"] - # For UR10e, the last logical link is `tool0` (from robot.get_end_effector_link_name) - # However the last link with geometry attached is `wrist_3_link`. + # For UR5, the end effector link is `tool0`, which has no geometry. + # The last link with geometry attached is `wrist_3_link`. - robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, attachment_frame, touch_links) - # Note: There is a rotation to match the gripper's orientation because the last link in the abb robot - # does not follow the REP 199 convention. + robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, touch_links=touch_links) # ------------------------------------------------------------------------ # Workpiece Attachment @@ -740,9 +771,9 @@ def abb_irb4600_40_255_gripper_one_beam(cls, load_geometry: bool = True) -> tupl # Load Rigid Bodies # --------------------------------------------------------------------- - # Z axis is the length of the beam, X axis points away from the robot + # Authored in the gripper's TCF: Y axis is the length of the beam, Z axis points away from the robot beam_length = 1.0 - beam = Box.from_corner_corner_height([0.0, -0.1, -beam_length * 0.5], [0.2, 0.1, -beam_length * 0.5], beam_length) + beam = Box.from_corner_corner_height([-0.1, -beam_length * 0.5, 0.0], [0.1, beam_length * 0.5, 0.0], 0.2) beam_mesh = Mesh.from_shape(beam) robot_cell.rigid_body_models["beam"] = RigidBody.from_mesh(beam_mesh) @@ -756,10 +787,9 @@ def abb_irb4600_40_255_gripper_one_beam(cls, load_geometry: bool = True) -> tupl robot_cell_state = robot_cell.default_cell_state() # Attach the tool to the robot's main group - attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) - robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, attachment_frame) - # Note: There is a rotation to match the gripper's orientation because the last link in the abb robot - # does not follow the REP 199 convention. + # The tools of the ToolLibrary mount along z+, same as the planning group's last link, + # so no rotation is needed in the attachment frame. + robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name) # Attach the beam to the gripper robot_cell_state.set_rigid_body_attached_to_tool("beam", "gripper") @@ -804,9 +834,9 @@ def ur10e_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell, # Load Rigid Bodies # --------------------------------------------------------------------- - # Z axis is the length of the beam, X axis points away from the robot + # Authored in the gripper's TCF: Y axis is the length of the beam, Z axis points away from the robot beam_length = 0.4 - beam = Box.from_corner_corner_height([0.0, -0.05, -beam_length * 0.5], [0.1, 0.05, -beam_length * 0.5], beam_length) + beam = Box.from_corner_corner_height([-0.05, -beam_length * 0.5, 0.0], [0.05, beam_length * 0.5, 0.0], 0.1) beam_mesh = Mesh.from_shape(beam) robot_cell.rigid_body_models["beam"] = RigidBody.from_mesh(beam_mesh) @@ -823,22 +853,20 @@ def ur10e_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell, # Tool Attachment # ------------------------------------------------------------------------ - # Attach the tool to the robot's main group - attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) + # Attach the tool to the robot's main group. + # The gripper of the ToolLibrary mounts along z+, same as the planning group's last + # link ('tool0'), so no rotation is needed in the attachment frame. # Gripper is allowed to touch the last link of the robot. - # However, do not use the following line to get the end effector link name, + # However, do not use the end effector link name as touch link, # because it is not guaranteed to be the last link that has geometry in the robot chain. - # ee_link_name = robot.get_end_effector_link_name(robot_cell.main_group_name) - - # Instead, check the robot model and hard code the actual link name. + # Instead, check the robot model and hard code the actual link name, + # or use `robot_cell.default_touch_links()`. touch_links = ["wrist_3_link"] - # For UR10e, the last logical link is `tool0` (from robot.get_end_effector_link_name) - # However the last link with geometry attached is `wrist_3_link`. + # For UR10e, the end effector link is `tool0`, which has no geometry. + # The last link with geometry attached is `wrist_3_link`. - robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, attachment_frame, touch_links) - # Note: There is a rotation to match the gripper's orientation because the last link in the abb robot - # does not follow the REP 199 convention. + robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, touch_links=touch_links) # ------------------------------------------------------------------------ # Workpiece Attachment @@ -908,9 +936,10 @@ def abb_irb4600_40_255_printing_tool(cls, load_geometry: bool = True) -> tuple[R # ------------------------------------------------------------------------ # Attach the tool to the robot's main group - attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) + # The tools of the ToolLibrary mount along z+, same as the planning group's last link, + # so no rotation is needed in the attachment frame. touch_links = ["link_6"] - robot_cell_state.set_tool_attached_to_group("printing_tool", robot_cell.main_group_name, attachment_frame, touch_links=touch_links) + robot_cell_state.set_tool_attached_to_group("printing_tool", robot_cell.main_group_name, touch_links=touch_links) # ------------------------------------------------------------------------ # Static Rigid Body Touch Links diff --git a/src/compas_fab/robots/semantics.py b/src/compas_fab/robots/semantics.py index 4999d4e5df..c811782f0a 100644 --- a/src/compas_fab/robots/semantics.py +++ b/src/compas_fab/robots/semantics.py @@ -194,6 +194,25 @@ def from_xml(cls, xml: XML, robot_model: RobotModel) -> "RobotSemantics": def get_end_effector_link_name(self, group: Optional[str] = None) -> str: """Get the name of the last link (end effector link) in a planning group. + The frame of this link is the robot's Planner Coordinate Frame (PCF), + where tools are attached. + + Planning groups conventionally end at the robot's `tool0` link, whose + positive Z axis points away from the last link. That holds across brands + — it is what ROS Industrial support packages ship — and robots without a + `tool0` tend to end at an equivalent frame anyway (e.g. Panda's + `panda_hand_tcp`). The tools in [`ToolLibrary`][compas_fab.robots.ToolLibrary] + are modelled to mount along that same positive Z axis, so they attach to + any of these robots without a compensating rotation. + + Note that a `flange` link, where a robot model has one, follows the + opposite convention: [ROS REP 199](https://gavanderhoorn.github.io/rep/rep-0199.html) + puts its positive X axis away from the last link. Since only some robot + models ship one, chaining a planning group to it would leave the cell with + two mounting conventions depending on the robot. If your group does end at + a flange, state the tool's mounting plane on the tool itself, see + [`ToolModel.reframe_base`][compas_robots.ToolModel.reframe_base]. + Parameters ---------- group @@ -203,6 +222,12 @@ def get_end_effector_link_name(self, group: Optional[str] = None) -> str: ------- `str` The name of the end effector link. + + Examples + -------- + >>> robot_cell, robot_cell_state = RobotCellLibrary.ur5() + >>> robot_cell.robot_semantics.get_end_effector_link_name() + 'tool0' """ if not group: diff --git a/tests/backends/ros/test_doc_examples_integration.py b/tests/backends/ros/test_doc_examples_integration.py index 12c84a04a0..aab32a8b6c 100644 --- a/tests/backends/ros/test_doc_examples_integration.py +++ b/tests/backends/ros/test_doc_examples_integration.py @@ -75,7 +75,7 @@ def test_02_set_robot_cell_state_with_attached_objects_example(ur5_robot_cell, p robot_cell_state.rigid_body_states["beam"].frame = Frame([1.2, 0, 0], [0, 0, 1], [1, 0, 0]) robot_cell_state.tool_states["gripper"].attached_to_group = robot_cell.main_group_name - robot_cell_state.tool_states["gripper"].attachment_frame = Frame([0, 0, 0], [0, 0, 1], [1, 0, 0]) + robot_cell_state.tool_states["gripper"].attachment_frame = Frame.worldXY() planner.set_robot_cell_state(robot_cell_state) robot_cell_state.rigid_body_states["beam"].attached_to_tool = "gripper" @@ -95,7 +95,6 @@ def test_02_set_robot_cell_state_with_kinematic_tool_example(ur5_robot_cell, pla robot_cell_state.set_tool_attached_to_group( gripper.name, ur5_robot_cell.main_group_name, - attachment_frame=Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]), touch_links=["wrist_3_link"], ) robot_cell_state.robot_configuration.joint_values[1] = -1.0 @@ -134,7 +133,8 @@ def test_03_forward_kinematics_target_mode_example(ros2_client, ur5_robot_cell, planner.set_robot_cell(robot_cell) robot_cell_state.robot_configuration.joint_values = [-2.238, -1.153, -2.174, 0.185, 0.667, 0.0] - robot_cell_state.rigid_body_states["beam"].attachment_frame = Frame([0.0, 0.0, -0.1], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]) + # Offset across the tool axis: the TCF's Y, since its Z now runs along the tool + robot_cell_state.rigid_body_states["beam"].attachment_frame = Frame([0.0, -0.1, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]) robot_frame = planner.forward_kinematics(robot_cell_state, TargetMode.ROBOT) tool_frame = planner.forward_kinematics(robot_cell_state, TargetMode.TOOL) diff --git a/tests/robots/test_robot_library.py b/tests/robots/test_robot_library.py index 46b7cabe26..3288ba3ca8 100644 --- a/tests/robots/test_robot_library.py +++ b/tests/robots/test_robot_library.py @@ -1,6 +1,24 @@ +from compas.geometry import Point +from compas.geometry import Vector + from compas_fab.robots import RobotCellLibrary +from compas_fab.robots import ToolLibrary import pytest +# Every cell of the library, with the tool attached to its main planning group +CELLS_WITH_TOOLS = [ + ("ur5_cone_tool", "cone"), + ("ur5_gripper_one_beam", "gripper"), + ("ur10e_gripper_one_beam", "gripper"), + ("abb_irb4600_40_255_gripper_one_beam", "gripper"), + ("abb_irb4600_40_255_printing_tool", "printing_tool"), +] + +# `printing_tool` is deliberately absent: it is an L-shaped tool whose tip sits a metre +# off to the side of its mount (it reaches along +Y of its base frame), which is how it +# has always been modelled. It still mounts by its base frame like every other tool. +TOOLS_REACHING_ALONG_Z = ["cone", "static_gripper", "static_gripper_small", "kinematic_gripper"] + @pytest.fixture def all_robots_cells_and_states(): @@ -18,3 +36,69 @@ def test_robot_semantics_and_geometry(all_robots_cells_and_states): robot_cell.ensure_geometry() assert robot_cell.robot_model.name robot_cell.print_info() + + +@pytest.mark.parametrize("tool_name", TOOLS_REACHING_ALONG_Z) +def test_tools_mount_along_their_z_axis(tool_name): + """The mounting convention of the library: a tool reaches along the +Z axis of + its base frame, which is the frame the robot's flange takes hold of it at. + + This is what lets the same tool be attached to any robot of the library without + a rotation, and it is only true because every planning group there ends at a + link whose +Z points away from the arm. + """ + tool = getattr(ToolLibrary, tool_name)(load_geometry=True) + + tcf_direction = Vector(*tool.frame.point).unitized() + assert tcf_direction.dot(Vector.Zaxis()) > 0.9, "{} does not reach along +Z".format(tool_name) + + # ...and the TCF states the working direction with its own Z axis, which is the axis + # a TargetMode.TOOL target aligns the tool to. A TCF left pointing along X mounts the + # tool correctly but sends every tool-mode target off at 90 degrees. + assert Vector(*tool.frame.zaxis).dot(Vector.Zaxis()) > 0.99, "{} works along its TCF X, not its TCF Z".format(tool_name) + + # The body of the tool sits on the +Z side of its mounting plane, i.e. it does not + # reach back into the robot it is attached to. Only the base link is checked, the + # geometry of any child link is expressed in that link's own frame, not this one. + for mesh in tool.get_link_collision_meshes(tool.root) or []: + zs = [mesh.vertex_coordinates(v)[2] for v in mesh.vertices()] + assert min(zs) > -1e-6, "{} has geometry behind its mounting plane".format(tool_name) + + +@pytest.mark.parametrize("cell_name, tool_id", CELLS_WITH_TOOLS) +def test_cells_attach_their_tool_without_a_rotation(cell_name, tool_id): + """Because tools and end effector links agree on the convention, every cell of + the library attaches its tool with an identity attachment frame, on UR and ABB + alike. A rotation creeping back in means the two conventions have drifted apart. + """ + robot_cell, robot_cell_state = getattr(RobotCellLibrary, cell_name)(load_geometry=False) + attachment_frame = robot_cell_state.tool_states[tool_id].attachment_frame + + assert attachment_frame.point.distance_to_point(Point(0, 0, 0)) == pytest.approx(0.0, abs=1e-9) + assert Vector(*attachment_frame.xaxis).dot(Vector.Xaxis()) == pytest.approx(1.0, abs=1e-9) + assert Vector(*attachment_frame.yaxis).dot(Vector.Yaxis()) == pytest.approx(1.0, abs=1e-9) + + +@pytest.mark.parametrize("cell_name, tool_id", CELLS_WITH_TOOLS) +def test_attached_tool_sits_where_the_tool_says_it_does(cell_name, tool_id): + """With the conventions agreeing, the TCP relative to the end effector link is + simply the tool's own TCF — no rotation, no offset introduced by the attachment. + + This is the pose the scene objects draw, `RobotCell.compute_attach_objects_frames` + is what `BaseRobotCellObject.update` calls, so this is the "tool looks wrong in + Rhino" regression. + """ + robot_cell, robot_cell_state = getattr(RobotCellLibrary, cell_name)(load_geometry=False) + robot_cell_state.robot_configuration.joint_values = [-2.238, -1.153, -2.174, 0.185, 0.667, 0.5] + + tcf_in_pcf = Point(0, 0, 0).transformed(robot_cell.t_pcf_tcf(robot_cell_state, tool_id)) + assert tcf_in_pcf.distance_to_point(Point(*robot_cell.tool_models[tool_id].frame.point)) < 1e-9 + + # ...and in the world it lands on the frame of the end effector link + ee_frame = robot_cell.robot_model.forward_kinematics(robot_cell_state.robot_configuration, robot_cell.get_end_effector_link_name()) + assert ( + ee_frame.to_world_coordinates(tcf_in_pcf).distance_to_point( + robot_cell.compute_attach_objects_frames(robot_cell_state).tool_states[tool_id].frame.to_world_coordinates(Point(*robot_cell.tool_models[tool_id].frame.point)) + ) + < 1e-9 + ) From a8e2d1926d13c7cb2afc6ff3698a9b6d1ce3ea03 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Fri, 31 Jul 2026 14:06:00 +0200 Subject: [PATCH 2/9] Send an explicit ik_link_name to MoveIt `MoveItInverseKinematics` sent the target pose without an `ik_link_name`, letting MoveIt interpret it at the default tip link of the planning group. That tip is the end effector link compas_fab computes the Planner Coordinate Frame at for every robot in the library, but nothing guarantees it for a group configured with a different tip, and the failure is silent: the IK result comes back rotated. Add the field to `PositionIKRequest` and always state the link, defaulting to the group's end effector link and overridable with the new `"link"` option, mirroring `plan_cartesian_motion`. Verified against a live ROS 2 MoveIt stack: IK round-trips through model FK at the requested link. Also use `get_end_effector_link_name` instead of `get_link_names(group)[-1]` in the PyBullet cell state feature, same result, explicit intent. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 1 + .../backend_features/pybullet_set_robot_cell_state.py | 2 +- .../ros/backend_features/move_it_inverse_kinematics.py | 9 +++++++++ src/compas_fab/backends/ros/messages/moveit_msgs.py | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 415302cd92..47a1d71b6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed * The tools in `ToolLibrary` now mount along the +Z axis of their base frame instead of +X. Every planning group in `RobotCellLibrary` ends at a link whose +Z points away from the arm (`tool0` for the industrial robots, `panda_hand_tcp` for the Panda), so with this the same tool attaches to any of them with an identity attachment frame — previously each cell carried a rotation to bridge the two conventions, and a tool authored for one robot did not necessarily fit another. Their TCF states the tool's working direction with its own Z axis too, so a `TargetMode.TOOL` target aligns the tool along the target's Z — previously the TCF's X axis ran along the tool, which put every tool-mode target 90 degrees out. The tools are still modelled along +X internally and re-framed on the way out via `ToolModel.reframe_base`. The beams held by the gripper cells are authored in TCF coordinates and were re-authored to match, so they stay put. Poses are unchanged: the attached tools and workpieces of every cell land exactly where they did, only the tool's base frame is now the end effector link's frame rather than a rotated version of it. Requires the `reframe_base` support of the next `compas_robots` release. +* `MoveItInverseKinematics` now sends the target pose with an explicit `ik_link_name` (the planning group's end effector link, overridable via the new `"link"` option) instead of relying on MoveIt's default tip link for the group. The two are the same link for the robots in this library, but nothing guarantees that for a planning group configured with a different tip, in which case MoveIt would interpret the target pose at the wrong frame. `PositionIKRequest` gained the corresponding `ik_link_name` field. ### Removed diff --git a/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py b/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py index 544565a9db..95b40ea63d 100644 --- a/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py +++ b/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py @@ -89,7 +89,7 @@ def set_robot_cell_state(self, robot_cell_state: RobotCellState): if not robot_cell_state.robot_configuration: continue # If tool is attached to a group, update the tool's base frame using the group's FK frame - link_name = client.robot_cell.get_link_names(tool_state.attached_to_group)[-1] + link_name = client.robot_cell.get_end_effector_link_name(tool_state.attached_to_group) _robot_configuration = robot_cell_state.robot_configuration # Get PCF of the Robot pcf_link_id = client.robot_link_puids[link_name] diff --git a/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py b/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py index ad4bacac99..a473d7b49c 100644 --- a/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py +++ b/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py @@ -165,6 +165,9 @@ def iter_inverse_kinematics( - ``"constraints"``: (:obj:`list` of :class:`compas_fab.robots.Constraint`, optional) An extra set of MoveIt constraints where the final link of the planning group must satisfy. Defaults to ``None``. + - ``"link"``: (:obj:`str`, optional) The name of the link the target pose refers to. + Defaults to the end effector link of the planning group, see + :meth:`compas_fab.robots.RobotCell.get_end_effector_link_name`. - ``"timeout"``: (:obj:`int`, optional) Maximum allowed time for one inverse kinematic calculation by the backend. If ``max_results`` is greater than 1, this timeout is applied to each calculation. @@ -245,6 +248,11 @@ def _iter_inverse_kinematics_frame_target(self, target: FrameTarget, robot_cell_ options["base_link"] = options.get("base_link", robot_cell.root_name) # The exposed "base_link" option is removed from documentation because I don't know what it does. + # The link the target pose refers to. This must be stated explicitly because the + # Planner Coordinate Frame (e.g. the 'flange' link) is not necessarily the default + # tip link that MoveIt would otherwise assume for the planning group (e.g. 'tool0'). + options["link"] = options.get("link") or robot_cell.get_end_effector_link_name(group) + # Setting the entire robot cell state, including the robot configuration planner.set_robot_cell_state(robot_cell_state) @@ -351,6 +359,7 @@ def _inverse_kinematics_async( group_name=group, robot_state=robot_state, constraints=constraints, + ik_link_name=options["link"], pose_stamped=pose_stamped, avoid_collisions=bool(check_collision), attempts=options.get("attempts", 8), diff --git a/src/compas_fab/backends/ros/messages/moveit_msgs.py b/src/compas_fab/backends/ros/messages/moveit_msgs.py index 6e59c3ddbb..2bfaa560f5 100644 --- a/src/compas_fab/backends/ros/messages/moveit_msgs.py +++ b/src/compas_fab/backends/ros/messages/moveit_msgs.py @@ -192,11 +192,15 @@ def __init__( timeout=None, attempts=8, avoid_collisions=True, + ik_link_name="", ): self.group_name = group_name self.robot_state = robot_state if robot_state else RobotState() self.constraints = constraints if constraints else Constraints() self.avoid_collisions = avoid_collisions + # The link the `pose_stamped` refers to. An empty string lets MoveIt + # fall back to the default tip link of the planning group. + self.ik_link_name = ik_link_name self.pose_stamped = pose_stamped if pose_stamped else PoseStamped() self.timeout = timeout self.attempts = attempts From 562cd027933a9e61e92a4a0be01e58792b513b30 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Fri, 31 Jul 2026 14:06:00 +0200 Subject: [PATCH 3/9] Let a tool declare where the flange takes hold of it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A tool built from a Rhino mesh had to be modelled in the tool's own base frame, because that frame was hardcoded to the origin: the mesh coordinates *were* the base frame. Draw a gripper reaching along X and it mounts sideways, with nothing to say so. Add a `base_plane` input to `Tool From Mesh`: the plane, in the coordinates you modelled in, at which the robot's flange takes hold of the geometry. Its Z axis points away from the robot, matching the tools of the ToolLibrary, so a tool drawn reaching along world Z needs no plane at all and one drawn along another axis is mounted by wiring a plane rather than redrawing. Backed by `base_frame` of compas_robots' ToolModel, which folds it into the link origins instead of baking it into the mesh, so it can be re-wired at any time. It is only passed when wired, so an older compas_robots keeps working for definitions that don't use it. The component also remarks when the TCP does not sit roughly on the tool's +Z, since that means the tool will point sideways once attached. The direction from the mount to the TCP is only a hint — it says nothing about the roll of the tool, and a gripper with a lateral TCP offset would come out subtly tilted rather than obviously wrong — so it is reported rather than applied. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 1 + .../Cf_ToolFromMesh/code.py | 67 +++++++++++++++++-- .../Cf_ToolFromMesh/metadata.json | 8 ++- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47a1d71b6c..a7656df9ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +* The `Tool From Mesh` Grasshopper component gained a `base_plane` input: where the robot's flange takes hold of the geometry, expressed in the coordinates the mesh was modelled in. Its Z axis points away from the robot, so a tool drawn reaching along world Z needs none, and a tool drawn along another axis is mounted by wiring a plane instead of redrawing the geometry. Backed by the new `base_frame` argument of `compas_robots.ToolModel`; nothing is baked into the mesh, so the plane can be re-wired at any time. The component also surfaces a remark when the TCP does not sit roughly on the tool's +Z, since that means the tool will point sideways once attached — the direction from the mount to the TCP is only a hint (it says nothing about roll), so it is reported rather than applied. ### Changed diff --git a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py index 4b589be2f3..c99086ca3a 100644 --- a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py +++ b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py @@ -3,10 +3,21 @@ Construct a ToolModel from a Rhino mesh and a TCP plane. `tcp_plane` may be a Rhino Plane or a compas Frame; it is the Tool -Coordinate Frame expressed in the robot's `tool0` link frame. If -`collision_mesh` is unwired, `visual_mesh` is reused for collision +Coordinate Frame, expressed in the same coordinates you modelled the mesh +in. If `collision_mesh` is unwired, `visual_mesh` is reused for collision checks. +`base_plane` is where the robot's flange takes hold of the geometry, also +in the coordinates you modelled in. Its Z axis points away from the robot, +matching the planning groups of the robots in the library, so a tool drawn +reaching along world Z needs no `base_plane` at all. Wire one when the tool +was drawn along another axis: for a tool reaching along world X, that is +the plane with Z = world X. Nothing is baked into the mesh, so the plane +can be re-wired at any time. + +A remark is surfaced when the TCP does not sit roughly on the tool's +Z, +since that means the tool will point sideways once attached. + The result is a static (no joints) `ToolModel` ready to feed into a `Load Robot Cell` component's `tools` input. Kinematic tools (with their own joints) should be loaded from URDF instead. @@ -14,32 +25,80 @@ COMPAS FAB v2.0.1 """ +from math import degrees + import Grasshopper import Rhino import rhinoscriptsyntax as rs import System from compas.geometry import Frame +from compas.geometry import Vector +from compas_ghpython import remark from compas_ghpython import warning as gh_warning from compas_rhino.conversions import mesh_to_compas from compas_rhino.conversions import plane_to_compas_frame from compas_robots import ToolModel +# Beyond this angle between the tool's +Z and its TCP, the tool is considered +# to be pointing somewhere other than away from the flange. +MAX_TCP_OFF_AXIS_ANGLE = 30.0 + + +def _off_axis_remark(tool): + """Text for the mounting-axis remark, or None when the tool looks fine. + + The TCP direction is only a hint: it says nothing about the roll of the tool + and is meaningless for a TCP sitting on the mount itself, so it is reported + rather than applied. + """ + tcp_direction = Vector(*tool.frame.point) + if tcp_direction.length < 1e-6: + return None + + angle = degrees(tcp_direction.angle(Vector.Zaxis())) + if angle < MAX_TCP_OFF_AXIS_ANGLE: + return None + + message = ("TCP sits {:.0f} deg off the tool's +Z axis, so this tool will point sideways once attached: tools mount with +Z pointing away from the flange. ").format(angle) + + unitized = tcp_direction.unitized() + if abs(unitized.x) > 0.99: + message += "Your tool reaches along X, so set `base_plane` to a plane with its Z axis along world X (origin, x=(0,1,0), y=(0,0,1))." + elif abs(unitized.y) > 0.99: + message += "Your tool reaches along Y, so set `base_plane` to a plane with its Z axis along world Y (origin, x=(0,0,1), y=(1,0,0))." + else: + message += "Set `base_plane` to a plane whose Z axis runs along your tool, with its X axis picked to give the roll you want." + return message + class ToolFromMesh(Grasshopper.Kernel.GH_ScriptInstance): - def RunScript(self, name: str, visual_mesh, collision_mesh, tcp_plane): + def RunScript(self, name: str, visual_mesh, collision_mesh, tcp_plane, base_plane): if visual_mesh is None or tcp_plane is None: return None frame = tcp_plane if isinstance(tcp_plane, Frame) else plane_to_compas_frame(tcp_plane) + base_frame = None + if base_plane is not None: + base_frame = base_plane if isinstance(base_plane, Frame) else plane_to_compas_frame(base_plane) c_visual = mesh_to_compas(rs.coercemesh(visual_mesh)) if visual_mesh else None c_collision = mesh_to_compas(rs.coercemesh(collision_mesh)) if collision_mesh else None if collision_mesh is None: gh_warning(ghenv.Component, "No collision mesh provided: the tool will be visualized but ignored for collision checking.") # noqa: F821 - return ToolModel( + # `base_frame` is only passed when wired, so an older compas_robots keeps + # working for definitions that don't use it. + kwargs = {"base_frame": base_frame} if base_frame else {} + tool = ToolModel( visual=c_visual, frame_in_tool0_frame=frame, collision=c_collision, name=(name or "attached_tool").strip(), + **kwargs, ) + + message = _off_axis_remark(tool) + if message: + remark(ghenv.Component, message) # noqa: F821 + + return tool diff --git a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json index e847c73bad..b0d1db0034 100644 --- a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json +++ b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json @@ -3,7 +3,7 @@ "nickname": "Tool From Mesh", "category": "COMPAS FAB", "subcategory": "Robot Cell", - "description": "Construct a ToolModel from a Rhino mesh and a TCP plane. The TCP is expressed in the robot's `tool0` link frame. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.", + "description": "Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.", "exposure": 4, "ghpython": { "isAdvancedMode": true, @@ -24,7 +24,11 @@ }, { "name": "tcp_plane", - "description": "Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame." + "description": "Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in." + }, + { + "name": "base_plane", + "description": "Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame." } ], "outputParameters": [ From f7652c527d699ea87eeb0d6ff61f6bfd374c8299 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Fri, 31 Jul 2026 16:20:58 +0200 Subject: [PATCH 4/9] Point the analytical solvers at the same end effector as the model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The UR solvers' DH chain ends at the robot's flange, whose x+ points away from the last link, while the planning group ends at `tool0`, whose z+ does. The two are a fixed rotation apart, so the analytical planner and the URDF model disagreed about the orientation of the end effector: a target handed to the planner was interpreted rotated, and the robot it drew never reached the frame it had been asked for. Tool and workpiece modes compounded it, since the tool offset was then applied along the wrong axis. `AnalyticalKinematics` already documented `flange_frame` as the way to state that offset — "should match the end effector of the robot in the URDF model" — but nothing ever applied it, and no solver set one. Apply it in the analytical forward and inverse kinematics, and declare it once on `OffsetWristKinematics`, which covers the whole UR family. The spherical wrist solvers need no correction, their orientation already matches. Analytical FK now agrees with the robot model to 1e-10, and matches the zero-configuration frame the PyBullet tests have always expected, which it never did before. A TargetMode.TOOL round trip reaches its target exactly. The three tests that broke had the uncorrected frame baked into them. The forward kinematics expectation is updated and cross-checked against the robot model; the two inverse kinematics tests now assert that each solution actually reaches the target, read back through the model, rather than pinning joint values that encode a convention. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 1 + .../analytical_forward_kinematics.py | 8 +++++ .../analytical_inverse_kinematics.py | 7 ++++ .../solvers/offset_wrist_kinematics.py | 11 ++++-- .../test_analytical_kinematics_planner.py | 36 +++++++++++++------ 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7656df9ab..c0e284b001 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * The tools in `ToolLibrary` now mount along the +Z axis of their base frame instead of +X. Every planning group in `RobotCellLibrary` ends at a link whose +Z points away from the arm (`tool0` for the industrial robots, `panda_hand_tcp` for the Panda), so with this the same tool attaches to any of them with an identity attachment frame — previously each cell carried a rotation to bridge the two conventions, and a tool authored for one robot did not necessarily fit another. Their TCF states the tool's working direction with its own Z axis too, so a `TargetMode.TOOL` target aligns the tool along the target's Z — previously the TCF's X axis ran along the tool, which put every tool-mode target 90 degrees out. The tools are still modelled along +X internally and re-framed on the way out via `ToolModel.reframe_base`. The beams held by the gripper cells are authored in TCF coordinates and were re-authored to match, so they stay put. Poses are unchanged: the attached tools and workpieces of every cell land exactly where they did, only the tool's base frame is now the end effector link's frame rather than a rotated version of it. Requires the `reframe_base` support of the next `compas_robots` release. * `MoveItInverseKinematics` now sends the target pose with an explicit `ik_link_name` (the planning group's end effector link, overridable via the new `"link"` option) instead of relying on MoveIt's default tip link for the group. The two are the same link for the robots in this library, but nothing guarantees that for a planning group configured with a different tip, in which case MoveIt would interpret the target pose at the wrong frame. `PositionIKRequest` gained the corresponding `ik_link_name` field. +* `AnalyticalKinematicsPlanner` now honours the `flange_frame` of its kinematics solver, and the UR solvers (`OffsetWristKinematics` and its subclasses) declare one. Their DH chain ends at the robot's flange, whose x+ points away from the last link, while the planning group ends at `tool0`, whose z+ does — a fixed rotation apart. `flange_frame` was documented as the way to state that offset but was never applied, so the solver and the URDF model disagreed on the orientation of the end effector: every target was interpreted rotated and the robot never reached the frame it was asked for. Analytical forward kinematics now agrees with the robot model (and with PyBullet) to 1e-10, and a `TargetMode.TOOL` target is reached exactly. ### Removed diff --git a/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py b/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py index 867bf279e4..b188696b43 100644 --- a/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py +++ b/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py @@ -2,6 +2,7 @@ from typing import Optional from compas.geometry import Frame +from compas.geometry import Transformation from compas_fab.backends.interfaces import ForwardKinematics from compas_fab.robots import RobotCell @@ -44,6 +45,13 @@ def forward_kinematics( joint_values = robot_cell_state.robot_configuration.joint_values pcf_frame = planner.kinematics_solver.forward(joint_values) + # The solver's own end frame is not necessarily the end effector link of the URDF + # model: the UR solvers, for one, end at the flange while the planning group ends + # at `tool0`. `flange_frame` states that offset, so apply it to land on the PCF. + flange_frame = planner.kinematics_solver.flange_frame + if flange_frame is not None: + pcf_frame = Frame.from_transformation(Transformation.from_frame(pcf_frame) * Transformation.from_frame(flange_frame)) + target_frame = robot_cell.pcf_to_target_frames(robot_cell_state, pcf_frame, target_mode, robot_cell.main_group_name) # Scale the frame to user units diff --git a/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py b/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py index 5f131f460e..bada644081 100644 --- a/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py +++ b/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py @@ -3,6 +3,7 @@ from typing import Optional from compas.geometry import Frame +from compas.geometry import Transformation from compas_robots import Configuration from compas_fab.backends.exceptions import BackendTargetNotSupportedError @@ -139,6 +140,12 @@ def inverse_kinematics_ordered(self, frame_WCF: Frame, group: Optional[str] = No keep_order = options.get("keep_order", False) + # The target is a PCF, i.e. at the end effector link of the URDF model, but the + # solver ends at its own frame -- the UR solvers, for one, end at the flange while + # the planning group ends at `tool0`. Take that offset back out before solving. + if solver.flange_frame is not None: + frame_WCF = Frame.from_transformation(Transformation.from_frame(frame_WCF) * Transformation.from_frame(solver.flange_frame).inverted()) + # convert the frame WCF to RCF if solver.base_frame is not None: frame_RCF = solver.base_frame.to_local_coordinates(frame_WCF) diff --git a/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py b/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py index 6ece5e979f..be4d14e634 100644 --- a/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py +++ b/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py @@ -66,8 +66,15 @@ class OffsetWristKinematics(AnalyticalKinematics): """ """ - def __init__(self, params): - super(OffsetWristKinematics, self).__init__() + def __init__(self, params, flange_frame=None): + # The DH chain of an offset wrist ends at the robot's flange, whose x+ points away + # from the last link (ROS REP 199). The UR models this solver is used with end their + # planning group at `tool0` instead, whose z+ does. Without stating that fixed + # rotation, the solver and the URDF model disagree on the orientation of the end + # effector, and every target is interpreted rotated. + if flange_frame is None: + flange_frame = Frame([0.0, 0.0, 0.0], [0.0, -1.0, 0.0], [0.0, 0.0, -1.0]) + super(OffsetWristKinematics, self).__init__(flange_frame=flange_frame) self.params = params def forward(self, joint_values: list[float]) -> Frame: diff --git a/tests/backends/kinematics/test_analytical_kinematics_planner.py b/tests/backends/kinematics/test_analytical_kinematics_planner.py index d703c8e89a..4ba3f26a3c 100644 --- a/tests/backends/kinematics/test_analytical_kinematics_planner.py +++ b/tests/backends/kinematics/test_analytical_kinematics_planner.py @@ -5,7 +5,6 @@ from compas.geometry import Point from compas.geometry import Vector from compas.tolerance import Tolerance -from compas_robots import Configuration import compas_fab from compas_fab.backends import AnalyticalKinematicsPlanner @@ -47,14 +46,23 @@ def test_forward_kinematics(ur5_planner_robot_only): start_state = planner.robot_cell.default_cell_state() frame = planner.forward_kinematics(start_state, TargetMode.ROBOT, group=None) + # The frame of the `tool0` link at the zero configuration, i.e. the same answer the + # URDF model gives. The solver's own chain ends at the flange, one fixed rotation + # earlier, which is what `flange_frame` accounts for. correct = Frame( Point(x=0.81725, y=0.19145, z=-0.00549), - Vector(x=0.0, y=1.0, z=-0.0), - Vector(x=1.0, y=-0.0, z=-0.0), + Vector(x=-1.0, y=0.0, z=0.0), + Vector(x=0.0, y=0.0, z=1.0), ) assert TOL.is_allclose(frame.point, correct.point) assert TOL.is_allclose(frame.quaternion, correct.quaternion) + # ...and it agrees with the robot model, which is what the scene objects draw + robot_cell = planner.robot_cell + model_frame = robot_cell.robot_model.forward_kinematics(start_state.robot_configuration, robot_cell.get_end_effector_link_name()) + assert TOL.is_allclose(frame.point, model_frame.point) + assert TOL.is_allclose(frame.quaternion, model_frame.quaternion) + def test_iter_inverse_kinematics(ur5_planner_robot_only): planner = ur5_planner_robot_only # type: AnalyticalKinematicsPlanner @@ -65,9 +73,14 @@ def test_iter_inverse_kinematics(ur5_planner_robot_only): start_state = planner.robot_cell.default_cell_state() solutions = list(planner.iter_inverse_kinematics(target, start_state, group=None)) assert len(solutions) == 8 - configuration = solutions[0] - correct = Configuration.from_revolute_values((0.022, 4.827, 1.508, 1.126, 1.876, 3.163)) - assert correct.close_to(configuration) + # Every solution must actually reach the target, read through the robot model + robot_cell = planner.robot_cell + for configuration in solutions: + state = start_state.copy() + state.robot_configuration = configuration + reached = robot_cell.forward_kinematics_target_frame(state, TargetMode.ROBOT) + assert TOL.is_allclose(reached.point, target.target_frame.point) + assert TOL.is_allclose(reached.quaternion, target.target_frame.quaternion) def test_inverse_kinematics(ur5_planner_robot_only): @@ -80,10 +93,13 @@ def test_inverse_kinematics(ur5_planner_robot_only): for i in range(8): solutions.append(planner.inverse_kinematics(target, start_state, group=None)) - # Check First Solution Correctness - first_configuration = solutions[0] - correct = Configuration.from_revolute_values((0.022, 4.827, 1.508, 1.126, 1.876, 3.163)) - assert correct.close_to(first_configuration) + # Check First Solution Correctness by reading it back through the robot model + robot_cell = planner.robot_cell + state = start_state.copy() + state.robot_configuration = solutions[0] + reached = robot_cell.forward_kinematics_target_frame(state, TargetMode.ROBOT) + assert TOL.is_allclose(reached.point, target.target_frame.point) + assert TOL.is_allclose(reached.quaternion, target.target_frame.quaternion) # Check that all solutions are different for a, b in combinations(solutions, 2): From fc13649d4356b4da75d85a97f55339ec996579f0 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Mon, 3 Aug 2026 17:40:48 +0200 Subject: [PATCH 5/9] Update grasshopper example files --- .../ghpython/files/03_build_robot_cell.ghx | 840 +++-- .../ghpython/files/04_plan_motion.ghx | 3332 +++++++++-------- .../ghpython/files/05_kitchen_sink.ghx | 1098 +++--- 3 files changed, 2671 insertions(+), 2599 deletions(-) diff --git a/docs/frontends/ghpython/files/03_build_robot_cell.ghx b/docs/frontends/ghpython/files/03_build_robot_cell.ghx index 622cc37b57..60e59dd233 100644 --- a/docs/frontends/ghpython/files/03_build_robot_cell.ghx +++ b/docs/frontends/ghpython/files/03_build_robot_cell.ghx @@ -50,10 +50,10 @@ - -90 - 213 + -149 + 279 - 0.6275781 + 0.502582 @@ -78,7 +78,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -86,7 +86,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -108,7 +108,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABsElEQVRIDbVVzU7DMAxOV56CI9DRjis3eAJOE4ynAGlXhpAQEgKuk+ApGGgn3oAb4kjLChx5i9HlM3WVBHddN2Ypc+Kfz7G9xkotmTwTP8uyjj5304+vnfF4bOlMO2nv+34WbKw9a13f87wB2xQgGvwqeU97rFiEh5vBtQ5yCowV/ODmAL9Lv9WtXiYdB6vqSC+JSu2V6mnMV2TSyB274C64BFolMzAIk0o0Sj9/UPPo6YX8473tKhxRb/qjJ81gvUEZ1G2oiO4IGZN64OjE41ucqPuHodpqhaoV/S7R0BFaAdBQiS4ubxQCgJgfHrRVZ79tmUv+1IM4GWWWpXEYPA7p5hCdn51QAGQCQiaQlVEUNj0rA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8ug5DBzALPe5r4EtxBXBuCSoBdMKBWIdSyXeGWT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjetw11/ZFDZgzoBJFsKgIdJUi4iY0z60DCJ9DzYZUBOFee684Ax8ummuER9BmODebnxHhEmNRlgyxqZRYA8yL8P/XkrMbPfBNULvFi5msP0AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABsUlEQVRIDbVVzU7DMAx2pz4FN2CFbly5wRNwmmA8BUi7MoSEkBBwnQRPwUA78QbcEEda6IAbT1FR8oW6SoK7rhuzlDnxz+fYXmOiBZNn4mdZ1lXn3vj9cytNU0tn2kl73/ez5uryo9INPM8bsk0BosAv4tekz4p5eLgeXKogx8Dw8YObA/wm+aJrtUw6DJboQC2JSu2J+grzGZk0csceuAsugVbJDAyNqUuUjD++UfPWw5P2j3Y2q3BEvemPngTNlYbOoG5DRXRHyJi6B45OPL5EMd3ejWijHVK79btEQ0doBUBDJTo7vyIEADHf3+tQd7djmUv+ugdR/JZZlsZheD/SN4fo9ORIB0AmIGQCWRm1wjXPykAyZDDokAlAmTgbPkuc/6aSzpKhJCCA8t4yKDlMHcCst7kvwS3ElQG4JOgFE0oFYh3LJV7ZZDiZjWYQgKNUk4L8aTLeFpD79nBJ0PBJwJK/lYH5qfNN63DXHxlU9qBOAMlWB8DDJCnnkTGm/tAwidQ82GZAThXnuvOAMfLpRlyiAYOxwazceI80pm4ywBY1MosAeZB/H/qzVmJqvx+vzbxSXiOWzgAAAABJRU5ErkJggg== e3ecf34e-b507-4e7a-b64b-25f7eb105fc0 true @@ -125,7 +125,7 @@ - + 2003 144 @@ -136,7 +136,6 @@ 2090 196 - true @@ -172,7 +171,7 @@ - + 2005 146 @@ -183,7 +182,6 @@ 2041.5 156 - true @@ -212,7 +210,7 @@ - + 2005 166 @@ -223,7 +221,6 @@ 2041.5 176 - true @@ -251,7 +248,7 @@ - + 2005 186 @@ -262,7 +259,6 @@ 2041.5 196 - true @@ -290,7 +286,7 @@ - + 2005 206 @@ -301,7 +297,6 @@ 2041.5 216 - true @@ -329,7 +324,7 @@ - + 2005 226 @@ -340,7 +335,6 @@ 2041.5 236 - true @@ -368,7 +362,7 @@ - + 2105 146 @@ -379,7 +373,6 @@ 2154.5 158.5 - true @@ -407,7 +400,7 @@ - + 2105 171 @@ -418,7 +411,6 @@ 2154.5 183.5 - true @@ -446,7 +438,7 @@ - + 2105 196 @@ -457,7 +449,6 @@ 2154.5 208.5 - true @@ -485,7 +476,7 @@ - + 2105 221 @@ -496,7 +487,6 @@ 2154.5 233.5 - true @@ -552,7 +542,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACXElEQVRIDbVVz0tUcRCffe1hH+2G1iHoWutqp4qQIAWxTp2kXIIuXQUFPVYE3uqaYOApECSQtfQfKILqkIfqULrrFqFEUGEGarvha1/zmd35+n3Pd1DfOrD7ne/8+MzMd77vO0QHTAkb3/f9ft4PL5U/X6zVagGdbRfFO47jt2VPvmbdWCKRmFEbA8Lg94ql8m1VxFnbc9n7HOQOMCQAMmfwQhzQsC8HyaMSp6EYDhs0YS+YUkFp6RMfef3MNzY26fF0gd6+e7+nGOfOnqEb1/OUTh8WP/Qk13bKkQoUHBqAP3v+gsjnzR5+8IGvkmImVaArMm9tbaGJ8Qcq2tU6MDgSWbX2gBYWizTzdI6q1Wo98wjYh+VvdPNNKUJD5Hme+ALDJlNB4cmcBIFya8uzbQw/zgFA87/WqfNoxsjBVDgxBAHOx4Uijd69JXpTAQT5a33kuilyU6mAMzbIXsnmVZZJp8UXGPgpmQAQ9F/toxSDJ5OmMLUjZD+UPUGdx4KZGwNm4AuM0x3tRhwIYKQhZvTDskimln/Qplej+dV1ml75GbKK3poAgSaHbN1DdbPLx1uo44gr2tmvqwEr71+MJk9++S7HM8hHBFr581eqsCNUKvtsMm4MSMHDvCj5L5PZZ5NxHScv5BRHVsgWr5wPyLCJavKO64I3BZ/9wNBI4IN7ZMOZR35buLb2my719mwLGpwEwMOkbwceLJA8dhFADb8dC8DVF0pgYhUIngcveR50QdAs4nnwiudBt17TsWYBWziCKQEweTDmLGUstjEyZS4HTvkghn6sTHfj/B/RXwWUJQ405QAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACW0lEQVRIDbVVzUtUURQ/48xiHs6E1iJoWU1qq4qQQIOoVq2kHII2bQUFXVYE7mqboNBKEEKQ0fIfKIJqkYtqUTo2faBEUGEGajPhG1/nd5xzvff5FuobD8zcc8/H75xzz333EO0zJWz8IAi6ed9f+vSlo1qtOjrbLopPJpNB7vjRV6wbSiQSk2pjQBj8XnG+dFsVcdbWltx9DnIHGBIAmTN4IQ5o2JeD5FFJQ03RHzaow14wpYKPpc8beuarq2s0PlGgN2/f7SrGmdOn6Mb1PGUyjeKHnpzIHWuQChQcGoA/ffacKODNLn7wga+SYqZUoCsyb25uoofDD1S0o7WndyCyau0Bzc4VafLxNFUqlc3MI2BHSt/p5uv5CA2R7/viCwybTAWFqWkJAuX6um/bGH6YA4Bmfq9Q+8GskYMpc2IIApwPs0UavHtL9KYCCPLXusjz0uSl044zNsheyeZVls1kxBcY+CmZABB0X+2iNIOnUqYwtSNk35c7Qu2H3MyNATPwBcbJtlYjdgIYaYgZfL8gkkcLP2nN36CZpRWaWPwVsoremgBOk0O2XnLT7PLhJmo74In2ybclx8qvxmjy2Ncfcjy9fESgxb//pAo7Qrm8xybjxoAUPMyLkv+y2T02Gddx7FyL4sgK2dyVs44Mm6gmb7sueFPw2ff0DTgf3KgNZx75LeHy8h+6dPHClqDGSQA8TPp24MECyWMXAVTz27YAXH2hBCZWgeB58ILnQScE9SKeBy95HpzXazpUL2ALRzAlACYPxpyljMXWRqbMZeeU92Pox8p0J87/Aa+rBZGCER/uAAAAAElFTkSuQmCC 437b5bd6-da2a-464e-9bec-b8311f38cc2f true @@ -827,7 +817,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABv0lEQVRIDWNgoDFgRDb/////IUB+/q3bd63//fuHIoesDhubiYnpv5qq8lGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDPBPrh56w4wyP8xhkcngM1auXQBmKaEAMWJupoKE9gH6BHa2NJBsU9gZsKCCMWx167fQOHj4+x+8Z4BhHEBrBaAFK9eu4EBFGSgeMEFQAbnnbsLxrgsQbEgNDgAl1kExbc/f4dVDTiSr9+49R+rLBZBUPBpaWrAZdY+fsPQdeMxw6fffxmmmagwOIoJwOU0NdQYUXwAl8HBABkOSgAgDIunYFkRhg59RbCOiov3GdYALUQGRPkAFA+gOEEH9TUVcN8Unr/HsAMaTJOMlBlcJQQZSPYBugXIQeUlKYguDeYT5QOYTlgQgQwGJQhkC0BqYCkJ5HoQAPmAJAtAmtAjGSSGC5AVROiuxmU4TJykVATTRAoNtgBUMJGiiRi1MDPBFkBrImL0Ea0GZiYsiCYSrZN4hWAzwRaAah5QNUe8XvwqoVUmuF4GJ1OYclpU+jCzaUYDALUcqb2TIfgBAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDWNgoDFgRDb/////IUB+/u0796z//v2LIoesDhubmZn5v6qK0lGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDPBPrh1++4/UJiHRyeAzVq5dAGYpoQAxYmaqjIT2AfoEdrY0kGxT2BmwoIIxbHXrt9A4ePj7H7xngGEcQGsFoAUr167gQEUZKB4wQVABueduwvGuCxBsSA0OACXWQTFtz9/h1UNOJKv37j1H6ssFkFQ8GlpasBl1j5+w9B14zHDp99/GaaZqDA4ignA5TQ11BhRfACXwcEAGQ5KACAMi6dgWRGGDn1FsI6Ki/cZ1gAtRAZE+QAUD6A4QQf1NRVw3xSev8ewAxpMk4yUGVwlBBlI9gG6BchB5SUpiC4N5hPlA5hOWBCBDAYlCGQLQGpgKQnkehAA+YAkC0Ca0CMZJIYLkBVE6K7GZThMnKRUBNNECg22AFQwkaKJGLUwM8EWQGsiYvQRrQZmJiyIJhKtk3iFYDPBFoBqHlA1R7xe/CqhVSa4XgYnU5hyWlT6MLNpRgMAj96pt4FfdZEAAAAASUVORK5CYII= 08fba69e-6e56-4d64-b53e-bdf9e7e5b6e7 true @@ -1223,7 +1213,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDbVV3ytDcRQ/95qRH5skpHlhP5UkHggJb54W27O8Sau9ovbKs1ry5g8wUl5kSWJ44MXDbDORJGkPSBJ2r+859p1t7uwOO3Xv93vPj8/5fs75dg9AgUVIxZdl2cG+3ZGz8x5JktJsqX5Ke1EUZbOpOcBs84Ig+LhPEoSBz4bCZ9Pc8JfVajHNsSQziEEJ8OQMfPkvoJmxLIkTmYgJgzvT4R++CZMYhCNRVvL8ap7rANgTi9koEoNc4L7VNcAnH+GYGjVByyuf4I4Ruxr3NB/egzTlf34UPIGqEsW1pb8mRbfoNBSRlRC27+7BG7mB4OMzmVt0ZeAyN8BAbZWS+zedzWoWspYIwSePogRecXsN+GAi1KFNrWRNgCdH8XYYwXC4BY37ftqTLmEjhxwvxR48vL3TabtrdNCqL4eQfYxgvB4PVHQNQRAM4BifgKLXlyS8c9QOStc4KwMeGZe/2iPIElerXhUZ6Is1gA09iD0Sk53BNljf2ARfdR081RugSSuCb2lRVZKsDPC2oLiOozB1cgGBBhNc9g+TTvKvQ/A0RPtcL2KAPyb+7+ABeBUXOo10TZEJCrJqj11BvLIEWmxW7qq4IiYa+DzYZfOgV9GTKbHpKFg6tcLmwR6bB328RPM/BSJwPuAJLMKkBDh5cMz9lCQfW2Jk0lymEvHgQgx9jl2w9QOYn7dbu7ZRPAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/u0796z//v2LIoesDhubmZn5v6qK0lGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB7du3/1HapgTcgAoTtRUlZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwB267dY+cyKeAAAAABJRU5ErkJggg== 2daad94e-cced-4d4a-8811-bf6652f839d9 true @@ -1661,7 +1651,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACO0lEQVRIDbVVPU8bQRDdOxAFKCBBlxb8CRUKKFLgP1jBFkUK0huJlkSREBJKUmIJ+qRIEfEh06ZNkIwLqPBnKKHCNC6QouDLvD3Pebxn3zmFRzrv7czb92Z29rxKDdksye84TprmW7X6zatWq9UVk7he77ZtO9HI7DnFcpZlHTPGIyHyj5Vq/R0H5FgqV9TRSV7NJ+MqmXAfGTff47HIJxJ5D78WQOZEfmQCMT8+zWtyGcuspVT6dUq6fO8kkkElLPCTBFYkClnv7n32XDsfthVXws4gIRL4RQKrWqBa+01b3r3n62/eah5sCYgwwkzh79++wO0z9CQWnbNHETHJJZoJIQJDLwYx5rTDwJIY5KgE2zWohQqgmXIbQM7bNYhIqABOkWm9fCaG57rJ5UrNYQePvY4nYsgefYEFnSLEE/Go1VcAAFgvIYjIk+Ui/b8Q0KfIH+p4+IO6LnWy/p8e9K2g+NDUKsvTzzpq4i0sDqivgsP6nTqgx7TNyHPV+PNXLUyNq7Pbhio2XHGJAyZLj2neFiEjJl+ecbNG9vCxnxfLONZBEJglWmdW7AnwYjMTzurFjys1Zltqf3G2iyRLC/tVDk6fAAuZ48SI+8mYGZo4c64F8MdEAd1wXfJF1cOZhIgj4zBrc7oV4CYq3F/qv2uzgTzH9sA2Ch3xIJH27eZtUY4yXfn6MqbXyKw5W240Goy+SAyqgkkfTXPwuWnRS9CVCWCt+aieHEclJscxDTTflcnoYVz6zD208R9Sfv3UuEKitQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACPUlEQVRIDbVVPU8bQRDdsyMKUIgEXcoQ4w+oIkCRYv4DCiCKFKEHiZZEkRASCpRYIn1SpIhwImhpAfFRQBVsbKBLGmQaF5GimGPenuc8nrPvnMIjnfd25u17Mzt7XmO6bI7kd113huZL5aubV7VarSkmca3e4/G4m3j+7JBiOcdx8ozxSYj8Y/Gy/I4DcrwoFM329x0zkkmZTNp7ZFy/p5KJdRJ5D78VQOZEvq2BmOd/7FhyGZudnjIzr6ekK/BOIrOohAX2SSArUch6dW3Dd618WDZcCTvDhEjggAQmrUCpfH2v93zuzbzlwZaACCNMC3/7+hnugKEnw4mh2CNENLlEMyFEYOhFJ8acsSiwJAY5KsF2dWqRAmim3AaQ83Z1IhIpgFOkrZVPY3hum1wollx28NjqeCKG7NEXWNgpQjydGnbaCgAAayUEEXmyPGTwFwL2FAVDDQ9/UD8vGln/Tw/aVnB6V7UqEwOPG2riLSoOaKCCT+XfZosebYuJp6by958ZfdJrdn9VzGnFE5c4YBbo0eZvETJi8olBL2tkDx/7ebGMYx0EgRmndbpiX4AX60w4q7G9c9MTc8zmi6EmkgVa2K5ycAYEWEiPfXHvk9EZapyeWwH8MVHANtyWfHLp4zQh4sg4yuqcXgW4iY5uz+zftW4gz7E9sLfHDfEwkfrt5m9RjjLNfnmZtGtk1pwtNxoNRl8kBlXBpI+mOfi8tOgl7MoEsFT9Y2qua9L9vZiGWuDKZHQ3Ln3m7tr4ACmJ/cyE62ybAAAAAElFTkSuQmCC 17a19208-b966-4839-8eff-7362056dba89 true @@ -1832,7 +1822,7 @@ 1 2 true - 0c26d40b-ce02-4863-b88a-6713fa7abfbb + 0bd56e73-ac52-4472-8e49-534eb360ae0a 1 Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. 1c282eeb-dd16-439f-94e4-7d92b542fe8b @@ -2165,7 +2155,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCklEQVRIDbVVzUsCQRR/u4WBYZ8HI6gOYhZ0ioog/4MIkaxr10DBrvUH1FXBoGuXiApCokv3wDzUNZUOGUVCZuAhiHKbN+7bZscdLcgH68z7+v3em7frALRZNBHfMIwI0+P5wt1CrVaz+cQ4p72u68a433fJfElN004oxgJh4Nu3ucImOXA9OjmF51JJNFn7sdERCC0tWrq4mQj4dxjJFto4AVbOwI/FoPTZORwc2kyim++XwyFYjYQb7GhgJCvYSafpjctRxeIDN+2lErKL6+uxDWV3ZgJi1gnwzB1RTGN/f5/NXam82XQnhTB1dP51oE6Aso0wOYHs/E+97QQ05KZF/+bMVQBKAq/Xy3PwbVEJfgutREmA73dXlwvuzddVBhpiBag+NDFWSYBBvwEQwZz2yiFnX6uAj0pa+SnP1sFu4QlS7JEl5h+G8scnTPW6If1Yhmy5kRhjouyRxSLAigh8btDD4+YGPNxGdkoW/bwTRogxsywPc0SxCMgoV0JVzVzcgEvXIDHts4FEWaKqc8RsICAiee3uqI9LrlCOk3VOgJcFc/C/bt7yVc6KkwHRjxW3EhOz3gHeRJmX6yAmyQMkHY8HZS3zQ84Nih/zdrOOKMkqDe7PB3i4WDVVS4PGAeNcxBjsCkW0MTWJtqZXJgaQ5Kvv8GUYMNnjJpNybbgyKbIdlz5ht239BvrNw7Lbs78cAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACC0lEQVRIDbVVO0sDQRCey0kExUe0iAgqqCEKVqIimH8gEoKP1lZIILb6A7RNIIKtjYgGJIiNvagptDVGBBVFkahgIYjh3NncnHt7t0kEb+CyO6/vm9m5ywJ4LJqIbxjGHNOTxeubqXK5bPOJcW57XdeN0GD/MfOlNU3LUowFwsDXLgvFFXLgupvdh6fnZ9Fk7ft6eyA6M23p4mYoHFpnJKto4wRYOQPfE4NyB4ewvWMziW6+n41FYWEu5rCjgZHMYycNpjcpR93d3XPTZiYlu7i+lFhWdmcmIGaFAM/cFcU0BgLtNvfb27tNd1MI04fOvw7UDVC2ESYnkJ3/qXtOQEOuWnQ9Z64CUBIEg0Geg2+LSvBbqCVKAny/Gxv9cGu+rjJQFytA9aGJsUoCDKoHQARz2yuHnH/9AHxUUstPebYONoqPkGGPLIlQN5S+vmGkrQlyDyXIl5zEGBNnjywWAVZE4BOdLTxuoqOF28hOyaKfd8IIMWac5WGOKBYBGeVKqKqxowvw+zRIjQ7YQOIsUdU5YjoIiEhem/XKuOQK5ThZ5wR4WTAH/+vmLZ8VrDgZEP1YcS0xMSsd4E108nIewSR5gKTj8aAsnv6Sc4Pix7zdrCNKs0ojW5NhHi5WTdXSoHHAOBcxBrtCEW1MTaOt6pWJASRXH59QNgwYbm0ik3J1XJkU6cWlT9ierT/70sOwbr1lsQAAAABJRU5ErkJggg== bc8a002f-cbef-4901-a35d-a64883a911b7 true @@ -2495,7 +2485,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKklEQVRIDbWVTUtbQRSGTy7dZeOi9qaL2IUfiaZtkIqkaP9CCTHBrZQiFAWli9IUS3d1JwYsBSnubVSkf6EVxaUazYcummwS40IX2SbOe5K5nYS5qTeSgZk5c86Z571zBu4Qdbm5VH6tVouK9UI2dzFRrVabYmqezjYMozY02L8nYgmXy7UlcyyIgH9NZ3JxGbjP7PcNLguRT2CwAL5cwJOt0P2DQzo6PmH36GiQxsdetKbYroVIDCeRAr+FwKSavbP7izaTO6qLpmMRioRfN/nsFkLgjxB4xQKZ7Lko+b+aVyoVejM7Rx7TpPeL88xYWV2jYqlEG+vfyO1223EtP+7ENzRgGPCocKxLl2VM9DQwTE/6vNxho8kYL9oMkvlAl2M+6mX3SeqM/uYLlg1Dxth5h0ErgBKg3riDD/HPFga+u5TH2iAMrQAScJmPPR76vv6D89/NvqWXoXG2nQx8B3YbALzxPadrf7AjOLi2J0DwZ75M2WchmLRVuKKo9yHbTgatwOlZmtBT1xUyyzfMOy5miHrcFI2EnfD1J0hu77IASGYDlxYzeuo0TV+WPja8/5+0dxAY8Vs7Y1NhQh8ZrvvUmJXUxtCWSMIwy5Ikt2cYI9dtmE0hWwHA5V1gRsNJnDZtiVQY7gMdzenXYw8L4MeEhdpwAnkK+J1+vWSyQOMlUvlsO4WqAMmUd5AQwab3AMk4gRTpoDxg1l80GF19MiGA1o1Hv07u4ngLeKXBZ/oKpBEAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACJklEQVRIDbWVz0tbQRDHJ6a3XDyoLx5UUFPjr4ooIaL+CxLSBK+liCAWFA9Si9Kb3kRBEUS8a1TEf0FF8WgSjaYWqhfTeNBDjjHd7yT72Mi+6LNkYXdnZ2Y/37c78JaozM2h8nO5XEisJ5K/fvdns9mimJqns51OZ87T3HgsYssOh2NH5pgQAZ9PXCVnZOB/Zm+LZ0GI/ACDBfDlAh55CT05PaPzaIzd3d1d5OvteZliuRYiYZxEChwKgQE1e2//gLYie6qLhsNBCgaGinxWCyFwJAQGWeA6efOs3nkmk6Gvo+PkNgyamvzGjMWlFbpPpWhzfZVcLpcV1/SjJh89TRUV8KhwrFN/05ioo72VGurruMNGkzFelBgk84Mux6ipZncsfkl/bu9MG4aMsfMNg1YAV4D7Rg2mZ+ZMDHxvuR5zgzC0AkhAMWvdblpb3+D8sdER6vP72LYzcA2sNgD41PKJHr1d74KDa3kCBLdv03Td6YdJO3cPFKqrYtvOoBW4uEwQevwxQ0b6iXnR+yuiSheFggE7fP0JIrv7LACSUcAlxIwev0jQz9nvBe/rk7YG7W1ec2f4c4DQ21rzPjVmJpUwtFckYZjllUR2vzBGrkswi0KWAoDLWmBGw0nsNu0VqTDUAx3N7tdjDwvgx4SF2nACeQr47X69ZLJA4SVS+WzbhaoAyZQ1WBbBovcAyTiBFHnH9YCZf9FglPXJhABaOR79PLmM4z9TZ8Fh8nXMxwAAAABJRU5ErkJggg== 7b338da0-dca2-40c1-a9fe-ef6c978d06b2 true @@ -2972,7 +2962,7 @@ - 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 6 00000000-0000-0000-0000-000000000000 @@ -2988,408 +2978,128 @@ - c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Tool From Mesh + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel - - - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABsUlEQVRIDbVVvUoDQRDeO30AIaJtwPxpbWcEfQPRpPURTKsiiCBqJeQNbCwkUXwHtbPW/FlZ2KmNoM2d+42ZZb3bvdsjyRbZ2Z1vvm9mltwIMeHl6fxhGNbkudHrv6wEQfDPp+NMtu/7Yam48CB9Tc/z2oxRJJL8pNPt77FjlL1SLp5KkX1wkAAyl+StUUijsVKkjkr8oaMRBYzhTJxUQbc3kC3P1vO0BPAm5VLBnwYwSn50fCaenjtpHMp/eLArlhYr6gyDOblFygniLOQq0GLEBJBJNBvEIsv61kaMBncmPANjAnCYiNC21vUtxznvRgG9ClN2fIdEapvxqnR1owAAehVXlxe4ogWb3yiNHAFWAa4i+ujtm7826QmQsuXHKgA8k+i9Z9sle3AkCuhVAMyLhfmctCcKINBE5po94umfDMO2UAVEzt++xNTPt9jJ52xQ432qAKJy1TXx8TgggtnlgpHIdkkC+DDxt8MEXJ+bEdv5efH6/ilguyxwAsfz4E7Og6pLoCtGzoN7OQ9W+ZGbroEZcMRJApg8GHMZghOhw5FJc1nNZERMYugnZjIO5y+SaI6beOV7vAAAAABJRU5ErkJggg== - - 83b96250-454d-4bd9-88a1-ea599d5391b2 - true - false - true - COMPAS FAB: Tool From Mesh - COMPAS FAB: Tool From Mesh - 3 - - false - false - false - false + + A panel for custom notes and text values + 005fbb2a-8d9c-47ba-a343-2c44624eec15 + Panel + + false + 0 + 0 + gripper - + - + - 482 - 301 - 167 - 84 + 241 + 304 + 53 + 20 + 0 + 0 + 0 - 573 - 343 + 241.09781 + 304.7948 - + - 4 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 1 - 08908df5-fa14-4982-9ab2-1aa0927566aa + + 255;255;250;90 + + true + true + true + false + false + true - - - - true - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. - 7029b4ed-6f8b-4319-b317-5c7038cc54ba - name - name - true - 0 - 2 - true - 005fbb2a-8d9c-47ba-a343-2c44624eec15 - 1 - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - - - - - - 484 - 303 - 74 - 20 - - - 522.5 - 313 - - - - - - System.Private.CoreLib - System.String - - - - - - - true - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). - 06535f11-3e58-4cee-b2fe-053484f6e646 - visual_mesh - visual_mesh - true - 0 - 2 - true - 548b96ae-d6b1-4cfa-a8f2-865e9d100241 - 1 - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 484 - 323 - 74 - 20 - - - 522.5 - 333 - - - - - - System.Private.CoreLib - System.Object - - - - - - - true - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. - 37ce7642-a02f-4c34-a272-f8b8a636f702 - collision_mesh - collision_mesh - true - 0 - 2 - true - 548b96ae-d6b1-4cfa-a8f2-865e9d100241 - 1 - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196 + Plane + Plane + false + 0 + + + + + + 244 + 363 + 50 + 24 + + + 269.66293 + 375.1797 + + + + + + 1 + + + + + 1 + {0} - - - - - 484 - 343 - 74 - 20 - - - 522.5 - 353 + + + + + 0 + 0 + 0.24076616764068604 + 1 + 0 + 0 + 0 + 1 + 0 - - - System.Private.CoreLib - System.Object - - - - - true - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame. - 5aabe885-38a2-489a-8206-4bae1c24541c - tcp_plane - tcp_plane - true - 0 - 2 - true - 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196 - 1 - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 484 - 363 - 74 - 20 - - - 522.5 - 373 - - - - - - System.Private.CoreLib - System.Object - - - - - - - false - ToolModel. - 0c26d40b-ce02-4863-b88a-6713fa7abfbb - tool_model - tool_model - false - 0 - 2 - true - 0 - ToolModel. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 588 - 303 - 59 - 80 - - - 617.5 - 343 - - - - - - System.Private.CoreLib - System.Object - - - - - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25zdHJ1Y3QgYSBUb29sTW9kZWwgZnJvbSBhIFJoaW5vIG1lc2ggYW5kIGEgVENQIHBsYW5lLgoKYHRjcF9wbGFuZWAgbWF5IGJlIGEgUmhpbm8gUGxhbmUgb3IgYSBjb21wYXMgRnJhbWU7IGl0IGlzIHRoZSBUb29sCkNvb3JkaW5hdGUgRnJhbWUgZXhwcmVzc2VkIGluIHRoZSByb2JvdCdzIGB0b29sMGAgbGluayBmcmFtZS4gSWYKYGNvbGxpc2lvbl9tZXNoYCBpcyB1bndpcmVkLCBgdmlzdWFsX21lc2hgIGlzIHJldXNlZCBmb3IgY29sbGlzaW9uCmNoZWNrcy4KClRoZSByZXN1bHQgaXMgYSBzdGF0aWMgKG5vIGpvaW50cykgYFRvb2xNb2RlbGAgcmVhZHkgdG8gZmVlZCBpbnRvIGEKYExvYWQgUm9ib3QgQ2VsbGAgY29tcG9uZW50J3MgYHRvb2xzYCBpbnB1dC4gS2luZW1hdGljIHRvb2xzICh3aXRoIHRoZWlyCm93biBqb2ludHMpIHNob3VsZCBiZSBsb2FkZWQgZnJvbSBVUkRGIGluc3RlYWQuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgbmFtZTogc3RyLCB2aXN1YWxfbWVzaCwgY29sbGlzaW9uX21lc2gsIHRjcF9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgY192aXN1YWwgPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKHZpc3VhbF9tZXNoKSkgaWYgdmlzdWFsX21lc2ggZWxzZSBOb25lCiAgICAgICAgY19jb2xsaXNpb24gPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKGNvbGxpc2lvbl9tZXNoKSkgaWYgY29sbGlzaW9uX21lc2ggZWxzZSBOb25lCgogICAgICAgIGlmIGNvbGxpc2lvbl9tZXNoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiTm8gY29sbGlzaW9uIG1lc2ggcHJvdmlkZWQ6IHRoZSB0b29sIHdpbGwgYmUgdmlzdWFsaXplZCBidXQgaWdub3JlZCBmb3IgY29sbGlzaW9uIGNoZWNraW5nLiIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIFRvb2xNb2RlbCgKICAgICAgICAgICAgdmlzdWFsPWNfdmlzdWFsLAogICAgICAgICAgICBmcmFtZV9pbl90b29sMF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgY29sbGlzaW9uPWNfY29sbGlzaW9uLAogICAgICAgICAgICBuYW1lPShuYW1lIG9yICJhdHRhY2hlZF90b29sIikuc3RyaXAoKSwKICAgICAgICApCg== - COMPAS FAB: Tool From Mesh - - - - - *.*.python - 3.* - - - - - - 330 - 199 - 550 - 650 - - - - - - - - - - 59e0b89a-e487-49f8-bab8-b5bab16be14c - Panel - - - - - A panel for custom notes and text values - 005fbb2a-8d9c-47ba-a343-2c44624eec15 - Panel - - false - 0 - 0 - gripper - - - - - - 241 - 304 - 53 - 20 - - 0 - 0 - 0 - - 241.09781 - 304.7948 - - - - - - - 255;255;250;90 - - true - true - true - false - false - true - - - - 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 - Plane - - - - - Contains a collection of three-dimensional axis-systems - 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196 - Plane - Plane - false - 0 - - - - - - 244 - 363 - 50 - 24 - - - 269.66293 - 375.1797 - - - - - - 1 - - - - - 1 - {0} - - - - - - 0 - 0 - 0.24076616764068604 - 1 - 0 - 0 - 0 - 1 - 0 - - - - - - - - - - - - c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group - + 1 198;217;216;237 @@ -3402,7 +3112,8 @@ 83b96250-454d-4bd9-88a1-ea599d5391b2 005fbb2a-8d9c-47ba-a343-2c44624eec15 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196 - 7 + 0c0a7bb9-2c36-4b1a-bc0b-e1e73bf41a91 + 8 9cd90d33-8de2-48af-837c-caa019d3cb24 Group @@ -3413,7 +3124,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -3440,7 +3151,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -3466,7 +3177,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -3493,7 +3204,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -3518,6 +3229,315 @@ + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + COMPAS FAB: Tool From Mesh + + + + + Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input. + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABq0lEQVRIDbVVsU7DMBB1Ch+A1ArWDoUWZjaKBH+AoF35BLoCQkJICJiQ+gcsDKgB8Q/AxgwtdGNgAxYkWBruHZxlEjtx1PaG+Ox7996drdhKjdkCkz+KogbNW72n/hL5/2ImzuYHQRBV5yp3FGuTHwpGkxDhUbf3vCOBYcZadfaYRHbBwQKonMg7w5DGc0mkiU4Kf4FWHDCCOXNyB1T9IO+eZxWAM6EuCpMAxskPDk/Uw2M3i0PH9/e21cJ8Tc/hCKdskQ6COA+5TnQ4CQFUEq8GuaiyubGWoMGaDS/AhAACNiJsW+fyWvK8R6uA2YWtOllDIY31ZFemulUAALOLi/MzLLHBlzPKIkeCU0C6iB96ePW7TWYBrOz4OAWAFxJz78X3qR4cqQJmFwCLibDM08ZUASTayHyrRz7/yXBchi4gcvr6qSa+v9RWueiCWtczBZBVrK+o9/s+E5QWK1Yi1yIL4GKSu8MGXJ2eUpvlGfXy9qHg+xg4gZP34IZu1LpPoi+GbtJbElmWQ277JubAMScLkFKIZy5HcioUXOAESL/JmNA5jPzRB+9Y7Qe0HI6ecIyijwAAAABJRU5ErkJggg== + + 0c0a7bb9-2c36-4b1a-bc0b-e1e73bf41a91 + true + false + true + COMPAS FAB: Tool From Mesh + COMPAS FAB: Tool From Mesh + 3 + + false + false + false + false + + + + + + 482 + 302 + 167 + 104 + + + 573 + 354 + + + + + + 5 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 1 + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. + 436381bd-6eae-4f6f-bcab-332e39fe96a2 + name + name + true + 0 + 2 + true + 005fbb2a-8d9c-47ba-a343-2c44624eec15 + 1 + Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + + + + + + 484 + 304 + 74 + 20 + + + 522.5 + 314 + + + + + + System.Private.CoreLib + System.String + + + + + + + true + Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). + fa9dcc6c-a042-46a4-9395-f47f47434dda + visual_mesh + visual_mesh + true + 0 + 2 + true + 548b96ae-d6b1-4cfa-a8f2-865e9d100241 + 1 + Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 484 + 324 + 74 + 20 + + + 522.5 + 334 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. + 798e918d-e018-46bb-bbf6-e7682f1700af + collision_mesh + collision_mesh + true + 0 + 2 + true + 548b96ae-d6b1-4cfa-a8f2-865e9d100241 + 1 + Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 484 + 344 + 74 + 20 + + + 522.5 + 354 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in. + 54709955-a89f-4bdc-9fd8-7077f4f8292b + tcp_plane + tcp_plane + true + 0 + 2 + true + 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196 + 1 + Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 484 + 364 + 74 + 20 + + + 522.5 + 374 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame. + ae622948-3a93-45db-812f-723f350cff21 + base_plane + base_plane + true + 0 + 2 + true + 0 + Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 484 + 384 + 74 + 20 + + + 522.5 + 394 + + + + + + System.Private.CoreLib + System.Object + + + + + + + false + ToolModel. + 0bd56e73-ac52-4472-8e49-534eb360ae0a + tool_model + tool_model + false + 0 + 2 + true + 0 + ToolModel. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 588 + 304 + 59 + 100 + + + 617.5 + 354 + + + + + + System.Private.CoreLib + System.Object + + + + + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yLjAuMQoiIiIKQ29uc3RydWN0IGEgVG9vbE1vZGVsIGZyb20gYSBSaGlubyBtZXNoIGFuZCBhIFRDUCBwbGFuZS4KCmB0Y3BfcGxhbmVgIG1heSBiZSBhIFJoaW5vIFBsYW5lIG9yIGEgY29tcGFzIEZyYW1lOyBpdCBpcyB0aGUgVG9vbApDb29yZGluYXRlIEZyYW1lLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIHRoZSBtZXNoCmluLiBJZiBgY29sbGlzaW9uX21lc2hgIGlzIHVud2lyZWQsIGB2aXN1YWxfbWVzaGAgaXMgcmV1c2VkIGZvciBjb2xsaXNpb24KY2hlY2tzLgoKYGJhc2VfcGxhbmVgIGlzIHdoZXJlIHRoZSByb2JvdCdzIGZsYW5nZSB0YWtlcyBob2xkIG9mIHRoZSBnZW9tZXRyeSwgYWxzbwppbiB0aGUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIGluLiBJdHMgWiBheGlzIHBvaW50cyBhd2F5IGZyb20gdGhlIHJvYm90LAptYXRjaGluZyB0aGUgcGxhbm5pbmcgZ3JvdXBzIG9mIHRoZSByb2JvdHMgaW4gdGhlIGxpYnJhcnksIHNvIGEgdG9vbCBkcmF3bgpyZWFjaGluZyBhbG9uZyB3b3JsZCBaIG5lZWRzIG5vIGBiYXNlX3BsYW5lYCBhdCBhbGwuIFdpcmUgb25lIHdoZW4gdGhlIHRvb2wKd2FzIGRyYXduIGFsb25nIGFub3RoZXIgYXhpczogZm9yIGEgdG9vbCByZWFjaGluZyBhbG9uZyB3b3JsZCBYLCB0aGF0IGlzCnRoZSBwbGFuZSB3aXRoIFogPSB3b3JsZCBYLiBOb3RoaW5nIGlzIGJha2VkIGludG8gdGhlIG1lc2gsIHNvIHRoZSBwbGFuZQpjYW4gYmUgcmUtd2lyZWQgYXQgYW55IHRpbWUuCgpBIHJlbWFyayBpcyBzdXJmYWNlZCB3aGVuIHRoZSBUQ1AgZG9lcyBub3Qgc2l0IHJvdWdobHkgb24gdGhlIHRvb2wncyArWiwKc2luY2UgdGhhdCBtZWFucyB0aGUgdG9vbCB3aWxsIHBvaW50IHNpZGV3YXlzIG9uY2UgYXR0YWNoZWQuCgpUaGUgcmVzdWx0IGlzIGEgc3RhdGljIChubyBqb2ludHMpIGBUb29sTW9kZWxgIHJlYWR5IHRvIGZlZWQgaW50byBhCmBMb2FkIFJvYm90IENlbGxgIGNvbXBvbmVudCdzIGB0b29sc2AgaW5wdXQuIEtpbmVtYXRpYyB0b29scyAod2l0aCB0aGVpcgpvd24gam9pbnRzKSBzaG91bGQgYmUgbG9hZGVkIGZyb20gVVJERiBpbnN0ZWFkLgoKQ09NUEFTIEZBQiB2Mi4wLjEgKGJ1aWx0IDIwMjYtMDgtMDMgMTU6MzAgVVRDKQoiIiIKCmZyb20gbWF0aCBpbXBvcnQgZGVncmVlcwoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgcmhpbm9zY3JpcHRzeW50YXggYXMgcnMKaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhcy5nZW9tZXRyeSBpbXBvcnQgRnJhbWUKZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IFZlY3Rvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgcmVtYXJrCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCiMgQmV5b25kIHRoaXMgYW5nbGUgYmV0d2VlbiB0aGUgdG9vbCdzICtaIGFuZCBpdHMgVENQLCB0aGUgdG9vbCBpcyBjb25zaWRlcmVkCiMgdG8gYmUgcG9pbnRpbmcgc29tZXdoZXJlIG90aGVyIHRoYW4gYXdheSBmcm9tIHRoZSBmbGFuZ2UuCk1BWF9UQ1BfT0ZGX0FYSVNfQU5HTEUgPSAzMC4wCgoKZGVmIF9vZmZfYXhpc19yZW1hcmsodG9vbCk6CiAgICAiIiJUZXh0IGZvciB0aGUgbW91bnRpbmctYXhpcyByZW1hcmssIG9yIE5vbmUgd2hlbiB0aGUgdG9vbCBsb29rcyBmaW5lLgoKICAgIFRoZSBUQ1AgZGlyZWN0aW9uIGlzIG9ubHkgYSBoaW50OiBpdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJvbGwgb2YgdGhlIHRvb2wKICAgIGFuZCBpcyBtZWFuaW5nbGVzcyBmb3IgYSBUQ1Agc2l0dGluZyBvbiB0aGUgbW91bnQgaXRzZWxmLCBzbyBpdCBpcyByZXBvcnRlZAogICAgcmF0aGVyIHRoYW4gYXBwbGllZC4KICAgICIiIgogICAgdGNwX2RpcmVjdGlvbiA9IFZlY3RvcigqdG9vbC5mcmFtZS5wb2ludCkKICAgIGlmIHRjcF9kaXJlY3Rpb24ubGVuZ3RoIDwgMWUtNjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFuZ2xlID0gZGVncmVlcyh0Y3BfZGlyZWN0aW9uLmFuZ2xlKFZlY3Rvci5aYXhpcygpKSkKICAgIGlmIGFuZ2xlIDwgTUFYX1RDUF9PRkZfQVhJU19BTkdMRToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG1lc3NhZ2UgPSAoIlRDUCBzaXRzIHs6LjBmfSBkZWcgb2ZmIHRoZSB0b29sJ3MgK1ogYXhpcywgc28gdGhpcyB0b29sIHdpbGwgcG9pbnQgc2lkZXdheXMgb25jZSBhdHRhY2hlZDogdG9vbHMgbW91bnQgd2l0aCArWiBwb2ludGluZyBhd2F5IGZyb20gdGhlIGZsYW5nZS4gIikuZm9ybWF0KGFuZ2xlKQoKICAgIHVuaXRpemVkID0gdGNwX2RpcmVjdGlvbi51bml0aXplZCgpCiAgICBpZiBhYnModW5pdGl6ZWQueCkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFgsIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWCAob3JpZ2luLCB4PSgwLDEsMCksIHk9KDAsMCwxKSkuIgogICAgZWxpZiBhYnModW5pdGl6ZWQueSkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFksIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWSAob3JpZ2luLCB4PSgwLDAsMSksIHk9KDEsMCwwKSkuIgogICAgZWxzZToKICAgICAgICBtZXNzYWdlICs9ICJTZXQgYGJhc2VfcGxhbmVgIHRvIGEgcGxhbmUgd2hvc2UgWiBheGlzIHJ1bnMgYWxvbmcgeW91ciB0b29sLCB3aXRoIGl0cyBYIGF4aXMgcGlja2VkIHRvIGdpdmUgdGhlIHJvbGwgeW91IHdhbnQuIgogICAgcmV0dXJuIG1lc3NhZ2UKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgbmFtZTogc3RyLAogICAgICAgICAgICB2aXN1YWxfbWVzaCwKICAgICAgICAgICAgY29sbGlzaW9uX21lc2gsCiAgICAgICAgICAgIHRjcF9wbGFuZSwKICAgICAgICAgICAgYmFzZV9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgYmFzZV9mcmFtZSA9IE5vbmUKICAgICAgICBpZiBiYXNlX3BsYW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBiYXNlX2ZyYW1lID0gYmFzZV9wbGFuZSBpZiBpc2luc3RhbmNlKGJhc2VfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZShiYXNlX3BsYW5lKQogICAgICAgIGNfdmlzdWFsID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaCh2aXN1YWxfbWVzaCkpIGlmIHZpc3VhbF9tZXNoIGVsc2UgTm9uZQogICAgICAgIGNfY29sbGlzaW9uID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaChjb2xsaXNpb25fbWVzaCkpIGlmIGNvbGxpc2lvbl9tZXNoIGVsc2UgTm9uZQoKICAgICAgICBpZiBjb2xsaXNpb25fbWVzaCBpcyBOb25lOgogICAgICAgICAgICBnaF93YXJuaW5nKGdoZW52LkNvbXBvbmVudCwgIk5vIGNvbGxpc2lvbiBtZXNoIHByb3ZpZGVkOiB0aGUgdG9vbCB3aWxsIGJlIHZpc3VhbGl6ZWQgYnV0IGlnbm9yZWQgZm9yIGNvbGxpc2lvbiBjaGVja2luZy4iKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgYGJhc2VfZnJhbWVgIGlzIG9ubHkgcGFzc2VkIHdoZW4gd2lyZWQsIHNvIGFuIG9sZGVyIGNvbXBhc19yb2JvdHMga2VlcHMKICAgICAgICAjIHdvcmtpbmcgZm9yIGRlZmluaXRpb25zIHRoYXQgZG9uJ3QgdXNlIGl0LgogICAgICAgIGt3YXJncyA9IHsiYmFzZV9mcmFtZSI6IGJhc2VfZnJhbWV9IGlmIGJhc2VfZnJhbWUgZWxzZSB7fQogICAgICAgIHRvb2wgPSBUb29sTW9kZWwoCiAgICAgICAgICAgIHZpc3VhbD1jX3Zpc3VhbCwKICAgICAgICAgICAgZnJhbWVfaW5fdG9vbDBfZnJhbWU9ZnJhbWUsCiAgICAgICAgICAgIGNvbGxpc2lvbj1jX2NvbGxpc2lvbiwKICAgICAgICAgICAgbmFtZT0obmFtZSBvciAiYXR0YWNoZWRfdG9vbCIpLnN0cmlwKCksCiAgICAgICAgICAgICoqa3dhcmdzLAogICAgICAgICkKCiAgICAgICAgbWVzc2FnZSA9IF9vZmZfYXhpc19yZW1hcmsodG9vbCkKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICByZW1hcmsoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCgogICAgICAgIHJldHVybiB0b29sCg== + COMPAS FAB: Tool From Mesh + + + + + *.*.python + 3.* + + + + + + + + @@ -3525,7 +3545,7 @@ - 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 diff --git a/docs/frontends/ghpython/files/04_plan_motion.ghx b/docs/frontends/ghpython/files/04_plan_motion.ghx index dc86ffbda1..14a9a232a1 100644 --- a/docs/frontends/ghpython/files/04_plan_motion.ghx +++ b/docs/frontends/ghpython/files/04_plan_motion.ghx @@ -50,10 +50,10 @@ - -209 - 275 + -319 + 175 - 0.3132806 + 0.44672015 @@ -78,7 +78,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -86,7 +86,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -94,7 +94,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -102,7 +102,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -156,7 +156,7 @@ - 0.4008130799542978 + 0.33741530588272634 -0.4308280237301899 0.08170787080470088 1 @@ -1084,7 +1084,7 @@ 528 - 223 + 239 50 20 @@ -1092,8 +1092,8 @@ 0 0 - 528.39716 - 223.43997 + 528.7902 + 239.43997 @@ -1158,7 +1158,7 @@ - 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 6 00000000-0000-0000-0000-000000000000 @@ -1331,7 +1331,7 @@ - + 1 198;217;216;237 @@ -1363,7 +1363,8 @@ 0855e543-9f77-4823-8f21-2b134bc4fca3 9c92c74a-5e86-436d-874f-a0030c6dab03 14762c92-f1ae-4fe4-98ab-802dc2b518e2 - 26 + 1f179f42-a302-4b46-a703-cf43ac8ec09f + 27 1ca67453-7fdd-4978-814c-31ac691a83ba Group Prepare robot cell elements @@ -1636,7 +1637,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== 879f838f-40fa-475b-a82f-c6514e3d7044 true @@ -2080,7 +2081,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDb1VvU4CQRDeI1Y8gj9oAxz4CPoEVkShM6E10QQLE5WYGBODmtiY6FOAhpcwUUoT4Q4q8afTxoTSc7/xhuwee/EAcZvZmfnm+2bvZ0eICS9L5fc8Ly/9Uvf5danX62k5FWfax+NxLzE3cytzF5Zl1RjTJ5HkFcft7HNiHGunkydSpAwOEkDnkrw6DmmwVooUcJKYnygFAX/gEyed4Kn78jXsM+cGmi2HttmMzSGyeCfzidnYFLww8rBiZqrd1EX1us6uKKzlRH41Rz5z0glaTtvro+QGxChkAeTUYjWPzheztiZ0eLAnEM/YKUsTCHZkKkaMhVVRNIH6x6YjIIClCaDo6PiUEiBBMSwvVdyUZ5xqNQEkIKKSqmDeR8EwdkCAE8Paq84blWwmp7VSCNBXpEUNThgBQy9DBJDnH42xRgsCJgGg8fFpxJmCRoHfCIp3rijeuya+gZhRIApB4z3aKYwCaCMqwUDLgUCoQAA3sktfES6mytm55bjtH6KVdbIbW9sj+XY6Jcq7O3T9kIA/iZa5zYXOA2/JDuujyOf8p4GDyYMxp7U9huOPTJrLdJsy1ySGPnNPzH4DnVnW4pC0cHgAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDb1VvU4CQRDeI3a8AYqxAQ58BH0CK6LQmdCaaIKNCf4kxsQfEisTfQrQ8BImSmki3EEnSqeNofXcb7whu8dePEDcZnZmvvm+2fvZEWLGy1L5Pc8rSL/ce+2vDAYDLafiTPt4PO4lFxL3MndlWVadMUMSSX7uuN19Tkxj7UzqQoocgIME0Lkkr01DGqyVIkWcJOYnykHAH/jESSd46b19jfvMuYFW26FtLmtziCzeyWJyPjYHL4w8rJiZ6ncNUbttsCuKG3lRWM+Tz5x0grbT8YYouQExClkAObVYzaPz5ZytCR0fVQTiWTttaQLBjkzFiLGwKoomUP/ccgQEsDQBFJ2cVikBEhTD8lLFTXnGqVYTQAIiKqkK5n0UDGNHBDgxrr3p9qlkO5XQSiFAX5EWNThhBAy9DhFAnn80xhotCJgEgObHpxFnChoFfiMoPbii9Oia+EZiRoEoBM33aKcwCqCNqAQjLQcCoQIB3MQufUW4mM6ql5bjdn6I1jbJbu3sTuTbmbQ4rOzR9UMC/iRa5TaXuk+8JTuujyKf858GDiYPxpzW9hSOPzJpLtNtylyzGPrMPTP7DXFn1tne6IQrAAAAAElFTkSuQmCC 282367d0-3f19-41d2-8c3e-903cdb22e13b true @@ -2099,14 +2100,14 @@ - 3096 - 518 + 3101 + 522 158 104 - 3162 - 570 + 3167 + 574 @@ -2142,14 +2143,14 @@ - 3098 - 520 + 3103 + 524 49 100 - 3124 - 570 + 3129 + 574 @@ -2180,14 +2181,14 @@ - 3177 - 520 + 3182 + 524 75 20 - 3214.5 - 530 + 3219.5 + 534 @@ -2218,14 +2219,14 @@ - 3177 - 540 + 3182 + 544 75 20 - 3214.5 - 550 + 3219.5 + 554 @@ -2256,14 +2257,14 @@ - 3177 - 560 + 3182 + 564 75 20 - 3214.5 - 570 + 3219.5 + 574 @@ -2294,14 +2295,14 @@ - 3177 - 580 + 3182 + 584 75 20 - 3214.5 - 590 + 3219.5 + 594 @@ -2332,14 +2333,14 @@ - 3177 - 600 + 3182 + 604 75 20 - 3214.5 - 610 + 3219.5 + 614 @@ -2396,7 +2397,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEUlEQVRIDdVVyytEYRQ/d3A1M81kyMZ4bRhrjHeS7CQSJX+BhZIlfwBLKTZKsfGIRLIkCQskO49ZeEuUxzCGqOs7H+d279zvoysWTs2c853fOb/fd7/7OAB/bIqRX9O0JrbuOD27KI9EIibMWCeK3W63lpGetsawfkVRpqlGJ2HkPXv7oS4C0G9ubUM4HDam9NjlckFpSZG+NgZ5gZxeJtKNuXj8w53Hko9NTMHc/ALCUjs8OobWlmYLjlyMcxuvhAuwio7YqpXVNfD5kqCpsSEW4uvpmVnAGpHAZwNyfgjgmQtZWLKmukoIocBXRpwOLLJ7Q78iJow4uQAl/8L/fwF6iqSns7i0DJoU/R6QClRWlPP3YGh4RMpSX1crxQiQCuDznZ2VCdFolGpN3uv1QrAw35QTLaQCWFxWWizqsZUTCgyGLmyRYHEwxQNFyR5Ln0Vg4+YBBn4g0A5p3wvshp9g5/aR7yLX44SDh4/z7wz4LTujxOXzK4wfX9HS4k1X0LYVgivWgEbkGPftn6MTmk81UVhqOIrDgr4dqYkJoDoccB59Ab8zkZ+t36maGmmITJ5cg8IWoyUBy/EgJzZxAZxE7BteQSx3r288RL9+fU9p3ce+eKKb+zndgL5F/dhd4PMA7k5l21IdCrjjCNa5eYA19MMeiXFOrOMmGpmE2fXGkakLIAmOTuZ+dejb3Zzt+ne5RKuqd5c7kwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEklEQVRIDdVVyytEYRQ/d3A1Y2YyZMEIG8ba+5UkO4lEyV9goWTJH8BSio1SbDwikSxJwgLJzmMWHhlEeYzJEHV95+Pc7p37fXTFwqmZc77zO+f3++53Hwfgj00x8mua1sLWXeehy8pIJGLCjHWi2O12a5n+9A2GDSqKMks1Ogkj7zs4DPYQgH57ZxfC4bAxpcculwvKy0r0tTHID+T2M5FezMXjH+48lnxiagYWFpcQltrxySm0t7VacORinLt4JVyAVXTFVq2tb4DPlwwtzU2xEF/Pzs0D1ogEPhuQ80MAz1zIwpJ1tTVCCAW+MuJ0YJHdG/oVMWHEyQUo+Rf+/wvQUyQ9neWVVdCk6PeAVKC6qpK/ByOjY1KWxoZ6KUaAVACf75zsLIhGo1Rr8l6vF4qLCkw50UIqgMUV5aWiHls5ocBw8MIWCRYXp3qgJMVj6bMIbN0+wtAPBDoh43uB/fAT7N1F+C7yPE44evw4/+6A37IzSlw9v8Lk6TUtLd50BR07QbhmDWhEjvHAYQid0HyqicJSw1EcFvTtSEtMANXhgFD0BfzORH62fqdqaqQhMn12AwpbjJcFLMeDnNjEBXASsW94FbHcv77xEP3mzQOldR/74olu7ud0A/oWDWJ3oc8DuDuVbUt1KJAUR7DOzQOsoR/2SIxzYh030cgkzK43jkxdAElwdDL3q0Pf7uZs178Dt0yrp/1lc7YAAAAASUVORK5CYII= 9c92c74a-5e86-436d-874f-a0030c6dab03 true @@ -2416,13 +2417,13 @@ 675 - 219 + 237 159 64 760 - 251 + 269 @@ -2458,13 +2459,13 @@ 677 - 221 + 239 68 20 712.5 - 231 + 249 @@ -2496,13 +2497,13 @@ 677 - 241 + 259 68 20 712.5 - 251 + 269 @@ -2534,13 +2535,13 @@ 677 - 261 + 279 68 20 712.5 - 271 + 289 @@ -2572,13 +2573,13 @@ 775 - 221 + 239 57 30 803.5 - 236 + 254 @@ -2610,13 +2611,13 @@ 775 - 251 + 269 57 30 803.5 - 266 + 284 @@ -2664,7 +2665,7 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Tool From Mesh + COMPAS FAB: Frame Target @@ -2673,14 +2674,14 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVPUsDQRDdi4LFgQgRBTWSQjFa2xnB/APRpPUnmFZFEEHUSsg/sLGQRPE/qJ21RrQyfpRWB9p47hszx7q3e3dJLltkZ2fevDezy2WE6PNyVH7f98vyXG29vi95nvcvpuJMtuu6fm5q4lbGao7jNBgTkEjyw+bj0zYHetkLc7NHUmQHHCSAyiV5vRdSPVeKVNBJph2o6oAUzsRJHby03n46vfO4AvAm07nJzCCAOvn+wbG4f2jGcQTxvd0tsTBfCM4wmJOvKAiCuBPyINFihARQiV4NclFlZX01RAOfCc/AkAACJiJcW/3iivMS70YBtQtTdexDIeW1cFequlEAALWL87NTuGjB5jeKI0eCVYC70B+9cfl3TWoBpGz5sQoAzyTq3bOdpHpwRAqoXQDMi4X5HLVHCiDRRJa0euTTlwzDttAFRE4+PDHw/SU281kb1OiPFUBWtrgiPu+eiWB0ccZIZHPSFeGPyQaAvzQ2Ijby46I0PER2FJZjzMnz4FrOgyIH09jlPLiR82CZH7mWBqnGQZwkgMmDMacBuj62RybN5WAmg60fQ7/rKpMm/gLhhokzxSFCzgAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/pOnz62/fPmCIoesDhubh4fnv4y05FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBHiLc94c9LygAAAABJRU5ErkJggg== - 14762c92-f1ae-4fe4-98ab-802dc2b518e2 + 2c3deda5-7a78-4902-bb79-4796273ba3ff true false true - COMPAS FAB: Tool From Mesh - COMPAS FAB: Tool From Mesh + COMPAS FAB: Frame Target + COMPAS FAB: Frame Target 3 false @@ -2692,63 +2693,64 @@ - 673 - 116 - 167 - 84 + 2245 + 623 + 173 + 104 - 764 - 158 + 2367 + 675 - - 4 + + 5 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa 1 08908df5-fa14-4982-9ab2-1aa0927566aa - + true - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. - da2ca3e1-ada7-4121-93b6-7b421382aab4 - name - name + Rhino plane or COMPAS Frame describing the target pose (in WCF). + f086b18c-92ca-408c-b345-a009bfdc1d25 + plane + plane true 0 2 true - b1d6bdbb-bbbc-482e-9851-581e5580f4a9 + fa1878da-0da2-406e-95ad-60f40216bfa7 1 - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + Rhino plane or COMPAS Frame describing the target pose (in WCF). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 675 - 118 - 74 + 2247 + 625 + 105 20 - 713.5 - 128 + 2301 + 635 System.Private.CoreLib - System.String + System.Object @@ -2756,116 +2758,152 @@ true - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). - f2ed7ea7-33d7-441d-8089-38c02ce07c76 - visual_mesh - visual_mesh + Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece). + 4ea23f34-2f44-4fea-ace2-ed14776c55fd + target_mode + target_mode true 0 2 true - de7ea5f7-f04b-48c8-80ca-659046e21818 + 7f84f5b4-4206-4870-9cc2-3f06eea92a96 1 - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece). + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 675 - 138 - 74 + 2247 + 645 + 105 20 - 713.5 - 148 + 2301 + 655 System.Private.CoreLib - System.Object + System.String - + true - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. - 845901a6-5ddb-4f5f-9663-353bb0d7d2b1 - collision_mesh - collision_mesh + Position tolerance in meters (not affected by native_scale). If unset, the planner default is used. + e64a05b9-8639-4029-88ed-8e9187a04a68 + tolerance_position + tolerance_position true 0 2 true - de7ea5f7-f04b-48c8-80ca-659046e21818 - 1 - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + 0 + Position tolerance in meters (not affected by native_scale). If unset, the planner default is used. + 9d51e32e-c038-4352-9554-f4137ca91b9a - 675 - 158 - 74 + 2247 + 665 + 105 20 - 713.5 - 168 + 2301 + 675 System.Private.CoreLib - System.Object + System.Double - + true - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame. - 10f1a94a-a2c7-4f77-a6f5-0047b6ca053a - tcp_plane - tcp_plane + Orientation tolerance in radians. If unset, the planner default is used. + b9b337d0-dbe9-450e-b28b-ec6b45abb002 + tolerance_orientation + tolerance_orientation true 0 2 true - 3e07e26f-7364-466c-bf58-2608d206128a - 1 - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + 0 + Orientation tolerance in radians. If unset, the planner default is used. + 9d51e32e-c038-4352-9554-f4137ca91b9a - 675 - 178 - 74 + 2247 + 685 + 105 20 - 713.5 - 188 + 2301 + 695 System.Private.CoreLib - System.Object + System.Double + + + + + + + true + Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0. + b27f1e89-e38c-49cc-952b-6cd07d5aad25 + native_scale + native_scale + true + 0 + 2 + true + 0 + Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0. + 9d51e32e-c038-4352-9554-f4137ca91b9a + + + + + + 2247 + 705 + 105 + 20 + + + 2301 + 715 + + + + + + System.Private.CoreLib + System.Double @@ -2873,30 +2911,30 @@ false - ToolModel. - 6f0b279a-83bc-49d8-b291-d9861d788592 - tool_model - tool_model + FrameTarget. + 4d4c2587-3e67-44b5-ad21-f205a57ebe3a + target + target false 0 2 true 0 - ToolModel. + FrameTarget. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 779 - 118 - 59 - 80 + 2382 + 625 + 34 + 100 - 808.5 - 158 + 2399 + 675 @@ -2915,8 +2953,8 @@ true false true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25zdHJ1Y3QgYSBUb29sTW9kZWwgZnJvbSBhIFJoaW5vIG1lc2ggYW5kIGEgVENQIHBsYW5lLgoKYHRjcF9wbGFuZWAgbWF5IGJlIGEgUmhpbm8gUGxhbmUgb3IgYSBjb21wYXMgRnJhbWU7IGl0IGlzIHRoZSBUb29sCkNvb3JkaW5hdGUgRnJhbWUgZXhwcmVzc2VkIGluIHRoZSByb2JvdCdzIGB0b29sMGAgbGluayBmcmFtZS4gSWYKYGNvbGxpc2lvbl9tZXNoYCBpcyB1bndpcmVkLCBgdmlzdWFsX21lc2hgIGlzIHJldXNlZCBmb3IgY29sbGlzaW9uCmNoZWNrcy4KClRoZSByZXN1bHQgaXMgYSBzdGF0aWMgKG5vIGpvaW50cykgYFRvb2xNb2RlbGAgcmVhZHkgdG8gZmVlZCBpbnRvIGEKYExvYWQgUm9ib3QgQ2VsbGAgY29tcG9uZW50J3MgYHRvb2xzYCBpbnB1dC4gS2luZW1hdGljIHRvb2xzICh3aXRoIHRoZWlyCm93biBqb2ludHMpIHNob3VsZCBiZSBsb2FkZWQgZnJvbSBVUkRGIGluc3RlYWQuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgbmFtZTogc3RyLCB2aXN1YWxfbWVzaCwgY29sbGlzaW9uX21lc2gsIHRjcF9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgY192aXN1YWwgPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKHZpc3VhbF9tZXNoKSkgaWYgdmlzdWFsX21lc2ggZWxzZSBOb25lCiAgICAgICAgY19jb2xsaXNpb24gPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKGNvbGxpc2lvbl9tZXNoKSkgaWYgY29sbGlzaW9uX21lc2ggZWxzZSBOb25lCgogICAgICAgIGlmIGNvbGxpc2lvbl9tZXNoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiTm8gY29sbGlzaW9uIG1lc2ggcHJvdmlkZWQ6IHRoZSB0b29sIHdpbGwgYmUgdmlzdWFsaXplZCBidXQgaWdub3JlZCBmb3IgY29sbGlzaW9uIGNoZWNraW5nLiIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIFRvb2xNb2RlbCgKICAgICAgICAgICAgdmlzdWFsPWNfdmlzdWFsLAogICAgICAgICAgICBmcmFtZV9pbl90b29sMF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgY29sbGlzaW9uPWNfY29sbGlzaW9uLAogICAgICAgICAgICBuYW1lPShuYW1lIG9yICJhdHRhY2hlZF90b29sIikuc3RyaXAoKSwKICAgICAgICApCg== - COMPAS FAB: Tool From Mesh + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBGcmFtZVRhcmdldCBmb3IgdGhlIHJvYm90J3MgZW5kLWVmZmVjdG9yIG1vdGlvbiBwbGFubmluZy4KCkFjY2VwdHMgYSBSaGlubyBwbGFuZSBvciBhIENPTVBBUyBGcmFtZS4gVGhlIGB0YXJnZXRfbW9kZWAgY29udHJvbHMgd2hpY2gKZnJhbWUgb24gdGhlIHJvYm90L3Rvb2wvd29ya3BpZWNlIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgdGFyZ2V0LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX3ZhbHVlX2xpc3QKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgRnJhbWVUYXJnZXQKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgVGFyZ2V0TW9kZQoKX1RBUkdFVF9NT0RFUyA9IFttb2RlLnZhbHVlIGZvciBtb2RlIGluIFRhcmdldE1vZGVdCgoKY2xhc3MgRnJhbWVUYXJnZXRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcGxhbmUsCiAgICAgICAgICAgIHRhcmdldF9tb2RlOiBzdHIsCiAgICAgICAgICAgIHRvbGVyYW5jZV9wb3NpdGlvbjogZmxvYXQsCiAgICAgICAgICAgIHRvbGVyYW5jZV9vcmllbnRhdGlvbjogZmxvYXQsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGVuc3VyZV92YWx1ZV9saXN0KGdoZW52LkNvbXBvbmVudCwgInRhcmdldF9tb2RlIiwgX1RBUkdFVF9NT0RFUywgZGVmYXVsdD0iUk9CT1QiKSAgIyBub3FhOiBGODIxCgogICAgICAgIGlmIHBsYW5lIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGZyYW1lID0gcGxhbmUgaWYgaXNpbnN0YW5jZShwbGFuZSwgRnJhbWUpIGVsc2UgcGxhbmVfdG9fY29tcGFzX2ZyYW1lKHBsYW5lKQoKICAgICAgICBtb2RlID0gdGFyZ2V0X21vZGUgb3IgIlJPQk9UIgogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZSwgc3RyKToKICAgICAgICAgICAgbW9kZSA9IFRhcmdldE1vZGUobW9kZS5zdHJpcCgpLnVwcGVyKCkpCgogICAgICAgIG5hdGl2ZV9zY2FsZSA9IG5hdGl2ZV9zY2FsZSBpZiBuYXRpdmVfc2NhbGUgZWxzZSAxLjAKCiAgICAgICAgdGFyZ2V0ID0gRnJhbWVUYXJnZXQoCiAgICAgICAgICAgIHRhcmdldF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgdGFyZ2V0X21vZGU9bW9kZSwKICAgICAgICAgICAgbmF0aXZlX3NjYWxlPW5hdGl2ZV9zY2FsZSwKICAgICAgICAgICAgdG9sZXJhbmNlX3Bvc2l0aW9uPXRvbGVyYW5jZV9wb3NpdGlvbiwKICAgICAgICAgICAgdG9sZXJhbmNlX29yaWVudGF0aW9uPXRvbGVyYW5jZV9vcmllbnRhdGlvbiwKICAgICAgICApCiAgICAgICAgcmV0dXJuIHRhcmdldAo= + COMPAS FAB: Frame Target @@ -2930,10 +2968,10 @@ - 399 - 149 + 525 + 199 550 - 700 + 650 @@ -2944,7 +2982,7 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Frame Target + COMPAS FAB: Attach Tool To Robot @@ -2953,14 +2991,14 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBpPLdAuMVd1AAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACBUlEQVRIDbWVTS9DQRSGT8WuXVjgtvG1EvXZCGkI/oI01cbWQiRWdoIQCwmJnZVE/AGKiL+AEEttuVhpiY9akLTrmve0czNt5pZLepKZOXPOuc97Z85iiKpsLpWfz+cjYj/39Pwyks1mS3Jqnc73eDz55ibfuchtuVyuA1ljQQR83bx7WJSJ/6z+jvYNIbIEBgvgzwU8Vg69uLyi63iCw/39AQoODpSX2O6FSBQnkQKnQmBUrT46PqG92JEaoslomMKh8ZKY3UYInAmBsRoU4M7Vwlwux3CvYdDmxhoP+BBE7jcmmSxQ3tC39wwzero7qa21hQd8mMzxpsIkmbW6GqOxgcOJ5C09ptKWD0fmOPiLSSvgdrv5vnEl84srFgY9QM6JaQUAQDN9Xi9t7+wyb3ZmmoaHgk7YXMs9sPsKwK+OPvr0B/4EB9f2BEjupzJ03zsElw7SHxRpqWffyaQVuLk1CSP5mSMj88W8+OsdUZ2bIuGQE77+BLHDYxYAySjiTLFiJG9MWl1eKEZ/XrQ96O7yW19GJ0KE0dVZiKk5q6iCo70iCcMqryR2OMUYua/ALEnZCgAue4EVhpM4Ne0VqTD0AwPm9O/xDQvgscBGNZxAngJxp38vmSxQfIlUPvtOoSpAMmUPtkSy5D1AMU4gRf5wPWAWXjQ4VX0yIQCrxqNfIFdx/gZyM8B488sZSgAAAABJRU5ErkJggg== - 2c3deda5-7a78-4902-bb79-4796273ba3ff + a0b7288b-d4f9-4c4c-88eb-9a4e1b20e889 true false true - COMPAS FAB: Frame Target - COMPAS FAB: Frame Target + COMPAS FAB: Attach Tool To Robot + COMPAS FAB: Attach Tool To Robot 3 false @@ -2972,57 +3010,58 @@ - 2245 - 623 - 173 - 104 + 2484 + 124 + 176 + 124 - 2367 - 675 + 2591 + 186 - - 5 + + 6 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa 1 08908df5-fa14-4982-9ab2-1aa0927566aa - + true - Rhino plane or COMPAS Frame describing the target pose (in WCF). - f086b18c-92ca-408c-b345-a009bfdc1d25 - plane - plane + Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty. + 0632a7ab-b841-4e40-8475-8b8dadca3ef5 + robot_cell + robot_cell true 0 2 true - fa1878da-0da2-406e-95ad-60f40216bfa7 + c4c3df53-0a94-4574-afc8-9e68cb15bc46 1 - Rhino plane or COMPAS Frame describing the target pose (in WCF). + Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2247 - 625 - 105 + 2486 + 126 + 90 20 - 2301 - 635 + 2532.5 + 136 @@ -3037,76 +3076,77 @@ true - Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece). - 4ea23f34-2f44-4fea-ace2-ed14776c55fd - target_mode - target_mode + The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`. + 5c8ad236-9f77-449f-9f22-cc089f77999f + cell_state + cell_state true 0 2 true - 7f84f5b4-4206-4870-9cc2-3f06eea92a96 + e3d8b137-b6b2-491f-a175-53c88474afd2 1 - Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece). - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2247 - 645 - 105 + 2486 + 146 + 90 20 - 2301 - 655 + 2532.5 + 156 System.Private.CoreLib - System.String + System.Object - + true - Position tolerance in meters (not affected by native_scale). If unset, the planner default is used. - e64a05b9-8639-4029-88ed-8e9187a04a68 - tolerance_position - tolerance_position + Id of the tool inside the RobotCell. + e931a4e6-c85a-4040-a631-65ab93fd2b4d + tool_id + tool_id true 0 2 true - 0 - Position tolerance in meters (not affected by native_scale). If unset, the planner default is used. - 9d51e32e-c038-4352-9554-f4137ca91b9a + a194c46d-2cff-4b97-9fc2-c1b5762db47b + 1 + Id of the tool inside the RobotCell. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 2247 - 665 - 105 + 2486 + 166 + 90 20 - 2301 - 675 + 2532.5 + 176 System.Private.CoreLib - System.Double + System.String @@ -3114,37 +3154,37 @@ true - Orientation tolerance in radians. If unset, the planner default is used. - b9b337d0-dbe9-450e-b28b-ec6b45abb002 - tolerance_orientation - tolerance_orientation + Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`. + efc78418-137f-4d2a-bc1e-9ac84b85ba02 + group + group true 0 2 true 0 - Orientation tolerance in radians. If unset, the planner default is used. - 9d51e32e-c038-4352-9554-f4137ca91b9a + Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 2247 - 685 - 105 + 2486 + 186 + 90 20 - 2301 - 695 + 2532.5 + 196 System.Private.CoreLib - System.Double + System.String @@ -3152,37 +3192,76 @@ true - Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0. - b27f1e89-e38c-49cc-952b-6cd07d5aad25 - native_scale - native_scale + Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link). + a7f72b11-5611-4e89-a36b-81f37715729b + attachment_plane + attachment_plane true 0 2 true 0 - Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0. - 9d51e32e-c038-4352-9554-f4137ca91b9a + Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2247 - 705 - 105 + 2486 + 206 + 90 20 - 2301 - 715 + 2532.5 + 216 System.Private.CoreLib - System.Double + System.Object + + + + + + + 1 + true + Optional list of robot link names allowed to collide with the tool. + b0b069e8-af5a-4216-9545-d1ebba73f40f + touch_links + touch_links + true + 1 + 2 + true + 0 + Optional list of robot link names allowed to collide with the tool. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + + + + + + 2486 + 226 + 90 + 20 + + + 2532.5 + 236 + + + + + + System.Private.CoreLib + System.String @@ -3190,30 +3269,30 @@ false - FrameTarget. - 4d4c2587-3e67-44b5-ad21-f205a57ebe3a - target - target + New RobotCellState with the tool attached. + 69e48047-60c1-4584-8133-6458bdb0f4da + cell_state + cell_state false 0 2 true 0 - FrameTarget. + New RobotCellState with the tool attached. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2382 - 625 - 34 - 100 + 2606 + 126 + 52 + 120 - 2399 - 675 + 2632 + 186 @@ -3232,8 +3311,8 @@ true false true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBGcmFtZVRhcmdldCBmb3IgdGhlIHJvYm90J3MgZW5kLWVmZmVjdG9yIG1vdGlvbiBwbGFubmluZy4KCkFjY2VwdHMgYSBSaGlubyBwbGFuZSBvciBhIENPTVBBUyBGcmFtZS4gVGhlIGB0YXJnZXRfbW9kZWAgY29udHJvbHMgd2hpY2gKZnJhbWUgb24gdGhlIHJvYm90L3Rvb2wvd29ya3BpZWNlIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgdGFyZ2V0LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX3ZhbHVlX2xpc3QKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgRnJhbWVUYXJnZXQKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgVGFyZ2V0TW9kZQoKX1RBUkdFVF9NT0RFUyA9IFttb2RlLnZhbHVlIGZvciBtb2RlIGluIFRhcmdldE1vZGVdCgoKY2xhc3MgRnJhbWVUYXJnZXRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcGxhbmUsCiAgICAgICAgICAgIHRhcmdldF9tb2RlOiBzdHIsCiAgICAgICAgICAgIHRvbGVyYW5jZV9wb3NpdGlvbjogZmxvYXQsCiAgICAgICAgICAgIHRvbGVyYW5jZV9vcmllbnRhdGlvbjogZmxvYXQsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGVuc3VyZV92YWx1ZV9saXN0KGdoZW52LkNvbXBvbmVudCwgInRhcmdldF9tb2RlIiwgX1RBUkdFVF9NT0RFUywgZGVmYXVsdD0iUk9CT1QiKSAgIyBub3FhOiBGODIxCgogICAgICAgIGlmIHBsYW5lIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGZyYW1lID0gcGxhbmUgaWYgaXNpbnN0YW5jZShwbGFuZSwgRnJhbWUpIGVsc2UgcGxhbmVfdG9fY29tcGFzX2ZyYW1lKHBsYW5lKQoKICAgICAgICBtb2RlID0gdGFyZ2V0X21vZGUgb3IgIlJPQk9UIgogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZSwgc3RyKToKICAgICAgICAgICAgbW9kZSA9IFRhcmdldE1vZGUobW9kZS5zdHJpcCgpLnVwcGVyKCkpCgogICAgICAgIG5hdGl2ZV9zY2FsZSA9IG5hdGl2ZV9zY2FsZSBpZiBuYXRpdmVfc2NhbGUgZWxzZSAxLjAKCiAgICAgICAgdGFyZ2V0ID0gRnJhbWVUYXJnZXQoCiAgICAgICAgICAgIHRhcmdldF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgdGFyZ2V0X21vZGU9bW9kZSwKICAgICAgICAgICAgbmF0aXZlX3NjYWxlPW5hdGl2ZV9zY2FsZSwKICAgICAgICAgICAgdG9sZXJhbmNlX3Bvc2l0aW9uPXRvbGVyYW5jZV9wb3NpdGlvbiwKICAgICAgICAgICAgdG9sZXJhbmNlX29yaWVudGF0aW9uPXRvbGVyYW5jZV9vcmllbnRhdGlvbiwKICAgICAgICApCiAgICAgICAgcmV0dXJuIHRhcmdldAo= - COMPAS FAB: Frame Target + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpBdHRhY2ggYSB0b29sIHRvIGEgcm9ib3QgcGxhbm5pbmcgZ3JvdXAgaW5zaWRlIGEgUm9ib3RDZWxsU3RhdGUuCgpQYXNzdGhyb3VnaCBidWlsZGVyOiB0aGUgaW5wdXQgc3RhdGUgaXMgY29waWVkLCB0aGUgYXR0YWNobWVudCBpcyBzZXQsIGFuZAp0aGUgbmV3IHN0YXRlIGlzIHJldHVybmVkLgoKV2hlbiBgcm9ib3RfY2VsbGAgaXMgd2lyZWQgYW5kIGB0b29sX2lkYCBoYXMgbm8gc291cmNlLCB0aGUgY29tcG9uZW50CmF1dG8tY3JlYXRlcyBhIFZhbHVlIExpc3QgZHJvcGRvd24gbGlzdGluZyBldmVyeSB0b29sIGN1cnJlbnRseSBpbgpgY2VsbC50b29sX21vZGVsc2AgKHJlZnJlc2hlZCB3aGVuIHRoZSBzZXQgY2hhbmdlcykuIFRoZSBgdG9vbF9pZGAgaXMgYWxzbwp2YWxpZGF0ZWQgYWdhaW5zdCBgY2VsbC50b29sX21vZGVsc2A7IGFuIHVua25vd24gaWQgcmFpc2VzIGFuIGVycm9yIHJhdGhlcgp0aGFuIHByb2R1Y2luZyBhIGJyb2tlbiBzdGF0ZS4KCklmIGBjZWxsX3N0YXRlYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBkZWZhdWx0IHN0YXRlIGlzIGRlcml2ZWQgZnJvbQpgcm9ib3RfY2VsbGAsIHNvIGF0dGFjaGluZyBhIHNpbmdsZSB0b29sIG5lZWRzIG9ubHkgYHJvYm90X2NlbGxgICsgYHRvb2xfaWRgLgoKSWYgYGdyb3VwYCBpcyBsZWZ0IGVtcHR5LCB0aGUgY2VsbCdzIG1haW4gcGxhbm5pbmcgZ3JvdXAgaXMgdXNlZCAocmVxdWlyZXMKYHJvYm90X2NlbGxgIHRvIGJlIHdpcmVkIGluKS4gQW55IHRvb2wgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgc2FtZSBncm91cCBpcwphdXRvbWF0aWNhbGx5IGRldGFjaGVkLgoKSWYgYHRvdWNoX2xpbmtzYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBjb21wb25lbnQgZGVmYXVsdHMgdG8gdGhlIGVuZC1lZmZlY3RvcgpsaW5rIG9mIHRoZSBwbGFubmluZyBncm91cCAocGx1cyBpdHMgcGFyZW50IGxpbmsgd2hlbiB0aGUgZW5kLWVmZmVjdG9yIGxpbmsKaXRzZWxmIGhhcyBubyBnZW9tZXRyeSwgZS5nLiBVUidzIGB0b29sMGAgaXMgYSB6ZXJvLWdlb21ldHJ5IGZyYW1lIHNvIHRoZQpwYXJlbnQgYHdyaXN0XzNfbGlua2AgaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSkuIEEgcmVtYXJrIGlzIHN1cmZhY2VkIHNvCnRoZSBhdXRvLXBpY2sgaXNuJ3Qgc2lsZW50LgoKQSByZW1hcmsgYWx3YXlzIGFubm91bmNlcyB0aGUgbGluayB0aGUgdG9vbCBhY3R1YWxseSBlbmRzIHVwIGF0dGFjaGVkIHRvOgp0aGUgcGxhbm5pbmcgZ3JvdXAncyBlbmQtZWZmZWN0b3IgbGluayBhcyByZXR1cm5lZCBieQpgcm9ib3RfY2VsbC5nZXRfZW5kX2VmZmVjdG9yX2xpbmtfbmFtZShncm91cClgLiBPdmVycmlkZSB0aGF0IGVmZmVjdGl2ZQpmcmFtZSB2aWEgdGhlIGBhdHRhY2htZW50X3BsYW5lYCBpbnB1dC4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzLmdlb21ldHJ5IGltcG9ydCBGcmFtZQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgZXJyb3IKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcGxhbmVfdG9fY29tcGFzX2ZyYW1lCgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGVuc3VyZV9keW5hbWljX3ZhbHVlX2xpc3QKCgpjbGFzcyBBdHRhY2hUb29sVG9Sb2JvdChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICB0b29sX2lkOiBzdHIsCiAgICAgICAgICAgIGdyb3VwOiBzdHIsCiAgICAgICAgICAgIGF0dGFjaG1lbnRfcGxhbmUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cl0pOgogICAgICAgICMgQXV0by1wb3B1bGF0ZSB0aGUgdG9vbF9pZCBkcm9wZG93biBmcm9tIHRoZSBjZWxsJ3MgdG9vbCBpbnZlbnRvcnkuCiAgICAgICAgIyBSdW5zIGV2ZW4gd2hlbiB0b29sX2lkIGlzIGN1cnJlbnRseSBOb25lOiB0aGF0J3MgdGhlIHRyaWdnZXIuCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZW5zdXJlX2R5bmFtaWNfdmFsdWVfbGlzdCgKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudCwgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgInRvb2xfaWQiLAogICAgICAgICAgICAgICAgc29ydGVkKHJvYm90X2NlbGwudG9vbF9tb2RlbHMua2V5cygpKSwKICAgICAgICAgICAgKQoKICAgICAgICBpZiBub3QgdG9vbF9pZDoKICAgICAgICAgICAgcmV0dXJuIGNlbGxfc3RhdGUKCiAgICAgICAgdG9vbF9pZCA9IHRvb2xfaWQuc3RyaXAoKQoKICAgICAgICAjIFZhbGlkYXRlIHRoZSB0b29sIGV4aXN0cyBpbiB0aGUgY2VsbCBiZWZvcmUgYXR0YWNoaW5nIGl0LgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgbm90IE5vbmUgYW5kIHRvb2xfaWQgbm90IGluIHJvYm90X2NlbGwudG9vbF9tb2RlbHM6CiAgICAgICAgICAgIGVycm9yKCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICJUb29sIGlkICd7fScgaXMgbm90IGluIHRoZSByb2JvdCBjZWxsLiBBdmFpbGFibGUgdG9vbHM6IHt9LiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHRvb2xfaWQsICIsICIuam9pbihzb3J0ZWQocm9ib3RfY2VsbC50b29sX21vZGVscy5rZXlzKCkpKSBvciAiKG5vbmUpIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gY2VsbF9zdGF0ZQoKICAgICAgICAjIERlcml2ZSB0aGUgZGVmYXVsdCBzdGF0ZSBmcm9tIHRoZSBjZWxsIHdoZW4gYGNlbGxfc3RhdGVgIGlzIGxlZnQgdW53aXJlZC4KICAgICAgICBpZiBjZWxsX3N0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIldpcmUgYSBgY2VsbF9zdGF0ZWAsIG9yIHdpcmUgYHJvYm90X2NlbGxgIHNvIHRoZSBkZWZhdWx0IHN0YXRlIGNhbiBiZSBkZXJpdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGNlbGxfc3RhdGUgPSByb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCgogICAgICAgIGlmIG5vdCBncm91cDoKICAgICAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAiYGdyb3VwYCBpcyBlbXB0eSBhbmQgbm8gYHJvYm90X2NlbGxgIHdhcyB3aXJlZCBpbjogcHJvdmlkZSBvbmUgb3IgdGhlIG90aGVyIHNvIHRoZSB0b29sJ3MgcGxhbm5pbmcgZ3JvdXAgY2FuIGJlIHJlc29sdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBjZWxsX3N0YXRlCiAgICAgICAgICAgIGdyb3VwID0gcm9ib3RfY2VsbC5tYWluX2dyb3VwX25hbWUKCiAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCgogICAgICAgIGF0dGFjaG1lbnRfZnJhbWUgPSBOb25lCiAgICAgICAgaWYgYXR0YWNobWVudF9wbGFuZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgYXR0YWNobWVudF9mcmFtZSA9IGF0dGFjaG1lbnRfcGxhbmUgaWYgaXNpbnN0YW5jZShhdHRhY2htZW50X3BsYW5lLCBGcmFtZSkgZWxzZSBwbGFuZV90b19jb21wYXNfZnJhbWUoYXR0YWNobWVudF9wbGFuZSkKCiAgICAgICAgdG91Y2hfbGlua3NfbGlzdCA9IGxpc3QodG91Y2hfbGlua3MpIGlmIHRvdWNoX2xpbmtzIGVsc2UgTm9uZQoKICAgICAgICBpZiB0b3VjaF9saW5rc19saXN0IGlzIE5vbmUgYW5kIHJvYm90X2NlbGwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvdWNoX2xpbmtzX2xpc3QgPSByb2JvdF9jZWxsLmRlZmF1bHRfdG91Y2hfbGlua3MoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJ0b3VjaF9saW5rcyB1bndpcmVkOyBkZWZhdWx0ZWQgdG8ge30gKGxpbmtzIHRoZSB0b29sIGluZXZpdGFibHkgb3ZlcmxhcHMpLiBXaXJlIHlvdXIgb3duIGxpc3QgdG8gb3ZlcnJpZGUuIi5mb3JtYXQodG91Y2hfbGlua3NfbGlzdCkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZWVfbGluayA9IHJvYm90X2NlbGwuZ2V0X2VuZF9lZmZlY3Rvcl9saW5rX25hbWUoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayggICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAiYXR0YWNoaW5nICd7fScgYXQgbGluayAne30nIChncm91cCAne30nIGVuZC1lZmZlY3RvcikuIFRoZSB0b29sJ3MgYHRvb2wwYCBmcmFtZSBpcyBhdCB0aGlzIGxpbms7ICIKICAgICAgICAgICAgICAgICJ1c2UgYGF0dGFjaG1lbnRfcGxhbmVgIHRvIHJvdGF0ZS9vZmZzZXQgdGhlIHRvb2wgcmVsYXRpdmUgdG8gaXQuIi5mb3JtYXQodG9vbF9pZCwgZWVfbGluaywgZ3JvdXApLAogICAgICAgICAgICApCgogICAgICAgIG5ld19zdGF0ZSA9IGRlZXBjb3B5KGNlbGxfc3RhdGUpCiAgICAgICAgbmV3X3N0YXRlLnNldF90b29sX2F0dGFjaGVkX3RvX2dyb3VwKAogICAgICAgICAgICB0b29sX2lkPXRvb2xfaWQsCiAgICAgICAgICAgIGdyb3VwPWdyb3VwLAogICAgICAgICAgICBhdHRhY2htZW50X2ZyYW1lPWF0dGFjaG1lbnRfZnJhbWUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzPXRvdWNoX2xpbmtzX2xpc3QsCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXdfc3RhdGUK + COMPAS FAB: Attach Tool To Robot @@ -3247,7 +3326,7 @@ - 525 + 383 199 550 650 @@ -3261,23 +3340,24 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Attach Tool To Robot + COMPAS FAB: Visualize Robot Cell - + true + true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACA0lEQVRIDbWVTS9DQRSGT8WuGwvcEmUlbdVHhEgFf0GaamNrIRIrO1EhFhISOyuJ+AO0RPwFhFjST1ZUBLVoF13XvKedm2kzt1zSk8ydM3POfd4759xkiJpsDpVfLpfDYr2Se32bKpVKNTE1T+c7nc6yu6f7WsT2HQ5HXOaYEAHfyWSfojLwn9nr6d8VIutgsAC+XMBj9dCb2zu6f0jw9ujoCE2Mj9WnWK6FSAQnkQKXQmBazT47v6Dj2Jm6RfOREIWCszV7VgshcCUEZlqQgJqriaL+DHcZBu3tbvOAD0HEfmOSyQL1Df34zDNj0O+jvl43D/gwGeNFg4dktupyjM4O3k4k0/T8kjN9ODLGm794aAXEL8f1RklWo5smBj1AzI5pBQBAM7tcLjo4PGLe8tIiTQYm7LA5l3tg9RaARc8wFbwjf4KDa3kCBE9e8vQ4FIBL8dwXhd3t7Nt5aAVS6QxhJAslMvJF5j28Z4nanBQOBe3w9SeInZ6zAEhGFZcRM0YylaGtjbXq7s+Ttgf+Aa/5ZmQuSBgDvsqeGjOTGjjaEkkYZlmS2OkCY+S6AbMmZCkAuOwFZhhOYte0JVJh6AcGzO7X4x0WwGWBhWo4gTwF9u1+vWSyQPUmUvns24WqAMmUPdgXwZr7AMk4gRT5Q3nArNxocJp6ZUIA1oxLv0Ju4vMbbXfAeMEPB5cAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== - a0b7288b-d4f9-4c4c-88eb-9a4e1b20e889 + c300a51d-ea1d-4a6f-aac8-a4d4a36ca3fd true false true - COMPAS FAB: Attach Tool To Robot - COMPAS FAB: Attach Tool To Robot + COMPAS FAB: Visualize Robot Cell + COMPAS FAB: Visualize Robot Cell 3 false @@ -3289,58 +3369,60 @@ - 2484 - 124 - 176 - 124 + 2753 + 88 + 203 + 104 - 2591 - 186 + 2840 + 140 - - 6 + + 5 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 1 + 4 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa - + true - Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty. - 0632a7ab-b841-4e40-8475-8b8dadca3ef5 + The RobotCell to draw. + 0c5aa94e-7a38-43c6-adf2-eee52207dafd robot_cell robot_cell true 0 2 true - c4c3df53-0a94-4574-afc8-9e68cb15bc46 + 4faef0a9-d25c-40bb-862f-6f5183f66019 1 - Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty. + The RobotCell to draw. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2486 - 126 - 90 + 2755 + 90 + 70 20 - 2532.5 - 136 + 2791.5 + 100 @@ -3355,31 +3437,31 @@ true - The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`. - 5c8ad236-9f77-449f-9f22-cc089f77999f + Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used. + 099fb9a6-50e4-488c-8fb8-e961b1a1251b cell_state cell_state true 0 2 true - e3d8b137-b6b2-491f-a175-53c88474afd2 + 69e48047-60c1-4584-8133-6458bdb0f4da 1 - The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`. + Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2486 - 146 - 90 + 2755 + 110 + 70 20 - 2532.5 - 156 + 2791.5 + 120 @@ -3392,40 +3474,39 @@ - + true - Id of the tool inside the RobotCell. - e931a4e6-c85a-4040-a631-65ab93fd2b4d - tool_id - tool_id + Draw visual meshes. Defaults to True. + fbb9921d-2976-406f-bae0-f496a01fc3f3 + draw_visual + draw_visual true 0 2 true - a194c46d-2cff-4b97-9fc2-c1b5762db47b - 1 - Id of the tool inside the RobotCell. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + 0 + Draw visual meshes. Defaults to True. + d60527f5-b5af-4ef6-8970-5f96fe412559 - 2486 - 166 - 90 + 2755 + 130 + 70 20 - 2532.5 - 176 + 2791.5 + 140 System.Private.CoreLib - System.String + System.Boolean @@ -3433,37 +3514,37 @@ true - Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`. - efc78418-137f-4d2a-bc1e-9ac84b85ba02 - group - group + Draw collision meshes. Defaults to False. + df827498-35ea-4d0b-8421-db67c2ea9dc5 + draw_collision + draw_collision true 0 2 true 0 - Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + Draw collision meshes. Defaults to False. + d60527f5-b5af-4ef6-8970-5f96fe412559 - 2486 - 186 - 90 + 2755 + 150 + 70 20 - 2532.5 - 196 + 2791.5 + 160 System.Private.CoreLib - System.String + System.Boolean @@ -3471,30 +3552,68 @@ true - Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link). - a7f72b11-5611-4e89-a36b-81f37715729b - attachment_plane - attachment_plane + Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0. + 9fb3f85b-9eef-4a39-a92b-7d864813ecdc + native_scale + native_scale true 0 2 true 0 - Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link). - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0. + 9d51e32e-c038-4352-9554-f4137ca91b9a - 2486 - 206 - 90 + 2755 + 170 + 70 20 - 2532.5 - 216 + 2791.5 + 180 + + + + + + System.Private.CoreLib + System.Double + + + + + + + false + Rhino meshes of the robot model. + a10405c9-71de-4f11-861b-bd07a05b37f3 + robot_meshes + robot_meshes + false + 0 + 2 + true + 0 + Rhino meshes of the robot model. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 2855 + 90 + 99 + 25 + + + 2904.5 + 102.5 @@ -3506,72 +3625,110 @@ - + - 1 - true - Optional list of robot link names allowed to collide with the tool. - b0b069e8-af5a-4216-9545-d1ebba73f40f - touch_links - touch_links - true - 1 + false + Rhino meshes of all tool models in the cell. + true + 6502b183-bd8e-480f-9d1a-d5de5c1a6a4f + tool_meshes + tool_meshes + false + 0 2 true 0 - Optional list of robot link names allowed to collide with the tool. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + Rhino meshes of all tool models in the cell. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2486 - 226 - 90 - 20 + 2855 + 115 + 99 + 25 - 2532.5 - 236 + 2904.5 + 127.5 System.Private.CoreLib - System.String + System.Object - + false - New RobotCellState with the tool attached. - 69e48047-60c1-4584-8133-6458bdb0f4da - cell_state - cell_state + Rhino meshes of all rigid bodies in the cell. + 4e5f49ec-4d8c-4aed-b12d-1b7dd2b223df + rigid_body_meshes + rigid_body_meshes false 0 2 true 0 - New RobotCellState with the tool attached. + Rhino meshes of all rigid bodies in the cell. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2606 - 126 - 52 - 120 + 2855 + 140 + 99 + 25 - 2632 - 186 + 2904.5 + 152.5 + + + + + + System.Private.CoreLib + System.Object + + + + + + + false + Rhino plane at the robot's base frame. + 29539e21-299b-4f8f-af94-2afad9c5a860 + base_plane + base_plane + false + 0 + 2 + true + 0 + Rhino plane at the robot's base frame. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 2855 + 165 + 99 + 25 + + + 2904.5 + 177.5 @@ -3590,8 +3747,8 @@ true false true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpBdHRhY2ggYSB0b29sIHRvIGEgcm9ib3QgcGxhbm5pbmcgZ3JvdXAgaW5zaWRlIGEgUm9ib3RDZWxsU3RhdGUuCgpQYXNzdGhyb3VnaCBidWlsZGVyOiB0aGUgaW5wdXQgc3RhdGUgaXMgY29waWVkLCB0aGUgYXR0YWNobWVudCBpcyBzZXQsIGFuZAp0aGUgbmV3IHN0YXRlIGlzIHJldHVybmVkLgoKV2hlbiBgcm9ib3RfY2VsbGAgaXMgd2lyZWQgYW5kIGB0b29sX2lkYCBoYXMgbm8gc291cmNlLCB0aGUgY29tcG9uZW50CmF1dG8tY3JlYXRlcyBhIFZhbHVlIExpc3QgZHJvcGRvd24gbGlzdGluZyBldmVyeSB0b29sIGN1cnJlbnRseSBpbgpgY2VsbC50b29sX21vZGVsc2AgKHJlZnJlc2hlZCB3aGVuIHRoZSBzZXQgY2hhbmdlcykuIFRoZSBgdG9vbF9pZGAgaXMgYWxzbwp2YWxpZGF0ZWQgYWdhaW5zdCBgY2VsbC50b29sX21vZGVsc2A7IGFuIHVua25vd24gaWQgcmFpc2VzIGFuIGVycm9yIHJhdGhlcgp0aGFuIHByb2R1Y2luZyBhIGJyb2tlbiBzdGF0ZS4KCklmIGBjZWxsX3N0YXRlYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBkZWZhdWx0IHN0YXRlIGlzIGRlcml2ZWQgZnJvbQpgcm9ib3RfY2VsbGAsIHNvIGF0dGFjaGluZyBhIHNpbmdsZSB0b29sIG5lZWRzIG9ubHkgYHJvYm90X2NlbGxgICsgYHRvb2xfaWRgLgoKSWYgYGdyb3VwYCBpcyBsZWZ0IGVtcHR5LCB0aGUgY2VsbCdzIG1haW4gcGxhbm5pbmcgZ3JvdXAgaXMgdXNlZCAocmVxdWlyZXMKYHJvYm90X2NlbGxgIHRvIGJlIHdpcmVkIGluKS4gQW55IHRvb2wgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgc2FtZSBncm91cCBpcwphdXRvbWF0aWNhbGx5IGRldGFjaGVkLgoKSWYgYHRvdWNoX2xpbmtzYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBjb21wb25lbnQgZGVmYXVsdHMgdG8gdGhlIGVuZC1lZmZlY3RvcgpsaW5rIG9mIHRoZSBwbGFubmluZyBncm91cCAocGx1cyBpdHMgcGFyZW50IGxpbmsgd2hlbiB0aGUgZW5kLWVmZmVjdG9yIGxpbmsKaXRzZWxmIGhhcyBubyBnZW9tZXRyeSwgZS5nLiBVUidzIGB0b29sMGAgaXMgYSB6ZXJvLWdlb21ldHJ5IGZyYW1lIHNvIHRoZQpwYXJlbnQgYHdyaXN0XzNfbGlua2AgaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSkuIEEgcmVtYXJrIGlzIHN1cmZhY2VkIHNvCnRoZSBhdXRvLXBpY2sgaXNuJ3Qgc2lsZW50LgoKQSByZW1hcmsgYWx3YXlzIGFubm91bmNlcyB0aGUgbGluayB0aGUgdG9vbCBhY3R1YWxseSBlbmRzIHVwIGF0dGFjaGVkIHRvOgp0aGUgcGxhbm5pbmcgZ3JvdXAncyBlbmQtZWZmZWN0b3IgbGluayBhcyByZXR1cm5lZCBieQpgcm9ib3RfY2VsbC5nZXRfZW5kX2VmZmVjdG9yX2xpbmtfbmFtZShncm91cClgLiBPdmVycmlkZSB0aGF0IGVmZmVjdGl2ZQpmcmFtZSB2aWEgdGhlIGBhdHRhY2htZW50X3BsYW5lYCBpbnB1dC4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzLmdlb21ldHJ5IGltcG9ydCBGcmFtZQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgZXJyb3IKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcGxhbmVfdG9fY29tcGFzX2ZyYW1lCgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGVuc3VyZV9keW5hbWljX3ZhbHVlX2xpc3QKCgpjbGFzcyBBdHRhY2hUb29sVG9Sb2JvdChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICB0b29sX2lkOiBzdHIsCiAgICAgICAgICAgIGdyb3VwOiBzdHIsCiAgICAgICAgICAgIGF0dGFjaG1lbnRfcGxhbmUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cl0pOgogICAgICAgICMgQXV0by1wb3B1bGF0ZSB0aGUgdG9vbF9pZCBkcm9wZG93biBmcm9tIHRoZSBjZWxsJ3MgdG9vbCBpbnZlbnRvcnkuCiAgICAgICAgIyBSdW5zIGV2ZW4gd2hlbiB0b29sX2lkIGlzIGN1cnJlbnRseSBOb25lOiB0aGF0J3MgdGhlIHRyaWdnZXIuCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZW5zdXJlX2R5bmFtaWNfdmFsdWVfbGlzdCgKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudCwgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgInRvb2xfaWQiLAogICAgICAgICAgICAgICAgc29ydGVkKHJvYm90X2NlbGwudG9vbF9tb2RlbHMua2V5cygpKSwKICAgICAgICAgICAgKQoKICAgICAgICBpZiBub3QgdG9vbF9pZDoKICAgICAgICAgICAgcmV0dXJuIGNlbGxfc3RhdGUKCiAgICAgICAgdG9vbF9pZCA9IHRvb2xfaWQuc3RyaXAoKQoKICAgICAgICAjIFZhbGlkYXRlIHRoZSB0b29sIGV4aXN0cyBpbiB0aGUgY2VsbCBiZWZvcmUgYXR0YWNoaW5nIGl0LgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgbm90IE5vbmUgYW5kIHRvb2xfaWQgbm90IGluIHJvYm90X2NlbGwudG9vbF9tb2RlbHM6CiAgICAgICAgICAgIGVycm9yKCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICJUb29sIGlkICd7fScgaXMgbm90IGluIHRoZSByb2JvdCBjZWxsLiBBdmFpbGFibGUgdG9vbHM6IHt9LiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHRvb2xfaWQsICIsICIuam9pbihzb3J0ZWQocm9ib3RfY2VsbC50b29sX21vZGVscy5rZXlzKCkpKSBvciAiKG5vbmUpIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gY2VsbF9zdGF0ZQoKICAgICAgICAjIERlcml2ZSB0aGUgZGVmYXVsdCBzdGF0ZSBmcm9tIHRoZSBjZWxsIHdoZW4gYGNlbGxfc3RhdGVgIGlzIGxlZnQgdW53aXJlZC4KICAgICAgICBpZiBjZWxsX3N0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIldpcmUgYSBgY2VsbF9zdGF0ZWAsIG9yIHdpcmUgYHJvYm90X2NlbGxgIHNvIHRoZSBkZWZhdWx0IHN0YXRlIGNhbiBiZSBkZXJpdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGNlbGxfc3RhdGUgPSByb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCgogICAgICAgIGlmIG5vdCBncm91cDoKICAgICAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAiYGdyb3VwYCBpcyBlbXB0eSBhbmQgbm8gYHJvYm90X2NlbGxgIHdhcyB3aXJlZCBpbjogcHJvdmlkZSBvbmUgb3IgdGhlIG90aGVyIHNvIHRoZSB0b29sJ3MgcGxhbm5pbmcgZ3JvdXAgY2FuIGJlIHJlc29sdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBjZWxsX3N0YXRlCiAgICAgICAgICAgIGdyb3VwID0gcm9ib3RfY2VsbC5tYWluX2dyb3VwX25hbWUKCiAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCgogICAgICAgIGF0dGFjaG1lbnRfZnJhbWUgPSBOb25lCiAgICAgICAgaWYgYXR0YWNobWVudF9wbGFuZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgYXR0YWNobWVudF9mcmFtZSA9IGF0dGFjaG1lbnRfcGxhbmUgaWYgaXNpbnN0YW5jZShhdHRhY2htZW50X3BsYW5lLCBGcmFtZSkgZWxzZSBwbGFuZV90b19jb21wYXNfZnJhbWUoYXR0YWNobWVudF9wbGFuZSkKCiAgICAgICAgdG91Y2hfbGlua3NfbGlzdCA9IGxpc3QodG91Y2hfbGlua3MpIGlmIHRvdWNoX2xpbmtzIGVsc2UgTm9uZQoKICAgICAgICBpZiB0b3VjaF9saW5rc19saXN0IGlzIE5vbmUgYW5kIHJvYm90X2NlbGwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvdWNoX2xpbmtzX2xpc3QgPSByb2JvdF9jZWxsLmRlZmF1bHRfdG91Y2hfbGlua3MoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJ0b3VjaF9saW5rcyB1bndpcmVkOyBkZWZhdWx0ZWQgdG8ge30gKGxpbmtzIHRoZSB0b29sIGluZXZpdGFibHkgb3ZlcmxhcHMpLiBXaXJlIHlvdXIgb3duIGxpc3QgdG8gb3ZlcnJpZGUuIi5mb3JtYXQodG91Y2hfbGlua3NfbGlzdCkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZWVfbGluayA9IHJvYm90X2NlbGwuZ2V0X2VuZF9lZmZlY3Rvcl9saW5rX25hbWUoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayggICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAiYXR0YWNoaW5nICd7fScgYXQgbGluayAne30nIChncm91cCAne30nIGVuZC1lZmZlY3RvcikuIFRoZSB0b29sJ3MgYHRvb2wwYCBmcmFtZSBpcyBhdCB0aGlzIGxpbms7ICIKICAgICAgICAgICAgICAgICJ1c2UgYGF0dGFjaG1lbnRfcGxhbmVgIHRvIHJvdGF0ZS9vZmZzZXQgdGhlIHRvb2wgcmVsYXRpdmUgdG8gaXQuIi5mb3JtYXQodG9vbF9pZCwgZWVfbGluaywgZ3JvdXApLAogICAgICAgICAgICApCgogICAgICAgIG5ld19zdGF0ZSA9IGRlZXBjb3B5KGNlbGxfc3RhdGUpCiAgICAgICAgbmV3X3N0YXRlLnNldF90b29sX2F0dGFjaGVkX3RvX2dyb3VwKAogICAgICAgICAgICB0b29sX2lkPXRvb2xfaWQsCiAgICAgICAgICAgIGdyb3VwPWdyb3VwLAogICAgICAgICAgICBhdHRhY2htZW50X2ZyYW1lPWF0dGFjaG1lbnRfZnJhbWUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzPXRvdWNoX2xpbmtzX2xpc3QsCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXdfc3RhdGUK - COMPAS FAB: Attach Tool To Robot + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEcmF3IGEgUm9ib3RDZWxsIGF0IHRoZSBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBieSBhIFJvYm90Q2VsbFN0YXRlLgoKSWYgbm8gYGNlbGxfc3RhdGVgIGlzIHdpcmVkLCB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgaXMgdXNlZCwgc28gdGhlIGNlbGwgaXMKc3RpbGwgZHJhd24gKGluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCBub3RoaW5nIGF0dGFjaGVkKS4KClRoaXMgY29tcG9uZW50IHJldXNlcyBhIGNhY2hlZCBgUm9ib3RDZWxsT2JqZWN0YCBrZXllZCBvbiB0aGUgaW5wdXQgY2VsbCdzCmlkZW50aXR5LCBzbyBtZXNoZXMgYXJlIG9ubHkgYnVpbHQgb25jZSBwZXIgY2FudmFzIHNlc3Npb24gYW5kIHN1YnNlcXVlbnQKc3RhdGUgY2hhbmdlcyBvbmx5IHVwZGF0ZSB0cmFuc2Zvcm1zIChmYXN0KS4KClRoZSByb2JvdCBtb2RlbCwgdG9vbHMsIGFuZCByaWdpZCBib2RpZXMgYXJlIHJldHVybmVkIGFzIHNlcGFyYXRlIG91dHB1dHMgdG8KbWFrZSB3aXJpbmcgZG93bnN0cmVhbSBzdHlsaW5nL2ZpbHRlcmluZyBlYXN5LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuc2NlbmUgaW1wb3J0IFNjZW5lT2JqZWN0CmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IGZyYW1lX3RvX3JoaW5vX3BsYW5lCmZyb20gc2NyaXB0Y29udGV4dCBpbXBvcnQgc3RpY2t5IGFzIHN0Cgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24uc2NlbmUgaW1wb3J0IFJvYm90Q2VsbE9iamVjdAoKCmNsYXNzIFZpc3VhbGl6ZVJvYm90Q2VsbChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICBkcmF3X3Zpc3VhbDogYm9vbCwKICAgICAgICAgICAgZHJhd19jb2xsaXNpb246IGJvb2wsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lLCBOb25lKQoKICAgICAgICAjIEZhbGwgYmFjayB0byB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgd2hlbiBub25lIGlzIHdpcmVkLiBUaGUgY2hpbGQKICAgICAgICAjIHNjZW5lIG9iamVjdHMgKHJvYm90IG1vZGVsLCB0b29scywgcmlnaWQgYm9kaWVzKSBhcmUgb25seSBidWlsdCB3aGVuIGEKICAgICAgICAjIHN0YXRlIGlzIGFwcGxpZWQsIHNvIHdpdGhvdXQgdGhpcyB0aGUgZHJhd3MgYmVsb3cgaGl0IGEgTm9uZSBvYmplY3QuCiAgICAgICAgaWYgY2VsbF9zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICBjZWxsX3N0YXRlID0gcm9ib3RfY2VsbC5kZWZhdWx0X2NlbGxfc3RhdGUoKQoKICAgICAgICBkcmF3X3Zpc3VhbCA9IFRydWUgaWYgZHJhd192aXN1YWwgaXMgTm9uZSBlbHNlIGRyYXdfdmlzdWFsCiAgICAgICAgZHJhd19jb2xsaXNpb24gPSBGYWxzZSBpZiBkcmF3X2NvbGxpc2lvbiBpcyBOb25lIGVsc2UgZHJhd19jb2xsaXNpb24KICAgICAgICBuYXRpdmVfc2NhbGUgPSBuYXRpdmVfc2NhbGUgaWYgbmF0aXZlX3NjYWxlIGVsc2UgMS4wCgogICAgICAgIGtleSA9IGNyZWF0ZV9pZCggICMgbm9xYTogRjgyMQogICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgInJvYm90X2NlbGxfb2JqZWN0X3t9X3t9X3t9X3t9Ii5mb3JtYXQoaWQocm9ib3RfY2VsbCksIGRyYXdfdmlzdWFsLCBkcmF3X2NvbGxpc2lvbiwgbmF0aXZlX3NjYWxlKSwKICAgICAgICApCiAgICAgICAgc2NlbmVfb2JqZWN0ID0gc3QuZ2V0KGtleSkKICAgICAgICBpZiBzY2VuZV9vYmplY3QgaXMgTm9uZToKICAgICAgICAgICAgc2NlbmVfb2JqZWN0ID0gU2NlbmVPYmplY3QoCiAgICAgICAgICAgICAgICBpdGVtPXJvYm90X2NlbGwsCiAgICAgICAgICAgICAgICBzY2VuZW9iamVjdF90eXBlPVJvYm90Q2VsbE9iamVjdCwKICAgICAgICAgICAgICAgIGRyYXdfdmlzdWFsPWRyYXdfdmlzdWFsLAogICAgICAgICAgICAgICAgZHJhd19jb2xsaXNpb249ZHJhd19jb2xsaXNpb24sCiAgICAgICAgICAgICAgICBuYXRpdmVfc2NhbGU9bmF0aXZlX3NjYWxlLAogICAgICAgICAgICApCiAgICAgICAgICAgIHN0W2tleV0gPSBzY2VuZV9vYmplY3QKCiAgICAgICAgc2NlbmVfb2JqZWN0LnVwZGF0ZShjZWxsX3N0YXRlKQoKICAgICAgICAjIENvbGxlY3Qgb3V0cHV0cyBmcm9tIHRoZSBjaGlsZCBzY2VuZSBvYmplY3RzIGRpcmVjdGx5IHNvIGVhY2ggb3V0cHV0CiAgICAgICAgIyBjYW4gYmUgd2lyZWQgc2VwYXJhdGVseSB3aXRob3V0IHJlLXJ1bm5pbmcgZHJhdygpLgogICAgICAgIHJvYm90X21lc2hlcyA9IHNjZW5lX29iamVjdC5fcm9ib3RfbW9kZWxfc2NlbmVfb2JqZWN0LmRyYXcoKQoKICAgICAgICB0b29sX21lc2hlcyA9IFtdCiAgICAgICAgZm9yIHRvb2xfc28gaW4gc2NlbmVfb2JqZWN0Ll90b29sX3NjZW5lX29iamVjdHMudmFsdWVzKCk6CiAgICAgICAgICAgIHRvb2xfbWVzaGVzLmV4dGVuZCh0b29sX3NvLmRyYXcoKSkKCiAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMgPSBbXQogICAgICAgIGZvciByYl9zbyBpbiBzY2VuZV9vYmplY3QuX3JpZ2lkX2JvZHlfc2NlbmVfb2JqZWN0cy52YWx1ZXMoKToKICAgICAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMuZXh0ZW5kKHJiX3NvLmRyYXcoKSkKCiAgICAgICAgYmFzZV9wbGFuZSA9IE5vbmUKICAgICAgICBpZiBjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGJhc2VfcGxhbmUgPSBmcmFtZV90b19yaGlub19wbGFuZShjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUpCgogICAgICAgIHJldHVybiAocm9ib3RfbWVzaGVzLCB0b29sX21lc2hlcywgcmlnaWRfYm9keV9tZXNoZXMsIGJhc2VfcGxhbmUpCg== + COMPAS FAB: Visualize Robot Cell @@ -3605,7 +3762,7 @@ - 383 + 575 199 550 650 @@ -3619,24 +3776,23 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Visualize Robot Cell + COMPAS FAB: ROS Client - + true - true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5pOnz62/fPmCIoesDhubh4fnv4y05FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AJ2kxEQg2Zf8AAAAAElFTkSuQmCC - c300a51d-ea1d-4a6f-aac8-a4d4a36ca3fd + d669cfde-80ea-4143-bcdc-260a09b8dd65 true false true - COMPAS FAB: Visualize Robot Cell - COMPAS FAB: Visualize Robot Cell + COMPAS FAB: ROS Client + COMPAS FAB: ROS Client 3 false @@ -3648,67 +3804,64 @@ - 2753 - 88 - 203 - 104 + 281 + 71 + 151 + 84 - 2840 - 140 + 345 + 113 - - 5 + + 4 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 4 + 3 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - + - + true - The RobotCell to draw. - 0c5aa94e-7a38-43c6-adf2-eee52207dafd - robot_cell - robot_cell + ROS bridge host. Defaults to '127.0.0.1'. + c2f35edf-a776-4bfe-acc6-7426fe3408e6 + host + host true 0 2 true - 4faef0a9-d25c-40bb-862f-6f5183f66019 - 1 - The RobotCell to draw. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + 0 + ROS bridge host. Defaults to '127.0.0.1'. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 2755 - 90 - 70 + 283 + 73 + 47 20 - 2791.5 - 100 + 308 + 83 System.Private.CoreLib - System.Object + System.String @@ -3716,69 +3869,70 @@ true - Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used. - 099fb9a6-50e4-488c-8fb8-e961b1a1251b - cell_state - cell_state + ROS bridge port. Defaults to 9090. + 2652f473-4a38-4bd5-a19b-49dcd5e5d507 + port + port true 0 2 true - 69e48047-60c1-4584-8133-6458bdb0f4da + 7508753f-ee58-41f3-927d-759349106fed 1 - Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + ROS bridge port. Defaults to 9090. + 48d01794-d3d8-4aef-990e-127168822244 - 2755 - 110 - 70 + 283 + 93 + 47 20 - 2791.5 - 120 + 308 + 103 System.Private.CoreLib - System.Object + System.Int32 - + true - Draw visual meshes. Defaults to True. - fbb9921d-2976-406f-bae0-f496a01fc3f3 - draw_visual - draw_visual + If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired. + 4db7c716-8be5-41c0-8dd3-1c0a38d0885a + connect + connect true 0 2 true - 0 - Draw visual meshes. Defaults to True. + cabb38ef-411b-4279-aa2d-497d7c31c5c7 + 1 + If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired. d60527f5-b5af-4ef6-8970-5f96fe412559 - 2755 - 130 - 70 + 283 + 113 + 47 20 - 2791.5 - 140 + 308 + 123 @@ -3791,77 +3945,40 @@ - - true - Draw collision meshes. Defaults to False. - df827498-35ea-4d0b-8421-db67c2ea9dc5 - draw_collision - draw_collision - true - 0 - 2 - true - 0 - Draw collision meshes. Defaults to False. - d60527f5-b5af-4ef6-8970-5f96fe412559 - - - - - - 2755 - 150 - 70 - 20 - - - 2791.5 - 160 - - - - - - System.Private.CoreLib - System.Boolean - - - - - - + true - Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0. - 9fb3f85b-9eef-4a39-a92b-7d864813ecdc - native_scale - native_scale + Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport. + 5a940e85-9726-4ead-81c1-3e2f8dfd9716 + transport + transport true 0 2 true - 0 - Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0. - 9d51e32e-c038-4352-9554-f4137ca91b9a + 14c71912-2008-445b-9fc4-bc21691e2d07 + 1 + Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 2755 - 170 - 70 + 283 + 133 + 47 20 - 2791.5 - 180 + 308 + 143 System.Private.CoreLib - System.Double + System.String @@ -3869,30 +3986,30 @@ false - Rhino meshes of the robot model. - a10405c9-71de-4f11-861b-bd07a05b37f3 - robot_meshes - robot_meshes + Connected RosClient (or None if disconnected). + 3cc3528f-e4c6-4289-aa09-ea2f4e282515 + ros_client + ros_client false 0 2 true 0 - Rhino meshes of the robot model. + Connected RosClient (or None if disconnected). 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2855 - 90 - 99 - 25 + 360 + 73 + 70 + 26 - 2904.5 - 102.5 + 395 + 86.333336 @@ -3905,71 +4022,32 @@ - - false - Rhino meshes of all tool models in the cell. - true - 6502b183-bd8e-480f-9d1a-d5de5c1a6a4f - tool_meshes - tool_meshes - false - 0 - 2 - true - 0 - Rhino meshes of all tool models in the cell. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2855 - 115 - 99 - 25 - - - 2904.5 - 127.5 - - - - - - System.Private.CoreLib - System.Object - - - - - false - Rhino meshes of all rigid bodies in the cell. - 4e5f49ec-4d8c-4aed-b12d-1b7dd2b223df - rigid_body_meshes - rigid_body_meshes + True if the client is currently connected. + 59c3b947-6ae3-4172-8726-0967daa1ba6d + is_connected + is_connected false 0 2 true 0 - Rhino meshes of all rigid bodies in the cell. + True if the client is currently connected. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2855 - 140 - 99 - 25 + 360 + 99 + 70 + 27 - 2904.5 - 152.5 + 395 + 113 @@ -3981,33 +4059,33 @@ - + false - Rhino plane at the robot's base frame. - 29539e21-299b-4f8f-af94-2afad9c5a860 - base_plane - base_plane + Detected ROS distribution (e.g. 'noetic', 'jazzy'). + e987c8f1-282c-4982-8597-1cf3b2599a3b + ros_distro + ros_distro false 0 2 true 0 - Rhino plane at the robot's base frame. + Detected ROS distribution (e.g. 'noetic', 'jazzy'). 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2855 - 165 - 99 - 25 + 360 + 126 + 70 + 27 - 2904.5 - 177.5 + 395 + 139.66666 @@ -4026,8 +4104,8 @@ true false true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEcmF3IGEgUm9ib3RDZWxsIGF0IHRoZSBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBieSBhIFJvYm90Q2VsbFN0YXRlLgoKSWYgbm8gYGNlbGxfc3RhdGVgIGlzIHdpcmVkLCB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgaXMgdXNlZCwgc28gdGhlIGNlbGwgaXMKc3RpbGwgZHJhd24gKGluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCBub3RoaW5nIGF0dGFjaGVkKS4KClRoaXMgY29tcG9uZW50IHJldXNlcyBhIGNhY2hlZCBgUm9ib3RDZWxsT2JqZWN0YCBrZXllZCBvbiB0aGUgaW5wdXQgY2VsbCdzCmlkZW50aXR5LCBzbyBtZXNoZXMgYXJlIG9ubHkgYnVpbHQgb25jZSBwZXIgY2FudmFzIHNlc3Npb24gYW5kIHN1YnNlcXVlbnQKc3RhdGUgY2hhbmdlcyBvbmx5IHVwZGF0ZSB0cmFuc2Zvcm1zIChmYXN0KS4KClRoZSByb2JvdCBtb2RlbCwgdG9vbHMsIGFuZCByaWdpZCBib2RpZXMgYXJlIHJldHVybmVkIGFzIHNlcGFyYXRlIG91dHB1dHMgdG8KbWFrZSB3aXJpbmcgZG93bnN0cmVhbSBzdHlsaW5nL2ZpbHRlcmluZyBlYXN5LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuc2NlbmUgaW1wb3J0IFNjZW5lT2JqZWN0CmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IGZyYW1lX3RvX3JoaW5vX3BsYW5lCmZyb20gc2NyaXB0Y29udGV4dCBpbXBvcnQgc3RpY2t5IGFzIHN0Cgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24uc2NlbmUgaW1wb3J0IFJvYm90Q2VsbE9iamVjdAoKCmNsYXNzIFZpc3VhbGl6ZVJvYm90Q2VsbChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICBkcmF3X3Zpc3VhbDogYm9vbCwKICAgICAgICAgICAgZHJhd19jb2xsaXNpb246IGJvb2wsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lLCBOb25lKQoKICAgICAgICAjIEZhbGwgYmFjayB0byB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgd2hlbiBub25lIGlzIHdpcmVkLiBUaGUgY2hpbGQKICAgICAgICAjIHNjZW5lIG9iamVjdHMgKHJvYm90IG1vZGVsLCB0b29scywgcmlnaWQgYm9kaWVzKSBhcmUgb25seSBidWlsdCB3aGVuIGEKICAgICAgICAjIHN0YXRlIGlzIGFwcGxpZWQsIHNvIHdpdGhvdXQgdGhpcyB0aGUgZHJhd3MgYmVsb3cgaGl0IGEgTm9uZSBvYmplY3QuCiAgICAgICAgaWYgY2VsbF9zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICBjZWxsX3N0YXRlID0gcm9ib3RfY2VsbC5kZWZhdWx0X2NlbGxfc3RhdGUoKQoKICAgICAgICBkcmF3X3Zpc3VhbCA9IFRydWUgaWYgZHJhd192aXN1YWwgaXMgTm9uZSBlbHNlIGRyYXdfdmlzdWFsCiAgICAgICAgZHJhd19jb2xsaXNpb24gPSBGYWxzZSBpZiBkcmF3X2NvbGxpc2lvbiBpcyBOb25lIGVsc2UgZHJhd19jb2xsaXNpb24KICAgICAgICBuYXRpdmVfc2NhbGUgPSBuYXRpdmVfc2NhbGUgaWYgbmF0aXZlX3NjYWxlIGVsc2UgMS4wCgogICAgICAgIGtleSA9IGNyZWF0ZV9pZCggICMgbm9xYTogRjgyMQogICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgInJvYm90X2NlbGxfb2JqZWN0X3t9X3t9X3t9X3t9Ii5mb3JtYXQoaWQocm9ib3RfY2VsbCksIGRyYXdfdmlzdWFsLCBkcmF3X2NvbGxpc2lvbiwgbmF0aXZlX3NjYWxlKSwKICAgICAgICApCiAgICAgICAgc2NlbmVfb2JqZWN0ID0gc3QuZ2V0KGtleSkKICAgICAgICBpZiBzY2VuZV9vYmplY3QgaXMgTm9uZToKICAgICAgICAgICAgc2NlbmVfb2JqZWN0ID0gU2NlbmVPYmplY3QoCiAgICAgICAgICAgICAgICBpdGVtPXJvYm90X2NlbGwsCiAgICAgICAgICAgICAgICBzY2VuZW9iamVjdF90eXBlPVJvYm90Q2VsbE9iamVjdCwKICAgICAgICAgICAgICAgIGRyYXdfdmlzdWFsPWRyYXdfdmlzdWFsLAogICAgICAgICAgICAgICAgZHJhd19jb2xsaXNpb249ZHJhd19jb2xsaXNpb24sCiAgICAgICAgICAgICAgICBuYXRpdmVfc2NhbGU9bmF0aXZlX3NjYWxlLAogICAgICAgICAgICApCiAgICAgICAgICAgIHN0W2tleV0gPSBzY2VuZV9vYmplY3QKCiAgICAgICAgc2NlbmVfb2JqZWN0LnVwZGF0ZShjZWxsX3N0YXRlKQoKICAgICAgICAjIENvbGxlY3Qgb3V0cHV0cyBmcm9tIHRoZSBjaGlsZCBzY2VuZSBvYmplY3RzIGRpcmVjdGx5IHNvIGVhY2ggb3V0cHV0CiAgICAgICAgIyBjYW4gYmUgd2lyZWQgc2VwYXJhdGVseSB3aXRob3V0IHJlLXJ1bm5pbmcgZHJhdygpLgogICAgICAgIHJvYm90X21lc2hlcyA9IHNjZW5lX29iamVjdC5fcm9ib3RfbW9kZWxfc2NlbmVfb2JqZWN0LmRyYXcoKQoKICAgICAgICB0b29sX21lc2hlcyA9IFtdCiAgICAgICAgZm9yIHRvb2xfc28gaW4gc2NlbmVfb2JqZWN0Ll90b29sX3NjZW5lX29iamVjdHMudmFsdWVzKCk6CiAgICAgICAgICAgIHRvb2xfbWVzaGVzLmV4dGVuZCh0b29sX3NvLmRyYXcoKSkKCiAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMgPSBbXQogICAgICAgIGZvciByYl9zbyBpbiBzY2VuZV9vYmplY3QuX3JpZ2lkX2JvZHlfc2NlbmVfb2JqZWN0cy52YWx1ZXMoKToKICAgICAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMuZXh0ZW5kKHJiX3NvLmRyYXcoKSkKCiAgICAgICAgYmFzZV9wbGFuZSA9IE5vbmUKICAgICAgICBpZiBjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGJhc2VfcGxhbmUgPSBmcmFtZV90b19yaGlub19wbGFuZShjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUpCgogICAgICAgIHJldHVybiAocm9ib3RfbWVzaGVzLCB0b29sX21lc2hlcywgcmlnaWRfYm9keV9tZXNoZXMsIGJhc2VfcGxhbmUpCg== - COMPAS FAB: Visualize Robot Cell + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25uZWN0IHRvIGEgUk9TIGJyaWRnZSAoUk9TIDEgb3IgUk9TIDIpLgoKVGhlIGNsaWVudCBpcyBjYWNoZWQgaW4gc3RpY2t5IGFuZCBzdXJ2aXZlcyBjYW52YXMgcmVmcmVzaGVzLiBUb2dnbGluZwpgY29ubmVjdGAgZnJvbSBUcnVlIHRvIEZhbHNlIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4gVGhlIFJPUyBkaXN0cm8gaXMKYXV0by1kZXRlY3RlZCBhZnRlciBjb25uZWN0aW5nLgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCByb3NsaWJweQppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZwpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBSb3NDbGllbnQKZnJvbSBjb21wYXNfZmFiLmdocHl0aG9uIGltcG9ydCBlbnN1cmVfYm9vbGVhbl90b2dnbGUKCgpkZWYgX3Jvc2xpYnB5X3N1cHBvcnRzX3RyYW5zcG9ydCgpOgogICAgIiIiVGhlIGBgdHJhbnNwb3J0YGAgYXJndW1lbnQgd2FzIGludHJvZHVjZWQgaW4gcm9zbGlicHkgMi4xLiIiIgogICAgdHJ5OgogICAgICAgIG1ham9yLCBtaW5vciA9IChpbnQocGFydCkgZm9yIHBhcnQgaW4gcm9zbGlicHkuX192ZXJzaW9uX18uc3BsaXQoIi4iKVs6Ml0pCiAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgyLCAxKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gRmFsc2UKCgpjbGFzcyBSb3NDbGllbnRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgaG9zdDogc3RyLCBwb3J0OiBpbnQsIGNvbm5lY3Q6IGJvb2wsIHRyYW5zcG9ydDogc3RyKToKICAgICAgICBlbnN1cmVfYm9vbGVhbl90b2dnbGUoZ2hlbnYuQ29tcG9uZW50LCAiY29ubmVjdCIsIGRlZmF1bHQ9RmFsc2UpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaG9zdCA9IGhvc3Qgb3IgIjEyNy4wLjAuMSIKICAgICAgICBwb3J0ID0gcG9ydCBvciA5MDkwCiAgICAgICAgdHJhbnNwb3J0ID0gdHJhbnNwb3J0LnN0cmlwKCkgaWYgdHJhbnNwb3J0IGVsc2UgTm9uZQoKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAicm9zX2NsaWVudCIpICAjIG5vcWE6IEY4MjEKICAgICAgICByb3NfY2xpZW50ID0gc3QuZ2V0KGtleSwgTm9uZSkKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudC5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHdhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiRXJyb3IgY2xvc2luZyBwcmV2aW91cyBST1MgY2xpZW50OiB7fSIuZm9ybWF0KGUpKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHN0LnBvcChrZXksIE5vbmUpCiAgICAgICAgICAgIHJvc19jbGllbnQgPSBOb25lCgogICAgICAgIGlmIHRyYW5zcG9ydCBhbmQgbm90IF9yb3NsaWJweV9zdXBwb3J0c190cmFuc3BvcnQoKToKICAgICAgICAgICAgd2FybmluZyhnaGVudi5Db21wb25lbnQsICJUaGUgJ3RyYW5zcG9ydCcgaW5wdXQgcmVxdWlyZXMgcm9zbGlicHkgPj0gMi4xOyBpZ25vcmluZyBpdC4iKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5vbmUKCiAgICAgICAgaWYgY29ubmVjdDoKICAgICAgICAgICAgaWYgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0LCB0cmFuc3BvcnQ9dHJhbnNwb3J0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0KQogICAgICAgICAgICByb3NfY2xpZW50LnJ1big1KQogICAgICAgICAgICBzdFtrZXldID0gcm9zX2NsaWVudAoKICAgICAgICBpc19jb25uZWN0ZWQgPSBib29sKHJvc19jbGllbnQgYW5kIHJvc19jbGllbnQuaXNfY29ubmVjdGVkKQogICAgICAgIHJvc19kaXN0cm8gPSBOb25lCiAgICAgICAgaWYgaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByb3NfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJDb3VsZCBub3QgZGV0ZWN0IFJPUyBkaXN0cm86IHt9Ii5mb3JtYXQoZSkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIChyb3NfY2xpZW50LCBpc19jb25uZWN0ZWQsIHJvc19kaXN0cm8pCg== + COMPAS FAB: ROS Client @@ -4041,10 +4119,10 @@ - 575 - 199 + 469 + 33 550 - 650 + 850 @@ -4055,7 +4133,7 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: ROS Client + COMPAS FAB: MoveIt Planner @@ -4064,14 +4142,14 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AMLixEoY2NubAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUUlEQVRIDbVVPUgcURCeMxZ33C7EpFMvnWisNJhTUCHEJoiFJB6BNLaCgpZRAum0VVBIayPIabAIIYUJgUTIDyRpoid2mtiJgh634VbX9407z931iZo7B/bmvfn5vvdmuDdE1yyxIL7neX1qP7z1Z7s9n8+HfME40zqZTHqp2uoV5ZuKxWILEqNBFPh4bn1jVByl6Ib6uglFMgYMJsDJFXi2FNBoriLJ4CYVvmM4GlCGPWPyDTa3/h5JzQ8O8jQ3n6UfP39dieNecxM9e5ohy0pyHnpyJ1VTwTcQcHgA/v7DRyJPba7wIQe5IoJZKQbROHlV1U16NT0ppkvpgcER462lB7S6lqOF10vkOM7JyX3Y/q/rNLOxfYYENvhEXNflXGAERd8gu7jEJHAWi66O+bazT/ggg3XVrAE+HSEtqIOBBDi/V3P08sVzjtUEMID9zdt3VHlDmzkofdtmwPtKf1dkUXAE2ZZFzj+HerofUePdBs7DTwip73EvLUuDdQhR+pbNu/4vJyUBIWxRong8TsAIiu5B0GhaS3ngm22tN4UYbZog1GRDKE681t1Cs21mcPfwP5sc5ZJyRe2FgrnJ+gZocuZJLyUScUqoWoqg3iZBw4M+27Y4Fxj4RC5s8nn1xk3SkV6YmhwiACveFPztB4ZGQn84ORFr/cifWnd396jr4YNTg79iAjxM8nbgwYLwY2cA8vPOKIBLLpzAhGYINQ8+qXnQAUO5RM2Dz2oedEqTp8oFHMBhTCbA5MGYCzhLWvojk+dyqMrXMfRLOullko8BFYsFxtPMQ9sAAAAASUVORK5CYII= - d669cfde-80ea-4143-bcdc-260a09b8dd65 + 4393a904-1d39-422c-be8d-f07a18284b2f true false true - COMPAS FAB: ROS Client - COMPAS FAB: ROS Client + COMPAS FAB: MoveIt Planner + COMPAS FAB: MoveIt Planner 3 false @@ -4083,142 +4161,147 @@ - 281 - 71 - 151 - 84 + 1159 + 74 + 191 + 124 - 345 - 113 + 1251 + 136 - - 4 + + 6 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 3 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 3 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - + - + true - ROS bridge host. Defaults to '127.0.0.1'. - c2f35edf-a776-4bfe-acc6-7426fe3408e6 - host - host + Connected RosClient (from the ROS Client component). + de78af4c-b41c-4d0a-911a-5a4563ff8aa5 + ros_client + ros_client true 0 2 true - 0 - ROS bridge host. Defaults to '127.0.0.1'. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + 3cc3528f-e4c6-4289-aa09-ea2f4e282515 + 1 + Connected RosClient (from the ROS Client component). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 283 - 73 - 47 + 1161 + 76 + 75 20 - 308 - 83 + 1200 + 86 System.Private.CoreLib - System.String + System.Object - + + 1 true - ROS bridge port. Defaults to 9090. - 2652f473-4a38-4bd5-a19b-49dcd5e5d507 - port - port + Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching. + 1230f0c2-a82e-40f2-9d94-a077b31fd58a + tools + tools true - 0 + 1 2 true - 7508753f-ee58-41f3-927d-759349106fed + 3e1a6509-8a44-43de-bc75-d31a76526dbe 1 - ROS bridge port. Defaults to 9090. - 48d01794-d3d8-4aef-990e-127168822244 + Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 283 - 93 - 47 + 1161 + 96 + 75 20 - 308 - 103 + 1200 + 106 System.Private.CoreLib - System.Int32 + System.Object - + + 1 true - If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired. - 4db7c716-8be5-41c0-8dd3-1c0a38d0885a - connect - connect + Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component). + d31b266e-d72a-4537-a305-e2b50b497ec5 + rigid_bodies + rigid_bodies true - 0 + 1 2 true - cabb38ef-411b-4279-aa2d-497d7c31c5c7 + 758422be-0f15-43e4-8297-eef68a8e696c 1 - If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired. - d60527f5-b5af-4ef6-8970-5f96fe412559 + Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 283 - 113 - 47 + 1161 + 116 + 75 20 - 308 - 123 + 1200 + 126 System.Private.CoreLib - System.Boolean + System.Object @@ -4226,69 +4309,69 @@ true - Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport. - 5a940e85-9726-4ead-81c1-3e2f8dfd9716 - transport - transport + If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired. + 73e57853-56d4-4afc-8f2d-ee8480bd03a3 + load_geometry + load_geometry true 0 2 true - 14c71912-2008-445b-9fc4-bc21691e2d07 + a8abae57-e5f5-463f-8566-8443a0edd81c 1 - Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 283 - 133 - 47 + 1161 + 136 + 75 20 - 308 - 143 + 1200 + 146 System.Private.CoreLib - System.String + System.Object - + - false - Connected RosClient (or None if disconnected). - 3cc3528f-e4c6-4289-aa09-ea2f4e282515 - ros_client - ros_client - false + true + Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups. + 8dfd4718-345e-4071-9898-2c7dd2162c16 + options + options + true 0 2 true 0 - Connected RosClient (or None if disconnected). + Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 360 - 73 - 70 - 26 + 1161 + 156 + 75 + 20 - 395 - 86.333336 + 1200 + 166 @@ -4300,33 +4383,71 @@ - + + + true + Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False. + 93e22e6e-be7b-4a4b-b638-c9972a2fc848 + reload + reload + true + 0 + 2 + true + 0 + Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False. + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 1161 + 176 + 75 + 20 + + + 1200 + 186 + + + + + + System.Private.CoreLib + System.Boolean + + + + + false - True if the client is currently connected. - 59c3b947-6ae3-4172-8726-0967daa1ba6d - is_connected - is_connected + MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components. + 65aad224-d3c1-4ad9-9987-0faf7c247fd8 + planner + planner false 0 2 true 0 - True if the client is currently connected. + MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 360 - 99 - 70 - 27 + 1266 + 76 + 82 + 40 - 395 - 113 + 1307 + 96 @@ -4338,33 +4459,33 @@ - + false - Detected ROS distribution (e.g. 'noetic', 'jazzy'). - e987c8f1-282c-4982-8597-1cf3b2599a3b - ros_distro - ros_distro + The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component. + b00151b7-e50e-4f3c-bf78-7ce14e07d00e + robot_cell + robot_cell false 0 2 true 0 - Detected ROS distribution (e.g. 'noetic', 'jazzy'). + The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 360 - 126 - 70 - 27 + 1266 + 116 + 82 + 40 - 395 - 139.66666 + 1307 + 136 @@ -4376,32 +4497,70 @@ - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25uZWN0IHRvIGEgUk9TIGJyaWRnZSAoUk9TIDEgb3IgUk9TIDIpLgoKVGhlIGNsaWVudCBpcyBjYWNoZWQgaW4gc3RpY2t5IGFuZCBzdXJ2aXZlcyBjYW52YXMgcmVmcmVzaGVzLiBUb2dnbGluZwpgY29ubmVjdGAgZnJvbSBUcnVlIHRvIEZhbHNlIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4gVGhlIFJPUyBkaXN0cm8gaXMKYXV0by1kZXRlY3RlZCBhZnRlciBjb25uZWN0aW5nLgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCByb3NsaWJweQppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZwpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBSb3NDbGllbnQKZnJvbSBjb21wYXNfZmFiLmdocHl0aG9uIGltcG9ydCBlbnN1cmVfYm9vbGVhbl90b2dnbGUKCgpkZWYgX3Jvc2xpYnB5X3N1cHBvcnRzX3RyYW5zcG9ydCgpOgogICAgIiIiVGhlIGBgdHJhbnNwb3J0YGAgYXJndW1lbnQgd2FzIGludHJvZHVjZWQgaW4gcm9zbGlicHkgMi4xLiIiIgogICAgdHJ5OgogICAgICAgIG1ham9yLCBtaW5vciA9IChpbnQocGFydCkgZm9yIHBhcnQgaW4gcm9zbGlicHkuX192ZXJzaW9uX18uc3BsaXQoIi4iKVs6Ml0pCiAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgyLCAxKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gRmFsc2UKCgpjbGFzcyBSb3NDbGllbnRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgaG9zdDogc3RyLCBwb3J0OiBpbnQsIGNvbm5lY3Q6IGJvb2wsIHRyYW5zcG9ydDogc3RyKToKICAgICAgICBlbnN1cmVfYm9vbGVhbl90b2dnbGUoZ2hlbnYuQ29tcG9uZW50LCAiY29ubmVjdCIsIGRlZmF1bHQ9RmFsc2UpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaG9zdCA9IGhvc3Qgb3IgIjEyNy4wLjAuMSIKICAgICAgICBwb3J0ID0gcG9ydCBvciA5MDkwCiAgICAgICAgdHJhbnNwb3J0ID0gdHJhbnNwb3J0LnN0cmlwKCkgaWYgdHJhbnNwb3J0IGVsc2UgTm9uZQoKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAicm9zX2NsaWVudCIpICAjIG5vcWE6IEY4MjEKICAgICAgICByb3NfY2xpZW50ID0gc3QuZ2V0KGtleSwgTm9uZSkKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudC5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHdhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiRXJyb3IgY2xvc2luZyBwcmV2aW91cyBST1MgY2xpZW50OiB7fSIuZm9ybWF0KGUpKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHN0LnBvcChrZXksIE5vbmUpCiAgICAgICAgICAgIHJvc19jbGllbnQgPSBOb25lCgogICAgICAgIGlmIHRyYW5zcG9ydCBhbmQgbm90IF9yb3NsaWJweV9zdXBwb3J0c190cmFuc3BvcnQoKToKICAgICAgICAgICAgd2FybmluZyhnaGVudi5Db21wb25lbnQsICJUaGUgJ3RyYW5zcG9ydCcgaW5wdXQgcmVxdWlyZXMgcm9zbGlicHkgPj0gMi4xOyBpZ25vcmluZyBpdC4iKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5vbmUKCiAgICAgICAgaWYgY29ubmVjdDoKICAgICAgICAgICAgaWYgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0LCB0cmFuc3BvcnQ9dHJhbnNwb3J0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0KQogICAgICAgICAgICByb3NfY2xpZW50LnJ1big1KQogICAgICAgICAgICBzdFtrZXldID0gcm9zX2NsaWVudAoKICAgICAgICBpc19jb25uZWN0ZWQgPSBib29sKHJvc19jbGllbnQgYW5kIHJvc19jbGllbnQuaXNfY29ubmVjdGVkKQogICAgICAgIHJvc19kaXN0cm8gPSBOb25lCiAgICAgICAgaWYgaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByb3NfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJDb3VsZCBub3QgZGV0ZWN0IFJPUyBkaXN0cm86IHt9Ii5mb3JtYXQoZSkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIChyb3NfY2xpZW50LCBpc19jb25uZWN0ZWQsIHJvc19kaXN0cm8pCg== - COMPAS FAB: ROS Client - - - - - *.*.python - 3.* - - - - - - + + + false + ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches. + 47efdb72-2efa-4bf8-811d-16b8c8d5c65f + detected_distro + detected_distro + false + 0 + 2 + true + 0 + ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 1266 + 156 + 82 + 40 + + + 1307 + 176 + + + + + + System.Private.CoreLib + System.Object + + + + + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBNb3ZlSXRQbGFubmVyIGZyb20gYSBjb25uZWN0ZWQgUm9zQ2xpZW50LCBsb2FkaW5nIGl0cyByb2JvdCBjZWxsIGZyb20gUk9TLgoKTG9hZGluZyBhbmQgcGxhbm5lciBzZXR1cCBhcmUgb25lIHN0ZXA6IE1vdmVJdCdzIHBsYW5uaW5nIHNjZW5lIGlzIGRlZmluZWQgYnkgdGhlClVSREYvU1JERiBsb2FkZWQgaW50byBtb3ZlX2dyb3VwLCBzbyB0aGUgY2VsbCBjYW4gb25seSBjb21lIGZyb20gUk9TIC0gdGhlcmUgaXMKbm90aGluZyB0byBsb2FkIHNlcGFyYXRlbHkgYW5kIHdpcmUgaW4uIFRvb2xzIGFuZCByaWdpZCBib2RpZXMgd2lyZWQgaW50bwpgdG9vbHNgIC8gYHJpZ2lkX2JvZGllc2AgYXJlIHJlZ2lzdGVyZWQgaW50byB0aGUgY2VsbCBhbmQgdXBsb2FkZWQgYXMgY29sbGlzaW9uCm9iamVjdHMuCgpUaGUgYmFzZSBjZWxsIGlzIGZldGNoZWQgZnJvbSBST1Mgb25jZSBhbmQgY2FjaGVkIGluIHN0aWNreSAodGhlIG1lc2ggcGF5bG9hZCBjYW4KYmUgbGFyZ2UpOyBzZXQgYHJlbG9hZGAgdG8gcmUtZmV0Y2guIFRoZSBwbGFubmVyIGlzIGNhY2hlZCB0b28gYW5kIHJlYnVpbHQgaWYgdGhlCmNsaWVudCBjaGFuZ2VzIChlLmcuIGEgcmVjb25uZWN0KS4gQWR2YW5jZWQgbG9hZCBwYXJhbWV0ZXJzIGxpdmUgb24gdGhlIG9wdGlvbmFsCmBvcHRpb25zYCBpbnB1dCAoc2VlIHRoZSBNb3ZlSXQgUGxhbm5lciBPcHRpb25zIGNvbXBvbmVudCk7IHRoZSBkZWZhdWx0IGNhc2UgbmVlZHMKbm9uZSBvZiB0aGVtLgoKSWYgeW91IHNlZSBIVFRQIDQwNCBlcnJvcnMgd2hpbGUgbG9hZGluZyBnZW9tZXRyeSwgeW91ciBsb2NhbCBST1MgbWF5IGJlIFJPUyAxIGJ1dAptaXNzaW5nIHRoZSBgL3Jvc2FwaS9nZXRfcm9zX3ZlcnNpb25gIHNlcnZpY2UgQU5EIHRoZSBgL3Jvc2Rpc3Ryb2AgcGFyYW1ldGVyLCB3aGljaAptYWtlcyB0aGUgY2xpZW50IGZhbGwgYmFjayB0byBST1MgMiBkZWZhdWx0cy4gV29ya2Fyb3VuZHM6IHNldCB0aGUgYC9yb3NkaXN0cm9gIFJPUwpwYXJhbSwgaW5zdGFsbCB0aGUgcm9zYXBpIHNlcnZpY2UsIG9yIHNldCBgbG9hZF9nZW9tZXRyeWAgdG8gRmFsc2UuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBNb3ZlSXRQbGFubmVyCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgcmVnaXN0ZXJfbW9kZWxzX2ludG9fY2VsbAoKCmNsYXNzIE1vdmVJdFBsYW5uZXJDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcm9zX2NsaWVudCwKICAgICAgICAgICAgdG9vbHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbb2JqZWN0XSwKICAgICAgICAgICAgcmlnaWRfYm9kaWVzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W29iamVjdF0sCiAgICAgICAgICAgIGxvYWRfZ2VvbWV0cnksCiAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgIHJlbG9hZDogYm9vbCk6CiAgICAgICAgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlKGdoZW52LkNvbXBvbmVudCwgImxvYWRfZ2VvbWV0cnkiLCBkZWZhdWx0PVRydWUpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBOb25lIG9yIG5vdCByb3NfY2xpZW50LmlzX2Nvbm5lY3RlZDoKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lKQoKICAgICAgICBsb2FkX2dlb21ldHJ5ID0gVHJ1ZSBpZiBsb2FkX2dlb21ldHJ5IGlzIE5vbmUgZWxzZSBsb2FkX2dlb21ldHJ5CiAgICAgICAgbG9hZF9rd2FyZ3MgPSBvcHRpb25zLnRvX2xvYWRfa3dhcmdzKCkgaWYgb3B0aW9ucyBpcyBub3QgTm9uZSBlbHNlIHt9CgogICAgICAgIHRyeToKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gTm9uZQoKICAgICAgICAjIENhY2hlIHRoZSBwbGFubmVyOyByZWJ1aWxkIGlmIHRoZSBjbGllbnQgY2hhbmdlZCAoZS5nLiB1c2VyIHJlY29ubmVjdGVkKS4KICAgICAgICBwbGFubmVyX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJtb3ZlaXRfcGxhbm5lciIpICAjIG5vcWE6IEY4MjEKICAgICAgICBwbGFubmVyID0gc3QuZ2V0KHBsYW5uZXJfa2V5KQogICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IEZhbHNlCiAgICAgICAgaWYgcGxhbm5lciBpcyBub3QgTm9uZSBhbmQgcGxhbm5lci5jbGllbnQgaXMgbm90IHJvc19jbGllbnQ6CiAgICAgICAgICAgIHBsYW5uZXIgPSBOb25lCiAgICAgICAgaWYgcGxhbm5lciBpcyBOb25lOgogICAgICAgICAgICBwbGFubmVyID0gTW92ZUl0UGxhbm5lcihyb3NfY2xpZW50KQogICAgICAgICAgICBzdFtwbGFubmVyX2tleV0gPSBwbGFubmVyCiAgICAgICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IFRydWUKCiAgICAgICAgIyBDYWNoZSBvbmx5IHRoZSBiYXNlIGNlbGw7IHRvb2xzL3JpZ2lkIGJvZGllcyBhcmUgbWVyZ2VkIGZyZXNoIG9uIGV2ZXJ5IHJ1bgogICAgICAgICMgc28gZWRpdGluZyB0aGVtIGRvZXMgbm90IHJlcXVpcmUgcmUtZmV0Y2hpbmcgdGhlIChsYXJnZSkgbWVzaCBwYXlsb2FkLgogICAgICAgIHNpZyA9ICJ7fV97fV97fSIuZm9ybWF0KAogICAgICAgICAgICBsb2FkX2dlb21ldHJ5LAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInVyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInNyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICkKICAgICAgICBjZWxsX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJyb3Nfcm9ib3RfY2VsbF8iICsgc2lnKSAgIyBub3FhOiBGODIxCiAgICAgICAgYmFzZV9jZWxsID0gc3QuZ2V0KGNlbGxfa2V5KQoKICAgICAgICBpZiByZWxvYWQgb3IgYmFzZV9jZWxsIGlzIE5vbmU6CiAgICAgICAgICAgIGt3YXJncyA9IGRpY3QobG9hZF9nZW9tZXRyeT1sb2FkX2dlb21ldHJ5KQogICAgICAgICAgICBrd2FyZ3MudXBkYXRlKGxvYWRfa3dhcmdzKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBiYXNlX2NlbGwgPSByb3NfY2xpZW50LmxvYWRfcm9ib3RfY2VsbCgqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc3QucG9wKGNlbGxfa2V5LCBOb25lKSAgIyBkb24ndCBwb2lzb24gdGhlIGNhY2hlCiAgICAgICAgICAgICAgICBtc2cgPSBzdHIoZSkKICAgICAgICAgICAgICAgIGlmICI0MDQiIGluIG1zZyBvciAiTm90IEZvdW5kIiBpbiBtc2c6CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAgICAgICAgIGYiUk9TIGxvYWQgZmFpbGVkIHdpdGggSFRUUCA0MDQuIERldGVjdGVkIFJPUyBkaXN0cm86ICd7ZGV0ZWN0ZWRfZGlzdHJvfScuIiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIlJPUyBsb2FkIGZhaWxlZDoge30iLmZvcm1hdChlKSkgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBkZXRlY3RlZF9kaXN0cm8pCiAgICAgICAgICAgIHN0W2NlbGxfa2V5XSA9IGJhc2VfY2VsbAoKICAgICAgICBpZiBiYXNlX2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBkZXRlY3RlZF9kaXN0cm8pCgogICAgICAgIHJvYm90X2NlbGwgPSByZWdpc3Rlcl9tb2RlbHNfaW50b19jZWxsKGdoZW52LkNvbXBvbmVudCwgYmFzZV9jZWxsLCB0b29scywgcmlnaWRfYm9kaWVzKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgVXBsb2FkIHRvIHRoZSBwbGFubmluZyBzY2VuZSBvbmx5IHdoZW4gdGhlIHNldCBvZiByZWdpc3RlcmVkIG1vZGVscwogICAgICAgICMgY2hhbmdlZCAoYSByZWJ1aWx0IHBsYW5uZXIsIG9yIHRvb2xzL3JpZ2lkIGJvZGllcyBhZGRlZC9yZW1vdmVkL3JlbmFtZWQpLAogICAgICAgICMgc28gYSBwbGFpbiByZWNvbXB1dGUgZG9lcyBub3QgcmUtdXBsb2FkIHRoZSBzY2VuZSB0byBNb3ZlSXQgb24gZXZlcnkgdGljay4KICAgICAgICAjIENvbnRlbnQtb25seSBlZGl0cyB0byBhIHNhbWUtbmFtZWQgbW9kZWwgYXJlIGNhdWdodCBieSBgcmVsb2FkYC4KICAgICAgICBjZWxsX3NpZyA9IHJvYm90X2NlbGwuc3RydWN0dXJhbF9zaWduYXR1cmUoKQogICAgICAgIHNpZ19rZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAibW92ZWl0X2NlbGxfc2lnIikgICMgbm9xYTogRjgyMQogICAgICAgIGlmIHBsYW5uZXJfcmVidWlsdCBvciByZWxvYWQgb3Igc3QuZ2V0KHNpZ19rZXkpICE9IGNlbGxfc2lnOgogICAgICAgICAgICBwbGFubmVyLnNldF9yb2JvdF9jZWxsKHJvYm90X2NlbGwpCiAgICAgICAgICAgIHN0W3NpZ19rZXldID0gY2VsbF9zaWcKCiAgICAgICAgcmV0dXJuIChwbGFubmVyLCByb2JvdF9jZWxsLCBkZXRlY3RlZF9kaXN0cm8pCg== + COMPAS FAB: MoveIt Planner + + + + + *.*.python + 3.* + + + + + + - 469 - 33 - 550 - 850 + 135 + 99 + 932 + 750 @@ -4412,7 +4571,7 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: MoveIt Planner + COMPAS FAB: Deconstruct Planner @@ -4421,14 +4580,14 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUklEQVRIDbVVTUhUURQ+Yy5mpvcgddfPtBLNlYpOQgVSmxhaSDkEbtwKBrq0CNzpNsGgrRshRsWFiIuKQIM0qDbpiCst3YmCNvPEV6/7Hd+5vve8kTbjgTfn3vPzffeew9xDdM4SC+J7ntep9n0b3zdvFQqFkC8YZ1onk0kvde3KB+UbicViExKjQRT4UH517ak4StH1dbXDiuQZMJgAJ1fguVJAo7mKJIubVPiOvmhAGfaMyTdY3/jxW2q+v/+Txl/n6POXr2fiaG5qpK7HWbKsi5yHnlxPXa3gGwg4PAB/++49kac2Z/iQg1wRwawUg2icvKrqEr0afSGmU+me3n7jraUHtLySp4mpaXIc5+jkPmz34iq9XNs6QQIbfCKu63IuMIKib5CbnGYSOA8PXR2ztL1H+CC9tZdZA3w0QlpUBwMJcL4t52nw+QDHagIYwD4zO0eVF7SZg9I1NgO2Kv1JkUXBEWRbFjkHDj3I3KeGG/Wch58QUufDDnojDdYhROlqm3fdH49KAkLYokTxeJyAERTdg6DRtJbywDd2s84UYrRpglCTDaE48UqmhcbazODur/9scpRLyhW1F4vmJusboMnZRx2USMQpoWopgnqbBA0P+mzb4lxg4BP5Z5P/Vm/cJB3phanJIQKw4k3B377nSX/oDycnYq0f+WPrzs4u3bvbfmzwV0yAh0neDjxYEH7sDEB+3gkFcMmFE5jQDKHmwbyaB7dhKJeoebCg5sEdafJIuYADOIzJBJg8GHMBZ0lLf2TyXA5V+TyGfkknPU3yHzc/Bck9uYAcAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapjDHLDy0WswM1xOFCYEpkFxIicrzcQC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFJEuhmTItpkQAAAABJRU5ErkJggg== - 4393a904-1d39-422c-be8d-f07a18284b2f + 4819d1cf-0141-4891-83b1-8dbe7d876737 true false true - COMPAS FAB: MoveIt Planner - COMPAS FAB: MoveIt Planner + COMPAS FAB: Deconstruct Planner + COMPAS FAB: Deconstruct Planner 3 false @@ -4440,60 +4599,54 @@ - 1159 - 74 - 191 - 124 + 2928 + 776 + 140 + 44 - 1251 - 136 + 2984 + 798 - - 6 + + 1 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 3 + 2 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - + true - Connected RosClient (from the ROS Client component). - de78af4c-b41c-4d0a-911a-5a4563ff8aa5 - ros_client - ros_client + A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it. + 24341190-e05c-4049-b6b3-e770f5565812 + planner + planner true 0 2 true - 3cc3528f-e4c6-4289-aa09-ea2f4e282515 + d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e 1 - Connected RosClient (from the ROS Client component). + A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 1161 - 76 - 75 - 20 + 2930 + 778 + 39 + 40 - 1200 - 86 + 2951 + 798 @@ -4505,35 +4658,33 @@ - - - 1 - true - Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching. - 1230f0c2-a82e-40f2-9d94-a077b31fd58a - tools - tools - true - 1 + + + false + The RobotCell currently held by the planner's client. None if no cell has been loaded yet. + 53164f03-75b0-4ed9-9b64-afb81bc02549 + robot_cell + robot_cell + false + 0 2 true - 6f0b279a-83bc-49d8-b291-d9861d788592 - 1 - Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching. + 0 + The RobotCell currently held by the planner's client. None if no cell has been loaded yet. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 1161 - 96 - 75 + 2999 + 778 + 67 20 - 1200 - 106 + 3032.5 + 788 @@ -4545,35 +4696,33 @@ - - - 1 - true - Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component). - d31b266e-d72a-4537-a305-e2b50b497ec5 - rigid_bodies - rigid_bodies - true - 1 + + + false + The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet. + 54714e78-8232-4aea-b127-6592b1fcaf57 + robot_model + robot_model + false + 0 2 true - 758422be-0f15-43e4-8297-eef68a8e696c - 1 - Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component). + 0 + The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 1161 - 116 - 75 + 2999 + 798 + 67 20 - 1200 - 126 + 3032.5 + 808 @@ -4585,72 +4734,127 @@ - - - true - If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired. - 73e57853-56d4-4afc-8f2d-ee8480bd03a3 - load_geometry - load_geometry - true - 0 - 2 - true - a8abae57-e5f5-463f-8566-8443a0edd81c - 1 - If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEZWNvbnN0cnVjdCBhIHBsYW5uZXIgaW50byB0aGUgcm9ib3QgY2VsbCBpdCBjdXJyZW50bHkgaG9sZHM6IHRoZQpgcm9ib3RfY2VsbGAgYW5kIGl0cyBgcm9ib3RfbW9kZWxgLgoKVGhlc2UgYXJlIHJlYWQgZnJvbSB0aGUgcGxhbm5lcidzIGNsaWVudCAodGhlIGNlbGwgbGFzdCBzZXQgb24gaXQgdmlhIGEKTG9hZCBSb2JvdCBDZWxsICsgcGxhbm5lciBzZXR1cCkuIEVhY2ggb3V0cHV0IGlzIGBOb25lYCB1bnRpbCBhIGNlbGwgaGFzCmJlZW4gbG9hZGVkLiBSZWFkcyBvbmx5OyBuZXZlciBtdXRhdGVzIHRoZSBwbGFubmVyLgoKVGhlIGNlbGwgKnN0YXRlKiBpcyBpbnRlbnRpb25hbGx5IG5vdCBleHBvc2VkOiB0aGUgc3RhdGUgaGVsZCBieSB0aGUgY2xpZW50CmlzIHdoYXRldmVyIHdhcyBsYXN0IHNldCBpbnRlcm5hbGx5IGFuZCBpcyByYXJlbHkgdGhlIG9uZSB5b3Ugd2FudC4gQnVpbGQgdGhlCnN0YXRlIHlvdSBuZWVkIGZyb20gYERlZmF1bHQgQ2VsbCBTdGF0ZWAgLyB0aGUgYEF0dGFjaCpgIGNvbXBvbmVudHMgaW5zdGVhZC4KCldvcmtzIHdpdGggYW55IHBsYW5uZXIgKE1vdmVJdCwgUHlCdWxsZXQsIEFuYWx5dGljYWwsIOKApikuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQoKCmNsYXNzIERlY29uc3RydWN0UGxhbm5lcihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBwbGFubmVyKToKICAgICAgICBpZiBwbGFubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSkKCiAgICAgICAgcm9ib3RfY2VsbCA9IHBsYW5uZXIucm9ib3RfY2VsbAogICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbCBpZiByb2JvdF9jZWxsIGlzIG5vdCBOb25lIGVsc2UgTm9uZQoKICAgICAgICByZXR1cm4gKHJvYm90X2NlbGwsIHJvYm90X21vZGVsKQo= + COMPAS FAB: Deconstruct Planner + + + + + *.*.python + 3.* - - - - - 1161 - 136 - 75 - 20 - - - 1200 - 146 - - - - - - System.Private.CoreLib - System.Object - - - - - - true - Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups. - 8dfd4718-345e-4071-9898-2c7dd2162c16 - options - options - true - 0 - 2 - true - 0 - Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups. + + + + + + 399 + 199 + 550 + 650 + + + + + + + + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + COMPAS FAB: Plan Motion + + + + + + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/sNHT6y/f/+OIoesDhubk5Pzv7yczFGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bBg4eP/5Ea5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKEwV5WSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABQc8F4LvG3HgAAAABJRU5ErkJggg== + + 878ee4f3-dfc7-4c1e-ab8e-487124d32510 + true + false + true + COMPAS FAB: Plan Motion + COMPAS FAB: Plan Motion + 3 + + false + false + false + false + + + + + + 2663 + 552 + 214 + 164 + + + 2800 + 634 + + + + + + 8 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 4 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner). + 8e002351-10fa-451a-83f6-40a91c1deb68 + planner + planner + true + 0 + 2 + true + d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e + 1 + A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner). 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 1161 - 156 - 75 + 2665 + 554 + 120 20 - 1200 - 166 + 2726.5 + 564 @@ -4662,71 +4866,73 @@ - - + + true - Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False. - 93e22e6e-be7b-4a4b-b638-c9972a2fc848 - reload - reload + Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget). + 8f0985c9-bfd3-4613-b402-a03b0404cb26 + target + target true 0 2 true - 0 - Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False. - d60527f5-b5af-4ef6-8970-5f96fe412559 + 549998f3-80a1-4ada-9c82-ef9c0f3c9e43 + 1 + Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 1161 - 176 - 75 + 2665 + 574 + 120 20 - 1200 - 186 + 2726.5 + 584 System.Private.CoreLib - System.Boolean + System.Object - - - false - MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components. - 65aad224-d3c1-4ad9-9987-0faf7c247fd8 - planner - planner - false + + + true + Starting RobotCellState. The robot's configuration in this state is used as the seed. + 705c1aad-ac69-4405-ad94-59eeae7980d1 + start_state + start_state + true 0 2 true - 0 - MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components. + 3466ce89-77e4-426b-a993-683e29db59a1 + 1 + Starting RobotCellState. The robot's configuration in this state is used as the seed. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 1266 - 76 - 82 - 40 + 2665 + 594 + 120 + 20 - 1307 - 96 + 2726.5 + 604 @@ -4738,201 +4944,193 @@ - + - false - The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component. - b00151b7-e50e-4f3c-bf78-7ce14e07d00e - robot_cell - robot_cell - false + true + Planning group name. Defaults to the cell's main planning group. + 3044f4b7-874d-40c8-82f8-a61e0f89869b + group + group + true 0 2 true 0 - The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + Planning group name. Defaults to the cell's main planning group. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 1266 - 116 - 82 - 40 + 2665 + 614 + 120 + 20 - 1307 - 136 + 2726.5 + 624 System.Private.CoreLib - System.Object + System.String - + - false - ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches. - 47efdb72-2efa-4bf8-811d-16b8c8d5c65f - detected_distro - detected_distro - false + true + MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'. + c630c1e8-050b-4e7b-b340-dfed3ebe4a15 + planner_id + planner_id + true 0 2 true 0 - ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - 1266 - 156 - 82 - 40 + 2665 + 634 + 120 + 20 - 1307 - 176 + 2726.5 + 644 System.Private.CoreLib - System.Object + System.String - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBNb3ZlSXRQbGFubmVyIGZyb20gYSBjb25uZWN0ZWQgUm9zQ2xpZW50LCBsb2FkaW5nIGl0cyByb2JvdCBjZWxsIGZyb20gUk9TLgoKTG9hZGluZyBhbmQgcGxhbm5lciBzZXR1cCBhcmUgb25lIHN0ZXA6IE1vdmVJdCdzIHBsYW5uaW5nIHNjZW5lIGlzIGRlZmluZWQgYnkgdGhlClVSREYvU1JERiBsb2FkZWQgaW50byBtb3ZlX2dyb3VwLCBzbyB0aGUgY2VsbCBjYW4gb25seSBjb21lIGZyb20gUk9TIC0gdGhlcmUgaXMKbm90aGluZyB0byBsb2FkIHNlcGFyYXRlbHkgYW5kIHdpcmUgaW4uIFRvb2xzIGFuZCByaWdpZCBib2RpZXMgd2lyZWQgaW50bwpgdG9vbHNgIC8gYHJpZ2lkX2JvZGllc2AgYXJlIHJlZ2lzdGVyZWQgaW50byB0aGUgY2VsbCBhbmQgdXBsb2FkZWQgYXMgY29sbGlzaW9uCm9iamVjdHMuCgpUaGUgYmFzZSBjZWxsIGlzIGZldGNoZWQgZnJvbSBST1Mgb25jZSBhbmQgY2FjaGVkIGluIHN0aWNreSAodGhlIG1lc2ggcGF5bG9hZCBjYW4KYmUgbGFyZ2UpOyBzZXQgYHJlbG9hZGAgdG8gcmUtZmV0Y2guIFRoZSBwbGFubmVyIGlzIGNhY2hlZCB0b28gYW5kIHJlYnVpbHQgaWYgdGhlCmNsaWVudCBjaGFuZ2VzIChlLmcuIGEgcmVjb25uZWN0KS4gQWR2YW5jZWQgbG9hZCBwYXJhbWV0ZXJzIGxpdmUgb24gdGhlIG9wdGlvbmFsCmBvcHRpb25zYCBpbnB1dCAoc2VlIHRoZSBNb3ZlSXQgUGxhbm5lciBPcHRpb25zIGNvbXBvbmVudCk7IHRoZSBkZWZhdWx0IGNhc2UgbmVlZHMKbm9uZSBvZiB0aGVtLgoKSWYgeW91IHNlZSBIVFRQIDQwNCBlcnJvcnMgd2hpbGUgbG9hZGluZyBnZW9tZXRyeSwgeW91ciBsb2NhbCBST1MgbWF5IGJlIFJPUyAxIGJ1dAptaXNzaW5nIHRoZSBgL3Jvc2FwaS9nZXRfcm9zX3ZlcnNpb25gIHNlcnZpY2UgQU5EIHRoZSBgL3Jvc2Rpc3Ryb2AgcGFyYW1ldGVyLCB3aGljaAptYWtlcyB0aGUgY2xpZW50IGZhbGwgYmFjayB0byBST1MgMiBkZWZhdWx0cy4gV29ya2Fyb3VuZHM6IHNldCB0aGUgYC9yb3NkaXN0cm9gIFJPUwpwYXJhbSwgaW5zdGFsbCB0aGUgcm9zYXBpIHNlcnZpY2UsIG9yIHNldCBgbG9hZF9nZW9tZXRyeWAgdG8gRmFsc2UuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBNb3ZlSXRQbGFubmVyCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgcmVnaXN0ZXJfbW9kZWxzX2ludG9fY2VsbAoKCmNsYXNzIE1vdmVJdFBsYW5uZXJDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcm9zX2NsaWVudCwKICAgICAgICAgICAgdG9vbHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbb2JqZWN0XSwKICAgICAgICAgICAgcmlnaWRfYm9kaWVzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W29iamVjdF0sCiAgICAgICAgICAgIGxvYWRfZ2VvbWV0cnksCiAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgIHJlbG9hZDogYm9vbCk6CiAgICAgICAgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlKGdoZW52LkNvbXBvbmVudCwgImxvYWRfZ2VvbWV0cnkiLCBkZWZhdWx0PVRydWUpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBOb25lIG9yIG5vdCByb3NfY2xpZW50LmlzX2Nvbm5lY3RlZDoKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lKQoKICAgICAgICBsb2FkX2dlb21ldHJ5ID0gVHJ1ZSBpZiBsb2FkX2dlb21ldHJ5IGlzIE5vbmUgZWxzZSBsb2FkX2dlb21ldHJ5CiAgICAgICAgbG9hZF9rd2FyZ3MgPSBvcHRpb25zLnRvX2xvYWRfa3dhcmdzKCkgaWYgb3B0aW9ucyBpcyBub3QgTm9uZSBlbHNlIHt9CgogICAgICAgIHRyeToKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gTm9uZQoKICAgICAgICAjIENhY2hlIHRoZSBwbGFubmVyOyByZWJ1aWxkIGlmIHRoZSBjbGllbnQgY2hhbmdlZCAoZS5nLiB1c2VyIHJlY29ubmVjdGVkKS4KICAgICAgICBwbGFubmVyX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJtb3ZlaXRfcGxhbm5lciIpICAjIG5vcWE6IEY4MjEKICAgICAgICBwbGFubmVyID0gc3QuZ2V0KHBsYW5uZXJfa2V5KQogICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IEZhbHNlCiAgICAgICAgaWYgcGxhbm5lciBpcyBub3QgTm9uZSBhbmQgcGxhbm5lci5jbGllbnQgaXMgbm90IHJvc19jbGllbnQ6CiAgICAgICAgICAgIHBsYW5uZXIgPSBOb25lCiAgICAgICAgaWYgcGxhbm5lciBpcyBOb25lOgogICAgICAgICAgICBwbGFubmVyID0gTW92ZUl0UGxhbm5lcihyb3NfY2xpZW50KQogICAgICAgICAgICBzdFtwbGFubmVyX2tleV0gPSBwbGFubmVyCiAgICAgICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IFRydWUKCiAgICAgICAgIyBDYWNoZSBvbmx5IHRoZSBiYXNlIGNlbGw7IHRvb2xzL3JpZ2lkIGJvZGllcyBhcmUgbWVyZ2VkIGZyZXNoIG9uIGV2ZXJ5IHJ1bgogICAgICAgICMgc28gZWRpdGluZyB0aGVtIGRvZXMgbm90IHJlcXVpcmUgcmUtZmV0Y2hpbmcgdGhlIChsYXJnZSkgbWVzaCBwYXlsb2FkLgogICAgICAgIHNpZyA9ICJ7fV97fV97fSIuZm9ybWF0KAogICAgICAgICAgICBsb2FkX2dlb21ldHJ5LAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInVyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInNyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICkKICAgICAgICBjZWxsX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJyb3Nfcm9ib3RfY2VsbF8iICsgc2lnKSAgIyBub3FhOiBGODIxCiAgICAgICAgYmFzZV9jZWxsID0gc3QuZ2V0KGNlbGxfa2V5KQoKICAgICAgICBpZiByZWxvYWQgb3IgYmFzZV9jZWxsIGlzIE5vbmU6CiAgICAgICAgICAgIGt3YXJncyA9IGRpY3QobG9hZF9nZW9tZXRyeT1sb2FkX2dlb21ldHJ5KQogICAgICAgICAgICBrd2FyZ3MudXBkYXRlKGxvYWRfa3dhcmdzKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBiYXNlX2NlbGwgPSByb3NfY2xpZW50LmxvYWRfcm9ib3RfY2VsbCgqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc3QucG9wKGNlbGxfa2V5LCBOb25lKSAgIyBkb24ndCBwb2lzb24gdGhlIGNhY2hlCiAgICAgICAgICAgICAgICBtc2cgPSBzdHIoZSkKICAgICAgICAgICAgICAgIGlmICI0MDQiIGluIG1zZyBvciAiTm90IEZvdW5kIiBpbiBtc2c6CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAgICAgICAgIGYiUk9TIGxvYWQgZmFpbGVkIHdpdGggSFRUUCA0MDQuIERldGVjdGVkIFJPUyBkaXN0cm86ICd7ZGV0ZWN0ZWRfZGlzdHJvfScuIiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIlJPUyBsb2FkIGZhaWxlZDoge30iLmZvcm1hdChlKSkgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBkZXRlY3RlZF9kaXN0cm8pCiAgICAgICAgICAgIHN0W2NlbGxfa2V5XSA9IGJhc2VfY2VsbAoKICAgICAgICBpZiBiYXNlX2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBkZXRlY3RlZF9kaXN0cm8pCgogICAgICAgIHJvYm90X2NlbGwgPSByZWdpc3Rlcl9tb2RlbHNfaW50b19jZWxsKGdoZW52LkNvbXBvbmVudCwgYmFzZV9jZWxsLCB0b29scywgcmlnaWRfYm9kaWVzKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgVXBsb2FkIHRvIHRoZSBwbGFubmluZyBzY2VuZSBvbmx5IHdoZW4gdGhlIHNldCBvZiByZWdpc3RlcmVkIG1vZGVscwogICAgICAgICMgY2hhbmdlZCAoYSByZWJ1aWx0IHBsYW5uZXIsIG9yIHRvb2xzL3JpZ2lkIGJvZGllcyBhZGRlZC9yZW1vdmVkL3JlbmFtZWQpLAogICAgICAgICMgc28gYSBwbGFpbiByZWNvbXB1dGUgZG9lcyBub3QgcmUtdXBsb2FkIHRoZSBzY2VuZSB0byBNb3ZlSXQgb24gZXZlcnkgdGljay4KICAgICAgICAjIENvbnRlbnQtb25seSBlZGl0cyB0byBhIHNhbWUtbmFtZWQgbW9kZWwgYXJlIGNhdWdodCBieSBgcmVsb2FkYC4KICAgICAgICBjZWxsX3NpZyA9IHJvYm90X2NlbGwuc3RydWN0dXJhbF9zaWduYXR1cmUoKQogICAgICAgIHNpZ19rZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAibW92ZWl0X2NlbGxfc2lnIikgICMgbm9xYTogRjgyMQogICAgICAgIGlmIHBsYW5uZXJfcmVidWlsdCBvciByZWxvYWQgb3Igc3QuZ2V0KHNpZ19rZXkpICE9IGNlbGxfc2lnOgogICAgICAgICAgICBwbGFubmVyLnNldF9yb2JvdF9jZWxsKHJvYm90X2NlbGwpCiAgICAgICAgICAgIHN0W3NpZ19rZXldID0gY2VsbF9zaWcKCiAgICAgICAgcmV0dXJuIChwbGFubmVyLCByb2JvdF9jZWxsLCBkZXRlY3RlZF9kaXN0cm8pCg== - COMPAS FAB: MoveIt Planner - - - - - *.*.python - 3.* - - - - - - - - 135 - 99 - 932 - 750 - - - - - - - - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Deconstruct Planner - - - - - - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYBw8fPflHapjDHLDy0WswM1xOFCYEpkFxIi8nw8QC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFwfuhs3ElmqwAAAABJRU5ErkJggg== - - 4819d1cf-0141-4891-83b1-8dbe7d876737 - true - false - true - COMPAS FAB: Deconstruct Planner - COMPAS FAB: Deconstruct Planner - 3 - - false - false - false - false - - - - - - 2928 - 776 - 140 - 44 - - - 2984 - 798 - - - - - - 1 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 2 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - + + + true + Number of randomized attempts to make. Defaults to 5 for MoveIt. + 7cfa47f0-5878-47fe-b807-48088f6505f0 + num_planning_attempts + num_planning_attempts + true + 0 + 2 + true + 0 + Number of randomized attempts to make. Defaults to 5 for MoveIt. + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 2665 + 654 + 120 + 20 + + + 2726.5 + 664 + + + + + + System.Private.CoreLib + System.Int32 + + + + + + + true + Planning timeout in seconds. Defaults to 1.0. + 5812faf4-6133-43b2-b17b-2c55fa330237 + allowed_planning_time + allowed_planning_time + true + 0 + 2 + true + 0 + Planning timeout in seconds. Defaults to 1.0. + 9d51e32e-c038-4352-9554-f4137ca91b9a + + + + + + 2665 + 674 + 120 + 20 + + + 2726.5 + 684 + + + + + + System.Private.CoreLib + System.Double + + + + + true - A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it. - 24341190-e05c-4049-b6b3-e770f5565812 - planner - planner + Trigger planning. Defaults to False so the canvas does not plan on every refresh. + bc877669-87a5-40f0-9262-54b61aaf6bff + compute + compute true 0 2 true - d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e + 8a25fcc1-f970-4f14-b174-b1c41b5328d9 1 - A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + Trigger planning. Defaults to False so the canvas does not plan on every refresh. + d60527f5-b5af-4ef6-8970-5f96fe412559 - 2930 - 778 - 39 - 40 + 2665 + 694 + 120 + 20 - 2951 - 798 + 2726.5 + 704 System.Private.CoreLib - System.Object + System.Boolean @@ -4940,30 +5138,30 @@ false - The RobotCell currently held by the planner's client. None if no cell has been loaded yet. - 53164f03-75b0-4ed9-9b64-afb81bc02549 - robot_cell - robot_cell + Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright. + f73d3ab2-8697-4ff9-b443-87d7b13dafeb + trajectory + trajectory false 0 2 true 0 - The RobotCell currently held by the planner's client. None if no cell has been loaded yet. + Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2999 - 778 - 67 - 20 + 2815 + 554 + 60 + 40 - 3032.5 - 788 + 2845 + 574 @@ -4978,30 +5176,30 @@ false - The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet. - 54714e78-8232-4aea-b127-6592b1fcaf57 - robot_model - robot_model + List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved. + 7862377a-b0e8-4386-8873-fef9ac5884c7 + planes + planes false 0 2 true 0 - The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet. + List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2999 - 798 - 67 - 20 + 2815 + 594 + 60 + 40 - 3032.5 - 808 + 2845 + 614 @@ -5013,21 +5211,97 @@ - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEZWNvbnN0cnVjdCBhIHBsYW5uZXIgaW50byB0aGUgcm9ib3QgY2VsbCBpdCBjdXJyZW50bHkgaG9sZHM6IHRoZQpgcm9ib3RfY2VsbGAgYW5kIGl0cyBgcm9ib3RfbW9kZWxgLgoKVGhlc2UgYXJlIHJlYWQgZnJvbSB0aGUgcGxhbm5lcidzIGNsaWVudCAodGhlIGNlbGwgbGFzdCBzZXQgb24gaXQgdmlhIGEKTG9hZCBSb2JvdCBDZWxsICsgcGxhbm5lciBzZXR1cCkuIEVhY2ggb3V0cHV0IGlzIGBOb25lYCB1bnRpbCBhIGNlbGwgaGFzCmJlZW4gbG9hZGVkLiBSZWFkcyBvbmx5OyBuZXZlciBtdXRhdGVzIHRoZSBwbGFubmVyLgoKVGhlIGNlbGwgKnN0YXRlKiBpcyBpbnRlbnRpb25hbGx5IG5vdCBleHBvc2VkOiB0aGUgc3RhdGUgaGVsZCBieSB0aGUgY2xpZW50CmlzIHdoYXRldmVyIHdhcyBsYXN0IHNldCBpbnRlcm5hbGx5IGFuZCBpcyByYXJlbHkgdGhlIG9uZSB5b3Ugd2FudC4gQnVpbGQgdGhlCnN0YXRlIHlvdSBuZWVkIGZyb20gYERlZmF1bHQgQ2VsbCBTdGF0ZWAgLyB0aGUgYEF0dGFjaCpgIGNvbXBvbmVudHMgaW5zdGVhZC4KCldvcmtzIHdpdGggYW55IHBsYW5uZXIgKE1vdmVJdCwgUHlCdWxsZXQsIEFuYWx5dGljYWwsIOKApikuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQoKCmNsYXNzIERlY29uc3RydWN0UGxhbm5lcihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBwbGFubmVyKToKICAgICAgICBpZiBwbGFubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSkKCiAgICAgICAgcm9ib3RfY2VsbCA9IHBsYW5uZXIucm9ib3RfY2VsbAogICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbCBpZiByb2JvdF9jZWxsIGlzIG5vdCBOb25lIGVsc2UgTm9uZQoKICAgICAgICByZXR1cm4gKHJvYm90X2NlbGwsIHJvYm90X21vZGVsKQo= - COMPAS FAB: Deconstruct Planner - - - - - *.*.python - 3.* + + + false + Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points. + 4dd0ca5a-e703-4ea7-be36-d625defb901f + polyline + polyline + false + 0 + 2 + true + 0 + Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 2815 + 634 + 60 + 40 + + + 2845 + 654 + + + + + + System.Private.CoreLib + System.Object + + + + + + + false + The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success. + f08254eb-d464-4f7e-98da-31516efa7c4b + debug_info + debug_info + false + 0 + 2 + true + 0 + The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 2815 + 674 + 60 + 40 + + + 2845 + 694 + + + + + + System.Private.CoreLib + System.Object + + + + + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpQbGFuIGEgZnJlZS1zcGFjZSAoam9pbnQtaW50ZXJwb2xhdGVkKSBtb3Rpb24gdG8gYSB0YXJnZXQuCgpDYWxscyBgcGxhbm5lci5wbGFuX21vdGlvbih0YXJnZXQsIHN0YXJ0X3N0YXRlKWAuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGluCnN0aWNreSBzbyB0aGUgY2FudmFzIGRvZXMgbm90IHJlLXBsYW4gb24gZXZlcnkgcmVmcmVzaCAtIHNldCBgY29tcHV0ZWAgdG8KVHJ1ZSB0byAocmUpcGxhbi4KCkFueSBwbGFubmluZyBmYWlsdXJlIChubyBwbGFuIGZvdW5kLCBzdGFydC9nb2FsIGluIGNvbGxpc2lvbiwgdGltZWQgb3V0LCDigKYpCmZsYWdzIHRoZSBjb21wb25lbnQgcmVkIHdpdGggdGhlIGJhY2tlbmQgZXJyb3IgbWVzc2FnZS4gV2hlbiB0aGUgYmFja2VuZApyZXR1cm5zIGEgYHBhcnRpYWxfdHJhamVjdG9yeWAsIHRoZSBjb21wb25lbnQgaXMgZmxhZ2dlZCB3aXRoIGEgd2FybmluZwppbnN0ZWFkIGFuZCB0aGUgcGFydGlhbCB0cmFqZWN0b3J5IGlzIHN1cmZhY2VkLiBPbiBhIGZ1bGwgZmFpbHVyZSB0aGUgc3RhcnQKc3RhdGUgaXMgY29sbGlzaW9uLWNoZWNrZWQgKHdoZW4gdGhlIHBsYW5uZXIgc3VwcG9ydHMgaXQpIGFuZCBhIGNvbmNpc2UgaGludAphcHBlbmRlZC4gVGhlIG1lc3NhZ2UgaXMgYWxzbyBleHBvc2VkIG9uIHRoZSBgZGVidWdfaW5mb2Agb3V0cHV0IHNvIGl0IGNhbiBiZQpyZWFkIGluIGEgd2lyZWQgcGFuZWwuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvciBhcyBnaF9lcnJvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZyBhcyBnaF93YXJuaW5nCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBmcmFtZV90b19yaGlub19wbGFuZQpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcG9seWxpbmVfdG9fcmhpbm8KZnJvbSBzY3JpcHRjb250ZXh0IGltcG9ydCBzdGlja3kgYXMgc3QKCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgQmFja2VuZEVycm9yCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgTW90aW9uUGxhbm5pbmdFcnJvcgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGNvbGxpc2lvbl9kaWFnbm9zdGljCgoKY2xhc3MgUGxhbk1vdGlvbihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICBwbGFubmVyLAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cDogc3RyLAogICAgICAgICAgICBwbGFubmVyX2lkOiBzdHIsCiAgICAgICAgICAgIG51bV9wbGFubmluZ19hdHRlbXB0czogaW50LAogICAgICAgICAgICBhbGxvd2VkX3BsYW5uaW5nX3RpbWU6IGZsb2F0LAogICAgICAgICAgICBjb21wdXRlOiBib29sKToKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAidHJhamVjdG9yeSIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgZGVmIF92aXoodHJhamVjdG9yeSk6CiAgICAgICAgICAgIGlmIHRyYWplY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXSwgTm9uZQogICAgICAgICAgICBmcmFtZXMsIHBvbHlsaW5lID0gdHJhamVjdG9yeS50b19mcmFtZXNfYW5kX3BvbHlsaW5lKHBsYW5uZXIucm9ib3RfY2VsbCwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIHBsYW5lcyA9IFtmcmFtZV90b19yaGlub19wbGFuZShmKSBmb3IgZiBpbiBmcmFtZXNdCiAgICAgICAgICAgIHBvbHlsaW5lID0gcG9seWxpbmVfdG9fcmhpbm8ocG9seWxpbmUpIGlmIHBvbHlsaW5lIGVsc2UgTm9uZQogICAgICAgICAgICByZXR1cm4gcGxhbmVzLCBwb2x5bGluZQoKICAgICAgICBkZWYgX2RpYWdub3NlKGVycm9yX21zZywgaGFzX3RyYWplY3RvcnkpOgogICAgICAgICAgICAiIiJGbGFnIHRoZSBjb21wb25lbnQgZm9yIGFuIGVycm9yIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2Ugc2hvd24gKGZvciBkZWJ1Z19pbmZvKS4iIiIKICAgICAgICAgICAgaWYgbm90IGVycm9yX21zZzoKICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICBpZiBoYXNfdHJhamVjdG9yeToKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiTW90aW9uIHBsYW5uaW5nIGZhaWxlZCBidXQgYSBwYXJ0aWFsIHRyYWplY3Rvcnkgd2FzIHJldHVybmVkOiB7fSIuZm9ybWF0KGVycm9yX21zZykKICAgICAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIk1vdGlvbiBwbGFubmluZyBmYWlsZWQ6IHt9Ii5mb3JtYXQoZXJyb3JfbXNnKQogICAgICAgICAgICAgICAgZ2hfZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgICAgIGlmIG5vdCAocGxhbm5lciBhbmQgdGFyZ2V0IGFuZCBzdGFydF9zdGF0ZSBhbmQgY29tcHV0ZSk6CiAgICAgICAgICAgIGNhY2hlZCA9IHN0LmdldChrZXkpCiAgICAgICAgICAgIGlmIGNhY2hlZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBbXSwgTm9uZSwgIiIpCiAgICAgICAgICAgIHRyYWplY3RvcnksIGVycm9yX21zZyA9IGNhY2hlZAogICAgICAgICAgICBkZWJ1Z19pbmZvID0gX2RpYWdub3NlKGVycm9yX21zZywgdHJhamVjdG9yeSBpcyBub3QgTm9uZSkKICAgICAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICAgICAgcmV0dXJuICh0cmFqZWN0b3J5LCBwbGFuZXMsIHBvbHlsaW5lLCBkZWJ1Z19pbmZvKQoKICAgICAgICBvcHRpb25zID0ge30KICAgICAgICBpZiBwbGFubmVyX2lkOgogICAgICAgICAgICBvcHRpb25zWyJwbGFubmVyX2lkIl0gPSBwbGFubmVyX2lkCiAgICAgICAgaWYgbnVtX3BsYW5uaW5nX2F0dGVtcHRzOgogICAgICAgICAgICBvcHRpb25zWyJudW1fcGxhbm5pbmdfYXR0ZW1wdHMiXSA9IGludChudW1fcGxhbm5pbmdfYXR0ZW1wdHMpCiAgICAgICAgaWYgYWxsb3dlZF9wbGFubmluZ190aW1lOgogICAgICAgICAgICBvcHRpb25zWyJhbGxvd2VkX3BsYW5uaW5nX3RpbWUiXSA9IGZsb2F0KGFsbG93ZWRfcGxhbm5pbmdfdGltZSkKCiAgICAgICAgdHJhamVjdG9yeSA9IE5vbmUKICAgICAgICBlcnJvcl9tc2cgPSBOb25lCiAgICAgICAgIyB0cnk6CiAgICAgICAgdHJhamVjdG9yeSA9IHBsYW5uZXIucGxhbl9tb3Rpb24oCiAgICAgICAgICAgIHRhcmdldD10YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlPXN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cD1ncm91cCBvciBOb25lLAogICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMgb3IgTm9uZSwKICAgICAgICApCiAgICAgICAgIyBleGNlcHQgTW90aW9uUGxhbm5pbmdFcnJvciBhcyBlOgogICAgICAgICMgICAgIHRyYWplY3RvcnkgPSBnZXRhdHRyKGUsICJwYXJ0aWFsX3RyYWplY3RvcnkiLCBOb25lKQogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQogICAgICAgICMgZXhjZXB0IEJhY2tlbmRFcnJvciBhcyBlOgogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQoKICAgICAgICAjIE9uIGEgZnVsbCBmYWlsdXJlLCBhcHBlbmQgYSBjb25jaXNlIGNvbGxpc2lvbiBjaGVjayBvbiB0aGUgc3RhcnQgc3RhdGUKICAgICAgICAjIChhIGNvbW1vbiBjYXVzZSkuIENhY2hlZCB3aXRoIHRoZSBlcnJvciBzbyByZXBsYXlzIGRvbid0IHJlLXF1ZXJ5IHRoZSBiYWNrZW5kLgogICAgICAgIGlmIGVycm9yX21zZyBhbmQgdHJhamVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICBoaW50ID0gY29sbGlzaW9uX2RpYWdub3N0aWMocGxhbm5lciwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIGlmIGhpbnQ6CiAgICAgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIlxuIiArIGhpbnQKCiAgICAgICAgZGVidWdfaW5mbyA9IF9kaWFnbm9zZShlcnJvcl9tc2csIHRyYWplY3RvcnkgaXMgbm90IE5vbmUpCiAgICAgICAgc3Rba2V5XSA9ICh0cmFqZWN0b3J5LCBlcnJvcl9tc2cpCiAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICByZXR1cm4gKHRyYWplY3RvcnksIHBsYW5lcywgcG9seWxpbmUsIGRlYnVnX2luZm8pCg== + COMPAS FAB: Plan Motion + + + + + *.*.python + 3.* @@ -5035,10 +5309,10 @@ - 399 - 199 + 535 + 149 550 - 650 + 700 @@ -5049,7 +5323,7 @@ c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Plan Motion + COMPAS FAB: Robot Configuration @@ -5058,14 +5332,14 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/oOHj61//PiBIoesDhubg4Pjv4K87FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bB/QeP/pEa5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKE0UFOSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABYC8F1xJtFXwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB4ElEQVRIDWNgoDFgRDb/////UUB+5u0796z//v2LIoesDhubmZn5v6qK0lGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB7du3/2HK8wX3X8JtitOUZwkO0FxoqaqzMQC0gUz/NLlKwyvX7+BGzT9FwfD1X9gJQybbt5nyGT7AZfDxRAVFWHQ09WBmwnRDVU9beYchvfvP8D1Xo3OQbCBFs2auwDOx8UQFBRgmDFlAlwaxYKs9BQ0H/yB+0Cb6Q9DWnICXCMuBsgHyADFApDXkIEzkENuHMDMQbEAJohMo0fu+idvGBquPAQradCRZwiUQXUxsl4QG5yKrt+49R/Eae/qZXj46DGIiRMc9ohi+McESd1M//4x2O6AZ1qwHnk5WYbKMkh+1dRQY4TlA5wGUiqB4gNiDCMliEA+IBgHMEuRI5tQuMP0gGgUC9AzGkwhKRkOltFgelEsQM9oMEWkZDiSMhrMgum/iM9wWDMaqGAClUfoGQ1mATkZDmQmSD84FQHrg8PA+sAGZiA1aGB9cARYH9jC8sF0ahiKZgbYTLAFoJoHVM2hKSCbC60ywVkcHEQwk2hR6cPMphkNAHNawSqnZwBxAAAAAElFTkSuQmCC - 878ee4f3-dfc7-4c1e-ab8e-487124d32510 + 41a87a38-d6ed-4fa3-8ce0-56d36c64d779 true false true - COMPAS FAB: Plan Motion - COMPAS FAB: Plan Motion + COMPAS FAB: Robot Configuration + COMPAS FAB: Robot Configuration 3 false @@ -5077,63 +5351,55 @@ - 2663 - 552 - 214 - 164 + 2281 + 242 + 155 + 44 - 2800 - 634 + 2349 + 264 - - 8 + + 2 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 4 + 2 08908df5-fa14-4982-9ab2-1aa0927566aa 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - + true - A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner). - 8e002351-10fa-451a-83f6-40a91c1deb68 - planner - planner + The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints. + c13b9e93-0236-4827-908f-9e3625b9c970 + robot_cell + robot_cell true 0 2 true - d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e + c4c3df53-0a94-4574-afc8-9e68cb15bc46 1 - A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner). + The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2665 - 554 - 120 + 2283 + 244 + 51 20 - 2726.5 - 564 + 2310 + 254 @@ -5146,72 +5412,77 @@ - + + 1 true - Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget). - 8f0985c9-bfd3-4613-b402-a03b0404cb26 - target - target + Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override. + 352d1cbf-fc57-4fd2-afc5-b31c624b77c2 + joints + joints true - 0 + 1 2 true - 549998f3-80a1-4ada-9c82-ef9c0f3c9e43 - 1 - Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget). - 1c282eeb-dd16-439f-94e4-7d92b542fe8b + 6c63291c-1328-4b53-8824-3fabe85dcaea + e1f2d3c9-448c-4325-9962-093ce24f4b6d + 6908f732-c3c1-46cf-b28f-d05e55442514 + 7d720b2e-cb1b-4d13-8e07-b58ef0a2ca4e + a16adbc8-88dd-44fa-85a8-ef79e4a1e8b0 + ba57b42f-a73d-48dc-9c86-b258615889b2 + 6 + Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override. + 9d51e32e-c038-4352-9554-f4137ca91b9a - 2665 - 574 - 120 + 2283 + 264 + 51 20 - 2726.5 - 584 + 2310 + 274 System.Private.CoreLib - System.Object + System.Double - - - true - Starting RobotCellState. The robot's configuration in this state is used as the seed. - 705c1aad-ac69-4405-ad94-59eeae7980d1 - start_state - start_state - true + + + false + Configuration with joint_names and joint_types extracted from the cell. + e3aeb9d7-fd12-419f-82da-1a5c3e5fda0d + configuration + configuration + false 0 2 true - 3466ce89-77e4-426b-a993-683e29db59a1 - 1 - Starting RobotCellState. The robot's configuration in this state is used as the seed. + 0 + Configuration with joint_names and joint_types extracted from the cell. 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2665 - 594 - 120 + 2364 + 244 + 70 20 - 2726.5 - 604 + 2399 + 254 @@ -5223,609 +5494,59 @@ - + - true - Planning group name. Defaults to the cell's main planning group. - 3044f4b7-874d-40c8-82f8-a61e0f89869b - group - group - true + false + A copy of the default cell state with `robot_configuration` set to the selected configuration. + e3d8b137-b6b2-491f-a175-53c88474afd2 + cell_state + cell_state + false 0 2 true 0 - Planning group name. Defaults to the cell's main planning group. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + A copy of the default cell state with `robot_configuration` set to the selected configuration. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b - 2665 - 614 - 120 + 2364 + 264 + 70 20 - 2726.5 - 624 + 2399 + 274 System.Private.CoreLib - System.String + System.Object - - - true - MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'. - c630c1e8-050b-4e7b-b340-dfed3ebe4a15 - planner_id - planner_id - true - 0 - 2 - true - 0 - MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - - - - - - 2665 - 634 - 120 - 20 - - - 2726.5 - 644 - - - - - - System.Private.CoreLib - System.String - - - - - - - true - Number of randomized attempts to make. Defaults to 5 for MoveIt. - 7cfa47f0-5878-47fe-b807-48088f6505f0 - num_planning_attempts - num_planning_attempts - true - 0 - 2 - true - 0 - Number of randomized attempts to make. Defaults to 5 for MoveIt. - 48d01794-d3d8-4aef-990e-127168822244 - - - - - - 2665 - 654 - 120 - 20 - - - 2726.5 - 664 - - - - - - System.Private.CoreLib - System.Int32 - - - - - - - true - Planning timeout in seconds. Defaults to 1.0. - 5812faf4-6133-43b2-b17b-2c55fa330237 - allowed_planning_time - allowed_planning_time - true - 0 - 2 - true - 0 - Planning timeout in seconds. Defaults to 1.0. - 9d51e32e-c038-4352-9554-f4137ca91b9a - - - - - - 2665 - 674 - 120 - 20 - - - 2726.5 - 684 - - - - - - System.Private.CoreLib - System.Double - - - - - - - true - Trigger planning. Defaults to False so the canvas does not plan on every refresh. - bc877669-87a5-40f0-9262-54b61aaf6bff - compute - compute - true - 0 - 2 - true - 8a25fcc1-f970-4f14-b174-b1c41b5328d9 - 1 - Trigger planning. Defaults to False so the canvas does not plan on every refresh. - d60527f5-b5af-4ef6-8970-5f96fe412559 - - - - - - 2665 - 694 - 120 - 20 - - - 2726.5 - 704 - - - - - - System.Private.CoreLib - System.Boolean - - - - - - - false - Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright. - f73d3ab2-8697-4ff9-b443-87d7b13dafeb - trajectory - trajectory - false - 0 - 2 - true - 0 - Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2815 - 554 - 60 - 40 - - - 2845 - 574 - - - - - - System.Private.CoreLib - System.Object - - - - - - - false - List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved. - 7862377a-b0e8-4386-8873-fef9ac5884c7 - planes - planes - false - 0 - 2 - true - 0 - List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2815 - 594 - 60 - 40 - - - 2845 - 614 - - - - - - System.Private.CoreLib - System.Object - - - - - - - false - Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points. - 4dd0ca5a-e703-4ea7-be36-d625defb901f - polyline - polyline - false - 0 - 2 - true - 0 - Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2815 - 634 - 60 - 40 - - - 2845 - 654 - - - - - - System.Private.CoreLib - System.Object - - - - - - - false - The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success. - f08254eb-d464-4f7e-98da-31516efa7c4b - debug_info - debug_info - false - 0 - 2 - true - 0 - The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2815 - 674 - 60 - 40 - - - 2845 - 694 - - - - - - System.Private.CoreLib - System.Object - - - - - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpQbGFuIGEgZnJlZS1zcGFjZSAoam9pbnQtaW50ZXJwb2xhdGVkKSBtb3Rpb24gdG8gYSB0YXJnZXQuCgpDYWxscyBgcGxhbm5lci5wbGFuX21vdGlvbih0YXJnZXQsIHN0YXJ0X3N0YXRlKWAuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGluCnN0aWNreSBzbyB0aGUgY2FudmFzIGRvZXMgbm90IHJlLXBsYW4gb24gZXZlcnkgcmVmcmVzaCAtIHNldCBgY29tcHV0ZWAgdG8KVHJ1ZSB0byAocmUpcGxhbi4KCkFueSBwbGFubmluZyBmYWlsdXJlIChubyBwbGFuIGZvdW5kLCBzdGFydC9nb2FsIGluIGNvbGxpc2lvbiwgdGltZWQgb3V0LCDigKYpCmZsYWdzIHRoZSBjb21wb25lbnQgcmVkIHdpdGggdGhlIGJhY2tlbmQgZXJyb3IgbWVzc2FnZS4gV2hlbiB0aGUgYmFja2VuZApyZXR1cm5zIGEgYHBhcnRpYWxfdHJhamVjdG9yeWAsIHRoZSBjb21wb25lbnQgaXMgZmxhZ2dlZCB3aXRoIGEgd2FybmluZwppbnN0ZWFkIGFuZCB0aGUgcGFydGlhbCB0cmFqZWN0b3J5IGlzIHN1cmZhY2VkLiBPbiBhIGZ1bGwgZmFpbHVyZSB0aGUgc3RhcnQKc3RhdGUgaXMgY29sbGlzaW9uLWNoZWNrZWQgKHdoZW4gdGhlIHBsYW5uZXIgc3VwcG9ydHMgaXQpIGFuZCBhIGNvbmNpc2UgaGludAphcHBlbmRlZC4gVGhlIG1lc3NhZ2UgaXMgYWxzbyBleHBvc2VkIG9uIHRoZSBgZGVidWdfaW5mb2Agb3V0cHV0IHNvIGl0IGNhbiBiZQpyZWFkIGluIGEgd2lyZWQgcGFuZWwuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvciBhcyBnaF9lcnJvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZyBhcyBnaF93YXJuaW5nCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBmcmFtZV90b19yaGlub19wbGFuZQpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcG9seWxpbmVfdG9fcmhpbm8KZnJvbSBzY3JpcHRjb250ZXh0IGltcG9ydCBzdGlja3kgYXMgc3QKCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgQmFja2VuZEVycm9yCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgTW90aW9uUGxhbm5pbmdFcnJvcgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGNvbGxpc2lvbl9kaWFnbm9zdGljCgoKY2xhc3MgUGxhbk1vdGlvbihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICBwbGFubmVyLAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cDogc3RyLAogICAgICAgICAgICBwbGFubmVyX2lkOiBzdHIsCiAgICAgICAgICAgIG51bV9wbGFubmluZ19hdHRlbXB0czogaW50LAogICAgICAgICAgICBhbGxvd2VkX3BsYW5uaW5nX3RpbWU6IGZsb2F0LAogICAgICAgICAgICBjb21wdXRlOiBib29sKToKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAidHJhamVjdG9yeSIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgZGVmIF92aXoodHJhamVjdG9yeSk6CiAgICAgICAgICAgIGlmIHRyYWplY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXSwgTm9uZQogICAgICAgICAgICBmcmFtZXMsIHBvbHlsaW5lID0gdHJhamVjdG9yeS50b19mcmFtZXNfYW5kX3BvbHlsaW5lKHBsYW5uZXIucm9ib3RfY2VsbCwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIHBsYW5lcyA9IFtmcmFtZV90b19yaGlub19wbGFuZShmKSBmb3IgZiBpbiBmcmFtZXNdCiAgICAgICAgICAgIHBvbHlsaW5lID0gcG9seWxpbmVfdG9fcmhpbm8ocG9seWxpbmUpIGlmIHBvbHlsaW5lIGVsc2UgTm9uZQogICAgICAgICAgICByZXR1cm4gcGxhbmVzLCBwb2x5bGluZQoKICAgICAgICBkZWYgX2RpYWdub3NlKGVycm9yX21zZywgaGFzX3RyYWplY3RvcnkpOgogICAgICAgICAgICAiIiJGbGFnIHRoZSBjb21wb25lbnQgZm9yIGFuIGVycm9yIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2Ugc2hvd24gKGZvciBkZWJ1Z19pbmZvKS4iIiIKICAgICAgICAgICAgaWYgbm90IGVycm9yX21zZzoKICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICBpZiBoYXNfdHJhamVjdG9yeToKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiTW90aW9uIHBsYW5uaW5nIGZhaWxlZCBidXQgYSBwYXJ0aWFsIHRyYWplY3Rvcnkgd2FzIHJldHVybmVkOiB7fSIuZm9ybWF0KGVycm9yX21zZykKICAgICAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIk1vdGlvbiBwbGFubmluZyBmYWlsZWQ6IHt9Ii5mb3JtYXQoZXJyb3JfbXNnKQogICAgICAgICAgICAgICAgZ2hfZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgICAgIGlmIG5vdCAocGxhbm5lciBhbmQgdGFyZ2V0IGFuZCBzdGFydF9zdGF0ZSBhbmQgY29tcHV0ZSk6CiAgICAgICAgICAgIGNhY2hlZCA9IHN0LmdldChrZXkpCiAgICAgICAgICAgIGlmIGNhY2hlZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBbXSwgTm9uZSwgIiIpCiAgICAgICAgICAgIHRyYWplY3RvcnksIGVycm9yX21zZyA9IGNhY2hlZAogICAgICAgICAgICBkZWJ1Z19pbmZvID0gX2RpYWdub3NlKGVycm9yX21zZywgdHJhamVjdG9yeSBpcyBub3QgTm9uZSkKICAgICAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICAgICAgcmV0dXJuICh0cmFqZWN0b3J5LCBwbGFuZXMsIHBvbHlsaW5lLCBkZWJ1Z19pbmZvKQoKICAgICAgICBvcHRpb25zID0ge30KICAgICAgICBpZiBwbGFubmVyX2lkOgogICAgICAgICAgICBvcHRpb25zWyJwbGFubmVyX2lkIl0gPSBwbGFubmVyX2lkCiAgICAgICAgaWYgbnVtX3BsYW5uaW5nX2F0dGVtcHRzOgogICAgICAgICAgICBvcHRpb25zWyJudW1fcGxhbm5pbmdfYXR0ZW1wdHMiXSA9IGludChudW1fcGxhbm5pbmdfYXR0ZW1wdHMpCiAgICAgICAgaWYgYWxsb3dlZF9wbGFubmluZ190aW1lOgogICAgICAgICAgICBvcHRpb25zWyJhbGxvd2VkX3BsYW5uaW5nX3RpbWUiXSA9IGZsb2F0KGFsbG93ZWRfcGxhbm5pbmdfdGltZSkKCiAgICAgICAgdHJhamVjdG9yeSA9IE5vbmUKICAgICAgICBlcnJvcl9tc2cgPSBOb25lCiAgICAgICAgIyB0cnk6CiAgICAgICAgdHJhamVjdG9yeSA9IHBsYW5uZXIucGxhbl9tb3Rpb24oCiAgICAgICAgICAgIHRhcmdldD10YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlPXN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cD1ncm91cCBvciBOb25lLAogICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMgb3IgTm9uZSwKICAgICAgICApCiAgICAgICAgIyBleGNlcHQgTW90aW9uUGxhbm5pbmdFcnJvciBhcyBlOgogICAgICAgICMgICAgIHRyYWplY3RvcnkgPSBnZXRhdHRyKGUsICJwYXJ0aWFsX3RyYWplY3RvcnkiLCBOb25lKQogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQogICAgICAgICMgZXhjZXB0IEJhY2tlbmRFcnJvciBhcyBlOgogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQoKICAgICAgICAjIE9uIGEgZnVsbCBmYWlsdXJlLCBhcHBlbmQgYSBjb25jaXNlIGNvbGxpc2lvbiBjaGVjayBvbiB0aGUgc3RhcnQgc3RhdGUKICAgICAgICAjIChhIGNvbW1vbiBjYXVzZSkuIENhY2hlZCB3aXRoIHRoZSBlcnJvciBzbyByZXBsYXlzIGRvbid0IHJlLXF1ZXJ5IHRoZSBiYWNrZW5kLgogICAgICAgIGlmIGVycm9yX21zZyBhbmQgdHJhamVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICBoaW50ID0gY29sbGlzaW9uX2RpYWdub3N0aWMocGxhbm5lciwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIGlmIGhpbnQ6CiAgICAgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIlxuIiArIGhpbnQKCiAgICAgICAgZGVidWdfaW5mbyA9IF9kaWFnbm9zZShlcnJvcl9tc2csIHRyYWplY3RvcnkgaXMgbm90IE5vbmUpCiAgICAgICAgc3Rba2V5XSA9ICh0cmFqZWN0b3J5LCBlcnJvcl9tc2cpCiAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICByZXR1cm4gKHRyYWplY3RvcnksIHBsYW5lcywgcG9seWxpbmUsIGRlYnVnX2luZm8pCg== - COMPAS FAB: Plan Motion - - - - - *.*.python - 3.* - - - - - - - - 535 - 149 - 550 - 700 - - - - - - - - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Robot Configuration - - - - - - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB4UlEQVRIDWNgoDFgRDb/////UUB+5q3bd63//fuHIoesDhubiYnpv5qq8lGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYBzdv3QEGOfYwX3T/JdiuOEVxkuwExYm6mgoTC0gXzPBLl68wvH79Bm7Q9F8cDFf/gZUwbLp5nyGT7QdcDhdDVFSEQU9XB24mRDdU9bSZcxjev/8A13s1OgfBBlo0a+4COB8XQ1BQgGHGlAlwaRQLstJT0HzwB+4DbaY/DGnJCXCNuBggHyADFAtAXkMGzkAOuXEAMwfFApggMo0eueufvGFouPIQrKRBR54hUAbVxch6QWxwKrp+49Z/EKe9q5fh4aPHICZOcNgjiuEfEyR1M/37x2C7A55pwXrk5WQZKssg+VVTQ40Rlg9wGkipBIoPiDGMlCAC+YBgHMAsRY5sQuEO0wOiUSxAz2gwhaRkOFhGg+lFsQA9o8EUkZLhSMpoMAum/yI+w2HNaKCCCVQeoWc0mAXkZDiQmSD94FQErA8OA+sDG5iB1KCB9cERYH1gC8sH06lhKJoZYDPBFoBqHlA1h6aAbC60ygRncXAQwUyiRaUPM5tmNACVDsEtgc8jGAAAAABJRU5ErkJggg== - - 41a87a38-d6ed-4fa3-8ce0-56d36c64d779 - true - false - true - COMPAS FAB: Robot Configuration - COMPAS FAB: Robot Configuration - 3 - - false - false - false - false - - - - - - 2281 - 242 - 155 - 44 - - - 2349 - 264 - - - - - - 2 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 2 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - - - true - The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints. - c13b9e93-0236-4827-908f-9e3625b9c970 - robot_cell - robot_cell - true - 0 - 2 - true - c4c3df53-0a94-4574-afc8-9e68cb15bc46 - 1 - The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2283 - 244 - 51 - 20 - - - 2310 - 254 - - - - - - System.Private.CoreLib - System.Object - - - - - - - 1 - true - Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override. - 352d1cbf-fc57-4fd2-afc5-b31c624b77c2 - joints - joints - true - 1 - 2 - true - 6c63291c-1328-4b53-8824-3fabe85dcaea - e1f2d3c9-448c-4325-9962-093ce24f4b6d - 6908f732-c3c1-46cf-b28f-d05e55442514 - 7d720b2e-cb1b-4d13-8e07-b58ef0a2ca4e - a16adbc8-88dd-44fa-85a8-ef79e4a1e8b0 - ba57b42f-a73d-48dc-9c86-b258615889b2 - 6 - Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override. - 9d51e32e-c038-4352-9554-f4137ca91b9a - - - - - - 2283 - 264 - 51 - 20 - - - 2310 - 274 - - - - - - System.Private.CoreLib - System.Double - - - - - - - false - Configuration with joint_names and joint_types extracted from the cell. - e3aeb9d7-fd12-419f-82da-1a5c3e5fda0d - configuration - configuration - false - 0 - 2 - true - 0 - Configuration with joint_names and joint_types extracted from the cell. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2364 - 244 - 70 - 20 - - - 2399 - 254 - - - - - - System.Private.CoreLib - System.Object - - - - - - - false - A copy of the default cell state with `robot_configuration` set to the selected configuration. - e3d8b137-b6b2-491f-a175-53c88474afd2 - cell_state - cell_state - false - 0 - 2 - true - 0 - A copy of the default cell state with `robot_configuration` set to the selected configuration. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 2364 - 264 - 70 - 20 - - - 2399 - 274 - - - - - - System.Private.CoreLib - System.Object - - - - - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpCdWlsZCBhIENvbmZpZ3VyYXRpb24gZnJvbSBwZXItam9pbnQgc2xpZGVycyBhdXRvLWNyZWF0ZWQgZnJvbSBhIFJvYm90Q2VsbC4KCldpcmUgYSBgcm9ib3RfY2VsbGAgdG8gdGhpcyBjb21wb25lbnQgYW5kIG9uZSBgR0hfTnVtYmVyU2xpZGVyYCBwZXIKY29uZmlndXJhYmxlIGpvaW50IGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGFuZCB3aXJlZCB0byB0aGUgYGpvaW50c2AKbGlzdCBpbnB1dCwgd2l0aCBtaW4vbWF4IHNldCB0byB0aGUgam9pbnQncyBsaW1pdHMgKGFuZCDCsTLPgCBmYWxsYmFjayBmb3IKY29udGludW91cyBqb2ludHMgLyDCsTFtIGZvciBwcmlzbWF0aWMgd2hlbiBubyBsaW1pdCBpcyBkZWNsYXJlZCkuCgpSZS13aXJpbmcgYSBkaWZmZXJlbnQgYHJvYm90X2NlbGxgIHJlcGxhY2VzIHRoZSBzbGlkZXIgYmFuayB0byBtYXRjaCB0aGUKbmV3IGpvaW50IHNpZ25hdHVyZS4gV2lyaW5nIHlvdXIgb3duIHZhbHVlcyB0byBgam9pbnRzYCBvdmVycmlkZXMgdGhlCmF1dG8tc2xpZGVycy4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIGNvbXBhc19yb2JvdHMgaW1wb3J0IENvbmZpZ3VyYXRpb24KCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2pvaW50X3NsaWRlcnMKCgpjbGFzcyBSb2JvdENvbmZpZ3VyYXRpb25Db21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgcm9ib3RfY2VsbCwgam9pbnRzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W2Zsb2F0XSk6CiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAicm9ib3RfY2VsbCBtdXN0IGJlIGEgUm9ib3RDZWxsIGluc3RhbmNlLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgbWV0YWRhdGEgPSBlbnN1cmVfam9pbnRfc2xpZGVycyhnaGVudi5Db21wb25lbnQsIHJvYm90X21vZGVsLCBpbnB1dF9uYW1lPSJqb2ludHMiKSAgIyBub3FhOiBGODIxCiAgICAgICAgaWYgbm90IG1ldGFkYXRhOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBuYW1lcyA9IFtuYW1lIGZvciBuYW1lLCBfLCBfIGluIG1ldGFkYXRhXQogICAgICAgIHR5cGVzID0gW2p0eXBlIGZvciBfLCBqdHlwZSwgXyBpbiBtZXRhZGF0YV0KICAgICAgICBkZWZhdWx0cyA9IFtkZWZhdWx0IGZvciBfLCBfLCBkZWZhdWx0IGluIG1ldGFkYXRhXQoKICAgICAgICAjIGBqb2ludHNgIG1heSBhcnJpdmUgZW1wdHkgb24gdGhlIHZlcnkgZmlyc3Qgc29sdmUgKHNsaWRlcnMgYXJlCiAgICAgICAgIyB3aXJlZCBpbiB0aGlzIHBhc3MgYnV0IHRoZWlyIHZhbHVlcyBvbmx5IGZsb3cgb24gdGhlIHNjaGVkdWxlZAogICAgICAgICMgZm9sbG93LXVwIHNvbHZlKS4gRmFsbCBiYWNrIHRvIHBlci1qb2ludCBkZWZhdWx0cyB0aGVuLgogICAgICAgIGlmIG5vdCBqb2ludHMgb3IgbGVuKGpvaW50cykgPCBsZW4obWV0YWRhdGEpOgogICAgICAgICAgICB2YWx1ZXMgPSBkZWZhdWx0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlcyA9IFtmbG9hdCh2KSBmb3IgdiBpbiBqb2ludHNdCgogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uKGpvaW50X3ZhbHVlcz12YWx1ZXMsIGpvaW50X3R5cGVzPXR5cGVzLCBqb2ludF9uYW1lcz1uYW1lcykKICAgICAgICBjZWxsX3N0YXRlID1yb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCiAgICAgICAgY2VsbF9zdGF0ZS5yb2JvdF9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgogICAgICAgIHJldHVybiAoY29uZmlndXJhdGlvbiwgY2VsbF9zdGF0ZSkKCg== - COMPAS FAB: Robot Configuration - - - - - *.*.python - 3.* + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yCiIiIgpCdWlsZCBhIENvbmZpZ3VyYXRpb24gZnJvbSBwZXItam9pbnQgc2xpZGVycyBhdXRvLWNyZWF0ZWQgZnJvbSBhIFJvYm90Q2VsbC4KCldpcmUgYSBgcm9ib3RfY2VsbGAgdG8gdGhpcyBjb21wb25lbnQgYW5kIG9uZSBgR0hfTnVtYmVyU2xpZGVyYCBwZXIKY29uZmlndXJhYmxlIGpvaW50IGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGFuZCB3aXJlZCB0byB0aGUgYGpvaW50c2AKbGlzdCBpbnB1dCwgd2l0aCBtaW4vbWF4IHNldCB0byB0aGUgam9pbnQncyBsaW1pdHMgKGFuZCDCsTLPgCBmYWxsYmFjayBmb3IKY29udGludW91cyBqb2ludHMgLyDCsTFtIGZvciBwcmlzbWF0aWMgd2hlbiBubyBsaW1pdCBpcyBkZWNsYXJlZCkuCgpSZS13aXJpbmcgYSBkaWZmZXJlbnQgYHJvYm90X2NlbGxgIHJlcGxhY2VzIHRoZSBzbGlkZXIgYmFuayB0byBtYXRjaCB0aGUKbmV3IGpvaW50IHNpZ25hdHVyZS4gV2lyaW5nIHlvdXIgb3duIHZhbHVlcyB0byBgam9pbnRzYCBvdmVycmlkZXMgdGhlCmF1dG8tc2xpZGVycy4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIGNvbXBhc19yb2JvdHMgaW1wb3J0IENvbmZpZ3VyYXRpb24KCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2pvaW50X3NsaWRlcnMKCgpjbGFzcyBSb2JvdENvbmZpZ3VyYXRpb25Db21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgcm9ib3RfY2VsbCwgam9pbnRzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W2Zsb2F0XSk6CiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAicm9ib3RfY2VsbCBtdXN0IGJlIGEgUm9ib3RDZWxsIGluc3RhbmNlLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgbWV0YWRhdGEgPSBlbnN1cmVfam9pbnRfc2xpZGVycyhnaGVudi5Db21wb25lbnQsIHJvYm90X21vZGVsLCBpbnB1dF9uYW1lPSJqb2ludHMiKSAgIyBub3FhOiBGODIxCiAgICAgICAgaWYgbm90IG1ldGFkYXRhOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBuYW1lcyA9IFtuYW1lIGZvciBuYW1lLCBfLCBfIGluIG1ldGFkYXRhXQogICAgICAgIHR5cGVzID0gW2p0eXBlIGZvciBfLCBqdHlwZSwgXyBpbiBtZXRhZGF0YV0KICAgICAgICBkZWZhdWx0cyA9IFtkZWZhdWx0IGZvciBfLCBfLCBkZWZhdWx0IGluIG1ldGFkYXRhXQoKICAgICAgICAjIGBqb2ludHNgIG1heSBhcnJpdmUgZW1wdHkgb24gdGhlIHZlcnkgZmlyc3Qgc29sdmUgKHNsaWRlcnMgYXJlCiAgICAgICAgIyB3aXJlZCBpbiB0aGlzIHBhc3MgYnV0IHRoZWlyIHZhbHVlcyBvbmx5IGZsb3cgb24gdGhlIHNjaGVkdWxlZAogICAgICAgICMgZm9sbG93LXVwIHNvbHZlKS4gRmFsbCBiYWNrIHRvIHBlci1qb2ludCBkZWZhdWx0cyB0aGVuLgogICAgICAgIGlmIG5vdCBqb2ludHMgb3IgbGVuKGpvaW50cykgPCBsZW4obWV0YWRhdGEpOgogICAgICAgICAgICB2YWx1ZXMgPSBkZWZhdWx0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlcyA9IFtmbG9hdCh2KSBmb3IgdiBpbiBqb2ludHNdCgogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uKGpvaW50X3ZhbHVlcz12YWx1ZXMsIGpvaW50X3R5cGVzPXR5cGVzLCBqb2ludF9uYW1lcz1uYW1lcykKICAgICAgICBjZWxsX3N0YXRlID1yb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCiAgICAgICAgY2VsbF9zdGF0ZS5yb2JvdF9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgogICAgICAgIHJldHVybiAoY29uZmlndXJhdGlvbiwgY2VsbF9zdGF0ZSkKCg== + COMPAS FAB: Robot Configuration + + + + + *.*.python + 3.* @@ -5844,7 +5565,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -5885,7 +5606,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -5926,7 +5647,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -5967,7 +5688,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -6008,7 +5729,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -6049,7 +5770,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -6090,7 +5811,7 @@ - + ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278 Geometry @@ -6126,7 +5847,7 @@ - + ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278 Geometry @@ -6143,21 +5864,330 @@ a10405c9-71de-4f11-861b-bd07a05b37f3 1 - + + + + + 2999 + 90 + 50 + 24 + + + 3024.5435 + 102 + + + + + + + + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + COMPAS FAB: Tool From Mesh + + + + + Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input. + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABq0lEQVRIDbVVsU7DMBB1Ch+A1ArWDoUWZjaKBH+AoF35BLoCQkJICJiQ+gcsDKgB8Q/AxgwtdGNgAxYkWBruHZxlEjtx1PaG+Ox7996drdhKjdkCkz+KogbNW72n/hL5/2ImzuYHQRBV5yp3FGuTHwpGkxDhUbf3vCOBYcZadfaYRHbBwQKonMg7w5DGc0mkiU4Kf4FWHDCCOXNyB1T9IO+eZxWAM6EuCpMAxskPDk/Uw2M3i0PH9/e21cJ8Tc/hCKdskQ6COA+5TnQ4CQFUEq8GuaiyubGWoMGaDS/AhAACNiJsW+fyWvK8R6uA2YWtOllDIY31ZFemulUAALOLi/MzLLHBlzPKIkeCU0C6iB96ePW7TWYBrOz4OAWAFxJz78X3qR4cqQJmFwCLibDM08ZUASTayHyrRz7/yXBchi4gcvr6qSa+v9RWueiCWtczBZBVrK+o9/s+E5QWK1Yi1yIL4GKSu8MGXJ2eUpvlGfXy9qHg+xg4gZP34IZu1LpPoi+GbtJbElmWQ277JubAMScLkFKIZy5HcioUXOAESL/JmNA5jPzRB+9Y7Qe0HI6ecIyijwAAAABJRU5ErkJggg== + + 1f179f42-a302-4b46-a703-cf43ac8ec09f + true + false + true + COMPAS FAB: Tool From Mesh + COMPAS FAB: Tool From Mesh + 3 + + false + false + false + false + + - 2999 - 90 - 50 - 24 + 667 + 116 + 167 + 104 - 3024.5435 - 102 + 758 + 168 + + + 5 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 1 + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. + 3600fb81-ca56-4008-a0c8-ce0d7dfbda77 + name + name + true + 0 + 2 + true + b1d6bdbb-bbbc-482e-9851-581e5580f4a9 + 1 + Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + + + + + + 669 + 118 + 74 + 20 + + + 707.5 + 128 + + + + + + System.Private.CoreLib + System.String + + + + + + + true + Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). + 0ef05760-9985-44e6-9fb4-0a0b0f4d84f7 + visual_mesh + visual_mesh + true + 0 + 2 + true + de7ea5f7-f04b-48c8-80ca-659046e21818 + 1 + Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 138 + 74 + 20 + + + 707.5 + 148 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. + 56f882fb-6daf-4f6c-af1f-f4f991da3e98 + collision_mesh + collision_mesh + true + 0 + 2 + true + de7ea5f7-f04b-48c8-80ca-659046e21818 + 1 + Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 158 + 74 + 20 + + + 707.5 + 168 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in. + 79e726f7-b446-4461-81b5-d88988f92338 + tcp_plane + tcp_plane + true + 0 + 2 + true + 3e07e26f-7364-466c-bf58-2608d206128a + 1 + Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 178 + 74 + 20 + + + 707.5 + 188 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame. + 7c1b078d-551b-4b71-8b7d-2b040373be5c + base_plane + base_plane + true + 0 + 2 + true + 0 + Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 198 + 74 + 20 + + + 707.5 + 208 + + + + + + System.Private.CoreLib + System.Object + + + + + + + false + ToolModel. + 3e1a6509-8a44-43de-bc75-d31a76526dbe + tool_model + tool_model + false + 0 + 2 + true + 0 + ToolModel. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 773 + 118 + 59 + 100 + + + 802.5 + 168 + + + + + + System.Private.CoreLib + System.Object + + + + + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yLjAuMQoiIiIKQ29uc3RydWN0IGEgVG9vbE1vZGVsIGZyb20gYSBSaGlubyBtZXNoIGFuZCBhIFRDUCBwbGFuZS4KCmB0Y3BfcGxhbmVgIG1heSBiZSBhIFJoaW5vIFBsYW5lIG9yIGEgY29tcGFzIEZyYW1lOyBpdCBpcyB0aGUgVG9vbApDb29yZGluYXRlIEZyYW1lLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIHRoZSBtZXNoCmluLiBJZiBgY29sbGlzaW9uX21lc2hgIGlzIHVud2lyZWQsIGB2aXN1YWxfbWVzaGAgaXMgcmV1c2VkIGZvciBjb2xsaXNpb24KY2hlY2tzLgoKYGJhc2VfcGxhbmVgIGlzIHdoZXJlIHRoZSByb2JvdCdzIGZsYW5nZSB0YWtlcyBob2xkIG9mIHRoZSBnZW9tZXRyeSwgYWxzbwppbiB0aGUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIGluLiBJdHMgWiBheGlzIHBvaW50cyBhd2F5IGZyb20gdGhlIHJvYm90LAptYXRjaGluZyB0aGUgcGxhbm5pbmcgZ3JvdXBzIG9mIHRoZSByb2JvdHMgaW4gdGhlIGxpYnJhcnksIHNvIGEgdG9vbCBkcmF3bgpyZWFjaGluZyBhbG9uZyB3b3JsZCBaIG5lZWRzIG5vIGBiYXNlX3BsYW5lYCBhdCBhbGwuIFdpcmUgb25lIHdoZW4gdGhlIHRvb2wKd2FzIGRyYXduIGFsb25nIGFub3RoZXIgYXhpczogZm9yIGEgdG9vbCByZWFjaGluZyBhbG9uZyB3b3JsZCBYLCB0aGF0IGlzCnRoZSBwbGFuZSB3aXRoIFogPSB3b3JsZCBYLiBOb3RoaW5nIGlzIGJha2VkIGludG8gdGhlIG1lc2gsIHNvIHRoZSBwbGFuZQpjYW4gYmUgcmUtd2lyZWQgYXQgYW55IHRpbWUuCgpBIHJlbWFyayBpcyBzdXJmYWNlZCB3aGVuIHRoZSBUQ1AgZG9lcyBub3Qgc2l0IHJvdWdobHkgb24gdGhlIHRvb2wncyArWiwKc2luY2UgdGhhdCBtZWFucyB0aGUgdG9vbCB3aWxsIHBvaW50IHNpZGV3YXlzIG9uY2UgYXR0YWNoZWQuCgpUaGUgcmVzdWx0IGlzIGEgc3RhdGljIChubyBqb2ludHMpIGBUb29sTW9kZWxgIHJlYWR5IHRvIGZlZWQgaW50byBhCmBMb2FkIFJvYm90IENlbGxgIGNvbXBvbmVudCdzIGB0b29sc2AgaW5wdXQuIEtpbmVtYXRpYyB0b29scyAod2l0aCB0aGVpcgpvd24gam9pbnRzKSBzaG91bGQgYmUgbG9hZGVkIGZyb20gVVJERiBpbnN0ZWFkLgoKQ09NUEFTIEZBQiB2Mi4wLjEgKGJ1aWx0IDIwMjYtMDgtMDMgMTU6MzAgVVRDKQoiIiIKCmZyb20gbWF0aCBpbXBvcnQgZGVncmVlcwoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgcmhpbm9zY3JpcHRzeW50YXggYXMgcnMKaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhcy5nZW9tZXRyeSBpbXBvcnQgRnJhbWUKZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IFZlY3Rvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgcmVtYXJrCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCiMgQmV5b25kIHRoaXMgYW5nbGUgYmV0d2VlbiB0aGUgdG9vbCdzICtaIGFuZCBpdHMgVENQLCB0aGUgdG9vbCBpcyBjb25zaWRlcmVkCiMgdG8gYmUgcG9pbnRpbmcgc29tZXdoZXJlIG90aGVyIHRoYW4gYXdheSBmcm9tIHRoZSBmbGFuZ2UuCk1BWF9UQ1BfT0ZGX0FYSVNfQU5HTEUgPSAzMC4wCgoKZGVmIF9vZmZfYXhpc19yZW1hcmsodG9vbCk6CiAgICAiIiJUZXh0IGZvciB0aGUgbW91bnRpbmctYXhpcyByZW1hcmssIG9yIE5vbmUgd2hlbiB0aGUgdG9vbCBsb29rcyBmaW5lLgoKICAgIFRoZSBUQ1AgZGlyZWN0aW9uIGlzIG9ubHkgYSBoaW50OiBpdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJvbGwgb2YgdGhlIHRvb2wKICAgIGFuZCBpcyBtZWFuaW5nbGVzcyBmb3IgYSBUQ1Agc2l0dGluZyBvbiB0aGUgbW91bnQgaXRzZWxmLCBzbyBpdCBpcyByZXBvcnRlZAogICAgcmF0aGVyIHRoYW4gYXBwbGllZC4KICAgICIiIgogICAgdGNwX2RpcmVjdGlvbiA9IFZlY3RvcigqdG9vbC5mcmFtZS5wb2ludCkKICAgIGlmIHRjcF9kaXJlY3Rpb24ubGVuZ3RoIDwgMWUtNjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFuZ2xlID0gZGVncmVlcyh0Y3BfZGlyZWN0aW9uLmFuZ2xlKFZlY3Rvci5aYXhpcygpKSkKICAgIGlmIGFuZ2xlIDwgTUFYX1RDUF9PRkZfQVhJU19BTkdMRToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG1lc3NhZ2UgPSAoIlRDUCBzaXRzIHs6LjBmfSBkZWcgb2ZmIHRoZSB0b29sJ3MgK1ogYXhpcywgc28gdGhpcyB0b29sIHdpbGwgcG9pbnQgc2lkZXdheXMgb25jZSBhdHRhY2hlZDogdG9vbHMgbW91bnQgd2l0aCArWiBwb2ludGluZyBhd2F5IGZyb20gdGhlIGZsYW5nZS4gIikuZm9ybWF0KGFuZ2xlKQoKICAgIHVuaXRpemVkID0gdGNwX2RpcmVjdGlvbi51bml0aXplZCgpCiAgICBpZiBhYnModW5pdGl6ZWQueCkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFgsIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWCAob3JpZ2luLCB4PSgwLDEsMCksIHk9KDAsMCwxKSkuIgogICAgZWxpZiBhYnModW5pdGl6ZWQueSkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFksIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWSAob3JpZ2luLCB4PSgwLDAsMSksIHk9KDEsMCwwKSkuIgogICAgZWxzZToKICAgICAgICBtZXNzYWdlICs9ICJTZXQgYGJhc2VfcGxhbmVgIHRvIGEgcGxhbmUgd2hvc2UgWiBheGlzIHJ1bnMgYWxvbmcgeW91ciB0b29sLCB3aXRoIGl0cyBYIGF4aXMgcGlja2VkIHRvIGdpdmUgdGhlIHJvbGwgeW91IHdhbnQuIgogICAgcmV0dXJuIG1lc3NhZ2UKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgbmFtZTogc3RyLAogICAgICAgICAgICB2aXN1YWxfbWVzaCwKICAgICAgICAgICAgY29sbGlzaW9uX21lc2gsCiAgICAgICAgICAgIHRjcF9wbGFuZSwKICAgICAgICAgICAgYmFzZV9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgYmFzZV9mcmFtZSA9IE5vbmUKICAgICAgICBpZiBiYXNlX3BsYW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBiYXNlX2ZyYW1lID0gYmFzZV9wbGFuZSBpZiBpc2luc3RhbmNlKGJhc2VfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZShiYXNlX3BsYW5lKQogICAgICAgIGNfdmlzdWFsID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaCh2aXN1YWxfbWVzaCkpIGlmIHZpc3VhbF9tZXNoIGVsc2UgTm9uZQogICAgICAgIGNfY29sbGlzaW9uID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaChjb2xsaXNpb25fbWVzaCkpIGlmIGNvbGxpc2lvbl9tZXNoIGVsc2UgTm9uZQoKICAgICAgICBpZiBjb2xsaXNpb25fbWVzaCBpcyBOb25lOgogICAgICAgICAgICBnaF93YXJuaW5nKGdoZW52LkNvbXBvbmVudCwgIk5vIGNvbGxpc2lvbiBtZXNoIHByb3ZpZGVkOiB0aGUgdG9vbCB3aWxsIGJlIHZpc3VhbGl6ZWQgYnV0IGlnbm9yZWQgZm9yIGNvbGxpc2lvbiBjaGVja2luZy4iKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgYGJhc2VfZnJhbWVgIGlzIG9ubHkgcGFzc2VkIHdoZW4gd2lyZWQsIHNvIGFuIG9sZGVyIGNvbXBhc19yb2JvdHMga2VlcHMKICAgICAgICAjIHdvcmtpbmcgZm9yIGRlZmluaXRpb25zIHRoYXQgZG9uJ3QgdXNlIGl0LgogICAgICAgIGt3YXJncyA9IHsiYmFzZV9mcmFtZSI6IGJhc2VfZnJhbWV9IGlmIGJhc2VfZnJhbWUgZWxzZSB7fQogICAgICAgIHRvb2wgPSBUb29sTW9kZWwoCiAgICAgICAgICAgIHZpc3VhbD1jX3Zpc3VhbCwKICAgICAgICAgICAgZnJhbWVfaW5fdG9vbDBfZnJhbWU9ZnJhbWUsCiAgICAgICAgICAgIGNvbGxpc2lvbj1jX2NvbGxpc2lvbiwKICAgICAgICAgICAgbmFtZT0obmFtZSBvciAiYXR0YWNoZWRfdG9vbCIpLnN0cmlwKCksCiAgICAgICAgICAgICoqa3dhcmdzLAogICAgICAgICkKCiAgICAgICAgbWVzc2FnZSA9IF9vZmZfYXhpc19yZW1hcmsodG9vbCkKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICByZW1hcmsoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCgogICAgICAgIHJldHVybiB0b29sCg== + COMPAS FAB: Tool From Mesh + + + + + *.*.python + 3.* + + + + @@ -6169,7 +6199,7 @@ - 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 diff --git a/docs/frontends/ghpython/files/05_kitchen_sink.ghx b/docs/frontends/ghpython/files/05_kitchen_sink.ghx index b62a277c23..b19a088e8e 100644 --- a/docs/frontends/ghpython/files/05_kitchen_sink.ghx +++ b/docs/frontends/ghpython/files/05_kitchen_sink.ghx @@ -21,9 +21,10 @@ - + 17611819-bff5-48ff-80f8-ac42d6319de3 Shaded + Selection 1 100;150;0;0 @@ -49,10 +50,10 @@ - 133 - 234 + 168 + 177 - 0.22059527 + 0.1745186 @@ -77,7 +78,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -85,7 +86,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -93,7 +94,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -101,7 +102,7 @@ Robert McNeel & Associates 00000000-0000-0000-0000-000000000000 Grasshopper - 8.32.26160.13002 + 8.33.26188.13002 @@ -158,11 +159,11 @@ 0.4937036997233545 0.056971871730282335 0.5034884601000649 - 1 - 0 + 0.36964280868381477 + -0.9291739309668243 0 - 0 - -1 + -0.9291739309668243 + -0.36964280868381477 0 @@ -308,7 +309,7 @@ 100 0 0 - 12 + 0 @@ -987,70 +988,6 @@ - - 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 - Plane - - - - - Contains a collection of three-dimensional axis-systems - c3986e21-f43e-45b1-99c4-13cd41951b9b - Plane - target plane (IK) - false - 0 - - - - - - 1991 - 969 - 50 - 24 - - - 2016.6895 - 981.8627 - - - - - - 1 - - - - - 1 - {0} - - - - - - 0.36353384210999135 - 0 - 0.354596250621197 - 1 - 0 - 0 - 0 - -1 - 0 - - - - - - - - - - - - 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1087,7 +1024,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1124,14 +1061,14 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group - + 1 198;217;216;237 @@ -1193,7 +1130,8 @@ 3e570305-eb5d-43c4-a5c6-9a5914fde9ed 00b4398a-522a-4426-bceb-c8b4eb2df50a d833948b-a8e4-440a-87e5-eb1fb8831e21 - 56 + 03a3f0bd-ed2a-4964-bb43-3f73e45819ea + 57 498dbb65-c5f7-4346-9421-b403afe1c0e1 Group Inverse Kinematics to frame target @@ -1204,7 +1142,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1241,7 +1179,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1277,7 +1215,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1314,7 +1252,7 @@ - + b6236720-8d88-4289-93c3-ac4c99f9b97b Relay @@ -1350,7 +1288,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -1438,7 +1376,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1474,7 +1412,7 @@ - + 59daf374-bc21-4a5e-8282-5504fb7ae9ae List Item @@ -1667,7 +1605,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1704,7 +1642,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1741,7 +1679,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -1778,7 +1716,7 @@ - + 719467e6-7cf5-4848-99b0-c5dd57e5442c Python 3 Script @@ -2173,7 +2111,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -2218,7 +2156,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -2263,7 +2201,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -2308,7 +2246,7 @@ - + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a Boolean Toggle @@ -2339,7 +2277,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -2384,7 +2322,7 @@ - + 59daf374-bc21-4a5e-8282-5504fb7ae9ae List Item @@ -2577,7 +2515,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -2663,7 +2601,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -2715,7 +2653,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -2767,7 +2705,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -2819,7 +2757,7 @@ - + 3cadddef-1e2b-4c09-9390-0e8f78f7609f Merge @@ -2977,7 +2915,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3014,7 +2952,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3050,7 +2988,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3087,7 +3025,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3124,7 +3062,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3160,7 +3098,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3197,7 +3135,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -3242,7 +3180,7 @@ - + 59daf374-bc21-4a5e-8282-5504fb7ae9ae List Item @@ -3435,7 +3373,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -3514,7 +3452,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3550,7 +3488,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -3602,7 +3540,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -3654,7 +3592,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -3706,7 +3644,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -3743,7 +3681,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -3860,7 +3798,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -3882,7 +3820,7 @@ 528 - 223 + 241 50 20 @@ -3890,8 +3828,8 @@ 0 0 - 528.39716 - 223.43997 + 528.3352 + 241.43997 @@ -3912,7 +3850,7 @@ - + 1e936df3-0eea-4246-8549-514cb8862b7a Mesh @@ -3956,7 +3894,7 @@ - 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 6 00000000-0000-0000-0000-000000000000 @@ -3970,7 +3908,7 @@ - + 17b7152b-d30d-4d50-b9ef-c9fe25576fc2 XY Plane @@ -4079,7 +4017,7 @@ - + 00027467-0d24-4fa7-b178-8dc0ac5f42ec Value List @@ -4136,7 +4074,7 @@ - + 00027467-0d24-4fa7-b178-8dc0ac5f42ec Value List @@ -4179,7 +4117,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4215,14 +4153,14 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group - + 1 198;217;216;237 @@ -4254,7 +4192,8 @@ 0855e543-9f77-4823-8f21-2b134bc4fca3 9c92c74a-5e86-436d-874f-a0030c6dab03 14762c92-f1ae-4fe4-98ab-802dc2b518e2 - 26 + 731b0e88-d4e4-4632-bf0c-a84ce6be437d + 27 1ca67453-7fdd-4978-814c-31ac691a83ba Group Prepare robot cell elements @@ -4265,7 +4204,7 @@ - + 59e0b89a-e487-49f8-bab8-b5bab16be14c Panel @@ -4317,7 +4256,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -4362,7 +4301,7 @@ - + 00027467-0d24-4fa7-b178-8dc0ac5f42ec Value List @@ -4419,7 +4358,7 @@ - + 00027467-0d24-4fa7-b178-8dc0ac5f42ec Value List @@ -4476,7 +4415,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4513,7 +4452,7 @@ - + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a Boolean Toggle @@ -4544,7 +4483,7 @@ - + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a Boolean Toggle @@ -4575,7 +4514,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4612,7 +4551,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4649,7 +4588,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4686,7 +4625,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4723,7 +4662,7 @@ - + 00027467-0d24-4fa7-b178-8dc0ac5f42ec Value List @@ -4780,7 +4719,7 @@ - + 8ec86459-bf01-4409-baee-174d0d2b13d0 Data @@ -4817,7 +4756,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -4830,7 +4769,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== 3395d76e-3f13-4b26-ba34-d20894cd52cc true @@ -5252,7 +5191,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -5265,7 +5204,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== 879f838f-40fa-475b-a82f-c6514e3d7044 true @@ -5687,7 +5626,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Deconstruct Trajectory @@ -5699,7 +5638,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDb1VvU4CQRDeI1Y8gj9oAxz4CPoEVkShM6E10QQLE5WYGBODmtiY6FOAhpcwUUoT4Q4q8afTxoTSc7/xhuwee/EAcZvZmfnm+2bvZ0eICS9L5fc8Ly/9Uvf5danX62k5FWfax+NxLzE3cytzF5Zl1RjTJ5HkFcft7HNiHGunkydSpAwOEkDnkrw6DmmwVooUcJKYnygFAX/gEyed4Kn78jXsM+cGmi2HttmMzSGyeCfzidnYFLww8rBiZqrd1EX1us6uKKzlRH41Rz5z0glaTtvro+QGxChkAeTUYjWPzheztiZ0eLAnEM/YKUsTCHZkKkaMhVVRNIH6x6YjIIClCaDo6PiUEiBBMSwvVdyUZ5xqNQEkIKKSqmDeR8EwdkCAE8Paq84blWwmp7VSCNBXpEUNThgBQy9DBJDnH42xRgsCJgGg8fFpxJmCRoHfCIp3rijeuya+gZhRIApB4z3aKYwCaCMqwUDLgUCoQAA3sktfES6mytm55bjtH6KVdbIbW9sj+XY6Jcq7O3T9kIA/iZa5zYXOA2/JDuujyOf8p4GDyYMxp7U9huOPTJrLdJsy1ySGPnNPzH4DnVnW4pC0cHgAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDb1VvU4CQRDeI3a8AYqxAQ58BH0CK6LQmdCaaIKNCf4kxsQfEisTfQrQ8BImSmki3EEnSqeNofXcb7whu8dePEDcZnZmvvm+2fvZEWLGy1L5Pc8rSL/ce+2vDAYDLafiTPt4PO4lFxL3MndlWVadMUMSSX7uuN19Tkxj7UzqQoocgIME0Lkkr01DGqyVIkWcJOYnykHAH/jESSd46b19jfvMuYFW26FtLmtziCzeyWJyPjYHL4w8rJiZ6ncNUbttsCuKG3lRWM+Tz5x0grbT8YYouQExClkAObVYzaPz5ZytCR0fVQTiWTttaQLBjkzFiLGwKoomUP/ccgQEsDQBFJ2cVikBEhTD8lLFTXnGqVYTQAIiKqkK5n0UDGNHBDgxrr3p9qlkO5XQSiFAX5EWNThhBAy9DhFAnn80xhotCJgEgObHpxFnChoFfiMoPbii9Oia+EZiRoEoBM33aKcwCqCNqAQjLQcCoQIB3MQufUW4mM6ql5bjdn6I1jbJbu3sTuTbmbQ4rOzR9UMC/iRa5TaXuk+8JTuujyKf858GDiYPxpzW9hSOPzJpLtNtylyzGPrMPTP7DXFn1tne6IQrAAAAAElFTkSuQmCC 282367d0-3f19-41d2-8c3e-903cdb22e13b true @@ -6003,7 +5942,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -6016,7 +5955,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== 3e570305-eb5d-43c4-a5c6-9a5914fde9ed true @@ -6438,7 +6377,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Deconstruct Trajectory @@ -6450,7 +6389,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDb1VvU4CQRDeI1Y8gj9oAxz4CPoEVkShM6E10QQLE5WYGBODmtiY6FOAhpcwUUoT4Q4q8afTxoTSc7/xhuwee/EAcZvZmfnm+2bvZ0eICS9L5fc8Ly/9Uvf5danX62k5FWfax+NxLzE3cytzF5Zl1RjTJ5HkFcft7HNiHGunkydSpAwOEkDnkrw6DmmwVooUcJKYnygFAX/gEyed4Kn78jXsM+cGmi2HttmMzSGyeCfzidnYFLww8rBiZqrd1EX1us6uKKzlRH41Rz5z0glaTtvro+QGxChkAeTUYjWPzheztiZ0eLAnEM/YKUsTCHZkKkaMhVVRNIH6x6YjIIClCaDo6PiUEiBBMSwvVdyUZ5xqNQEkIKKSqmDeR8EwdkCAE8Paq84blWwmp7VSCNBXpEUNThgBQy9DBJDnH42xRgsCJgGg8fFpxJmCRoHfCIp3rijeuya+gZhRIApB4z3aKYwCaCMqwUDLgUCoQAA3sktfES6mytm55bjtH6KVdbIbW9sj+XY6Jcq7O3T9kIA/iZa5zYXOA2/JDuujyOf8p4GDyYMxp7U9huOPTJrLdJsy1ySGPnNPzH4DnVnW4pC0cHgAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDb1VvU4CQRDeI3a8AYqxAQ58BH0CK6LQmdCaaIKNCf4kxsQfEisTfQrQ8BImSmki3EEnSqeNofXcb7whu8dePEDcZnZmvvm+2fvZEWLGy1L5Pc8rSL/ce+2vDAYDLafiTPt4PO4lFxL3MndlWVadMUMSSX7uuN19Tkxj7UzqQoocgIME0Lkkr01DGqyVIkWcJOYnykHAH/jESSd46b19jfvMuYFW26FtLmtziCzeyWJyPjYHL4w8rJiZ6ncNUbttsCuKG3lRWM+Tz5x0grbT8YYouQExClkAObVYzaPz5ZytCR0fVQTiWTttaQLBjkzFiLGwKoomUP/ccgQEsDQBFJ2cVikBEhTD8lLFTXnGqVYTQAIiKqkK5n0UDGNHBDgxrr3p9qlkO5XQSiFAX5EWNThhBAy9DhFAnn80xhotCJgEgObHpxFnChoFfiMoPbii9Oia+EZiRoEoBM33aKcwCqCNqAQjLQcCoQIB3MQufUW4mM6ql5bjdn6I1jbJbu3sTuTbmbQ4rOzR9UMC/iRa5TaXuk+8JTuujyKf858GDiYPxpzW9hSOPzJpLtNtylyzGPrMPTP7DXFn1tne6IQrAAAAAElFTkSuQmCC ca756bd4-082c-4396-bc07-2044a7451bd3 true @@ -6754,7 +6693,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -6767,7 +6706,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VCx5BQSUpZCUlQ2egKmC8hQgdaUICSEhYK0ET0FBnXgDNsRIA10ooL5CNsJ9Jo7uDqdpWmrp6jv/fD7bzVmpOZNn4idJ0tTn1vDjayuOY0tn2kl73/eT6srSo9Z1PM/rsk0GosEvotdBmxWz8GC9dqmDHANjAT+4OcBvBiN1rZdJh7VFdaCXRLn2SrU15jMyqaSOLXAXXAItkhkYhEkleh9+fqPm4cMT+fd3NotwRL3pj56sVpcrlEHZhorojpAxqQeOTjy+9CN1e9dTG/VA1cPfJRo6QisAGirR2fmVQgAQ8/29hmruNixzyZ960I/eEsvSOHTve3RziE5PjigAMgEhE8jyKAzWPCsDyZDBoEMmAGXibPgscf6bSjpLhpKAAMp7yyDnMHEAs97mPgc3ExcG4JKgF0woFYh1LJd4YZPhZDaaQQCOUo0L8qfJeFtA7tvDJUHDxwFL/lYG5qfONy3DXX9kUNiDMgEkWwqAh0lSziJjTPrQMIn0PNhmQE4V57LzgDHS6aa4RB0GY4NpufEeESY1GWDzGplZgDTIvw/9aSsxsd8P9Yi8NKAab6MAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= 59be7153-6043-422c-9ddf-fbb55010bd2a true @@ -7189,7 +7128,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -7201,7 +7140,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== 2e1e8ed9-3cc8-4018-a772-130af7b9c80f true @@ -7218,7 +7157,7 @@ - + 3278 2538 @@ -7229,7 +7168,6 @@ 3365 2590 - true @@ -7265,7 +7203,7 @@ - + 3280 2540 @@ -7276,7 +7214,6 @@ 3316.5 2550 - true @@ -7305,7 +7242,7 @@ - + 3280 2560 @@ -7316,7 +7253,6 @@ 3316.5 2570 - true @@ -7344,7 +7280,7 @@ - + 3280 2580 @@ -7355,7 +7291,6 @@ 3316.5 2590 - true @@ -7383,7 +7318,7 @@ - + 3280 2600 @@ -7394,7 +7329,6 @@ 3316.5 2610 - true @@ -7422,7 +7356,7 @@ - + 3280 2620 @@ -7433,7 +7367,6 @@ 3316.5 2630 - true @@ -7461,7 +7394,7 @@ - + 3380 2540 @@ -7472,7 +7405,6 @@ 3429.5 2552.5 - true @@ -7500,7 +7432,7 @@ - + 3380 2565 @@ -7511,7 +7443,6 @@ 3429.5 2577.5 - true @@ -7539,7 +7470,7 @@ - + 3380 2590 @@ -7550,7 +7481,6 @@ 3429.5 2602.5 - true @@ -7578,7 +7508,7 @@ - + 3380 2615 @@ -7589,7 +7519,6 @@ 3429.5 2627.5 - true @@ -7633,7 +7562,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Trajectory Action @@ -7645,7 +7574,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVzy8DQRTHXxuJpBd6wfpRNClF4nfigItI0zgIWhLxLxBnjg6cuYtEIhJKG5FGXOnFHUXiR/3oxblurfm+diZrbWWbrpfs7sy8N5/vvLc7O0T/bA49P5fLhUV/OfX6PpzJZH749HFmbZfLlfM0NSSEb9PhcERkjIII+Hry7mFFOsp5+tt9G0JkFQwWwMoF/LAcqHGuEJlFJs6CY9kYYEOfmZzBS+otK2v+/JKix8cnElmVpCFWS15vK7U0e3ge3kmzp9FZgZ6EH0VP6CByXBLYGDwXnqHQ9KRisgCCsHLANa2OJoIBcjpl9YwI8342m6X42TkzBvp7VSZKAGWBAR4YHzOnGEbXrq7J7XbTkq9eebZ3drnEslRKQNbc6sq3onHar6wh+vyisZpq6qpyqawlC6pKQC3B0Igcx+j6JkldnX4Kz0yxF2OJoxjVdg9Rb083ww3TVPdPAYAOBQh2c5vkdr2m0Uc6zWOLPo3CwWFuF7sVfZN6+GxoinDBJBx9mVExOMZNM9jbP6CT0zjP04MAhA9mBY44UwE4YIMDfb9AC/NzeafFuxLAToThewakVJCci6dkoa0EsM1h2Cwwq58rB4ub3GjoSxbavOzb5D3/eOz8VQDe4W/L1+U/f3acgdh5F+I8GIGqXSbOg0vxLkblPti0C6zjMJMFhFIEx5zOWVazcGTyuZz/Ngs4USrbD/2yVmpl8jdy39R+b7UCBQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVu0sDQRDGJ0EQTKFpohffQjQa8A0WaiMiYiHRJIL4LyjWWlporb0IgggaH4gEsVUbezUq+DZpbINd4n6T7HKeF7mQy8Dd7e7M/r6dudtbohKbQ8/PZDJh0V98/0gMplKpXz59nFnb5XJl6uu8V8K37nA4ojJGQQR8NX7/uCQdxTz9bb41IbIMBgtg5QK+XwzUOFeIRJCJM+dYNAbY0GcmZ/D2/pmWNX95faOnp2cSWRWkIVZLLS3N1NTYwPPwThrqa51l6En4wdEJ7UUPCwIbg2fC0xSamlRMFkAQVg64ptXQxPgYOZ2yekaEeT+dTlPs7JwZfb3dKhMlgLLAAB8bHTGnGEZXrm/I7XbTgs+rPJtb21xiWSolIGtudeUbRzHaLfcQfX3TiKeKApUVKmvJgqoSUEswNKKHx3RzG6dAh5/C00H2Yuzq4JiqOweou6uT4YZpqvuvAED7AgS7vYtz26tplEgmeWzep1F4fJDb+W5536QeHgkFCRdMwtGXGeWDY9w0g53dPTo5jfE8PQhA+GBW4IgzFYAD1t/X8wc0NzuTdVq8KwHsRBi+Z0AKBcm5eEoW2koA2xyGzQKz+rlysLjJjYa+ZKHNy76LP/CPx85fBeDt/tZsXUr5s+MMxM67EOfBEFTtMnEeXIp3MSz3wbpdYB2HmSwglKI45nTOopq5I5PP5ey3mcOJUtl+6Be1UiuTfwBLc9R4U4cQPwAAAABJRU5ErkJggg== 9e8af65d-2825-4065-bd44-35ba37b85d94 true @@ -7911,7 +7840,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Trajectory Action @@ -7923,7 +7852,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVzy8DQRTHXxuJpBd6wfpRNClF4nfigItI0zgIWhLxLxBnjg6cuYtEIhJKG5FGXOnFHUXiR/3oxblurfm+diZrbWWbrpfs7sy8N5/vvLc7O0T/bA49P5fLhUV/OfX6PpzJZH749HFmbZfLlfM0NSSEb9PhcERkjIII+Hry7mFFOsp5+tt9G0JkFQwWwMoF/LAcqHGuEJlFJs6CY9kYYEOfmZzBS+otK2v+/JKix8cnElmVpCFWS15vK7U0e3ge3kmzp9FZgZ6EH0VP6CByXBLYGDwXnqHQ9KRisgCCsHLANa2OJoIBcjpl9YwI8342m6X42TkzBvp7VSZKAGWBAR4YHzOnGEbXrq7J7XbTkq9eebZ3drnEslRKQNbc6sq3onHar6wh+vyisZpq6qpyqawlC6pKQC3B0Igcx+j6JkldnX4Kz0yxF2OJoxjVdg9Rb083ww3TVPdPAYAOBQh2c5vkdr2m0Uc6zWOLPo3CwWFuF7sVfZN6+GxoinDBJBx9mVExOMZNM9jbP6CT0zjP04MAhA9mBY44UwE4YIMDfb9AC/NzeafFuxLAToThewakVJCci6dkoa0EsM1h2Cwwq58rB4ub3GjoSxbavOzb5D3/eOz8VQDe4W/L1+U/f3acgdh5F+I8GIGqXSbOg0vxLkblPti0C6zjMJMFhFIEx5zOWVazcGTyuZz/Ngs4USrbD/2yVmpl8jdy39R+b7UCBQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVu0sDQRDGJ0EQTKFpohffQjQa8A0WaiMiYiHRJIL4LyjWWlporb0IgggaH4gEsVUbezUq+DZpbINd4n6T7HKeF7mQy8Dd7e7M/r6dudtbohKbQ8/PZDJh0V98/0gMplKpXz59nFnb5XJl6uu8V8K37nA4ojJGQQR8NX7/uCQdxTz9bb41IbIMBgtg5QK+XwzUOFeIRJCJM+dYNAbY0GcmZ/D2/pmWNX95faOnp2cSWRWkIVZLLS3N1NTYwPPwThrqa51l6En4wdEJ7UUPCwIbg2fC0xSamlRMFkAQVg64ptXQxPgYOZ2yekaEeT+dTlPs7JwZfb3dKhMlgLLAAB8bHTGnGEZXrm/I7XbTgs+rPJtb21xiWSolIGtudeUbRzHaLfcQfX3TiKeKApUVKmvJgqoSUEswNKKHx3RzG6dAh5/C00H2Yuzq4JiqOweou6uT4YZpqvuvAED7AgS7vYtz26tplEgmeWzep1F4fJDb+W5536QeHgkFCRdMwtGXGeWDY9w0g53dPTo5jfE8PQhA+GBW4IgzFYAD1t/X8wc0NzuTdVq8KwHsRBi+Z0AKBcm5eEoW2koA2xyGzQKz+rlysLjJjYa+ZKHNy76LP/CPx85fBeDt/tZsXUr5s+MMxM67EOfBEFTtMnEeXIp3MSz3wbpdYB2HmSwglKI45nTOopq5I5PP5ey3mcOJUtl+6Be1UiuTfwBLc9R4U4cQPwAAAABJRU5ErkJggg== b479ed8a-fea5-463f-8a86-5870ac4ac61e true @@ -8189,7 +8118,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Action Chain @@ -8201,7 +8130,7 @@ true 2 - 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 8ba50487-6869-4a3d-837f-9901d0919a25 true @@ -8743,7 +8672,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -8756,7 +8685,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== 3b93c86c-12a5-40e1-9966-bb3ebf00d929 true @@ -9178,7 +9107,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Robot Configuration @@ -9190,7 +9119,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3UlEQVRIDWNgoDFgRDb/////UUB+5qPHT62/ffuGIoesDhubi4vrv5ys9FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYBw8fPfmHK8wX3X8JtitOUZwkO0FxIi8nw8QC0gUz/NLlKwyvX7+BGzT9FwfD1X9gJQybbt5nyGT7AZfDxRAVFWHQ09WBmwnRDVU9beYchvfvP8D1Xo3OQbCBFs2auwDOx8UQFBRgmDFlAlwaxYKs9BQ0H/yB+0Cb6Q9DWnICXCMuBsgHyADFApDXkIEzkENuHMDMQbEAJohMo0fu+idvGBquPAQradCRZwiUQXUxsl4QG5yKrt+49R/Eae/qZXj46DGIiRMc9ohi+McESd1M//4x2O6AZ1qwHnk5WYbKMkh+1dRQY4TlA5wGUiqB4gNiDCMliEA+IBgHMEuRI5tQuMP0gGgUC9AzGkwhKRkOltFgelEsQM9oMEWkZDiSMhrMgum/iM9w6BmNYGEHswQ5DmBi+GhYYQe2AFgfHAbWBzb4NJAqB6wPjgDrA1tYPphOqgFEqAebCbYAVPOAqjkiNBGlBFplgrM4OIhgumhR6cPMphkNACYhwys18M2RAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3UlEQVRIDWNgoDFgRDb/////UUB+5uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB48eP/2HK8wX3X8JtitOUZwkO0FxIicrzcQC0gUz/NLlKwyvX7+BGzT9FwfD1X9gJQybbt5nyGT7AZfDxRAVFWHQ09WBmwnRDVU9beYchvfvP8D1Xo3OQbCBFs2auwDOx8UQFBRgmDFlAlwaxYKs9BQ0H/yB+0Cb6Q9DWnICXCMuBsgHyADFApDXkIEzkENuHMDMQbEAJohMo0fu+idvGBquPAQradCRZwiUQXUxsl4QG5yKrt+49R/Eae/qZXj46DGIiRMc9ohi+McESd1M//4x2O6AZ1qwHnk5WYbKMkh+1dRQY4TlA5wGUiqB4gNiDCMliEA+IBgHMEuRI5tQuMP0gGgUC9AzGkwhKRkOltFgelEsQM9oMEWkZDiSMhrMgum/iM9w6BmNYGEHswQ5DmBi+GhYYQe2AFgfHAbWBzb4NJAqB6wPjgDrA1tYPphOqgFEqAebCbYAVPOAqjkiNBGlBFplgrM4OIhgumhR6cPMphkNAP6mwyUXpxX+AAAAAElFTkSuQmCC 086f7395-0fe4-4910-b486-d371d72a525f true @@ -9281,12 +9210,12 @@ 1 2 true - bdce4754-a6b0-47dc-ba0c-8fef4b701886 - 1f5db91c-2547-4781-939e-e813733713e9 - f3e86788-4a7f-40b7-a645-f63aa093cd29 - bceb6ccc-7107-4426-adca-c7aac74a5c46 - b23ab536-0229-4863-88bd-2042b8311bb5 - bef9677b-8a97-4c70-8d77-7a840d3a73fb + 32aa6709-f6d9-4157-b5ec-2fb5aace4072 + fbadd3c0-df5f-400f-9243-96f261d44776 + 2cc39827-4ec2-4307-995b-f62969026b73 + c1c866e6-fe5c-40c7-8145-028dcead736d + 5a2a0bf4-4661-4a9a-8313-f67db0550f4b + c395212b-f5d4-4312-b650-266e1bc7734f 6 Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override. 9d51e32e-c038-4352-9554-f4137ca91b9a @@ -9423,7 +9352,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Rigid Body From Library @@ -9435,7 +9364,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEUlEQVRIDdVVyytEYRQ/d3A1M81kyMZ4bRhrjHeS7CQSJX+BhZIlfwBLKTZKsfGIRLIkCQskO49ZeEuUxzCGqOs7H+d279zvoysWTs2c853fOb/fd7/7OAB/bIqRX9O0JrbuOD27KI9EIibMWCeK3W63lpGetsawfkVRpqlGJ2HkPXv7oS4C0G9ubUM4HDam9NjlckFpSZG+NgZ5gZxeJtKNuXj8w53Hko9NTMHc/ALCUjs8OobWlmYLjlyMcxuvhAuwio7YqpXVNfD5kqCpsSEW4uvpmVnAGpHAZwNyfgjgmQtZWLKmukoIocBXRpwOLLJ7Q78iJow4uQAl/8L/fwF6iqSns7i0DJoU/R6QClRWlPP3YGh4RMpSX1crxQiQCuDznZ2VCdFolGpN3uv1QrAw35QTLaQCWFxWWizqsZUTCgyGLmyRYHEwxQNFyR5Ln0Vg4+YBBn4g0A5p3wvshp9g5/aR7yLX44SDh4/z7wz4LTujxOXzK4wfX9HS4k1X0LYVgivWgEbkGPftn6MTmk81UVhqOIrDgr4dqYkJoDoccB59Ab8zkZ+t36maGmmITJ5cg8IWoyUBy/EgJzZxAZxE7BteQSx3r288RL9+fU9p3ce+eKKb+zndgL5F/dhd4PMA7k5l21IdCrjjCNa5eYA19MMeiXFOrOMmGpmE2fXGkakLIAmOTuZ+dejb3Zzt+ne5RKuqd5c7kwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEklEQVRIDdVVyytEYRQ/d3A1Y2YyZMEIG8ba+5UkO4lEyV9goWTJH8BSio1SbDwikSxJwgLJzmMWHhlEeYzJEHV95+Pc7p37fXTFwqmZc77zO+f3++53Hwfgj00x8mua1sLWXeehy8pIJGLCjHWi2O12a5n+9A2GDSqKMks1Ogkj7zs4DPYQgH57ZxfC4bAxpcculwvKy0r0tTHID+T2M5FezMXjH+48lnxiagYWFpcQltrxySm0t7VacORinLt4JVyAVXTFVq2tb4DPlwwtzU2xEF/Pzs0D1ogEPhuQ80MAz1zIwpJ1tTVCCAW+MuJ0YJHdG/oVMWHEyQUo+Rf+/wvQUyQ9neWVVdCk6PeAVKC6qpK/ByOjY1KWxoZ6KUaAVACf75zsLIhGo1Rr8l6vF4qLCkw50UIqgMUV5aWiHls5ocBw8MIWCRYXp3qgJMVj6bMIbN0+wtAPBDoh43uB/fAT7N1F+C7yPE44evw4/+6A37IzSlw9v8Lk6TUtLd50BR07QbhmDWhEjvHAYQid0HyqicJSw1EcFvTtSEtMANXhgFD0BfzORH62fqdqaqQhMn12AwpbjJcFLMeDnNjEBXASsW94FbHcv77xEP3mzQOldR/74olu7ud0A/oWDWJ3oc8DuDuVbUt1KJAUR7DOzQOsoR/2SIxzYh030cgkzK43jkxdAElwdDL3q0Pf7uZs178Dt0yrp/1lc7YAAAAASUVORK5CYII= 9c92c74a-5e86-436d-874f-a0030c6dab03 true @@ -9455,13 +9384,13 @@ 675 - 219 + 239 159 64 760 - 251 + 271 @@ -9497,13 +9426,13 @@ 677 - 221 + 241 68 20 712.5 - 231 + 251 @@ -9535,13 +9464,13 @@ 677 - 241 + 261 68 20 712.5 - 251 + 271 @@ -9573,13 +9502,13 @@ 677 - 261 + 281 68 20 712.5 - 271 + 291 @@ -9611,13 +9540,13 @@ 775 - 221 + 241 57 30 803.5 - 236 + 256 @@ -9649,13 +9578,13 @@ 775 - 251 + 271 57 30 803.5 - 266 + 286 @@ -9700,10 +9629,10 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Tool From Mesh + COMPAS FAB: Frame Waypoints @@ -9712,294 +9641,14 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVPUsDQRDdi4LFgQgRBTWSQjFa2xnB/APRpPUnmFZFEEHUSsg/sLGQRPE/qJ21RrQyfpRWB9p47hszx7q3e3dJLltkZ2fevDezy2WE6PNyVH7f98vyXG29vi95nvcvpuJMtuu6fm5q4lbGao7jNBgTkEjyw+bj0zYHetkLc7NHUmQHHCSAyiV5vRdSPVeKVNBJph2o6oAUzsRJHby03n46vfO4AvAm07nJzCCAOvn+wbG4f2jGcQTxvd0tsTBfCM4wmJOvKAiCuBPyINFihARQiV4NclFlZX01RAOfCc/AkAACJiJcW/3iivMS70YBtQtTdexDIeW1cFequlEAALWL87NTuGjB5jeKI0eCVYC70B+9cfl3TWoBpGz5sQoAzyTq3bOdpHpwRAqoXQDMi4X5HLVHCiDRRJa0euTTlwzDttAFRE4+PDHw/SU281kb1OiPFUBWtrgiPu+eiWB0ccZIZHPSFeGPyQaAvzQ2Ijby46I0PER2FJZjzMnz4FrOgyIH09jlPLiR82CZH7mWBqnGQZwkgMmDMacBuj62RybN5WAmg60fQ7/rKpMm/gLhhokzxSFCzgAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABxklEQVRIDbVVPUsDQRDdE7v7AYGoZfCMWFrZ+gP8SLCw8QcIaVUEEcSPUtBekRSSKPkDgo1N7DUhIIgSsNDCePW5b3Kzbo69I3s5By43m5l7b+bNwgjxz+bo+EEQlOS58vbeXfB9fyCm55l813WDqcn8g4ydOo5T5xwFIsEPW+3ONgdGeXvThSNJsgOMMfyg8rTgza+eOO90AaMMWKEafQIZqaiopfP42RNnEYIQgjCpA2huiavS0YFu+wfH4um5JRiTCGwHqgOyD9C19Q0Ch8+Y45wwzBsfFmc8Y+rJtyNeFpcp9jE3r3KoA3VKcACO9uu3DZWF/17v7+jclLP4yU3QoxKkY9WB/iH82k1D5CTJZiEvSitL0TCdUxHwICHX3u5WrGxgsCZA1WyzRS8RHHnGGUBnVKkb9I4ayPSZROM4GzvQq0QSSwK/vPqnNSSKu1XIhRkJ+iFBdxo+X0/obWuJBKh8mEEmkRpnoH/A9z86Ez0nyR/oAAOD/iZdcWPSGBFgWVxeVR0eLgZpIrEhACbySaJwExHodfViZHAAMyZttHDh1BDIyuRWK2N1UgdwsOYyBMfKpL2sdjLAwzWX6dLPquhYnF+Vrbqn8SLkqgAAAABJRU5ErkJggg== - 14762c92-f1ae-4fe4-98ab-802dc2b518e2 + 7f6fe63e-ecc6-4baf-a39e-b57f06f02f22 true false true - COMPAS FAB: Tool From Mesh - COMPAS FAB: Tool From Mesh - 3 - - false - false - false - false - - - - - - 673 - 116 - 167 - 84 - - - 764 - 158 - - - - - - 4 - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 08908df5-fa14-4982-9ab2-1aa0927566aa - 1 - 08908df5-fa14-4982-9ab2-1aa0927566aa - - - - - true - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. - da2ca3e1-ada7-4121-93b6-7b421382aab4 - name - name - true - 0 - 2 - true - b1d6bdbb-bbbc-482e-9851-581e5580f4a9 - 1 - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 - - - - - - 675 - 118 - 74 - 20 - - - 713.5 - 128 - - - - - - System.Private.CoreLib - System.String - - - - - - - true - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). - f2ed7ea7-33d7-441d-8089-38c02ce07c76 - visual_mesh - visual_mesh - true - 0 - 2 - true - de7ea5f7-f04b-48c8-80ca-659046e21818 - 1 - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 675 - 138 - 74 - 20 - - - 713.5 - 148 - - - - - - System.Private.CoreLib - System.Object - - - - - - - true - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. - 845901a6-5ddb-4f5f-9663-353bb0d7d2b1 - collision_mesh - collision_mesh - true - 0 - 2 - true - de7ea5f7-f04b-48c8-80ca-659046e21818 - 1 - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 675 - 158 - 74 - 20 - - - 713.5 - 168 - - - - - - System.Private.CoreLib - System.Object - - - - - - - true - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame. - 10f1a94a-a2c7-4f77-a6f5-0047b6ca053a - tcp_plane - tcp_plane - true - 0 - 2 - true - 3e07e26f-7364-466c-bf58-2608d206128a - 1 - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 675 - 178 - 74 - 20 - - - 713.5 - 188 - - - - - - System.Private.CoreLib - System.Object - - - - - - - false - ToolModel. - 6f0b279a-83bc-49d8-b291-d9861d788592 - tool_model - tool_model - false - 0 - 2 - true - 0 - ToolModel. - 1c282eeb-dd16-439f-94e4-7d92b542fe8b - - - - - - 779 - 118 - 59 - 80 - - - 808.5 - 158 - - - - - - System.Private.CoreLib - System.Object - - - - - - - - - true - false - true - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25zdHJ1Y3QgYSBUb29sTW9kZWwgZnJvbSBhIFJoaW5vIG1lc2ggYW5kIGEgVENQIHBsYW5lLgoKYHRjcF9wbGFuZWAgbWF5IGJlIGEgUmhpbm8gUGxhbmUgb3IgYSBjb21wYXMgRnJhbWU7IGl0IGlzIHRoZSBUb29sCkNvb3JkaW5hdGUgRnJhbWUgZXhwcmVzc2VkIGluIHRoZSByb2JvdCdzIGB0b29sMGAgbGluayBmcmFtZS4gSWYKYGNvbGxpc2lvbl9tZXNoYCBpcyB1bndpcmVkLCBgdmlzdWFsX21lc2hgIGlzIHJldXNlZCBmb3IgY29sbGlzaW9uCmNoZWNrcy4KClRoZSByZXN1bHQgaXMgYSBzdGF0aWMgKG5vIGpvaW50cykgYFRvb2xNb2RlbGAgcmVhZHkgdG8gZmVlZCBpbnRvIGEKYExvYWQgUm9ib3QgQ2VsbGAgY29tcG9uZW50J3MgYHRvb2xzYCBpbnB1dC4gS2luZW1hdGljIHRvb2xzICh3aXRoIHRoZWlyCm93biBqb2ludHMpIHNob3VsZCBiZSBsb2FkZWQgZnJvbSBVUkRGIGluc3RlYWQuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgbmFtZTogc3RyLCB2aXN1YWxfbWVzaCwgY29sbGlzaW9uX21lc2gsIHRjcF9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgY192aXN1YWwgPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKHZpc3VhbF9tZXNoKSkgaWYgdmlzdWFsX21lc2ggZWxzZSBOb25lCiAgICAgICAgY19jb2xsaXNpb24gPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKGNvbGxpc2lvbl9tZXNoKSkgaWYgY29sbGlzaW9uX21lc2ggZWxzZSBOb25lCgogICAgICAgIGlmIGNvbGxpc2lvbl9tZXNoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiTm8gY29sbGlzaW9uIG1lc2ggcHJvdmlkZWQ6IHRoZSB0b29sIHdpbGwgYmUgdmlzdWFsaXplZCBidXQgaWdub3JlZCBmb3IgY29sbGlzaW9uIGNoZWNraW5nLiIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIFRvb2xNb2RlbCgKICAgICAgICAgICAgdmlzdWFsPWNfdmlzdWFsLAogICAgICAgICAgICBmcmFtZV9pbl90b29sMF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgY29sbGlzaW9uPWNfY29sbGlzaW9uLAogICAgICAgICAgICBuYW1lPShuYW1lIG9yICJhdHRhY2hlZF90b29sIikuc3RyaXAoKSwKICAgICAgICApCg== - COMPAS FAB: Tool From Mesh - - - - - *.*.python - 3.* - - - - - - - - 368 - 149 - 550 - 700 - - - - - - - - - - c9b2d725-6f87-4b07-af90-bd9aefef68eb - COMPAS FAB: Frame Waypoints - - - - - - true - 2 - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABx0lEQVRIDbVVPUsDQRDdE6v7AwGDdsEzYmll6w/wI8HCxh8gpFURRBA/SkF7ERUkUfIHBBub2GtCQFBRsNDCyLXnvsnNujn2juzlHLjcbGbuvZk3CyPEP5uj4wdBUJLnysvr24zv+z0xPc/ku64bjI3m72Ts0HGcGucoEAm+22y11zkwyNsbL+xJkg1gDOEHlacFb3x1xHH7HTDKgBWq0SWQkYqKWjr3nx1xFCEIIQiTOoDmlrgqHR3otr2zLx4em4IxicB2oDog+wBdWl4hcPiMOcwJ/bzxYXHCM6YefDviaXaeYh9T0yqHOlCnBAfgaL92XVdZ+O/59obODTmLn1yeHpUgHasO9A/hV6/qIidJVgsjorQwFw3TORUBDxJybW2uxcoGBmsCVM02WfQSwZFnnAF0RpW6Qe+ogUyfSTSOs7EDvUoksSTwy4t/WkOiuFuFXJiRoBsSdKfh8/WE3raWSIDK+xlkEqlxBvoHfP+jM9FzkvyeDjAw6G/SFTcmjREBlsXp2YXDw8UgTSQ2BMBEPkkUbiICvTw/GRgcwIxJGy1cOFUEsjK51cpYndQBHKy5DMGxMmkvq50M8HDNZbr0syo6FucXl6W6qmWOrGsAAAAASUVORK5CYII= - - 7f6fe63e-ecc6-4baf-a39e-b57f06f02f22 - true - false - true - COMPAS FAB: Frame Waypoints - Frame Waypoints + COMPAS FAB: Frame Waypoints + Frame Waypoints 3 false @@ -10298,7 +9947,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Frame Target @@ -10310,7 +9959,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBpPLdAuMVd1AAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/pOnz62/fPmCIoesDhubh4fnv4y05FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBHiLc94c9LygAAAABJRU5ErkJggg== 2c3deda5-7a78-4902-bb79-4796273ba3ff true @@ -10615,7 +10264,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Frame Target @@ -10627,7 +10276,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYBw8fPflHapgTcgAoTuTlZJjAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwCK8LdD37XD/QAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBpPLdAuMVd1AAAAABJRU5ErkJggg== 00b4398a-522a-4426-bceb-c8b4eb2df50a true @@ -10680,7 +10329,7 @@ 0 2 true - c3986e21-f43e-45b1-99c4-13cd41951b9b + 03a3f0bd-ed2a-4964-bb43-3f73e45819ea 1 Rhino plane or COMPAS Frame describing the target pose (in WCF). 1c282eeb-dd16-439f-94e4-7d92b542fe8b @@ -10932,7 +10581,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Forward Kinematics @@ -10944,7 +10593,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAUlEQVRIDbWVS0sCURTH70QroZWQ0HOTqUXUqqAs6htI6bpdEAZtK4IIotoGRdCugiK0cNUX6AFF21KzRdoDClwFrqrp/k9zhmujaI5eGOY+zvmde87/zlwhatw0la/relCOZzNPL0O5XC5vTbUr1Hc4HHpba/OFXNvQNC3KNiZEwlcTydQ8L9h5ez3uNRlkAQwKgJ1LeMQO9K+vDBJCJnXGwuxfgyqMiUkZpDPP36j5bTxB3G6f1zYfmrS3tdTVgwT45vaOODu/JPCwf1DMTE/ZCsKHhEqEnQPucjXSgz5nYyuKdKYMGPL5+SWy2SwPq/KmDFBzlEWFp1IPVcmCRI4n7nVsF2UB+PDI/E4oMOtxZxyCrjIPgc/bqfExpXIgE7e7wyyN0+kkbViPyHFMLK+si+hJzLTZSr0KPMVangaqEQTntrd/IB7TGR4KBEILjgfEpgEPu5vMdbWTlwEWWI+3t3eBp6+3Jw+uOpfTL5gBaj42OkL+6keH8kCH0ESAdl9xADiqYAYtLc5RgHJFhl/BDBhY6F0M7ju9Mc1npB6siUUD06qMzuRVsqQVZYAfE/87SnoYBjia19kP0e9sELsDHosbmJikDIybyGJUaqIYHH7MZA025Jy/FFBdR43D6oS1D+ZvBrh5cM1ZbSqbMa5M+t+YdzJQtbj0K9viP7x+APKst1ZZrG60AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAElEQVRIDbWVO0sDQRDH94JdsAoYiI/K00QRrRR8od8gqKntBEkgrYoggqitoAh2Kijig1R+AR+g2KrRWKjRgEIqSaee+x9vjo13ITGXLBy3j5nf7Mx/71aIKjdN5RuGMSbH8fRLpi+Xy+WtqXZOfa/XazQ2BM7k2oqmaQdsY0EkfDF5l5rmBTfvYKu+JIPMgEEBsHMJ33cD/esrg0SQicdciP81qMCYmJTBc/r1GzW/vk0Stz0UdM2HJk2N9Z4akABfXd8QJ6fnBB7o7xWxyQlXQfiQUImwc8D9/jp60OdsXEWRzpQBQz4/v0Q2m+VhRd6UAWqOsqjwVOqhIlmQyLfJewPbRVkA3t2zvhMKzHrcmIegrcRDEAq2aHxMqRzIRNebrdL4fD7ShvXYP0yI+YVlcXCUsGzWUhmBp1DL00A1guDctrZ3xOPTMw8FAqGNjYTFqgmP6gFrXe3kZYAF1uPt7V3g6ersyIOrzqX0HTNAzYeHBslf/ehQHugQGQ3T7ssOAEcVzKC52SkKUKrI8HPMgIFO70Lw0PGVZR6TerAmNg0sqxI64xd3Ra0oA/yY+N9R1MM0wNG8zH6Ibl+t2OxptbmBiUnKwLyJbEbFJgrB4cdM1mBFzvUXA6rrqHFUnbD3wfzNADcPrjm7TXkz5pVJ/xvrTgaqGpd+eVv8h9cPxrq3TcqixRUAAAAASUVORK5CYII= 36d4fb80-9142-4c73-81a0-e837a9435e26 true @@ -11250,7 +10899,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Forward Kinematics @@ -11262,7 +10911,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAUlEQVRIDbWVS0sCURTH70QroZWQ0HOTqUXUqqAs6htI6bpdEAZtK4IIotoGRdCugiK0cNUX6AFF21KzRdoDClwFrqrp/k9zhmujaI5eGOY+zvmde87/zlwhatw0la/relCOZzNPL0O5XC5vTbUr1Hc4HHpba/OFXNvQNC3KNiZEwlcTydQ8L9h5ez3uNRlkAQwKgJ1LeMQO9K+vDBJCJnXGwuxfgyqMiUkZpDPP36j5bTxB3G6f1zYfmrS3tdTVgwT45vaOODu/JPCwf1DMTE/ZCsKHhEqEnQPucjXSgz5nYyuKdKYMGPL5+SWy2SwPq/KmDFBzlEWFp1IPVcmCRI4n7nVsF2UB+PDI/E4oMOtxZxyCrjIPgc/bqfExpXIgE7e7wyyN0+kkbViPyHFMLK+si+hJzLTZSr0KPMVangaqEQTntrd/IB7TGR4KBEILjgfEpgEPu5vMdbWTlwEWWI+3t3eBp6+3Jw+uOpfTL5gBaj42OkL+6keH8kCH0ESAdl9xADiqYAYtLc5RgHJFhl/BDBhY6F0M7ju9Mc1npB6siUUD06qMzuRVsqQVZYAfE/87SnoYBjia19kP0e9sELsDHosbmJikDIybyGJUaqIYHH7MZA025Jy/FFBdR43D6oS1D+ZvBrh5cM1ZbSqbMa5M+t+YdzJQtbj0K9viP7x+APKst1ZZrG60AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAElEQVRIDbWVO0sDQRDH94JdsAoYiI/K00QRrRR8od8gqKntBEkgrYoggqitoAh2Kijig1R+AR+g2KrRWKjRgEIqSaee+x9vjo13ITGXLBy3j5nf7Mx/71aIKjdN5RuGMSbH8fRLpi+Xy+WtqXZOfa/XazQ2BM7k2oqmaQdsY0EkfDF5l5rmBTfvYKu+JIPMgEEBsHMJ33cD/esrg0SQicdciP81qMCYmJTBc/r1GzW/vk0Stz0UdM2HJk2N9Z4akABfXd8QJ6fnBB7o7xWxyQlXQfiQUImwc8D9/jp60OdsXEWRzpQBQz4/v0Q2m+VhRd6UAWqOsqjwVOqhIlmQyLfJewPbRVkA3t2zvhMKzHrcmIegrcRDEAq2aHxMqRzIRNebrdL4fD7ShvXYP0yI+YVlcXCUsGzWUhmBp1DL00A1guDctrZ3xOPTMw8FAqGNjYTFqgmP6gFrXe3kZYAF1uPt7V3g6ersyIOrzqX0HTNAzYeHBslf/ehQHugQGQ3T7ssOAEcVzKC52SkKUKrI8HPMgIFO70Lw0PGVZR6TerAmNg0sqxI64xd3Ra0oA/yY+N9R1MM0wNG8zH6Ibl+t2OxptbmBiUnKwLyJbEbFJgrB4cdM1mBFzvUXA6rrqHFUnbD3wfzNADcPrjm7TXkz5pVJ/xvrTgaqGpd+eVv8h9cPxrq3TcqixRUAAAAASUVORK5CYII= 506100f6-29bc-4721-8251-b473cc6ca5f1 true @@ -11568,7 +11217,7 @@ - + 00027467-0d24-4fa7-b178-8dc0ac5f42ec Value List @@ -11625,7 +11274,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Attach Tool To Robot @@ -11637,7 +11286,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACA0lEQVRIDbWVTS9DQRSGT8WuGwvcEmUlbdVHhEgFf0GaamNrIRIrO1EhFhISOyuJ+AO0RPwFhFjST1ZUBLVoF13XvKedm2kzt1zSk8ydM3POfd4759xkiJpsDpVfLpfDYr2Se32bKpVKNTE1T+c7nc6yu6f7WsT2HQ5HXOaYEAHfyWSfojLwn9nr6d8VIutgsAC+XMBj9dCb2zu6f0jw9ujoCE2Mj9WnWK6FSAQnkQKXQmBazT47v6Dj2Jm6RfOREIWCszV7VgshcCUEZlqQgJqriaL+DHcZBu3tbvOAD0HEfmOSyQL1Df34zDNj0O+jvl43D/gwGeNFg4dktupyjM4O3k4k0/T8kjN9ODLGm794aAXEL8f1RklWo5smBj1AzI5pBQBAM7tcLjo4PGLe8tIiTQYm7LA5l3tg9RaARc8wFbwjf4KDa3kCBE9e8vQ4FIBL8dwXhd3t7Nt5aAVS6QxhJAslMvJF5j28Z4nanBQOBe3w9SeInZ6zAEhGFZcRM0YylaGtjbXq7s+Ttgf+Aa/5ZmQuSBgDvsqeGjOTGjjaEkkYZlmS2OkCY+S6AbMmZCkAuOwFZhhOYte0JVJh6AcGzO7X4x0WwGWBhWo4gTwF9u1+vWSyQPUmUvns24WqAMmUPdgXwZr7AMk4gRT5Q3nArNxocJp6ZUIA1oxLv0Ju4vMbbXfAeMEPB5cAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACBUlEQVRIDbWVTS9DQRSGT8WuXVjgtvG1EvXZCGkI/oI01cbWQiRWdoIQCwmJnZVE/AGKiL+AEEttuVhpiY9akLTrmve0czNt5pZLepKZOXPOuc97Z85iiKpsLpWfz+cjYj/39Pwyks1mS3Jqnc73eDz55ibfuchtuVyuA1ljQQR83bx7WJSJ/6z+jvYNIbIEBgvgzwU8Vg69uLyi63iCw/39AQoODpSX2O6FSBQnkQKnQmBUrT46PqG92JEaoslomMKh8ZKY3UYInAmBsRoU4M7Vwlwux3CvYdDmxhoP+BBE7jcmmSxQ3tC39wwzero7qa21hQd8mMzxpsIkmbW6GqOxgcOJ5C09ptKWD0fmOPiLSSvgdrv5vnEl84srFgY9QM6JaQUAQDN9Xi9t7+wyb3ZmmoaHgk7YXMs9sPsKwK+OPvr0B/4EB9f2BEjupzJ03zsElw7SHxRpqWffyaQVuLk1CSP5mSMj88W8+OsdUZ2bIuGQE77+BLHDYxYAySjiTLFiJG9MWl1eKEZ/XrQ96O7yW19GJ0KE0dVZiKk5q6iCo70iCcMqryR2OMUYua/ALEnZCgAue4EVhpM4Ne0VqTD0AwPm9O/xDQvgscBGNZxAngJxp38vmSxQfIlUPvtOoSpAMmUPtkSy5D1AMU4gRf5wPWAWXjQ4VX0yIQCrxqNfIFdx/gZyM8B488sZSgAAAABJRU5ErkJggg== a0b7288b-d4f9-4c4c-88eb-9a4e1b20e889 true @@ -11982,7 +11631,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Visualize Robot Cell @@ -11995,7 +11644,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg== c300a51d-ea1d-4a6f-aac8-a4d4a36ca3fd true @@ -12417,7 +12066,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: ROS Client @@ -12429,7 +12078,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AMLixEoY2NubAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5pOnz62/fPmCIoesDhubh4fnv4y05FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AJ2kxEQg2Zf8AAAAAElFTkSuQmCC d669cfde-80ea-4143-bcdc-260a09b8dd65 true @@ -12774,7 +12423,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: MoveIt Planner @@ -12786,7 +12435,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUklEQVRIDbVVTUhUURQ+Yy5mpvcgddfPtBLNlYpOQgVSmxhaSDkEbtwKBrq0CNzpNsGgrRshRsWFiIuKQIM0qDbpiCst3YmCNvPEV6/7Hd+5vve8kTbjgTfn3vPzffeew9xDdM4SC+J7ntep9n0b3zdvFQqFkC8YZ1onk0kvde3KB+UbicViExKjQRT4UH517ak4StH1dbXDiuQZMJgAJ1fguVJAo7mKJIubVPiOvmhAGfaMyTdY3/jxW2q+v/+Txl/n6POXr2fiaG5qpK7HWbKsi5yHnlxPXa3gGwg4PAB/++49kac2Z/iQg1wRwawUg2icvKrqEr0afSGmU+me3n7jraUHtLySp4mpaXIc5+jkPmz34iq9XNs6QQIbfCKu63IuMIKib5CbnGYSOA8PXR2ztL1H+CC9tZdZA3w0QlpUBwMJcL4t52nw+QDHagIYwD4zO0eVF7SZg9I1NgO2Kv1JkUXBEWRbFjkHDj3I3KeGG/Wch58QUufDDnojDdYhROlqm3fdH49KAkLYokTxeJyAERTdg6DRtJbywDd2s84UYrRpglCTDaE48UqmhcbazODur/9scpRLyhW1F4vmJusboMnZRx2USMQpoWopgnqbBA0P+mzb4lxg4BP5Z5P/Vm/cJB3phanJIQKw4k3B377nSX/oDycnYq0f+WPrzs4u3bvbfmzwV0yAh0neDjxYEH7sDEB+3gkFcMmFE5jQDKHmwbyaB7dhKJeoebCg5sEdafJIuYADOIzJBJg8GHMBZ0lLf2TyXA5V+TyGfkknPU3yHzc/Bck9uYAcAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUUlEQVRIDbVVPUgcURCeMxZ33C7EpFMvnWisNJhTUCHEJoiFJB6BNLaCgpZRAum0VVBIayPIabAIIYUJgUTIDyRpoid2mtiJgh634VbX9407z931iZo7B/bmvfn5vvdmuDdE1yyxIL7neX1qP7z1Z7s9n8+HfME40zqZTHqp2uoV5ZuKxWILEqNBFPh4bn1jVByl6Ib6uglFMgYMJsDJFXi2FNBoriLJ4CYVvmM4GlCGPWPyDTa3/h5JzQ8O8jQ3n6UfP39dieNecxM9e5ohy0pyHnpyJ1VTwTcQcHgA/v7DRyJPba7wIQe5IoJZKQbROHlV1U16NT0ppkvpgcER462lB7S6lqOF10vkOM7JyX3Y/q/rNLOxfYYENvhEXNflXGAERd8gu7jEJHAWi66O+bazT/ggg3XVrAE+HSEtqIOBBDi/V3P08sVzjtUEMID9zdt3VHlDmzkofdtmwPtKf1dkUXAE2ZZFzj+HerofUePdBs7DTwip73EvLUuDdQhR+pbNu/4vJyUBIWxRong8TsAIiu5B0GhaS3ngm22tN4UYbZog1GRDKE681t1Cs21mcPfwP5sc5ZJyRe2FgrnJ+gZocuZJLyUScUqoWoqg3iZBw4M+27Y4Fxj4RC5s8nn1xk3SkV6YmhwiACveFPztB4ZGQn84ORFr/cifWnd396jr4YNTg79iAjxM8nbgwYLwY2cA8vPOKIBLLpzAhGYINQ8+qXnQAUO5RM2Dz2oedEqTp8oFHMBhTCbA5MGYCzhLWvojk+dyqMrXMfRLOullko8BFYsFxtPMQ9sAAAAASUVORK5CYII= 4393a904-1d39-422c-be8d-f07a18284b2f true @@ -12882,7 +12531,7 @@ 1 2 true - 6f0b279a-83bc-49d8-b291-d9861d788592 + b23784e4-ff43-4dfc-a4d1-22ca6bfbf351 1 Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching. 1c282eeb-dd16-439f-94e4-7d92b542fe8b @@ -13212,7 +12861,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Inverse Kinematics @@ -13224,7 +12873,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AU/+nWEJiEbQAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AWLunWInieVcAAAAASUVORK5CYII= 8c40b20d-5907-473b-8192-ee9a7a063d58 true @@ -13569,7 +13218,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Inverse Kinematics @@ -13581,7 +13230,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AU/+nWEJiEbQAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AWLunWInieVcAAAAASUVORK5CYII= d833948b-a8e4-440a-87e5-eb1fb8831e21 true @@ -13926,7 +13575,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Deconstruct Planner @@ -13938,7 +13587,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYBw8fPflHapjDHLDy0WswM1xOFCYEpkFxIi8nw8QC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFwfuhs3ElmqwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapjDHLDy0WswM1xOFCYEpkFxIicrzcQC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFJEuhmTItpkQAAAABJRU5ErkJggg== 4819d1cf-0141-4891-83b1-8dbe7d876737 true @@ -14125,7 +13774,7 @@ - + c552a431-af5b-46a9-a8a4-0fcbc27ef596 Group @@ -14156,7 +13805,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Plan Cartesian Motion @@ -14168,7 +13817,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3ElEQVRIDWNgoDFgRDb/////IUB+/oOHj61//PiBIoesDhubg4Pjv4K87FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIMQ/9e4zw+m3n8HKTIV5GcyEeNG1gMyEWAAKc3RZYvhTbj+DKLsNoXJUpRiygRgEYGYygTikRihID8jF171MGBz/fGIQv3wKJMQAtxDIhpkJtgAsSwZx7foNhrcrFzGIX4JYYAYMKnQAiwN0cbz823fuMuw/cIhh7/6DYHUv9czANJZ4YCDZApDhNfXNcAfU11Qw7GfhAwcPKLLRAUkWgIJk0dIVcDNaGmsZVFWUGb4AU5TZO6wpiXgfrFm3gWH12g1gw50d7RkcHezAhoMEQEFjZq4OtxiZQdAH6OEdGhzAEBIUgGwGXjZeC5DDW1FRgSEuOoJBS1MDr4HokjgtQA/v5IRYeJCgG4KPj9UC9PB2sLcly3CQxSgWUBre2HwCt4Aa4Y3TAlBlAZSE1w3khjeyBVAz4fXBYWB9YAPyBQiAMg+lAFgfHAHWB7awIJoINNCGGgYjOQxkJgO4NAXVPKBqDkmSIia0ygTXy/BwB5lIi0qfIpcSoxkASu6xu5pSL+4AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3ElEQVRIDWNgoDFgRDb/////IUB+/sNHT6y/f/+OIoesDhubk5Pzv7yczFGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIMQ/9e4zw+m3n8HKTIV5GcyEeNG1gMyEWAAKc3RZYvhTbj+DKLsNoXJUpRiygRgEYGYygTikRihID8jF171MGBz/fGIQv3wKJMQAtxDIhpkJtgAsSwZx7foNhrcrFzGIX4JYYAYMKnQAiwN0cbz823fuMuw/cIhh7/6DYHUv9czANJZ4YCDZApDhNfXNcAfU11Qw7GfhAwcPKLLRAUkWgIJk0dIVcDNaGmsZVFWUGb4AU5TZO6wpiXgfrFm3gWH12g1gw50d7RkcHezAhoMEQEFjZq4OtxiZQdAH6OEdGhzAEBIUgGwGXjZeC5DDW1FRgSEuOoJBS1MDr4HokjgtQA/v5IRYeJCgG4KPj9UC9PB2sLcly3CQxSgWUBre2HwCt4Aa4Y3TAlBlAZSE1w3khjeyBVAz4fXBYWB9YAPyBQiAMg+lAFgfHAHWB7awIJoINNCGGgYjOQxkJgO4NAXVPKBqDkmSIia0ygTXy/BwB5lIi0qfIpcSoxkAWeixwUBUDFEAAAAASUVORK5CYII= 73660c5f-e6df-4df6-932b-946df58cce1c true @@ -14709,7 +14358,7 @@ - + b6236720-8d88-4289-93c3-ac4c99f9b97b Relay @@ -14745,7 +14394,7 @@ - + c9b2d725-6f87-4b07-af90-bd9aefef68eb COMPAS FAB: Plan Motion @@ -14757,7 +14406,7 @@ true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/oOHj61//PiBIoesDhubg4Pjv4K87FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bB/QeP/pEa5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKE0UFOSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABYC8F1xJtFXwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/sNHT6y/f/+OIoesDhubk5Pzv7yczFGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bBg4eP/5Ea5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKEwV5WSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABQc8F4LvG3HgAAAABJRU5ErkJggg== 878ee4f3-dfc7-4c1e-ab8e-487124d32510 true @@ -15298,7 +14947,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -15307,7 +14956,7 @@ Numeric slider for single values - bdce4754-a6b0-47dc-ba0c-8fef4b701886 + 32aa6709-f6d9-4157-b5ec-2fb5aace4072 Number Slider shoulder_pan_joint false @@ -15339,7 +14988,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -15348,7 +14997,7 @@ Numeric slider for single values - 1f5db91c-2547-4781-939e-e813733713e9 + fbadd3c0-df5f-400f-9243-96f261d44776 Number Slider shoulder_lift_joint false @@ -15380,7 +15029,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -15389,7 +15038,7 @@ Numeric slider for single values - f3e86788-4a7f-40b7-a645-f63aa093cd29 + 2cc39827-4ec2-4307-995b-f62969026b73 Number Slider elbow_joint false @@ -15421,7 +15070,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -15430,7 +15079,7 @@ Numeric slider for single values - bceb6ccc-7107-4426-adca-c7aac74a5c46 + c1c866e6-fe5c-40c7-8145-028dcead736d Number Slider wrist_1_joint false @@ -15462,7 +15111,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -15471,7 +15120,7 @@ Numeric slider for single values - b23ab536-0229-4863-88bd-2042b8311bb5 + 5a2a0bf4-4661-4a9a-8313-f67db0550f4b Number Slider wrist_2_joint false @@ -15503,7 +15152,7 @@ - + 57da07bd-ecab-415d-9d86-af36d7073abc Number Slider @@ -15512,7 +15161,7 @@ Numeric slider for single values - bef9677b-8a97-4c70-8d77-7a840d3a73fb + c395212b-f5d4-4312-b650-266e1bc7734f Number Slider wrist_3_joint false @@ -15544,6 +15193,379 @@ + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + 03a3f0bd-ed2a-4964-bb43-3f73e45819ea + Plane + target plane (IK) + false + 0 + + + + + + 1991 + 969 + 50 + 24 + + + 2016.4023 + 981.9662 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0.4937036997233545 + 0.056971871730282335 + 0.5034884601000649 + 0.36964280868381477 + -0.9291739309668243 + 0 + -0.9291739309668243 + -0.36964280868381477 + 0 + + + + + + + + + + + + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + COMPAS FAB: Tool From Mesh + + + + + Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input. + true + 2 + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABq0lEQVRIDbVVsU7DMBB1Ch+A1ArWDoUWZjaKBH+AoF35BLoCQkJICJiQ+gcsDKgB8Q/AxgwtdGNgAxYkWBruHZxlEjtx1PaG+Ox7996drdhKjdkCkz+KogbNW72n/hL5/2ImzuYHQRBV5yp3FGuTHwpGkxDhUbf3vCOBYcZadfaYRHbBwQKonMg7w5DGc0mkiU4Kf4FWHDCCOXNyB1T9IO+eZxWAM6EuCpMAxskPDk/Uw2M3i0PH9/e21cJ8Tc/hCKdskQ6COA+5TnQ4CQFUEq8GuaiyubGWoMGaDS/AhAACNiJsW+fyWvK8R6uA2YWtOllDIY31ZFemulUAALOLi/MzLLHBlzPKIkeCU0C6iB96ePW7TWYBrOz4OAWAFxJz78X3qR4cqQJmFwCLibDM08ZUASTayHyrRz7/yXBchi4gcvr6qSa+v9RWueiCWtczBZBVrK+o9/s+E5QWK1Yi1yIL4GKSu8MGXJ2eUpvlGfXy9qHg+xg4gZP34IZu1LpPoi+GbtJbElmWQ277JubAMScLkFKIZy5HcioUXOAESL/JmNA5jPzRB+9Y7Qe0HI6ecIyijwAAAABJRU5ErkJggg== + + 731b0e88-d4e4-4632-bf0c-a84ce6be437d + true + false + true + COMPAS FAB: Tool From Mesh + COMPAS FAB: Tool From Mesh + 3 + + false + false + false + false + + + + + + 667 + 118 + 167 + 104 + + + 758 + 170 + + + + + + 5 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 1 + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. + 045a2633-621c-4819-b494-b09d62548fb5 + name + name + true + 0 + 2 + true + b1d6bdbb-bbbc-482e-9851-581e5580f4a9 + 1 + Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`. + 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + + + + + + 669 + 120 + 74 + 20 + + + 707.5 + 130 + + + + + + System.Private.CoreLib + System.String + + + + + + + true + Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). + 0e773e40-740a-4447-9531-89c08243fa3b + visual_mesh + visual_mesh + true + 0 + 2 + true + de7ea5f7-f04b-48c8-80ca-659046e21818 + 1 + Rhino mesh for visualization (and collision checking if no separate collision mesh is provided). + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 140 + 74 + 20 + + + 707.5 + 150 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. + 30ad922e-40df-4bc0-a731-ae3178b76568 + collision_mesh + collision_mesh + true + 0 + 2 + true + de7ea5f7-f04b-48c8-80ca-659046e21818 + 1 + Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 160 + 74 + 20 + + + 707.5 + 170 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in. + 2a75d3f7-56fc-42ac-b070-ec7e16704258 + tcp_plane + tcp_plane + true + 0 + 2 + true + 3e07e26f-7364-466c-bf58-2608d206128a + 1 + Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 180 + 74 + 20 + + + 707.5 + 190 + + + + + + System.Private.CoreLib + System.Object + + + + + + + true + Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame. + 34dcf91f-95c7-4901-b1d9-db935d767bf1 + base_plane + base_plane + true + 0 + 2 + true + 0 + Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 669 + 200 + 74 + 20 + + + 707.5 + 210 + + + + + + System.Private.CoreLib + System.Object + + + + + + + false + ToolModel. + b23784e4-ff43-4dfc-a4d1-22ca6bfbf351 + tool_model + tool_model + false + 0 + 2 + true + 0 + ToolModel. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 773 + 120 + 59 + 100 + + + 802.5 + 170 + + + + + + System.Private.CoreLib + System.Object + + + + + + + + + true + false + true + IyByOiBjb21wYXNfZmFiPj0yLjAuMQoiIiIKQ29uc3RydWN0IGEgVG9vbE1vZGVsIGZyb20gYSBSaGlubyBtZXNoIGFuZCBhIFRDUCBwbGFuZS4KCmB0Y3BfcGxhbmVgIG1heSBiZSBhIFJoaW5vIFBsYW5lIG9yIGEgY29tcGFzIEZyYW1lOyBpdCBpcyB0aGUgVG9vbApDb29yZGluYXRlIEZyYW1lLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIHRoZSBtZXNoCmluLiBJZiBgY29sbGlzaW9uX21lc2hgIGlzIHVud2lyZWQsIGB2aXN1YWxfbWVzaGAgaXMgcmV1c2VkIGZvciBjb2xsaXNpb24KY2hlY2tzLgoKYGJhc2VfcGxhbmVgIGlzIHdoZXJlIHRoZSByb2JvdCdzIGZsYW5nZSB0YWtlcyBob2xkIG9mIHRoZSBnZW9tZXRyeSwgYWxzbwppbiB0aGUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIGluLiBJdHMgWiBheGlzIHBvaW50cyBhd2F5IGZyb20gdGhlIHJvYm90LAptYXRjaGluZyB0aGUgcGxhbm5pbmcgZ3JvdXBzIG9mIHRoZSByb2JvdHMgaW4gdGhlIGxpYnJhcnksIHNvIGEgdG9vbCBkcmF3bgpyZWFjaGluZyBhbG9uZyB3b3JsZCBaIG5lZWRzIG5vIGBiYXNlX3BsYW5lYCBhdCBhbGwuIFdpcmUgb25lIHdoZW4gdGhlIHRvb2wKd2FzIGRyYXduIGFsb25nIGFub3RoZXIgYXhpczogZm9yIGEgdG9vbCByZWFjaGluZyBhbG9uZyB3b3JsZCBYLCB0aGF0IGlzCnRoZSBwbGFuZSB3aXRoIFogPSB3b3JsZCBYLiBOb3RoaW5nIGlzIGJha2VkIGludG8gdGhlIG1lc2gsIHNvIHRoZSBwbGFuZQpjYW4gYmUgcmUtd2lyZWQgYXQgYW55IHRpbWUuCgpBIHJlbWFyayBpcyBzdXJmYWNlZCB3aGVuIHRoZSBUQ1AgZG9lcyBub3Qgc2l0IHJvdWdobHkgb24gdGhlIHRvb2wncyArWiwKc2luY2UgdGhhdCBtZWFucyB0aGUgdG9vbCB3aWxsIHBvaW50IHNpZGV3YXlzIG9uY2UgYXR0YWNoZWQuCgpUaGUgcmVzdWx0IGlzIGEgc3RhdGljIChubyBqb2ludHMpIGBUb29sTW9kZWxgIHJlYWR5IHRvIGZlZWQgaW50byBhCmBMb2FkIFJvYm90IENlbGxgIGNvbXBvbmVudCdzIGB0b29sc2AgaW5wdXQuIEtpbmVtYXRpYyB0b29scyAod2l0aCB0aGVpcgpvd24gam9pbnRzKSBzaG91bGQgYmUgbG9hZGVkIGZyb20gVVJERiBpbnN0ZWFkLgoKQ09NUEFTIEZBQiB2Mi4wLjEgKGJ1aWx0IDIwMjYtMDgtMDMgMTU6MzAgVVRDKQoiIiIKCmZyb20gbWF0aCBpbXBvcnQgZGVncmVlcwoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgcmhpbm9zY3JpcHRzeW50YXggYXMgcnMKaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhcy5nZW9tZXRyeSBpbXBvcnQgRnJhbWUKZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IFZlY3Rvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgcmVtYXJrCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCiMgQmV5b25kIHRoaXMgYW5nbGUgYmV0d2VlbiB0aGUgdG9vbCdzICtaIGFuZCBpdHMgVENQLCB0aGUgdG9vbCBpcyBjb25zaWRlcmVkCiMgdG8gYmUgcG9pbnRpbmcgc29tZXdoZXJlIG90aGVyIHRoYW4gYXdheSBmcm9tIHRoZSBmbGFuZ2UuCk1BWF9UQ1BfT0ZGX0FYSVNfQU5HTEUgPSAzMC4wCgoKZGVmIF9vZmZfYXhpc19yZW1hcmsodG9vbCk6CiAgICAiIiJUZXh0IGZvciB0aGUgbW91bnRpbmctYXhpcyByZW1hcmssIG9yIE5vbmUgd2hlbiB0aGUgdG9vbCBsb29rcyBmaW5lLgoKICAgIFRoZSBUQ1AgZGlyZWN0aW9uIGlzIG9ubHkgYSBoaW50OiBpdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJvbGwgb2YgdGhlIHRvb2wKICAgIGFuZCBpcyBtZWFuaW5nbGVzcyBmb3IgYSBUQ1Agc2l0dGluZyBvbiB0aGUgbW91bnQgaXRzZWxmLCBzbyBpdCBpcyByZXBvcnRlZAogICAgcmF0aGVyIHRoYW4gYXBwbGllZC4KICAgICIiIgogICAgdGNwX2RpcmVjdGlvbiA9IFZlY3RvcigqdG9vbC5mcmFtZS5wb2ludCkKICAgIGlmIHRjcF9kaXJlY3Rpb24ubGVuZ3RoIDwgMWUtNjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFuZ2xlID0gZGVncmVlcyh0Y3BfZGlyZWN0aW9uLmFuZ2xlKFZlY3Rvci5aYXhpcygpKSkKICAgIGlmIGFuZ2xlIDwgTUFYX1RDUF9PRkZfQVhJU19BTkdMRToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG1lc3NhZ2UgPSAoIlRDUCBzaXRzIHs6LjBmfSBkZWcgb2ZmIHRoZSB0b29sJ3MgK1ogYXhpcywgc28gdGhpcyB0b29sIHdpbGwgcG9pbnQgc2lkZXdheXMgb25jZSBhdHRhY2hlZDogdG9vbHMgbW91bnQgd2l0aCArWiBwb2ludGluZyBhd2F5IGZyb20gdGhlIGZsYW5nZS4gIikuZm9ybWF0KGFuZ2xlKQoKICAgIHVuaXRpemVkID0gdGNwX2RpcmVjdGlvbi51bml0aXplZCgpCiAgICBpZiBhYnModW5pdGl6ZWQueCkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFgsIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWCAob3JpZ2luLCB4PSgwLDEsMCksIHk9KDAsMCwxKSkuIgogICAgZWxpZiBhYnModW5pdGl6ZWQueSkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFksIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWSAob3JpZ2luLCB4PSgwLDAsMSksIHk9KDEsMCwwKSkuIgogICAgZWxzZToKICAgICAgICBtZXNzYWdlICs9ICJTZXQgYGJhc2VfcGxhbmVgIHRvIGEgcGxhbmUgd2hvc2UgWiBheGlzIHJ1bnMgYWxvbmcgeW91ciB0b29sLCB3aXRoIGl0cyBYIGF4aXMgcGlja2VkIHRvIGdpdmUgdGhlIHJvbGwgeW91IHdhbnQuIgogICAgcmV0dXJuIG1lc3NhZ2UKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgbmFtZTogc3RyLAogICAgICAgICAgICB2aXN1YWxfbWVzaCwKICAgICAgICAgICAgY29sbGlzaW9uX21lc2gsCiAgICAgICAgICAgIHRjcF9wbGFuZSwKICAgICAgICAgICAgYmFzZV9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgYmFzZV9mcmFtZSA9IE5vbmUKICAgICAgICBpZiBiYXNlX3BsYW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBiYXNlX2ZyYW1lID0gYmFzZV9wbGFuZSBpZiBpc2luc3RhbmNlKGJhc2VfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZShiYXNlX3BsYW5lKQogICAgICAgIGNfdmlzdWFsID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaCh2aXN1YWxfbWVzaCkpIGlmIHZpc3VhbF9tZXNoIGVsc2UgTm9uZQogICAgICAgIGNfY29sbGlzaW9uID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaChjb2xsaXNpb25fbWVzaCkpIGlmIGNvbGxpc2lvbl9tZXNoIGVsc2UgTm9uZQoKICAgICAgICBpZiBjb2xsaXNpb25fbWVzaCBpcyBOb25lOgogICAgICAgICAgICBnaF93YXJuaW5nKGdoZW52LkNvbXBvbmVudCwgIk5vIGNvbGxpc2lvbiBtZXNoIHByb3ZpZGVkOiB0aGUgdG9vbCB3aWxsIGJlIHZpc3VhbGl6ZWQgYnV0IGlnbm9yZWQgZm9yIGNvbGxpc2lvbiBjaGVja2luZy4iKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgYGJhc2VfZnJhbWVgIGlzIG9ubHkgcGFzc2VkIHdoZW4gd2lyZWQsIHNvIGFuIG9sZGVyIGNvbXBhc19yb2JvdHMga2VlcHMKICAgICAgICAjIHdvcmtpbmcgZm9yIGRlZmluaXRpb25zIHRoYXQgZG9uJ3QgdXNlIGl0LgogICAgICAgIGt3YXJncyA9IHsiYmFzZV9mcmFtZSI6IGJhc2VfZnJhbWV9IGlmIGJhc2VfZnJhbWUgZWxzZSB7fQogICAgICAgIHRvb2wgPSBUb29sTW9kZWwoCiAgICAgICAgICAgIHZpc3VhbD1jX3Zpc3VhbCwKICAgICAgICAgICAgZnJhbWVfaW5fdG9vbDBfZnJhbWU9ZnJhbWUsCiAgICAgICAgICAgIGNvbGxpc2lvbj1jX2NvbGxpc2lvbiwKICAgICAgICAgICAgbmFtZT0obmFtZSBvciAiYXR0YWNoZWRfdG9vbCIpLnN0cmlwKCksCiAgICAgICAgICAgICoqa3dhcmdzLAogICAgICAgICkKCiAgICAgICAgbWVzc2FnZSA9IF9vZmZfYXhpc19yZW1hcmsodG9vbCkKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICByZW1hcmsoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCgogICAgICAgIHJldHVybiB0b29sCg== + COMPAS FAB: Tool From Mesh + + + + + *.*.python + 3.* + + + + + + + + @@ -15551,7 +15573,7 @@ - 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 From 5b5c27b26283d1e0360582eb44d04396da4c3d1f Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Mon, 3 Aug 2026 17:47:30 +0200 Subject: [PATCH 6/9] Add script and workflow to generate GLTF files for many possible cells, solvers and tool definitions to test tool mounting --- .github/workflows/robot-cell-snapshots.yml | 97 +++ scripts/generate_robot_cell_gltf_snapshots.py | 656 ++++++++++++++++++ 2 files changed, 753 insertions(+) create mode 100644 .github/workflows/robot-cell-snapshots.yml create mode 100644 scripts/generate_robot_cell_gltf_snapshots.py diff --git a/.github/workflows/robot-cell-snapshots.yml b/.github/workflows/robot-cell-snapshots.yml new file mode 100644 index 0000000000..79dd394869 --- /dev/null +++ b/.github/workflows/robot-cell-snapshots.yml @@ -0,0 +1,97 @@ +name: robot-cell-snapshots + +on: + workflow_dispatch: + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + contents: read + +concurrency: + group: robot-cell-snapshots-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + generate: + name: Generate robot-cell GLB snapshots + runs-on: ubuntu-latest + timeout-minutes: 45 + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: pip + cache-dependency-path: | + requirements.txt + requirements-dev.txt + + - name: Bring up ROS 1 and ROS 2 integration stacks + run: | + docker compose -f tests/integration_setup/docker-compose.yml up -d --build + docker compose -f tests/integration_setup/docker-compose-ros2.yml up -d --build + docker ps -a + + - name: Install project and snapshot dependencies + run: | + python -m pip install --upgrade pip wheel + python -m pip install --no-cache-dir -e ".[dev]" + + - name: Generate local robot-cell snapshots + run: | + python scripts/generate_robot_cell_gltf_snapshots.py \ + --cells all \ + --output-dir artifacts/robot-cell-snapshots/local + + - name: Generate ROS 1 robot-cell snapshots + env: + ROSLIBPY_TRANSPORT: asyncio + run: | + python scripts/generate_robot_cell_gltf_snapshots.py \ + --solvers ros \ + --ros-host localhost \ + --ros-port 9090 \ + --output-dir artifacts/robot-cell-snapshots/ros1 + + - name: Generate ROS 2 robot-cell snapshots + env: + ROSLIBPY_TRANSPORT: asyncio + run: | + python scripts/generate_robot_cell_gltf_snapshots.py \ + --solvers ros \ + --ros-host localhost \ + --ros-port 9091 \ + --ros-http-file-server http://localhost:9190 \ + --output-dir artifacts/robot-cell-snapshots/ros2 + + - name: Upload GLB snapshots + if: always() + uses: actions/upload-artifact@v5 + with: + name: robot-cell-glb-snapshots + path: | + artifacts/robot-cell-snapshots/**/*.glb + artifacts/robot-cell-snapshots/**/manifest.json + if-no-files-found: error + retention-days: 14 + + - name: Show ROS container logs on failure + if: failure() + run: | + docker compose -f tests/integration_setup/docker-compose.yml logs --no-color + docker compose -f tests/integration_setup/docker-compose-ros2.yml logs --no-color + + - name: Tear down ROS integration stacks + if: always() + run: | + docker compose -f tests/integration_setup/docker-compose.yml down + docker compose -f tests/integration_setup/docker-compose-ros2.yml down diff --git a/scripts/generate_robot_cell_gltf_snapshots.py b/scripts/generate_robot_cell_gltf_snapshots.py new file mode 100644 index 0000000000..91f7e207c2 --- /dev/null +++ b/scripts/generate_robot_cell_gltf_snapshots.py @@ -0,0 +1,656 @@ +#!/usr/bin/env python3 +"""Generate headless glTF snapshots of solved robot-cell states. + +By default this creates four snapshots of the built-in UR10e cell: analytical +and PyBullet IK, each with equivalent cones authored along positive Z and +positive X. Their matching base frames normalize both source orientations to +the same flange-relative tool. The cone includes a one-sided perpendicular +marker that makes this normalization visible. + +Examples +-------- +Generate the four local snapshots as single-file binary glTF artifacts:: + + python scripts/generate_robot_cell_gltf_snapshots.py + +Generate embedded JSON glTF files instead:: + + python scripts/generate_robot_cell_gltf_snapshots.py --format gltf + +Generate every requested local RobotCellLibrary scenario:: + + python scripts/generate_robot_cell_gltf_snapshots.py --cells all + +Select only cells that already contain an end effector:: + + python scripts/generate_robot_cell_gltf_snapshots.py \ + --cells built-in-end-effectors --solvers pybullet + +Load the robot description and geometry from ROS and solve with MoveIt:: + + python scripts/generate_robot_cell_gltf_snapshots.py \ + --solvers ros --ros-host localhost --ros-port 9090 + +The ROS instance is expected to expose a robot description, semantic +description, geometry, MoveIt planning scene, and IK service. +""" + +from __future__ import annotations + +import argparse +import json +import math +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable +from typing import Optional + +import compas +import compas_robots +from compas.colors import Color +from compas.datastructures import Mesh +from compas.files import GLTF +from compas.files import GLTFContent +from compas.geometry import Cone +from compas.geometry import Cylinder +from compas.geometry import Frame +from compas.geometry import Plane +from compas.geometry import Rotation +from compas.geometry import Sphere +from compas.geometry import Transformation +from compas.geometry import angle_vectors +from compas.geometry import distance_point_point +from compas_robots import Configuration +from compas_robots import ToolModel +from compas_robots.model import LinkGeometry + +import compas_fab +from compas_fab.backends import ABB_IRB4600_40_255Kinematics +from compas_fab.backends import AnalyticalKinematicsPlanner +from compas_fab.backends import MoveItPlanner +from compas_fab.backends import PyBulletClient +from compas_fab.backends import PyBulletPlanner +from compas_fab.backends import RosClient +from compas_fab.backends import UR5Kinematics +from compas_fab.backends import UR10eKinematics +from compas_fab.robots import FrameTarget +from compas_fab.robots import RobotCell +from compas_fab.robots import RobotCellLibrary +from compas_fab.robots import RobotCellState +from compas_fab.robots import TargetMode + +TOOL_ID = "snapshot_cone" +TOOL_LENGTH = 0.15 +TOOL_RADIUS = 0.03 +MARKER_LENGTH = 0.06 +MARKER_RADIUS = 0.006 +TARGET_AXIS_LENGTH = 0.08 +TARGET_AXIS_RADIUS = 0.003 +TARGET_ORIGIN_RADIUS = 0.007 +ROBOT_COLOR = Color(0.72, 0.76, 0.82) +TOOL_COLOR = Color(1.0, 0.36, 0.05) +MARKER_COLOR = Color(0.0, 0.72, 0.82) +RIGID_BODY_COLOR = Color(0.55, 0.58, 0.62) +TARGET_ORIGIN_COLOR = Color(1.0, 0.85, 0.0) +TARGET_AXIS_COLORS = (Color(1.0, 0.1, 0.1), Color(0.1, 0.8, 0.1), Color(0.1, 0.3, 1.0)) +REFERENCE_DELTAS = (0.35, -0.65, 0.8, -0.55, 0.45, 0.25, -0.3) + + +@dataclass(frozen=True) +class LocalCellSpec: + """Describe how a RobotCellLibrary scenario supplies its end effector.""" + + end_effector: str + analytical_solver: object = None + + +LOCAL_CELL_SPECS = { + "ur5": LocalCellSpec("generated_cone", UR5Kinematics), + "ur10e": LocalCellSpec("generated_cone", UR10eKinematics), + "ur5_cone_tool": LocalCellSpec("built_in_tool", UR5Kinematics), + "ur5_gripper_one_beam": LocalCellSpec("built_in_tool", UR5Kinematics), + "ur10e_gripper_one_beam": LocalCellSpec("built_in_tool", UR10eKinematics), + "abb_irb4600_40_255": LocalCellSpec("generated_cone", ABB_IRB4600_40_255Kinematics), + "abb_irb4600_40_255_gripper_one_beam": LocalCellSpec("built_in_tool", ABB_IRB4600_40_255Kinematics), + "abb_irb4600_40_255_printing_tool": LocalCellSpec("built_in_tool", ABB_IRB4600_40_255Kinematics), + "panda": LocalCellSpec("robot"), +} +GENERATED_CONE_CELLS = tuple(name for name, spec in LOCAL_CELL_SPECS.items() if spec.end_effector == "generated_cone") +BUILT_IN_END_EFFECTOR_CELLS = tuple(name for name, spec in LOCAL_CELL_SPECS.items() if spec.end_effector != "generated_cone") +CELL_PRESETS = { + "all": tuple(LOCAL_CELL_SPECS), + "generated-cones": GENERATED_CONE_CELLS, + "built-in-end-effectors": BUILT_IN_END_EFFECTOR_CELLS, +} + + +def create_cone_tool(axis: str) -> ToolModel: + """Create equivalent tools authored along +Z or +X before base reframing.""" + if axis == "z": + authored_frame = Frame.worldXY() + authored_tcf = Frame([0.0, 0.0, TOOL_LENGTH], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]) + marker_frame = Frame([MARKER_LENGTH / 2.0, 0.0, TOOL_LENGTH * 0.75], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]) + base_frame = Frame.worldXY() + elif axis == "x": + authored_frame = Frame.worldYZ() + authored_tcf = Frame([TOOL_LENGTH, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]) + # The +X-authored equivalent of the +Z tool's one-sided +X marker is + # +Y in source coordinates. Both normalize to tool-base +X. + marker_frame = Frame([TOOL_LENGTH * 0.75, MARKER_LENGTH / 2.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]) + base_frame = Frame.worldYZ() + else: + raise ValueError("Cone axis must be 'x' or 'z'.") + + cone_mesh = Mesh.from_shape(Cone(TOOL_RADIUS, TOOL_LENGTH, authored_frame), u=24) + marker_mesh = Mesh.from_shape(Cylinder(MARKER_RADIUS, MARKER_LENGTH, marker_frame), u=16) + cone_mesh.vertices_attribute("vertex_color", list(TOOL_COLOR.rgba)) + marker_mesh.vertices_attribute("vertex_color", list(MARKER_COLOR.rgba)) + cone_mesh.join(marker_mesh) + + return ToolModel(cone_mesh, authored_tcf, name="cone_{}".format(axis), base_frame=base_frame) + + +def add_and_attach_tool(robot_cell: RobotCell, axis: str) -> RobotCellState: + """Add the requested cone and return a complete state with it attached.""" + robot_cell.tool_models[TOOL_ID] = create_cone_tool(axis) + state = robot_cell.default_cell_state() + state.set_tool_attached_to_group(TOOL_ID, robot_cell.main_group_name) + return state + + +def target_mode_for_spec(spec: LocalCellSpec) -> TargetMode: + return TargetMode.ROBOT if spec.end_effector == "robot" else TargetMode.TOOL + + +def reachable_target_frame(robot_cell: RobotCell, state: RobotCellState, target_mode: TargetMode) -> Frame: + """Create a deterministic, reachable target from a non-singular reference state.""" + reference_state = state.copy() + reference_configuration = reference_state.robot_configuration + joints = robot_cell.get_configurable_joints(robot_cell.main_group_name) + + for index, joint in enumerate(joints): + value = float(reference_configuration[joint.name]) + REFERENCE_DELTAS[index % len(REFERENCE_DELTAS)] + if joint.limit: + span = float(joint.limit.upper) - float(joint.limit.lower) + margin = min(0.05, max(1e-6, span * 0.01)) + value = max(float(joint.limit.lower) + margin, min(float(joint.limit.upper) - margin, value)) + reference_configuration[joint.name] = value + + return robot_cell.forward_kinematics_target_frame(reference_state, target_mode) + + +def cyclic_distance_from_start(configuration: Configuration, start: Configuration) -> float: + """Score a revolute configuration by its shortest angular distance from start.""" + start_by_name = dict(zip(start.joint_names, start.joint_values)) + score = 0.0 + for name, value in zip(configuration.joint_names, configuration.joint_values): + delta = value - start_by_name.get(name, 0.0) + shortest_delta = math.atan2(math.sin(delta), math.cos(delta)) + score += shortest_delta * shortest_delta + return score + + +def solve_analytical(robot_cell: RobotCell, state: RobotCellState, target: FrameTarget, solver_class) -> RobotCellState: + """Solve with the cell's analytical IK implementation and update the state.""" + planner = AnalyticalKinematicsPlanner(solver_class()) + planner.set_robot_cell(robot_cell) + solutions = list(planner.iter_inverse_kinematics(target, state)) + if not solutions: + raise RuntimeError("Analytical IK returned no solution.") + state.robot_configuration = min(solutions, key=lambda solution: cyclic_distance_from_start(solution, state.robot_configuration)) + planner.set_robot_cell_state(state) + return state + + +def solve_pybullet(robot_cell: RobotCell, state: RobotCellState, target: FrameTarget) -> tuple[RobotCellState, Frame]: + """Solve with PyBullet IK and return both the state and backend FK frame.""" + with PyBulletClient(connection_type="direct") as client: + planner = PyBulletPlanner(client) + planner.set_robot_cell(robot_cell, state) + state.robot_configuration = planner.inverse_kinematics( + target, + state, + options={ + "check_collision": False, + "max_descend_iterations": 200, + "max_results": 10, + }, + ) + planner.set_robot_cell_state(state) + backend_frame = planner.forward_kinematics(state, target.target_mode) + return state, backend_frame + + +def solve_moveit(planner: MoveItPlanner, robot_cell: RobotCell, state: RobotCellState, target: FrameTarget) -> RobotCellState: + """Synchronize the ROS planning scene, solve with MoveIt, and update it.""" + planner.set_robot_cell(robot_cell, state) + state.robot_configuration = planner.inverse_kinematics( + target, + state, + options={"check_collision": False, "max_results": 1}, + ) + planner.set_robot_cell_state(state) + return state + + +def frame_data(frame: Frame) -> dict: + """Return a JSON-safe representation of a frame.""" + return { + "point": list(frame.point), + "xaxis": list(frame.xaxis), + "yaxis": list(frame.yaxis), + "zaxis": list(frame.zaxis), + } + + +def validate_solution( + robot_cell: RobotCell, + state: RobotCellState, + target_frame: Frame, + target_mode: TargetMode, + backend_frame: Optional[Frame] = None, + tolerance: float = 2e-3, +) -> dict: + """Validate the solved end-effector frame and return error metrics.""" + model_frame = robot_cell.forward_kinematics_target_frame(state, target_mode) + solver_frame = backend_frame or model_frame + solver_position_error = distance_point_point(solver_frame.point, target_frame.point) + solver_orientation_error = max( + angle_vectors(solver_frame.xaxis, target_frame.xaxis), + angle_vectors(solver_frame.yaxis, target_frame.yaxis), + angle_vectors(solver_frame.zaxis, target_frame.zaxis), + ) + if solver_position_error > tolerance or solver_orientation_error > tolerance: + raise RuntimeError("Solver FK misses target: position error={:.6g} m, orientation error={:.6g} rad".format(solver_position_error, solver_orientation_error)) + + model_position_error = distance_point_point(model_frame.point, target_frame.point) + model_orientation_error = max( + angle_vectors(model_frame.xaxis, target_frame.xaxis), + angle_vectors(model_frame.yaxis, target_frame.yaxis), + angle_vectors(model_frame.zaxis, target_frame.zaxis), + ) + return { + "solver_frame": frame_data(solver_frame), + "solver_position_error_m": solver_position_error, + "solver_orientation_error_rad": solver_orientation_error, + "model_frame": frame_data(model_frame), + "model_position_error_m": model_position_error, + "model_orientation_error_rad": model_orientation_error, + "backend_model_position_delta_m": distance_point_point(model_frame.point, solver_frame.point), + "model_matches_target": model_position_error <= tolerance and model_orientation_error <= tolerance, + } + + +def color_rgba(mesh: Mesh, item, fallback: Color) -> list[float]: + """Resolve an imported mesh/URDF material color with a stable fallback.""" + diffuse = mesh.attributes.get("mesh_color.diffuse") + if diffuse: + rgba = list(diffuse) + else: + item_color = item.get_color() if hasattr(item, "get_color") else None + rgba = list(item_color.rgba if item_color else fallback.rgba) + if len(rgba) == 3: + rgba.append(1.0) + return rgba[:4] + + +def prepared_mesh(mesh: Mesh, transformation: Transformation, rgba: Iterable[float]) -> Mesh: + """Bake a pose into a triangulated mesh and add glTF color and normal data.""" + posed = mesh.transformed(transformation) + source_colors = posed.vertices_attribute("vertex_color") + vertices, faces = posed.to_vertices_and_faces(triangulated=True) + result = Mesh.from_vertices_and_faces(vertices, faces) + fallback_color = list(rgba) + for index, vertex in enumerate(result.vertices()): + vertex_color = source_colors[index] if source_colors[index] is not None else fallback_color + result.vertex_attribute(vertex, "vertex_color", list(vertex_color)) + if any(face is not None for face in result.vertex_faces(vertex)): + normal = list(result.vertex_normal(vertex)) + else: + # Some imported CAD meshes retain vertices that no face references. + normal = [0.0, 0.0, 1.0] + result.vertex_attribute(vertex, "vertex_normal", normal) + return result + + +def link_transformations(model, configuration: Optional[Configuration]) -> dict[str, Transformation]: + """Return each model link's transform relative to its model base.""" + configuration = configuration or model.zero_configuration() + transformations = {model.root.name: Transformation()} + frames = model.transformed_frames(configuration) + for joint, frame in zip(model.iter_joints(), frames): + transformations[joint.child_link.name] = Transformation.from_frame(frame) + return transformations + + +def add_model_to_gltf(parent, model, configuration: Optional[Configuration], base_frame: Frame, fallback_color: Color) -> dict: + """Add a posed RobotModel or ToolModel below a glTF node.""" + counts = {"links": 0, "meshes": 0, "vertices": 0, "faces": 0} + world_from_model = Transformation.from_frame(base_frame) + transforms = link_transformations(model, configuration) + + for link in model.iter_links(): + link_node = parent.add_child(link.name, {"kind": "link"}) + counts["links"] += 1 + world_from_link = world_from_model * transforms[link.name] + for item_index, item in enumerate(link.visual): + meshes = LinkGeometry._get_item_meshes(item) or [] + world_from_geometry = world_from_link + if item.origin: + world_from_geometry = world_from_geometry * Transformation.from_frame(item.origin) + for mesh_index, mesh in enumerate(meshes): + name = item.name or "visual_{}".format(item_index) + mesh_name = "{}.{}.{}".format(link.name, name, mesh_index) + mesh_node = link_node.add_child(mesh_name, {"kind": "visual_mesh"}) + gltf_mesh = prepared_mesh(mesh, world_from_geometry, color_rgba(mesh, item, fallback_color)) + mesh_data = mesh_node.add_mesh(gltf_mesh) + mesh_data.mesh_name = mesh_name + counts["meshes"] += 1 + counts["vertices"] += gltf_mesh.number_of_vertices() + counts["faces"] += gltf_mesh.number_of_faces() + return counts + + +def merge_counts(total: dict, addition: dict) -> None: + for key, value in addition.items(): + total[key] = total.get(key, 0) + value + + +def add_target_frame_to_gltf(parent, target_frame: Frame) -> dict: + """Add a yellow origin and RGB positive axes at the requested target frame.""" + counts = {"links": 0, "meshes": 0, "vertices": 0, "faces": 0} + target_node = parent.add_child("target_frame", {"kind": "target_frame", "frame": frame_data(target_frame)}) + marker_meshes = [("origin", Mesh.from_shape(Sphere(TARGET_ORIGIN_RADIUS, point=target_frame.point), u=12, v=8), TARGET_ORIGIN_COLOR)] + + for name, axis, color in zip(("x_axis", "y_axis", "z_axis"), (target_frame.xaxis, target_frame.yaxis, target_frame.zaxis), TARGET_AXIS_COLORS): + center = target_frame.point + axis * (TARGET_AXIS_LENGTH / 2.0) + axis_frame = Frame.from_plane(Plane(center, axis)) + axis_mesh = Mesh.from_shape(Cylinder(TARGET_AXIS_RADIUS, TARGET_AXIS_LENGTH, axis_frame), u=12) + marker_meshes.append((name, axis_mesh, color)) + + for name, mesh, color in marker_meshes: + mesh_node = target_node.add_child(name, {"kind": "target_marker"}) + gltf_mesh = prepared_mesh(mesh, Transformation(), color.rgba) + mesh_data = mesh_node.add_mesh(gltf_mesh) + mesh_data.mesh_name = "target_frame.{}".format(name) + counts["meshes"] += 1 + counts["vertices"] += gltf_mesh.number_of_vertices() + counts["faces"] += gltf_mesh.number_of_faces() + return counts + + +def export_snapshot(filepath: Path, scenario: str, robot_cell: RobotCell, state: RobotCellState, target_frame: Frame, metadata: dict) -> dict: + """Bake a RobotCellState into a colored, hierarchical glTF artifact.""" + state = robot_cell.compute_attach_objects_frames(state) + content = GLTFContent() + scene = content.add_scene(scenario, {"generator": "compas_fab robot-cell snapshot"}) + root = scene.add_child(scenario, metadata) + + # glTF viewers assume Y-up; COMPAS robot cells are Z-up. + root.matrix = Rotation.from_axis_and_angle([1.0, 0.0, 0.0], -math.pi / 2.0).matrix + + counts = {"links": 0, "meshes": 0, "vertices": 0, "faces": 0} + robot_node = root.add_child(robot_cell.robot_model.name, {"kind": "robot"}) + merge_counts( + counts, + add_model_to_gltf(robot_node, robot_cell.robot_model, state.robot_configuration, state.robot_base_frame, ROBOT_COLOR), + ) + merge_counts(counts, add_target_frame_to_gltf(root, target_frame)) + + tools_node = root.add_child("tools", {"kind": "tool_collection"}) + for tool_id, tool_model in robot_cell.tool_models.items(): + tool_state = state.tool_states[tool_id] + if tool_state.is_hidden: + continue + tool_node = tools_node.add_child(tool_id, {"kind": "tool", "attached_to_group": tool_state.attached_to_group}) + merge_counts(counts, add_model_to_gltf(tool_node, tool_model, tool_state.configuration, tool_state.frame, TOOL_COLOR)) + + bodies_node = root.add_child("rigid_bodies", {"kind": "rigid_body_collection"}) + for body_id, body in robot_cell.rigid_body_models.items(): + body_state = state.rigid_body_states[body_id] + if body_state.is_hidden: + continue + body_node = bodies_node.add_child(body_id, {"kind": "rigid_body"}) + transformation = Transformation.from_frame(body_state.frame) + for index, mesh in enumerate(body.visual_meshes_in_meters): + mesh_name = "{}.visual.{}".format(body_id, index) + mesh_node = body_node.add_child(mesh_name, {"kind": "visual_mesh"}) + gltf_mesh = prepared_mesh(mesh, transformation, RIGID_BODY_COLOR.rgba) + mesh_data = mesh_node.add_mesh(gltf_mesh) + mesh_data.mesh_name = mesh_name + counts["meshes"] += 1 + counts["vertices"] += gltf_mesh.number_of_vertices() + counts["faces"] += gltf_mesh.number_of_faces() + + filepath.parent.mkdir(parents=True, exist_ok=True) + gltf = GLTF(str(filepath)) + gltf.content = content + gltf.export(embed_data=True) + + # Parse the artifact again so a corrupt or unsupported export fails the run. + exported = GLTF(str(filepath)) + exported.read() + if len(exported.content.meshes) != counts["meshes"]: + raise RuntimeError("glTF round-trip mesh count does not match the exported cell.") + + counts["nodes"] = len(exported.content.nodes) + counts["bytes"] = filepath.stat().st_size + return counts + + +def scenario_metadata( + scenario: str, + solver: str, + cell_factory: str, + axis: Optional[str], + end_effector: str, + target_mode: TargetMode, + target_frame: Frame, + robot_cell: RobotCell, + state: RobotCellState, + validation: dict, +) -> dict: + configuration = state.robot_configuration + return { + "scenario": scenario, + "solver": solver, + "cell_factory": cell_factory, + "end_effector": end_effector, + "cone_axis": "+{}".format(axis.upper()) if axis else None, + "authored_cone_axis": "+{}".format(axis.upper()) if axis else None, + "mounted_cone_axis": "+Z" if axis else None, + "robot": robot_cell.robot_model.name, + "group": robot_cell.main_group_name, + "target_mode": target_mode.name, + "target_frame": frame_data(target_frame), + "attached_tool": state.get_attached_tool_id(robot_cell.main_group_name), + "joint_names": list(configuration.joint_names), + "joint_values": list(configuration.joint_values), + "validation": validation, + "coordinate_system": {"source_up_axis": "+Z", "gltf_up_axis": "+Y"}, + } + + +def generate_local_scenario(cell_factory: str, solver: str, axis: Optional[str], output_dir: Path, extension: str) -> dict: + spec = LOCAL_CELL_SPECS[cell_factory] + robot_cell, state = getattr(RobotCellLibrary, cell_factory)(load_geometry=True) + + if spec.end_effector == "generated_cone": + if not axis: + raise ValueError("Generated-cone scenarios require an axis.") + state = add_and_attach_tool(robot_cell, axis) + scenario_suffix = "cone_{}".format(axis) + elif spec.end_effector == "built_in_tool": + tool_id = state.get_attached_tool_id(robot_cell.main_group_name) + if not tool_id: + raise RuntimeError("RobotCellLibrary.{} did not return its built-in tool attached.".format(cell_factory)) + scenario_suffix = "built_in_{}".format(tool_id) + else: + scenario_suffix = "robot_end_effector" + + target_mode = target_mode_for_spec(spec) + target_frame = reachable_target_frame(robot_cell, state, target_mode) + target = FrameTarget(target_frame, target_mode) + backend_frame = None + if solver == "analytical": + state = solve_analytical(robot_cell, state, target, spec.analytical_solver) + elif solver == "pybullet": + state, backend_frame = solve_pybullet(robot_cell, state, target) + else: + raise ValueError("Unknown local solver: {}".format(solver)) + + validation = validate_solution(robot_cell, state, target_frame, target_mode, backend_frame=backend_frame) + scenario = "{}_{}_{}".format(cell_factory, solver, scenario_suffix) + metadata = scenario_metadata( + scenario, + solver, + cell_factory, + axis, + spec.end_effector, + target_mode, + target_frame, + robot_cell, + state, + validation, + ) + filepath = output_dir / "{}.{}".format(scenario, extension) + counts = export_snapshot(filepath, scenario, robot_cell, state, target_frame, metadata) + return {"artifact": filepath.name, "metadata": metadata, "geometry": counts} + + +def generate_ros_scenarios(args, output_dir: Path, extension: str) -> list[dict]: + client_kwargs = {"host": args.ros_host, "port": args.ros_port, "is_secure": args.ros_secure} + with RosClient(**client_kwargs) as client: + robot_cell = client.load_robot_cell( + load_geometry=True, + local_cache_directory=args.ros_cache, + http_file_server_base_url=args.ros_http_file_server, + ) + planner = MoveItPlanner(client) + results = [] + for axis in args.axes: + state = add_and_attach_tool(robot_cell, axis) + target_frame = reachable_target_frame(robot_cell, state, TargetMode.TOOL) + target = FrameTarget(target_frame, TargetMode.TOOL) + state = solve_moveit(planner, robot_cell, state, target) + validation = validate_solution(robot_cell, state, target_frame, TargetMode.TOOL) + safe_robot_name = robot_cell.robot_model.name.replace("/", "_").replace(" ", "_") + scenario = "{}_ros_moveit_cone_{}".format(safe_robot_name, axis) + metadata = scenario_metadata( + scenario, + "ros_moveit", + "ros", + axis, + "generated_cone", + TargetMode.TOOL, + target_frame, + robot_cell, + state, + validation, + ) + filepath = output_dir / "{}.{}".format(scenario, extension) + counts = export_snapshot(filepath, scenario, robot_cell, state, target_frame, metadata) + results.append({"artifact": filepath.name, "metadata": metadata, "geometry": counts}) + return results + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument( + "--solvers", + nargs="+", + choices=("analytical", "pybullet", "ros"), + default=("analytical", "pybullet"), + help="IK backends to snapshot (default: analytical pybullet). 'ros' uses MoveIt.", + ) + parser.add_argument( + "--cells", + nargs="+", + choices=tuple(LOCAL_CELL_SPECS) + tuple(CELL_PRESETS), + default=("ur10e",), + help="Local RobotCellLibrary factories or presets (default: ur10e). Ignored by ROS scenarios.", + ) + parser.add_argument("--axes", nargs="+", choices=("z", "x"), default=("z", "x"), help="Cone mounting axes (default: z x).") + parser.add_argument("--format", choices=("glb", "gltf"), default="glb", help="Single-file glTF format (default: glb).") + parser.add_argument("--output-dir", type=Path, default=Path("temp/robot_cell_snapshots"), help="Artifact directory.") + parser.add_argument("--ros-host", default="localhost", help="rosbridge host (ROS scenarios only).") + parser.add_argument("--ros-port", type=int, default=9090, help="rosbridge port (ROS scenarios only).") + parser.add_argument("--ros-secure", action="store_true", help="Use a secure rosbridge WebSocket.") + parser.add_argument("--ros-cache", help="Robot-specific local geometry cache directory.") + parser.add_argument("--ros-http-file-server", help="ROS 2 HTTP file-server base URL used to resolve package meshes.") + return parser.parse_args() + + +def expand_cells(values: Iterable[str]) -> list[str]: + """Expand cell presets while retaining order and removing duplicates.""" + expanded = [] + for value in values: + names = CELL_PRESETS.get(value, (value,)) + for name in names: + if name not in expanded: + expanded.append(name) + return expanded + + +def print_result(output_dir: Path, result: dict) -> None: + geometry = result["geometry"] + print( + "Generated {} ({} meshes, {} vertices, {:.1f} KiB)".format( + output_dir / result["artifact"], + geometry["meshes"], + geometry["vertices"], + geometry["bytes"] / 1024.0, + ) + ) + validation = result["metadata"]["validation"] + if not validation["model_matches_target"]: + print(" Warning: RobotModel FK differs from solver FK by {:.3f} mm at the target.".format(validation["backend_model_position_delta_m"] * 1000.0)) + + +def main() -> None: + args = parse_args() + output_dir = args.output_dir.resolve() + results = [] + skipped = [] + local_cells = expand_cells(args.cells) + + for solver in args.solvers: + if solver == "ros": + solver_results = generate_ros_scenarios(args, output_dir, args.format) + results.extend(solver_results) + for result in solver_results: + print_result(output_dir, result) + continue + for cell_factory in local_cells: + spec = LOCAL_CELL_SPECS[cell_factory] + if solver == "analytical" and not spec.analytical_solver: + skip = { + "cell_factory": cell_factory, + "solver": solver, + "reason": "No analytical kinematics solver is available for this robot.", + } + skipped.append(skip) + print("Skipped {} with {}: {}".format(cell_factory, solver, skip["reason"])) + continue + axes = args.axes if spec.end_effector == "generated_cone" else (None,) + for axis in axes: + result = generate_local_scenario(cell_factory, solver, axis, output_dir, args.format) + results.append(result) + print_result(output_dir, result) + + manifest = { + "versions": { + "compas": compas.__version__, + "compas_fab": compas_fab.__version__, + "compas_robots": compas_robots.__version__, + }, + "results": results, + "skipped": skipped, + } + manifest_path = output_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, indent=2, sort_keys=True) + "\n") + print("Generated manifest {}".format(manifest_path)) + + +if __name__ == "__main__": + main() From 124a129cd7e2d5dd006f086192e077decebd3bc1 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Mon, 3 Aug 2026 18:05:34 +0200 Subject: [PATCH 7/9] (temp) Point to git branch of compas_robots until new version is released --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 545fefe782..9f8c343071 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ compas >= 2.3, < 3 -compas_robots >= 1, < 2 +compas_robots @ git+https://github.com/compas-dev/compas_robots.git@tool-base-frame roslibpy >=2 From e103d0ee49e310ffe4aeebd533fcdc9219639a4c Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Tue, 4 Aug 2026 15:57:41 +0200 Subject: [PATCH 8/9] Spell out the migration path for the tool mounting changes Three changes in this release alter results rather than the API, and one of them - a leftover compensating attachment_frame now rotating the tool twice - fails silently. A Migrating section at the top of the release says what to remove, what to re-author and what to regenerate, and the docstring of set_tool_attached_to_group points at it from the parameter that carries the break. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 12 +++++++++++- src/compas_fab/robots/state.py | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0e284b001..988249e3fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Migrating + +Three changes in this release alter results rather than the API. Code that compensated for the old behaviour needs the compensation removed. + +* **Tools from `ToolLibrary` mount along +Z.** If you attached one with an `attachment_frame` that rotated it to bridge the old +X convention — `state.set_tool_attached_to_group(tool_id, group, attachment_frame=Frame([0, 0, 0], [0, 0, 1], [1, 0, 0]))`, which is what the library's own cells used to do — drop that argument. The tool now attaches with an identity frame, and a leftover rotation rotates it twice. This is the one break that fails silently: nothing errors, the tool simply hangs off the flange sideways. Tools you authored yourself are untouched; if one was modelled along +X to match the old library convention, either re-express it with the new `base_frame` argument of `ToolModel` (`base_frame=Frame([0, 0, 0], [0, 1, 0], [0, 0, 1])`, the plane whose z+ runs along the tool's x+) or keep attaching it with the rotation you already use. +* **`TargetMode.TOOL` targets against library tools moved 90 degrees.** The TCF's Z axis now runs along the tool's working direction, where its X axis used to. A target frame that was correct before now points the tool sideways. Re-author such targets so their Z axis points where the tool should point — which is what the mode meant all along. +* **Analytical kinematics for UR robots returns different numbers.** Forward kinematics now reports the orientation of the `tool0` link (matching the robot model and PyBullet) instead of a version rotated by the never-applied `flange_frame`, and inverse kinematics interprets targets in that same corrected frame. Positions are unchanged; orientations are not. Frames and configurations recorded from the old solver — golden values in tests, targets tuned by trial and error, cached trajectories — have to be regenerated. Targets that were correct in `TargetMode.ROBOT` under PyBullet or MoveIt now work unchanged with the analytical planner too, which was the point. + +Requires `compas_robots >= 1.1`. + ### Added * The `Tool From Mesh` Grasshopper component gained a `base_plane` input: where the robot's flange takes hold of the geometry, expressed in the coordinates the mesh was modelled in. Its Z axis points away from the robot, so a tool drawn reaching along world Z needs none, and a tool drawn along another axis is mounted by wiring a plane instead of redrawing the geometry. Backed by the new `base_frame` argument of `compas_robots.ToolModel`; nothing is baked into the mesh, so the plane can be re-wired at any time. The component also surfaces a remark when the TCP does not sit roughly on the tool's +Z, since that means the tool will point sideways once attached — the direction from the mount to the TCP is only a hint (it says nothing about roll), so it is reported rather than applied. ### Changed -* The tools in `ToolLibrary` now mount along the +Z axis of their base frame instead of +X. Every planning group in `RobotCellLibrary` ends at a link whose +Z points away from the arm (`tool0` for the industrial robots, `panda_hand_tcp` for the Panda), so with this the same tool attaches to any of them with an identity attachment frame — previously each cell carried a rotation to bridge the two conventions, and a tool authored for one robot did not necessarily fit another. Their TCF states the tool's working direction with its own Z axis too, so a `TargetMode.TOOL` target aligns the tool along the target's Z — previously the TCF's X axis ran along the tool, which put every tool-mode target 90 degrees out. The tools are still modelled along +X internally and re-framed on the way out via `ToolModel.reframe_base`. The beams held by the gripper cells are authored in TCF coordinates and were re-authored to match, so they stay put. Poses are unchanged: the attached tools and workpieces of every cell land exactly where they did, only the tool's base frame is now the end effector link's frame rather than a rotated version of it. Requires the `reframe_base` support of the next `compas_robots` release. +* The tools in `ToolLibrary` now mount along the +Z axis of their base frame instead of +X. Every planning group in `RobotCellLibrary` ends at a link whose +Z points away from the arm (`tool0` for the industrial robots, `panda_hand_tcp` for the Panda), so with this the same tool attaches to any of them with an identity attachment frame — previously each cell carried a rotation to bridge the two conventions, and a tool authored for one robot did not necessarily fit another. Their TCF states the tool's working direction with its own Z axis too, so a `TargetMode.TOOL` target aligns the tool along the target's Z — previously the TCF's X axis ran along the tool, which put every tool-mode target 90 degrees out. The tools are still modelled along +X internally and re-framed on the way out via `ToolModel.reframe_base`. The beams held by the gripper cells are authored in TCF coordinates and were re-authored to match, so they stay put. Poses are unchanged: the attached tools and workpieces of every cell land exactly where they did, only the tool's base frame is now the end effector link's frame rather than a rotated version of it. Requires the `reframe_base` support of `compas_robots >= 1.1`. * `MoveItInverseKinematics` now sends the target pose with an explicit `ik_link_name` (the planning group's end effector link, overridable via the new `"link"` option) instead of relying on MoveIt's default tip link for the group. The two are the same link for the robots in this library, but nothing guarantees that for a planning group configured with a different tip, in which case MoveIt would interpret the target pose at the wrong frame. `PositionIKRequest` gained the corresponding `ik_link_name` field. * `AnalyticalKinematicsPlanner` now honours the `flange_frame` of its kinematics solver, and the UR solvers (`OffsetWristKinematics` and its subclasses) declare one. Their DH chain ends at the robot's flange, whose x+ points away from the last link, while the planning group ends at `tool0`, whose z+ does — a fixed rotation apart. `flange_frame` was documented as the way to state that offset but was never applied, so the solver and the URDF model disagreed on the orientation of the end effector: every target was interpreted rotated and the robot never reached the frame it was asked for. Analytical forward kinematics now agrees with the robot model (and with PyBullet) to 1e-10, and a `TargetMode.TOOL` target is reached exactly. diff --git a/src/compas_fab/robots/state.py b/src/compas_fab/robots/state.py index 8f347955be..000f5bbb47 100644 --- a/src/compas_fab/robots/state.py +++ b/src/compas_fab/robots/state.py @@ -211,6 +211,10 @@ def set_tool_attached_to_group( attachment_frame The frame of the tool relative to the end frame of the planning group. Defaults to None, which means that the tool's frame coincides with the end frame of the planning group. + The tools in [`ToolLibrary`][compas_fab.robots.ToolLibrary] are authored to mount that way, so leave this + out for them; pass a frame only for a tool that is deliberately mounted somewhere else on the + flange, or at an angle to it. Note that a tool modelled for an earlier release of this library may + carry its mounting rotation here — see the migration notes of version 2.1. touch_links The names of the robot links that are allowed to collide with the tool. From 5a00565f55c90b3496cfe02bfa842c5f10da0336 Mon Sep 17 00:00:00 2001 From: Gonzalo Casas Date: Tue, 4 Aug 2026 15:57:41 +0200 Subject: [PATCH 9/9] (temp) Lock compas_robots to the git branch Follows the requirement pinned in the previous commit; both revert when compas_robots 1.1 is on PyPI. Co-Authored-By: Claude Opus 5 --- uv.lock | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/uv.lock b/uv.lock index d619e227e4..f0be94418b 100644 --- a/uv.lock +++ b/uv.lock @@ -693,7 +693,7 @@ requires-dist = [ { name = "bump-my-version", marker = "extra == 'dev'" }, { name = "compas", specifier = ">=2.3,<3" }, { name = "compas-invocations2", extras = ["mkdocs"], marker = "extra == 'dev'" }, - { name = "compas-robots", specifier = ">=1,<2" }, + { name = "compas-robots", git = "https://github.com/compas-dev/compas_robots.git?rev=tool-base-frame" }, { name = "invoke", marker = "extra == 'dev'", specifier = ">=0.14" }, { name = "mkdocs-print-site-plugin", marker = "extra == 'dev'" }, { name = "pybullet", marker = "extra == 'dev'" }, @@ -750,14 +750,10 @@ mkdocs = [ [[package]] name = "compas-robots" version = "1.0.1" -source = { registry = "https://pypi.org/simple" } +source = { git = "https://github.com/compas-dev/compas_robots.git?rev=tool-base-frame#b5a1c676ddbaf7bac188695cdbcacd3c7832c693" } dependencies = [ { name = "compas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/f7/97b7e5b87b25931dc6d3e603c0af50ffd19fbaa2074b73b7bfca88aca853/compas_robots-1.0.1.tar.gz", hash = "sha256:5e3cdfc2f3e0ab00789f782ab9192b75dabbc031c542347958e6a96b17ca858b", size = 6043059, upload-time = "2026-05-15T11:05:09.738Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/90/6331e22189043fff683d883c587acc4187fe84319786a2ae7858dc9f796b/compas_robots-1.0.1-py3-none-any.whl", hash = "sha256:d9fe956d5fabccc1760be356e99a6019929326af23598d6312dca907e8677c20", size = 6077053, upload-time = "2026-05-15T11:05:07.211Z" }, -] [[package]] name = "constantly"