Figure 1: Quanser Interactive Labs simulation of Q-Arm and autoclaves
import random import sys sys.path.append('../') from Common.simulation_project_library import * hardware = False QLabs = configure_environment(project_identifier, ip_address, hardware).QLabs arm = qarm(project_identifier,ip_address,QLabs,hardware) potentiometer = potentiometer_interface() # small note when running code - sometimes some of the autoclaves cannot be reached using potentiometer control # in this case, move the potentiometer to the other extreme (ie. if value is ~100 set to 0) very quickly # this will trigger the "cannot rotate past +/- 175 degree" error, which will stop the rotation and allow the potentiometer control to move base again # different location coordinates - pickup, dropoff, and home locations respectively p_loc = [0.60,0.050,0.04] d_loc = [[0.0, -0.63, 0.30],[0.0, 0.63, 0.30],[-0.63, 0.235, 0.30],[0.0, -0.42, 0.17], [0.0, 0.42, 0.17], [-0.41, 0.17, 0.17]] h_loc = [0.406, 0, 0.483] # picks up container from pickup location and returns arm to home position def pick_up_container(p_loc: list, home_loc: list): # small delay to wait for everything to load time.sleep(1) # sets the location of pickup location of the box box_x = p_loc box_y = p_loc box_z = p_loc # sets the coordinates of home home_x = home_loc home_y = home_loc home_z = home_loc # move arm just above box to prevent hitting box arm.move_arm(box_x, box_y, box_z + 0.5) time.sleep(2) arm.move_arm(box_x, box_y, box_z) time.sleep(2) arm.control_gripper(35) time.sleep(2) arm.move_arm(home_x, home_y, home_z) # allows user control of how much the Q-Arm base should be rotated by def rotate_base(item_val: int): # get initial potentiometer reading reading_a = potentiometer.right() check_color = int(item_val) # uses item_val to check color of the box and make sure it is in front of correct autoclave if item_val == 1 or item_val == 4: color = 'red' elif item_val == 2 or item_val == 5: color = 'green' elif item_val == 3 or item_val == 6: color = 'blue' # allows user to continue to rotate the base until both potentiometer readings are correct while not (arm.check_autoclave(color) and ((potentiometer.left()==1.0 and item_val >= 4) or (0.5<potentiometer.left()<1.0 and item_val <= 3))): # gets the difference between the readings to find how much to rotate the base by reading_b = potentiometer.right() delta = reading_b - reading_a arm.rotate_base(350*delta) reading_a = reading_b # drops off the container - Joon def drop_off(locations: list, item_val: int): time.sleep(1) # check color of box and its respective location loc = locations[item_val - 1] # uses item_val to check color of the box and make sure it is in front of correct autoclave if item_val == 1 or item_val == 4: color = 'red' elif item_val == 2 or item_val == 5: color = 'green' elif item_val == 3 or item_val == 6: color = 'blue' arm.activate_autoclaves() # get potentiometer reading then checks where the box should go reading = potentiometer.left() # if reading is 100, opens drawer and drops box off then closes drawer again if reading == 1.0: arm.open_autoclave(color) time.sleep(2) # moves arm just above the dropoff location to prevent the arm from hitting anything as it approaches arm.move_arm(loc, loc, loc + 0.1) time.sleep(2) arm.move_arm(loc, loc, loc) time.sleep(1) arm.control_gripper(-35) time.sleep(1) arm.home() time.sleep(1) arm.open_autoclave(color, False) time.sleep(4) # sometimes the drawer won't close so as a backup, attempt to close one more time arm.open_autoclave(color, False) time.sleep(2) # if reading is 50<reading<100, drops box off on top of autoclave elif 1.0 > reading > 0.5: time.sleep(1) # moves arm just above the dropoff location to prevent the arm from hitting anything as it approaches arm.move_arm(loc, loc, loc + 0.1) time.sleep(2) arm.move_arm(loc, loc, loc) time.sleep(1) arm.control_gripper(-35) time.sleep(1) arm.home() # deactivates autoclaves and return arm to home position arm.deactivate_autoclaves() time.sleep(1) arm.home() time.sleep(2) # funcion to check whether to continue or not def continue_or_not(box_num: int): # remove box that has already been used box_num_list.pop(box_num) # if box_num_list is empty, stop program if not box_num_list: arm.home() time.sleep(1) arm.terminate_arm() else: main() box_num_list = [1,2,3,4,5,6] def main(): # generate new box number and generate in simulation - this is the index of the item box_num = random.randint(0, len(box_num_list) - 1) # move container to desired location then repeat 6 times arm.spawn_cage(box_num_list[box_num]) pick_up_container(p_loc, h_loc) rotate_base(box_num_list[box_num]) drop_off(d_loc, box_num_list[box_num]) continue_or_not(box_num)
Figure 2: Final working computer program
The Goal: Create a system to transport surgical tools for sterilization
The Task: Write a program that sorts autoclave containers by color and size
The Constraints: Two potentiometer controls need to be implemented for specific tasks
The Solution: Efficiently sort containers using a Q-Arm
Soft Skills: Collaboration, Engineering Report Writing, Time Management
Technical Skills: Python, Quanser Interactive Labs, Q-Arm, ANSYS-GRANTA EduPack, Microsoft Office
Problem Framing: The team met to accuratly define the problem and came up with the objective, function, and constraint for our computer program
Ideas Brainstorming: The team came up with various ideas on feature implementation
Planning: The team came up with a flowchart for the entire program and wrote some pseudocode for each required function
Development: The team split up the work into equal parts and each member wrote a different function of the program
Code Review: The team put all completed code together and checked over each other's work to ensure that the code would run without issues
Testing: I tested the code to make sure the small details were correct, such as the exact pick-up and drop-off location coordinates
Role: I was the Administrator for the computing sub-team
Responsibilities: I created and shared the collaborative working document for the team and submitted all deliverables on behalf of the computing sub-team. I also created the Final Gantt Chart to document the project's actual progress vs. the planned progress.
Expectations: Ensured that the team worked on the Project Report in a collaborative manner and that the tean was aware of all expectations
Engineering Interviews: I learned how to prepare well for technical interviews and how to answer technical questions on the spot
Project Management: As the administrator for the computing sub-team, I learned how to evenly split up tasks for all sub-team members and keep them all on track to meet deadlines.
While my teammates were all very friendly and easy-to-approach, not all of them had up-to-par technical abilities, often leading to me having to take on more responsibilities and initially agreed-upon. There were many bumps along the way, which took a long time to solve because of the lack of communications. I definitely learned that good communications is the key to sucess and I hope everyone learnd that as well.