Baxter Pick and Place
2015-12-10 00:00:00 +0000
Overview
This project was part of the course ME 495, Embedded Systems in Robotics, at Northwestern University. The main goal of this project was to use the Baxter robot to autonomously pick objects off of a work surface and place them in a container. The blocks can be placed at any position and orientation on the table, and they are also sorted by tag number into two groups.
We split the task into four main parts which are implemented through a state machine:
All of the code for this project is hosted on this page.
Detecting the block with AR tracking
In this state, ar_track_alvar is used to find the block positions and orientations. Each block has a unique tag; if multiple blocks are found, the block that is closest to the current position will be used.
Moving above the block
In this state, a joint trajectory is calculated to move between from the current position to 10 mm above the block. The joint angles for the gripper position at the block is calculated through inverse kinematics and transformed to the robot’s base frame. The joint trajectory is then calulcated with quintic time scaling and the joint positions are sent sequentially to move the gripper to the desired position.
Adjusting the height
In this state, a Cartesian trajectory is used to hold the orientation of the gripper constant and just change the height as the gripper moves closer to the block. The laser range data from Baxter’s hand is used in a feedback loop to determine when the gripper has reached the block.
Dropoff
In this state, the gripper grabs the block and moves to drop it off in a specified location. The blocks are sorted into two groups using metadata from the AR tags to specify which dropoff location to use.