| """ |
| Facebook/CMU LoCoBot drives to a cube, picks it up, and takes it to a target. |
| This script contains examples of: |
| - Linear mobile paths on a non-holonomic platform |
| - How to use the combination of a mobile base, manipulator, and gripper. |
| """ |
| from os.path import dirname, join, abspath |
| from pyrep import PyRep |
| from pyrep.robots.mobiles.locobot import LoCoBot |
| from pyrep.robots.arms.locobot_arm import LoCoBotArm |
| from pyrep.robots.end_effectors.locobot_gripper import LoCoBotGripper |
| from pyrep.objects.shape import Shape |
| from pyrep.objects.dummy import Dummy |
|
|
| SCENE_FILE = join(dirname(abspath(__file__)), 'scene_locobot_stack_cube.ttt') |
| pr = PyRep() |
| pr.launch(SCENE_FILE, headless=False) |
| pr.start() |
|
|
| base = LoCoBot() |
| arm = LoCoBotArm() |
| gripper = LoCoBotGripper() |
|
|
| base.set_motor_locked_at_zero_velocity(True) |
|
|
|
|
| def drive_to_position(position, orientation): |
| base_path = base.get_linear_path(position, orientation) |
| base_path.visualize() |
| done = False |
| while not done: |
| done = base_path.step() |
| pr.step() |
| pr.step() |
|
|
|
|
| def move_arm(position, quaternion, ignore_collisions=False): |
| arm_path = arm.get_path(position, |
| quaternion=quaternion, |
| ignore_collisions=ignore_collisions) |
| arm_path.visualize() |
| done = False |
| while not done: |
| done = arm_path.step() |
| pr.step() |
| arm_path.clear_visualization() |
|
|
|
|
| cuboid = Shape('cuboid') |
| goal = Shape('goal') |
| grasp_point = Dummy('grasp_point') |
|
|
| drive_pos = cuboid.get_position() |
| drive_pos[1] -= 0.3 |
|
|
| print('Driving to cube ...') |
| drive_to_position(drive_pos, 0) |
|
|
| grasp_point_raised = grasp_point.get_position() |
| grasp_point_raised[2] += 0.075 |
|
|
| print('Move arm above cube ...') |
| move_arm(grasp_point_raised, grasp_point.get_quaternion()) |
|
|
| print('Arm approach cube ...') |
| move_arm(grasp_point.get_position(), grasp_point.get_quaternion(), True) |
|
|
| print('Closing gripper ...') |
| while not gripper.actuate(0.0, 0.4): |
| pr.step() |
| gripper.grasp(cuboid) |
|
|
| print('Lift cube ...') |
| move_arm(grasp_point_raised, grasp_point.get_quaternion(), True) |
|
|
| drive_pos = goal.get_position() |
| drive_pos[1] -= 0.35 |
|
|
| print('Driving to goal ...') |
| drive_to_position(drive_pos, 0) |
|
|
| goal_point_raised = goal.get_position() |
| goal_point_raised[2] += 0.05 |
|
|
| print('Move arm above goal ...') |
| move_arm(goal_point_raised, grasp_point.get_quaternion()) |
|
|
| print('Drop cube ...') |
| gripper.release() |
| while not gripper.actuate(1.0, 0.4): |
| pr.step() |
|
|
| print('Done!') |
|
|
| pr.stop() |
| pr.shutdown() |
|
|