Product Concept #1
Description: A robotic arm designed to automate and facilitate the item sorting procedure by picking up objects and relocating them to their designated locations
Operation: The product will be programmed to be automated and require little operation, save for maintenance and troubleshooting.
Justification: The product is extremely easy to develop and assemble, using simple maneuvers that require minimal joints, though programming it to grab select products could prove difficult
Product Concept #2
Description: Delivery drones designed to ship items directly from a warehouse to the recipient, capable of overseas deliveries if given a sufficient power source
Operation: The product is automated, using GPS and various sensors to deliver products to their designated locations. Little to no operation is necessary.
Justification: The product requires little to no human input and is the most automated option, though it could prove difficult to develop
Product Concept #3
Description: Automated guided vehicles (AGVs) designed to lift and sort items across a larger warehouse
Operation: The product is fully automated, requiring little operation save for troubleshooting, and uses advanced coding, GPS, and various sensors to navigate surroundings and sort products
Justification: The product is the most flexible and precise option, but would be difficult to develop
Starting Idea
A sorting system utilizing a robotic arm that grabs and relocates certain products
Substitute the claw with a magnet
Combine the arm with a conveyor belt for easier access to products
Adapt the arm to scan codes on products in order to differentiate them
Magnify the arm to be extremely large to be able to grab a wider variety of scaled products
Modify the arm to have more hidden joints
Put the arm to another use by using it to export packages too
Eliminate the claw’s omnidirectional rotation, limit to y-axis
Rearrange the joints, move the omnidirectionality to a different joint
Reverse the angle of the root joint
(3D modeling process documented by Adam Gashaw)
(Concept sketch by Aithana Gomez-Prebe Romero)
(Final 3D model by Adam Gashaw)
(Final 3D model drawing)
While the robotic arm exceeds the standards for performance in a distribution center, it violates certain ethical principles. While the product is perfectly safe and even contributes to a less hazardous workspace, one of our greatest concerns about a modernized distribution center was the unemployment rates it could effectuate as a result of automation. The robotic arm, however, is highly automated and requires little to no operation, causing countless former operators to face unemployment. This issue could partially be addressed by sectioning off an automated workspace while preserving manual labor in certain tasks.
Our list of materials consists of the contents of the VEX CTE Workcell toolboxes we were provided:
(4) 6-Axis Robotic Arm
(4) Magnetic Pickup Tool
(4) Pen Holder Tool
(4) Power Adapter
(4) Power Supply Cable - Type A US
(4) USB cable (A-C) 1m
(4) Disk - Red - Tag 0
(4) Disk - Red - Tag 1
(4) Disk - Red - Tag 2
(4) Disk - Red - Tag 3
(4) Disk - Red - Tag 4
(4) Disk - Green - Tag 10
(4) Disk - Green - Tag 11
(4) Disk - Green - Tag 12
(4) Disk - Green - Tag 13
(8) Disk - Green - Tag 14
(8) CTE Tile
(320) Chain Link - Serpentine Conveyor
(24) CTE Tile Frame
(320) Platform - Serpentine Conveyor
(4) Zip Ties - 4" (100pk)
(4) T15 Screwdriver
(4) Object Sensor
(4) Signal Tower
(4) Air Tank 70mL
(4) Air Pump
(4) Pneumatic Solenoid
(8) 2 Pitch Stroke Pneumatic Cylinder
(4) 4 Pitch Pneumatic Cylinder
(4) 4mm Tubing - 6.5m
(24) V5 Smart Cable 300mm
(12) V5 Smart Cable 600mm
(12) V5 Smart Cable 900mm
(4) USB Charger - International
(4) USB Cable (A-C) (1m)
(4) 3 Wire Extender Cable 24"
(4) Disk Loader
(4) 32T Sprocket
(8) Pallet
(4) Cube - April Tag 20
(4) Cube - April Tag 21
(4) Cube - April Tag 22
(4) Cube - April Tag 23
(4) Cube - April Tag 24
(4) Cube - April Tag 25
(4) Cube - April Tag 26
(4) Cube - April Tag 27
(4) Cube - April Tag 28
(20) Linear Conveyor Assembly
(28) Straight Serpentine Conveyor Track Piece
(4) Drive Serpentine Conveyor Track Piece
(12) Diverter Serpentine Conveyor Track Piece
(24) Turn Serpentine Conveyor Track Piece
(8) Pneumatic Diverter Tower
(8) Pneumatic Diverter Arm
(4) Feeder Base
(4) Disk Feeder
(4) Robot Brain Mount
(4) Open End Wrench
The code allows the conveyors, primary belt, pneumatics, and AI sensor to work. The AI sensor detects chips and sorts them if they are greater than 6 or less than 6. Numbers greater than 6 will exit the simulation, while numbers less than 6 will stay on the belt. Blue boxes are sorted by the arm.
Konner Woo and J.D. Connole documented their experience in assembling this product...
"First we began with the coordinated movement classwide project. The process had us make 4 workcells and combine them together. This created a simulation that could infinitely loop the conveyors and transport goods inside the build. The program had students create their one workcells in groups which were then combined. We had existing code to work with, so all we had to do was add a few programs but that process came with a few problems. 1. How can we make the AI sensor work? How can we make the build function with the AI sensor? How can we sort with the AI sensor? And lastly, how could we make the arm work with the sensor?
Now, we move on to a different problem, where instead of sorting the packages through colors, we sort it with AI tags instead. AI tags are images on the packaging that allows an AI sensor to detect. The AI sensor we use is able to detect such tags and let us write code to sort the tags. Next we need to figure out how to use the AI sensor. We started by experimenting with the AI Sensor to first detect the tags. Using the VEX code example, we were able to build a foundation that allows us to properly utilize the sensor. We also had to create a design to add the AI sensor to the build. We created a simple design that holds the AI sensors up with stability and efficiency. At first we created a design under the main conveyor. One problem we encountered was that the conveyor was moving too fast for the AI tags to follow, which caused the tags to not be detected. Our solution was to move the sensor above the conveyor belt near where the packaging is distributed, rather than the main one. That conveyor runs way slower and is much more efficient for what we are trying to do.
After writing the program we ran into a few problems, we had to adjust the pneumatic sliders according to the timing of the package, in order to properly move the packaging fluidly. Secondly, we did not have a function for the arm yet. We decided to use the arm on the blue boxes included in the kit. For the pneumatics, we ran a lot of simulations to adjust the timing down to the last millisecond. It was a tedious process and took us a few days to figure out but we have finally got it. Another issue we had was with the product itself. There was no interference with the code, but we noticed that the main conveyor belt easily jams. There is too much friction with the design and leads to inconsistent results. We find that this is a very annoying problem for consumers using the device and that is something that needs to be fixed."
#region VEXcode Generated Robot Configuration
from vex import *
from cte import *
import urandom
import math
# Brain should be defined by default
brain = Brain()
# Robot configuration code
brain_inertial = Inertial()
# AI Vision Color Descriptions
# AI Vision Code Descriptions
ai_vision_1 = AiVision(Ports.PORT5, AiVision.ALL_TAGS)
motor_2 = Motor(Ports.PORT2, False)
motor_1 = Motor(Ports.PORT1, False)
motor_4 = Motor(Ports.PORT4, False)
pneumatic_3 = Pneumatic(Ports.PORT3)
signal_tower_6 = SignalTower(Ports.PORT6)
# Wait for sensor(s) to fully initialize
wait(100, MSEC)
# generating and setting random seed
def initializeRandomSeed():
wait(100, MSEC)
xaxis = brain_inertial.acceleration(XAXIS) * 1000
yaxis = brain_inertial.acceleration(YAXIS) * 1000
zaxis = brain_inertial.acceleration(ZAXIS) * 1000
systemTime = brain.timer.system() * 100
urandom.seed(int(xaxis + yaxis + zaxis + systemTime))
# Initialize random seed
initializeRandomSeed()
# Reset the Signal Tower lights
signal_tower_6.set_color(SignalTower.ALL, SignalTower.OFF)
signal_tower_6.set_color(SignalTower.GREEN, SignalTower.ON)
#endregion VEXcode Generated Robot Configuration
# ------------------------------------------------------------------------------
#
# Project: Detecting AprilTags (AI Vision)
# Description: This project will detect and display
# the AprilTag that is found to the EXP
# Brain's screen
# Configuration: AI Vision Sensor in Port 1
#
# ------------------------------------------------------------------------------
# Library imports
motor_1.set_velocity(15,PERCENT)
motor_2.set_velocity(35,PERCENT)
snapshot_objects=-1
def a():
for repeat_count in range(8):
pneumatic_3.extend(CYLINDER1)
wait(7.5,SECONDS)
pneumatic_3.retract(CYLINDER1)
wait(7.5,SECONDS)
signal_tower_6.pressed(a)
while True:
#mmake motors spin
motor_2.spin(FORWARD)
motor_1.spin(FORWARD)
motor_4.spin(REVERSE)
brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)
# Take a snapshot of all AprilTags
snapshot_objects = ai_vision_1.take_snapshot(AiVision.ALL_TAGS);
# Check to see if an AprilTag exists in this snapshot.
if snapshot_objects[0].id > 6:
wait(5.35,SECONDS)
motor_1.stop()
brain.screen.print("greater than 6")
wait(0.001,SECONDS)
pneumatic_3.retract(CYLINDER2)
wait(4,SECONDS)
pneumatic_3.extend(CYLINDER2)
motor_1.spin(FORWARD)
snapshot_objects = -1
elif snapshot_objects[0].id < 6 and snapshot_objects[0].id > 0:
wait(5.35,SECONDS)
motor_1.stop()
wait(.001,SECONDS)
brain.screen.print("less than 6")
pneumatic_3.retract(CYLINDER4)
wait(4,SECONDS)
pneumatic_3.extend(CYLINDER4)
motor_1.spin(FORWARD)
snapshot_objects = -1
wait(0.3, SECONDS)
wait(5, MSEC)
(Code by Konner Woo)
Arms must be able to pick up pieces
Conveyor belt must be able to move
Must move specified pieces to desired locations
Must use pneumatics to open and close gates
Must have minimal technical mishaps
A lot of the testing was just adjusting the timing from when the pneumatic cylinders would expand and retract. Eventually, we finalized it in exactly four seconds. We also noticed that when the conveyor would constantly move the AI tags around, we had to pause the conveyor to improve stability, because if the conveyor kept moving, the AI tags would not scan.
To remove the boxes from the conveyor belt we had to get the specific arm positions which required a lot of trial and error. Most of our testing was less for making sure it worked properly, but adding redundancy to our build so that we wouldn’t need to fix it much after we got it to the showcase. Eventually, we were able to make it run smoothly and make it run efficiently.
if snapshot_objects[0].id > 6:
wait(5.35,SECONDS)
motor_1.stop()
brain.screen.print("greater than 6")
wait(0.001,SECONDS)
pneumatic_3.retract(CYLINDER2)
wait(4,SECONDS)
pneumatic_3.extend(CYLINDER2)
motor_1.spin(FORWARD)
snapshot_objects = -1
elif snapshot_objects[0].id < 6 and snapshot_objects[0].id > 0:
wait(5.35,SECONDS)
motor_1.stop()
wait(.001,SECONDS)
brain.screen.print("less than 6")
pneumatic_3.retract(CYLINDER4)
wait(4,SECONDS)
pneumatic_3.extend(CYLINDER4)
motor_1.spin(FORWARD)
snapshot_objects = -1
wait(0.3, SECONDS)
wait(5, MSEC)
(Code by Konner Woo)
First testing program draft
#region VEXcode Generated Robot Configuration
from vex import *
from cte import *
import urandom
import math
# Brain should be defined by default
brain = Brain()
# Robot configuration code
brain_inertial = Inertial()
# AI Vision Color Descriptions
# AI Vision Code Descriptions
ai_vision_1 = AiVision(Ports.PORT5, AiVision.ALL_TAGS)
motor_2 = Motor(Ports.PORT2, False)
motor_1 = Motor(Ports.PORT1, False)
motor_4 = Motor(Ports.PORT4, False)
pneumatic_3 = Pneumatic(Ports.PORT3)
signal_tower_6 = SignalTower(Ports.PORT6)
# Wait for sensor(s) to fully initialize
wait(100, MSEC)
# generating and setting random seed
def initializeRandomSeed():
wait(100, MSEC)
xaxis = brain_inertial.acceleration(XAXIS) * 1000
yaxis = brain_inertial.acceleration(YAXIS) * 1000
zaxis = brain_inertial.acceleration(ZAXIS) * 1000
systemTime = brain.timer.system() * 100
urandom.seed(int(xaxis + yaxis + zaxis + systemTime))
# Initialize random seed
initializeRandomSeed()
# Reset the Signal Tower lights
signal_tower_6.set_color(SignalTower.ALL, SignalTower.OFF)
signal_tower_6.set_color(SignalTower.GREEN, SignalTower.ON)
#endregion VEXcode Generated Robot Configuration
# ------------------------------------------------------------------------------
#
# Project: Detecting AprilTags (AI Vision)
# Description: This project will detect and display
# the AprilTag that is found to the EXP
# Brain's screen
# Configuration: AI Vision Sensor in Port 1
#
# ------------------------------------------------------------------------------
# Library imports
motor_1.set_velocity(15,PERCENT)
motor_2.set_velocity(35,PERCENT)
snapshot_objects=-1
def a():
for repeat_count in range(8):
pneumatic_3.extend(CYLINDER1)
wait(7.5,SECONDS)
pneumatic_3.retract(CYLINDER1)
wait(7.5,SECONDS)
signal_tower_6.pressed(a)
while True:
#mmake motors spin
motor_2.spin(FORWARD)
motor_1.spin(FORWARD)
motor_4.spin(REVERSE)
brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)
# Take a snapshot of all AprilTags
snapshot_objects = ai_vision_1.take_snapshot(AiVision.ALL_TAGS);
# Check to see if an AprilTag exists in this snapshot.
if snapshot_objects[0].id > 6:
wait(5.35,SECONDS)
motor_1.stop()
brain.screen.print("greater than 6")
wait(0.001,SECONDS)
pneumatic_3.retract(CYLINDER2)
wait(4,SECONDS)
pneumatic_3.extend(CYLINDER2)
motor_1.spin(FORWARD)
snapshot_objects = -1
elif snapshot_objects[0].id < 6 and snapshot_objects[0].id > 0:
wait(5.35,SECONDS)
motor_1.stop()
wait(.001,SECONDS)
brain.screen.print("less than 6")
pneumatic_3.retract(CYLINDER4)
wait(4,SECONDS)
pneumatic_3.extend(CYLINDER4)
motor_1.spin(FORWARD)
snapshot_objects = -1
wait(0.3, SECONDS)
wait(5, MSEC)
(Code by Konner Woo)
Konner Woo and J.D. Connole recorded their testing process...
"After writing the program we ran into a few problems, we had to adjust the pneumatic sliders according to the timing of the package, in order to properly move the packaging fluidly. Secondly, we did not have a function for the arm yet. We decided to use the arm on the blue boxes included in the kit. For the pneumatics, we ran a lot of simulations to adjust the timing down to the last millisecond. It was a tedious process and took us a few days to figure out but we have finally got it. Another issue we had was with the product itself. There was no interference with the code, but we noticed that the main conveyor belt easily jams. There is too much friction with the design and leads to inconsistent results. We find that this is a very annoying problem for consumers using the device and that is something that needs to be fixed.
We could have sped up the process by properly logging the pneumatic timings but we kept going until the pneumatic timing actually worked.
Overall, we had an easy time doing this project, it was not that difficult to code it was just trial and error in a repeated loop."
A possible way to redesign is to improve the AI sensor’s capabilities so we are not restricted to a set of rules. The rules we must follow to make this design work is 1. Allow the velocity of the chips to be slow so the AI sensor can read it. Two, the AI sensor must read the tag, and the current conveyor design would get in the way of that as boxes may face the wrong direction. These two restrictions were what made our designs not as capable as we wanted them to be. Another restriction we ran into was the boxes itself. There is currently no dispenser for the boxes, and we want to make an automated system that would allow the boxes to be transferred.
If we were to redesign, we would make the conveyor belt transferring the products one complete belt instead of several, as it would prevent the boxes from flipping and prevent the april tags from failing. Another convenient feature that would help our design is the responsiveness of the AI sensor as improving it would allow us to speed up the efficiency of the build and create faster times.
Director of Software Development, Konner Woo, documented his evaluation on the final build...
"Even though the code isn’t as optimized as it could be, it works effectively when tested. With the build, I think some parts could be improved, but nothing broke, and nothing major had to be added or changed from the original build. Although there are improvements that we could have made to the design and code of our build, we were able to effectively separate the April tag IDs and remove the boxes from our conveyors. Overall, we were successful in what we were trying to accomplish, effectively categorizing each April tag and sorting them with our system."