This project was the final challenge for Penn's graduate course on serial manipulator robotics. The objective was to program a 7-DOF robot arm (Franka Emika Robot) that could autonomously pick up and stack both static and dynamic blocks on a goal-scoring platform within four minutes. Points were awarded based on the height of the stack and whether the blocks were static or dynamic, with dynamic blocks yielding higher scores.
Our team focused on reliability and speed by using deterministic motions with pre-calculated positions and safety offsets rather than implementing complex path planning algorithms. Separate strategies were developed for static and dynamic blocks to account for their unique behaviors and challenges. We used numerical inverse kinematics to calculate the joint angles for the robot arm to reach the desired positions, using warm starts on the optimization from the previous joint angles. We additionally used a manipulability metric with the null space task to ensure the robot arm stayed away from singularities.
Pre-position for block grasping
Block orientation variation for static block
The workflow was divided into two main phases: stacking all static blocks first, followed by dynamic block stacking. Each phase consisted of two steps: grasping (approach, grab, and retract) and placing (move to goal platform, align, release, and retract).
We used forward and inverse kinematics algorithms developed earlier in the course, combined with an on-board camera and AprilTag detection for block localization. The ArmController managed robot motion while the ObjectDetector handled vision processing.
For static blocks, we adopted a top-down grasping and stacking approach to minimize collisions and simplify the task. Predefined scanning positions allowed the camera to capture all blocks on the field. Each detected block was approached vertically, grasped, and stacked in the center of the goal platform. We hardcoded safe positions for each stack layer to reduce computation time and improve reliability.
Dynamic blocks rotated on a turntable, requiring a different strategy. The gripper waited at a fixed position and angle, repeatedly attempting to capture blocks as they passed underneath. Once grasped, the dynamic block was stacked using predefined positions similar to the static stacking sequence, but with an adjusted roll angle to match the block's orientation.
The system was tested in both simulation and hardware. Success was measured by the number of blocks stacked, final stack height, total runtime, and qualitative factors such as stability and robustness.
In simulation, the robot consistently stacked four static blocks and two dynamic blocks, achieving the maximum possible score. On hardware, the final competition run achieved a stack of three static blocks in 2 minutes and 51 seconds. Dynamic block performance was more challenging due to calibration issues and physical constraints not present in simulation.
The static stacking algorithm was reliable but occasionally missed blocks due to limitations in the scanning field of view. Dynamic block stacking was highly sensitive to tuning and hardware offsets, making it less consistent during competition.
A key insight was that simulation often failed to accurately model physical factors such as friction and calibration offsets, highlighting the importance of testing extensively on real hardware.
Read the full MEAM 5200 lab report (PDF)
Final stack of static blocks
Competition one-on-one setup