def to_attached_collision_meshes(self): """Creates a list of attached collision meshes from a :class:`compas_fab.backends.AttachedCollisionObject` """ attached_collision_meshes = [] obj = self.object if isinstance(self.object, CollisionObject) else CollisionObject(**self.object) collision_meshes = obj.to_collision_meshes() for cm in collision_meshes: acm = AttachedCollisionMesh(cm, self.link_name, self.touch_links, self.weight) attached_collision_meshes.append(acm) return attached_collision_meshes
def RunScript(self, scene, mesh, identifier, link_name, touch_links, add, remove): attached_collision_mesh = None if scene and mesh and identifier and link_name: compas_mesh = RhinoMesh.from_geometry(mesh).to_compas() collision_mesh = CollisionMesh(compas_mesh, identifier) attached_collision_mesh = AttachedCollisionMesh(collision_mesh, link_name, touch_links) if add: scene.add_attached_collision_mesh(attached_collision_mesh) if remove: scene.remove_attached_collision_mesh(identifier) scene.remove_collision_mesh(identifier) return attached_collision_mesh
def data(self, data): self.points = list( map(JointTrajectoryPoint.from_data, data.get('points') or [])) self.joint_names = data.get('joint_names', []) if data.get('start_configuration'): self.start_configuration = Configuration.from_data( data.get('start_configuration')) self.fraction = data.get('fraction') self.attached_collision_meshes = [ AttachedCollisionMesh.from_data(acm_data) for acm_data in data.get('attached_collision_meshes', []) ]
import time import compas_fab from compas_fab.backends.pybullet import PyBulletClient from compas_fab.robots import AttachedCollisionMesh from compas_fab.robots import CollisionMesh from compas.datastructures import Mesh with PyBulletClient() as client: urdf_filepath = compas_fab.get( 'universal_robot/ur_description/urdf/ur5.urdf') robot = client.load_robot(urdf_filepath) mesh = Mesh.from_stl(compas_fab.get('planning_scene/cone.stl')) cm = CollisionMesh(mesh, 'tip') acm = AttachedCollisionMesh(cm, 'ee_link') client.add_attached_collision_mesh(acm, {'mass': 1, 'robot': robot}) time.sleep(1) client.step_simulation() time.sleep(1) client.remove_attached_collision_mesh('tip') time.sleep(1)
tolerance_axes = [math.radians(1)] * 3 with RosClient('localhost') as client: robot = client.load_robot() scene = PlanningScene(robot) scene.remove_collision_mesh('brick_wall') # attach tool robot.attach_tool(tool) # add tool to scene scene.add_attached_tool() # create an attached collision mesh to the robot's end effector. ee_link_name = robot.get_end_effector_link_name() brick_acm = AttachedCollisionMesh( CollisionMesh(element_tool0.mesh, 'brick'), ee_link_name) # add the collision mesh to the scene scene.add_attached_collision_mesh(brick_acm) # ========================================================================== # 1. Calculate a cartesian motion from the picking frame to the savelevel_picking_frame frames = [picking_frame, savelevel_picking_frame] start_configuration = picking_configuration trajectory1 = robot.plan_cartesian_motion( robot.from_attached_tool_to_tool0(frames), start_configuration, max_step=0.01, attached_collision_meshes=[brick_acm]) assert (trajectory1.fraction == 1.)
# load assembly from file filepath = os.path.join(DATA, '048_flemish_bond.json') # load from existing if calculation failed at one point... clear_planning_scene = True if os.path.isfile(PATH_TO): assembly = Assembly.from_json(PATH_TO) clear_planning_scene = False else: assembly = Assembly.from_json(filepath) # create an attached collision mesh to be attached to the robot's end effector. T = Transformation.from_frame_to_frame(brick.gripping_frame, tool.frame) brick_tool0 = brick.transformed(T) attached_brick_mesh = AttachedCollisionMesh( CollisionMesh(brick_tool0.mesh, 'brick'), 'ee_link') # ============================================================================== # From here on: fill in code, whereever you see this dots ... def plan_picking_motion(robot, picking_frame, savelevel_picking_frame, start_configuration, attached_brick_mesh): """Returns a cartesian trajectory to pick an element. Parameters ---------- robot : :class:`compas.robots.Robot` picking_frame : :class:`Frame` save_level_picking_frame : :class:`Frame` start_configuration : :class:`Configuration`
from compas.datastructures import Mesh from compas.geometry import Frame from compas.robots import Configuration import compas_fab from compas_fab.backends import RosClient from compas_fab.robots import CollisionMesh, AttachedCollisionMesh with RosClient() as client: robot = client.load_robot() assert robot.name == 'ur5' ee_link_name = robot.get_end_effector_link_name() mesh = Mesh.from_stl(compas_fab.get('planning_scene/cone.stl')) cm = CollisionMesh(mesh, 'tip') acm = AttachedCollisionMesh(cm, link_name=ee_link_name) client.add_attached_collision_mesh(acm) frames = [] frames.append(Frame([0.3, 0.1, 0.5], [1, 0, 0], [0, 1, 0])) frames.append(Frame([0.5, 0.1, 0.6], [1, 0, 0], [0, 1, 0])) start_configuration = Configuration.from_revolute_values([-0.042, 0.033, -2.174, 5.282, -1.528, 0.000]) options = { 'max_step': 0.01, 'avoid_collisions': True, } trajectory = robot.plan_cartesian_motion(frames, start_configuration, options=options)
def test_collision_checker(abb_irb4600_40_255_setup, itj_TC_g1_cms, itj_beam_cm, column_obstacle_cm, base_plate_cm, itj_tool_changer_grasp_transf, itj_gripper_grasp_transf, itj_beam_grasp_transf, tool_type, itj_tool_changer_urdf_path, itj_g1_urdf_path, viewer, diagnosis): # modified from https://github.com/yijiangh/pybullet_planning/blob/dev/tests/test_collisions.py urdf_filename, semantics = abb_irb4600_40_255_setup move_group = 'bare_arm' ee_touched_link_names = ['link_6'] with PyChoreoClient(viewer=viewer) as client: with LockRenderer(): robot = client.load_robot(urdf_filename) robot.semantics = semantics client.disabled_collisions = robot.semantics.disabled_collisions if tool_type == 'static': for _, ee_cm in itj_TC_g1_cms.items(): client.add_collision_mesh(ee_cm) else: client.add_tool_from_urdf('TC', itj_tool_changer_urdf_path) client.add_tool_from_urdf('g1', itj_g1_urdf_path) # * add static obstacles client.add_collision_mesh(base_plate_cm) client.add_collision_mesh(column_obstacle_cm) ik_joint_names = robot.get_configurable_joint_names(group=move_group) ik_joint_types = robot.get_joint_types_by_names(ik_joint_names) flange_link_name = robot.get_end_effector_link_name(group=move_group) tool0_tf = Transformation.from_frame( client.get_link_frame_from_name(robot, flange_link_name)) tool0_from_tool_changer_base = itj_tool_changer_grasp_transf tool0_from_gripper_base = itj_gripper_grasp_transf client.set_object_frame( '^{}'.format('TC'), Frame.from_transformation(tool0_tf * tool0_from_tool_changer_base)) client.set_object_frame( '^{}'.format('g1'), Frame.from_transformation(tool0_tf * tool0_from_gripper_base)) names = client._get_collision_object_names('^{}'.format('g1')) + \ client._get_collision_object_names('^{}'.format('TC')) for ee_name in names: attach_options = {'robot': robot} if tool_type == 'actuated': attached_child_link_name = 'toolchanger_base' if 'TC' in ee_name else 'gripper_base' attach_options.update( {'attached_child_link_name': attached_child_link_name}) client.add_attached_collision_mesh(AttachedCollisionMesh( CollisionMesh(None, ee_name), flange_link_name, touch_links=ee_touched_link_names), options=attach_options) # client._print_object_summary() # wait_if_gui('EE attached.') if tool_type == 'actuated': # lower 0.0008 upper 0.01 tool_bodies = client._get_bodies('^{}'.format('itj_PG500')) tool_conf = Configuration( values=[0.01, 0.01], types=[Joint.PRISMATIC, Joint.PRISMATIC], joint_names=['joint_gripper_jaw_l', 'joint_gripper_jaw_r']) for b in tool_bodies: client._set_body_configuration(b, tool_conf) wait_if_gui('Open') tool_conf = Configuration( values=[0.0008, 0.0008], types=[Joint.PRISMATIC, Joint.PRISMATIC], joint_names=['joint_gripper_jaw_l', 'joint_gripper_jaw_r']) for b in tool_bodies: client._set_body_configuration(b, tool_conf) wait_if_gui('Close') cprint('safe start conf', 'green') conf = Configuration(values=[0.] * 6, types=ik_joint_types, joint_names=ik_joint_names) assert not client.check_collisions( robot, conf, options={'diagnosis': diagnosis}) cprint('joint over limit', 'cyan') conf = Configuration(values=[0., 0., 1.5, 0, 0, 0], types=ik_joint_types, joint_names=ik_joint_names) assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) cprint('attached gripper-obstacle collision - column', 'cyan') vals = [ -0.33161255787892263, -0.43633231299858238, 0.43633231299858238, -1.0471975511965976, 0.087266462599716474, 0.0 ] # conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) # client.set_robot_configuration(robot, conf) # wait_if_gui() assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) #* attach beam client.add_collision_mesh(itj_beam_cm) tool0_tf = Transformation.from_frame( client.get_link_frame_from_name(robot, flange_link_name)) tool0_from_beam_base = itj_beam_grasp_transf client.set_object_frame( '^{}$'.format('itj_beam_b2'), Frame.from_transformation(tool0_tf * tool0_from_beam_base)) client.add_attached_collision_mesh(AttachedCollisionMesh( CollisionMesh(None, 'itj_beam_b2'), flange_link_name, touch_links=[]), options={'robot': robot}) # wait_if_gui('beam attached.') cprint('attached beam-robot body self collision', 'cyan') vals = [ 0.73303828583761843, -0.59341194567807209, 0.54105206811824214, -0.17453292519943295, 1.064650843716541, 1.7278759594743862 ] conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) cprint('attached beam-obstacle collision - column', 'cyan') vals = [ 0.087266462599716474, -0.19198621771937624, 0.20943951023931956, 0.069813170079773182, 1.2740903539558606, 0.069813170079773182 ] conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) cprint('attached beam-obstacle collision - ground', 'cyan') vals = [ -0.017453292519943295, 0.6108652381980153, 0.20943951023931956, 1.7627825445142729, 1.2740903539558606, 0.069813170079773182 ] conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) cprint('robot link-obstacle collision - column', 'cyan') vals = [ -0.41887902047863912, 0.20943951023931956, 0.20943951023931956, 1.7627825445142729, 1.2740903539558606, 0.069813170079773182 ] conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) cprint('robot link-obstacle collision - ground', 'cyan') vals = [ 0.33161255787892263, 1.4660765716752369, 0.27925268031909273, 0.17453292519943295, 0.22689280275926285, 0.54105206811824214 ] conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert client.check_collisions(robot, conf, options={'diagnosis': diagnosis}) cprint('Sweeping collision', 'cyan') vals = [ -0.12217304763960307, -0.73303828583761843, 0.83775804095727824, -2.4609142453120048, 1.2391837689159739, -0.85521133347722145 ] conf1 = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert not client.check_collisions( robot, conf1, options={'diagnosis': diagnosis}) # wait_if_gui() vals = [ -0.12217304763960307, -0.73303828583761843, 0.83775804095727824, -2.4958208303518914, -1.5533430342749532, -0.85521133347722145 ] conf2 = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) assert not client.check_collisions( robot, conf2, options={'diagnosis': diagnosis}) # wait_if_gui() assert client.check_sweeping_collisions(robot, conf1, conf2, options={ 'diagnosis': diagnosis, 'line_width': 3.0 }) wait_if_gui("Finished.")
def test_plan_motion(abb_irb4600_40_255_setup, itj_TC_g1_cms, itj_beam_cm, column_obstacle_cm, base_plate_cm, itj_tool_changer_grasp_transf, itj_gripper_grasp_transf, itj_beam_grasp_transf, tool_type, itj_tool_changer_urdf_path, itj_g1_urdf_path, viewer, diagnosis): # modified from https://github.com/yijiangh/pybullet_planning/blob/dev/tests/test_collisions.py urdf_filename, semantics = abb_irb4600_40_255_setup move_group = 'bare_arm' ee_touched_link_names = ['link_6'] with PyChoreoClient(viewer=viewer) as client: with LockRenderer(): robot = client.load_robot(urdf_filename) robot.semantics = semantics client.disabled_collisions = robot.semantics.disabled_collisions if tool_type == 'static': for _, ee_cm in itj_TC_g1_cms.items(): client.add_collision_mesh(ee_cm) else: client.add_tool_from_urdf('TC', itj_tool_changer_urdf_path) client.add_tool_from_urdf('g1', itj_g1_urdf_path) # * add static obstacles client.add_collision_mesh(base_plate_cm) client.add_collision_mesh(column_obstacle_cm) ik_joint_names = robot.get_configurable_joint_names(group=move_group) ik_joint_types = robot.get_joint_types_by_names(ik_joint_names) flange_link_name = robot.get_end_effector_link_name(group=move_group) tool0_tf = Transformation.from_frame( client.get_link_frame_from_name(robot, flange_link_name)) tool0_from_tool_changer_base = itj_tool_changer_grasp_transf tool0_from_gripper_base = itj_gripper_grasp_transf client.set_object_frame( '^{}'.format('TC'), Frame.from_transformation(tool0_tf * tool0_from_tool_changer_base)) client.set_object_frame( '^{}'.format('g1'), Frame.from_transformation(tool0_tf * tool0_from_gripper_base)) names = client._get_collision_object_names('^{}'.format('g1')) + \ client._get_collision_object_names('^{}'.format('TC')) for ee_name in names: attach_options = {'robot': robot} if tool_type == 'actuated': attached_child_link_name = 'toolchanger_base' if 'TC' in ee_name else 'gripper_base' attach_options.update( {'attached_child_link_name': attached_child_link_name}) client.add_attached_collision_mesh(AttachedCollisionMesh( CollisionMesh(None, ee_name), flange_link_name, touch_links=ee_touched_link_names), options=attach_options) #* attach beam client.add_collision_mesh(itj_beam_cm) tool0_tf = Transformation.from_frame( client.get_link_frame_from_name(robot, flange_link_name)) tool0_from_beam_base = itj_beam_grasp_transf client.set_object_frame( '^{}$'.format('itj_beam_b2'), Frame.from_transformation(tool0_tf * tool0_from_beam_base)) client.add_attached_collision_mesh(AttachedCollisionMesh( CollisionMesh(None, 'itj_beam_b2'), flange_link_name, touch_links=[]), options={'robot': robot}) wait_if_gui('beam attached.') vals = [ -1.4660765716752369, -0.22689280275926285, 0.27925268031909273, 0.17453292519943295, 0.22689280275926285, -0.22689280275926285 ] start_conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) # client.set_robot_configuration(robot, start_conf) # wait_if_gui() # vals = [0.05235987755982989, -0.087266462599716474, -0.05235987755982989, 1.7104226669544429, 0.13962634015954636, -0.43633231299858238] vals = [ 0.034906585039886591, 0.68067840827778847, 0.15707963267948966, -0.89011791851710809, -0.034906585039886591, -2.2514747350726849 ] end_conf = Configuration(values=vals, types=ik_joint_types, joint_names=ik_joint_names) # client.set_robot_configuration(robot, end_conf) # wait_if_gui() plan_options = {'diagnosis': True, 'resolutions': 0.05} goal_constraints = robot.constraints_from_configuration( end_conf, [0.01], [0.01], group=move_group) st_time = time.time() trajectory = client.plan_motion(robot, goal_constraints, start_configuration=start_conf, group=move_group, options=plan_options) print('Solving time: {}'.format(elapsed_time(st_time))) if trajectory is None: cprint('Client motion planner CANNOT find a plan!', 'red') # assert False, 'Client motion planner CANNOT find a plan!' # TODO warning else: cprint('Client motion planning find a plan!', 'green') wait_if_gui('Start sim.') time_step = 0.03 for traj_pt in trajectory.points: client.set_robot_configuration(robot, traj_pt) wait_for_duration(time_step) wait_if_gui("Finished.")
frame = Frame([0.4, 0.3, 0.4], [0, 1, 0], [0, 0, 1]) tolerance_position = 0.001 tolerance_axes = [math.radians(1)] * 3 with RosClient() as client: robot = Robot(client) start_configuration = Configuration.from_revolute_values([-0.042, 4.295, 0, -3.327, 4.755, 0.]) group = robot.main_group_name # create attached collision object mesh = Mesh.from_stl(compas_fab.get('planning_scene/cone.stl')) cm = CollisionMesh(mesh, 'tip') ee_link_name = 'ee_link' touch_links = ['wrist_3_link', 'ee_link'] acm = AttachedCollisionMesh(cm, ee_link_name, touch_links) # create goal constraints from frame goal_constraints = robot.constraints_from_frame(frame, tolerance_position, tolerance_axes, group) trajectory = robot.plan_motion(goal_constraints, start_configuration, group, planner_id='RRT', attached_collision_meshes=[acm]) print("Computed kinematic path with %d configurations." % len(trajectory.points))
CollisionMesh(Mesh.from_data(m), name) for m, name in zip(data['collision_meshes'], data['collision_names']) ] # load assembly from file or from existing if calculation failed at one point... filepath = os.path.join(DATA, "assembly.json") if LOAD_FROM_EXISTING and os.path.isfile(PATH_TO): assembly = Assembly.from_json(PATH_TO) else: assembly = Assembly.from_json(filepath) # create an attached collision mesh to be attached to the robot's end effector. T = Transformation.from_frame_to_frame(element0._tool_frame, tool.frame) element0_tool0 = element0.transformed(T) attached_element_mesh = AttachedCollisionMesh( CollisionMesh(element0_tool0.mesh, 'element'), 'ee_link') # ============================================================================== # From here on: fill in code, whereever you see this dots ... # NOTE: If you run Docker Toolbox, change `localhost` to `192.168.99.100` with RosClient('localhost') as client: robot = client.load_robot() scene = PlanningScene(robot) robot.attach_tool(tool) # 1. Add a collison mesh to the planning scene: floor, desk, etc. for cm in scene_collision_meshes: scene.add_collision_mesh(cm) if not LOAD_FROM_EXISTING: