diff --git a/LINEUPS.md b/LINEUPS.md index c9a8d30..3ba5981 100644 --- a/LINEUPS.md +++ b/LINEUPS.md @@ -2,14 +2,14 @@ ## These are the line-up positions for the robot game for various missions. -- Mission Run #1 (Mission #1) [Right/Blue Home] - The left yellow part of the right arm attachment is positioned with its right edge on the 5th thin line from the left. Note that this is NOT positioned from the back of the robot. +- Mission Run #1 (Run #1) [Right/Blue Home] - The left yellow part of the right arm attachment is positioned with its right edge on the 5th thin line from the left. Note that this is NOT positioned from the back of the robot. Also, when counting these lines, make sure you count from the inside curve, not the outside. -- Mission Run #2 (Send Over) [Right/Blue Home] - The robot should be lined up on the vertical edge of the left home. The robot's right side should be positioned on the 1st thin line from the top. Note that the 0th line is the one that is not part of the curve. +Alt text -- Mission Run #3 (Sand mission) [Right/Blue Home] - The robot should be lined up on the vertical edge of the left home. The robot's left side should be positioned on the 1/2th thin line from the bottom. +- Mission Run #2 (Tip the scales) [Right/Blue Home] - The middle of the left edge of the robot should be positioned on the 2nd thick line from the left. -- Mission Run #4 (Boat mission) [Left/Red Home] - The robot should be lined up on the vertical edge of the left home. The robot's right side should be positioned on the 2nd thick line from the bottom. +- Mission Run #3 (Send Over) [Right/Blue Home] - The robot should be lined up on the vertical edge of the right home. The robot's right edge should be positioned on the 1st thin line from the top. Note that the 0th line is the one that is in the inner curve. -- Mission Run #5 (Bautism) [Left/Red Home] - The robot's left edge should be positioned at the 1st thick, 2nd thin line from the left. +- Mission Run #4 (Run #4) [Left/Red Home] - The robot's left edge should be positioned on the 2nd thick line from the left. -- Mission Run #6 (Not-so-heavy Lifting) [Right/Blue Home] - The robot's right edge should be positioned at the 1st thick from the right. \ No newline at end of file +- Mission Run #5 (Boat mission) [Left/Red Home] - There are two alignments for this. When sending off the robot for part 1, the robot should be facing the right home. It's right edge should be positioned at the very bottom edge of the board. Once it completes the pulling part, once it comes back begin part 2. For part 2, the middle of the robot's right side should be positioned in the middle of the 3rd thick and the 3rd thick, 1st thin lines from the top. For both runs the robot should be facing the blue home. \ No newline at end of file diff --git a/README.md b/README.md index 5187815..3bb5d68 100644 --- a/README.md +++ b/README.md @@ -63,17 +63,17 @@ Repository ### Installation & Deployment - from the server - everyday -1. Download the file codes_for_scrimmage/hazmat/mainhazmatUPD.py +1. Download the file codes_for_scrimmage/regional-final/Final_combined.py - You can do this through the repo, by using cURL, or by using git. - - Repo - Go to [codes_for_scrimmage/hazmat/mainhazmatUPD.py](codes_for_scrimmage/hazmat/mainhazmatUPD.py) and click the "Download" button. + - Repo - Go to [codes_for_scrimmage/regional-final/Final_combined.py](codes_for_scrimmage/regional-final/Final_combined.py) and click the "Download" button. - cURL or another HTTP data transferrer - - ```curl -o mainhazmatUPD.py https://codes.fll-65266.org/FLL_65266_LEGO_DYNAMICS/solutions_season_unearthed/raw/branch/main/codes_for_scrimmage/hazmat/mainhazmatUPD.py``` + ```curl -o Final_combined.py https://codes.fll-65266.org/FLL_65266_LEGO_DYNAMICS/solutions_season_unearthed/raw/branch/main/codes_for_scrimmage/regional-final/Final_combined.py``` - git CLI - - ```git clone -b dev https://codes.fll-65266.org/FLL_65266_LEGO_DYNAMICS/solutions_season_unearthed.git && cd solutions_season_unearthed/codes_for_scrimmage/hazmat``` + ```git clone -b dev https://codes.fll-65266.org/FLL_65266_LEGO_DYNAMICS/solutions_season_unearthed.git && cd solutions_season_unearthed/codes_for_scrimmage/regional-final``` - Then use mainhazmatUPD.py. + Then use Final_combined.py. 2. Open https://code.pybricks.com/ and select the "Import a file" button on the top of the left bar. Import the .py file. Pair your robot via Bluetooth in Pybricks by selecting the Bluetooth button. @@ -94,12 +94,12 @@ Repository ### Color Start System | Color | Mission | |-------|-----------| -| Green 🟩 | Run 1 | -| Purple 🟪 | Run 2 | -| Red 🟥| Run 3 | -| Yellow 🟨| Run 4 | -| Blue 🟦| Run 5 | -| Orange 🟧| Run 6 | +| ```Green 🟩 ```| Run 1 | +| ```Purple 🟪 ```| Run 2 | +| ```Red 🟥 ```| Run 3 | +| ```Yellow 🟨 ```| Run 4 | +| ```Blue 🟦 ```| Run 5 | +| ```Orange 🟧 ```| Run 6 | --- diff --git a/RegionalFinal.py b/RegionalFinal.py new file mode 100644 index 0000000..c6df462 --- /dev/null +++ b/RegionalFinal.py @@ -0,0 +1,220 @@ +from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor +from pybricks.parameters import Button, Color, Direction, Port, Side, Stop +from pybricks.tools import run_task, multitask +from pybricks.tools import wait, StopWatch +from pybricks.robotics import DriveBase +from pybricks.hubs import PrimeHub + +# Initialize hub and devices +hub = PrimeHub() +left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) +right_motor = Motor(Port.B) +left_arm = Motor(Port.C) +right_arm = Motor(Port.D) +lazer_ranger = UltrasonicSensor(Port.E) +color_sensor = ColorSensor(Port.F) + +# DriveBase configuration +WHEEL_DIAMETER = 68.8 # mm (adjust for your wheels) +AXLE_TRACK = 180 # mm (distance between wheels) +drive_base = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK) +drive_base.settings(600, 500, 300, 200) +drive_base.use_gyro(True) + +WALL_DISTANCE = 300 # mm + +async def drive_forward(): + """Drive forward continuously using DriveBase.""" + drive_base.drive(400, 0) + + +async def monitor_distance(): + """Monitor ultrasonic sensor and stop when wall is detected.""" + while True: + distance = await lazer_ranger.distance() + print('Distancing...',distance) + + if distance < WALL_DISTANCE: + # Stop the drivebase + await drive_base.stop + print(f"Wall detected at {distance}mm!") + break + + # Small delay to prevent overwhelming the sensor + await wait(50) + +# New Section +async def Run1(): # From M8_5.py + right_arm.run_angle(1000,450) + left_arm.run_angle(500,90) + await drive_base.straight(200) + + await drive_base.turn(-40) + await drive_base.straight(325) + await left_arm.run_angle(500,-90) + + await drive_base.straight(-100) + await drive_base.straight(50) + await left_arm.run_angle(500,180) + + await drive_base.straight(-90) + left_arm.run_angle(500,-180) + await drive_base.turn(-20) + await drive_base.turn(15) + + await drive_base.straight(-173) + await drive_base.turn(45) + await drive_base.straight(120) + left_arm.run_angle(1000,670) + + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + right_arm.run_angle(5000,450, Stop.HOLD) + + await drive_base.turn(-35) + await drive_base.straight(297) + await drive_base.turn(63) + await drive_base.straight(170) + + await drive_base.turn(-80) + await drive_base.straight(87) + await drive_base.turn(-15) + + await drive_base.straight(-90) + await drive_base.turn(-100) + await drive_base.arc(-500,None,600) + + +async def Run2(): # From Heavy_lifting_final.py + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(536) + await drive_base.turn(60, Stop.HOLD) + await drive_base.straight(30) + await right_arm.run_angle(5000, 2900) + await drive_base.straight(40) + await right_arm.run_angle(5000, -4000) + await drive_base.straight(-60) + await drive_base.turn(-60) + await drive_base.straight(-670) + + +async def Run3(): # tip the scale.py + right_arm.run_angle(500,400) + await drive_base.straight(800) + await drive_base.turn(90) + await drive_base.straight(86) + await right_arm.run_angle(800,-600) + await right_arm.run_angle(900,800) + + await drive_base.straight(-100) + await drive_base.turn(90) + await drive_base.straight(800) + drive_base.brake() + + +async def Run4(): # From Send_Over_Final.py + + await drive_base.straight(920) + await drive_base.turn(-90,Stop.HOLD) + await drive_base.straight(65) + #Solve + drive_base.turn(-10) + await left_arm.run_angle(10000,-4000) + await drive_base.straight(-110) + await drive_base.turn(90) + + await multitask( + drive_forward(), + monitor_distance() + ) + +# Add Rishi's code here +async def Run5(): + await drive_base.straight(700) + await drive_base.turn(-20) + await drive_base.straight(110) + await drive_base.straight(-210) + await drive_base.turn(63) + await drive_base.straight(130) + await right_arm.run_angle(1000, -1200) + await drive_base.straight(84) + await right_arm.run_angle(300, 1200) + await drive_base.straight(-900) + + +# Add - Adi's code here +async def Run6(): + await drive_base.straight(500) + await right_arm.run_angle(300,500) + await drive_base.straight(-75) + await right_arm.run_angle(300, -900) + await drive_base.straight(-350) + await wait(1000) + await drive_base.straight(800) + await drive_base.straight(-200) + await drive_base.turn(-15) + await drive_base.straight(350) + await drive_base.turn(-102.5) + await drive_base.straight(-80) + await left_arm.run_angle(500, -900) + await drive_base.straight(50) + await drive_base.straight(50) + await left_arm.run_angle(700, 270) + await drive_base.turn(30) + await drive_base.straight(-60) + + + +# Function to classify color based on HSV +def detect_color(h, s, v, reflected): + if reflected > 4: + if h < 4 or h > 350: # red + return "Red" + elif 3 < h < 40 and s > 70: # orange + return "Orange" + elif 47 < h < 56: # yellow + return "Yellow" + elif 70 < h < 160: # green - do it vertically not horizontally for accuracy + return "Green" + elif 210 < h < 225: # blue - do it vertically not horizontally for accuracy + return "Blue" + elif 260 < h < 350: # purple + return "Purple" + else: + return "Unknown" + return "Unknown" + + +async def main(): + while True: + h, s, v = await color_sensor.hsv() + reflected = await color_sensor.reflection() + color = detect_color(h, s, v, reflected) + + if color == "Red": + print('Running Mission 3') + await Run3() #red + elif color == "Orange": + print('Running Mission 6') + await Run6() #orange + elif color == "Yellow": + print('Running Mission 4') + await Run4() #yellow + elif color == "Green": + print('Running Mission 1') + await Run1() #green - vertically + elif color == "Blue": + print('Running Mission 5') + await Run5() #blue - vertically + elif color == "Purple": + print('Running Mission 2') + await Run2() #purple - vertically + else: + print(f"Unknown color detected (Hue: {h}, Sat: {s}, Val: {v})") + await wait(10) +# Run the main function +run_task(main()) \ No newline at end of file diff --git a/codes_for_scrimmage/hazmat/HazmatCodeChanges.py b/competition_codes/hazmat/HazmatCodeChanges.py similarity index 85% rename from codes_for_scrimmage/hazmat/HazmatCodeChanges.py rename to competition_codes/hazmat/HazmatCodeChanges.py index c48de0b..36efc37 100644 --- a/codes_for_scrimmage/hazmat/HazmatCodeChanges.py +++ b/competition_codes/hazmat/HazmatCodeChanges.py @@ -140,40 +140,41 @@ async def Run4(): # From Send_Over_Final.py # Add Rishi's code here async def Run5(): - await drive_base.straight(519) - await left_arm.run_angle(-10000, 300) - await left_arm.run_angle(10000, 600) - await drive_base.straight(160) - await drive_base.turn(-30) - await drive_base.straight(50) - await right_arm.run_angle(3000, 3000) - await drive_base.straight(-150) - await drive_base.turn(120) - await drive_base.straight(25) - await right_arm.run_angle(10000, -3000) - await drive_base.straight(-110) - await drive_base.turn(-43) - await right_arm.run_angle(10000, -3000) - await drive_base.straight(295) - await right_arm.run_angle(10000, 9000) - await drive_base.straight(-65) - await drive_base.turn(45) - await drive_base.straight(175) - await drive_base.turn(24.5) - await drive_base.straight(-100) - await right_arm.run_angle(10000, -8500) + await drive_base.straight(700) + await drive_base.turn(-18) await drive_base.straight(100) - await right_arm.run_angle(10000, 3500) - await drive_base.turn(-30) - await drive_base.straight(-300) - await drive_base.turn(-80) - await drive_base.straight(-700) + await drive_base.straight(-205) + await drive_base.turn(63) + await drive_base.straight(125) + await arm_motor.run_angle(1000, -1200) + await drive_base.straight(84) + await arm_motor.run_angle(300, 1200) + await drive_base.straight(-875) # Add - Adi's code here async def Run6(): - await drive_base.straight(750) - await drive_base.straight(-650) + await drive_base.straight(500) + await right_arm.run_angle(300,500) + await drive_base.straight(-75) + await right_arm.run_angle(300, -900) + await drive_base.straight(-350) + await wait(1000) + await drive_base.straight(800) + await drive_base.straight(-200) + await drive_base.turn(-15) + await drive_base.straight(350) + await drive_base.turn(-94) + await drive_base.straight(-80) + await left_arm.run_angle(500, 900) + await drive_base.straight(50) + await drive_base.turn(-10) + await drive_base.straight(50) + await left_arm.run_angle(700, -200) + await drive_base.turn(30) + await drive_base.straight(-60) + await drive_base.turn(80) + await drive_base.straight(-900) # Function to classify color based on HSV diff --git a/codes_for_scrimmage/hazmat/Heavy_lifting_final.py b/competition_codes/hazmat/Heavy_lifting_final.py similarity index 100% rename from codes_for_scrimmage/hazmat/Heavy_lifting_final.py rename to competition_codes/hazmat/Heavy_lifting_final.py diff --git a/codes_for_scrimmage/hazmat/M8_5.py b/competition_codes/hazmat/M8_5.py similarity index 100% rename from codes_for_scrimmage/hazmat/M8_5.py rename to competition_codes/hazmat/M8_5.py diff --git a/codes_for_scrimmage/hazmat/Send_Over_Final.py b/competition_codes/hazmat/Send_Over_Final.py similarity index 100% rename from codes_for_scrimmage/hazmat/Send_Over_Final.py rename to competition_codes/hazmat/Send_Over_Final.py diff --git a/codes_for_scrimmage/hazmat/hazmat_main.py b/competition_codes/hazmat/hazmat_main.py similarity index 100% rename from codes_for_scrimmage/hazmat/hazmat_main.py rename to competition_codes/hazmat/hazmat_main.py diff --git a/codes_for_scrimmage/hazmat/mainhazmatUPD.py b/competition_codes/hazmat/mainhazmatUPD.py similarity index 68% rename from codes_for_scrimmage/hazmat/mainhazmatUPD.py rename to competition_codes/hazmat/mainhazmatUPD.py index c48de0b..d23f655 100644 --- a/codes_for_scrimmage/hazmat/mainhazmatUPD.py +++ b/competition_codes/hazmat/mainhazmatUPD.py @@ -21,7 +21,7 @@ drive_base = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK) drive_base.settings(600, 500, 300, 200) drive_base.use_gyro(True) -WALL_DISTANCE = 300 # mm +WALL_DISTANCE = 200 # mm async def drive_forward(): """Drive forward continuously using DriveBase.""" @@ -45,31 +45,49 @@ async def monitor_distance(): # New Section async def Run1(): # From M8_5.py - left_arm.run_angle(1000, -300) - right_arm.run_angle(1000, 500) - await drive_base.straight(320) - await right_arm.run_angle(5000, -500, Stop.HOLD) - await right_arm.run_angle(5000, 500, Stop.HOLD) - await right_arm.run_angle(5000, -500, Stop.HOLD) - await right_arm.run_angle(5000, 500, Stop.HOLD) - await right_arm.run_angle(5000, -500, Stop.HOLD) - await drive_base.turn(-20) - await drive_base.straight(277) - await drive_base.turn(20) - await drive_base.straight(65) - await drive_base.turn(-30) - right_arm.run_angle(50, 500) - await drive_base.turn(45) - await drive_base.straight(-145) - await drive_base.turn(-60) - await drive_base.straight(90) - await left_arm.run_angle(1000, 450) - await drive_base.straight(-145) - await left_arm.run_angle(1000, -450) - await drive_base.straight(10) - await drive_base.turn(35) - await drive_base.straight(-600) + + right_arm.run_angle(1000,450) + left_arm.run_angle(500,-90) + await drive_base.straight(200) + await drive_base.turn(-40) + await drive_base.straight(325) + await left_arm.run_angle(500,90) + + await drive_base.straight(-100) + await drive_base.straight(50) + await left_arm.run_angle(500,-180) + + await drive_base.straight(-90) + left_arm.run_angle(500,180) + await drive_base.turn(-20) + await drive_base.turn(15) + + await drive_base.straight(-173) + await drive_base.turn(45) + await drive_base.straight(120) + left_arm.run_angle(1000,-670) + + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + right_arm.run_angle(5000,450, Stop.HOLD) + + await drive_base.turn(-35) + await drive_base.straight(297) + await drive_base.turn(63) + await drive_base.straight(170) + + await drive_base.turn(-80) + await drive_base.straight(87) + await drive_base.turn(-15) + + await drive_base.straight(-90) + await drive_base.turn(-100) + await drive_base.arc(-500,None,600) + async def Run2(): # From Heavy_lifting_final.py await drive_base.straight(200) await drive_base.turn(-20) @@ -105,77 +123,62 @@ async def Run3(): # tip the scale.py await drive_base.turn(40) # turning right await left_arm.run_angle(410,-400) #lift a little bit await drive_base.straight(80) - await drive_base.turn(-41) #ma din din din dun 67 41 21 69 + await drive_base.turn(-41) #ma din din din dun 67 41 21 await drive_base.straight(900) async def Run4(): # From Send_Over_Final.py - #Get to mission + await drive_base.straight(920) await drive_base.turn(-90,Stop.HOLD) await drive_base.straight(65) - #Solve mission + #Solve drive_base.turn(-10) - await left_arm.run_angle(10000, 4000) - #Get to Red Start + await left_arm.run_angle(10000,-4000) await drive_base.straight(-110) await drive_base.turn(90) - # while True: - # distance_mm = await lazer_ranger.distance() - # print('distancing...',distance_mm) - # if distance_mm < 300: - # drive_base.stop - # break - # else: - # drive_base.straight(300) - # print('running...') - # await wait(10) await multitask( drive_forward(), monitor_distance() ) - - # Add Rishi's code here async def Run5(): - await drive_base.straight(519) - await left_arm.run_angle(-10000, 300) - await left_arm.run_angle(10000, 600) - await drive_base.straight(160) - await drive_base.turn(-30) - await drive_base.straight(50) - await right_arm.run_angle(3000, 3000) - await drive_base.straight(-150) - await drive_base.turn(120) - await drive_base.straight(25) - await right_arm.run_angle(10000, -3000) - await drive_base.straight(-110) - await drive_base.turn(-43) - await right_arm.run_angle(10000, -3000) - await drive_base.straight(295) - await right_arm.run_angle(10000, 9000) - await drive_base.straight(-65) - await drive_base.turn(45) - await drive_base.straight(175) - await drive_base.turn(24.5) + await drive_base.straight(600) await drive_base.straight(-100) - await right_arm.run_angle(10000, -8500) + await drive_base.straight(150) + await drive_base.turn(60) await drive_base.straight(100) - await right_arm.run_angle(10000, 3500) - await drive_base.turn(-30) - await drive_base.straight(-300) - await drive_base.turn(-80) - await drive_base.straight(-700) - + await drive_base.turn(-86) + await drive_base.straight(120) + await drive_base.turn(-45) + await drive_base.straight(-200) + await drive_base.turn(75) # Add - Adi's code here async def Run6(): - await drive_base.straight(750) - await drive_base.straight(-650) - - + await drive_base.straight(500) + await right_arm.run_angle(300,500) + await drive_base.straight(-75) + await right_arm.run_angle(300, -900) + await drive_base.straight(-350) + await wait(1000) + await drive_base.straight(800) + await drive_base.straight(-200) + await drive_base.turn(-15) + await drive_base.straight(350) + await drive_base.turn(-94) + await drive_base.straight(-80) + await left_arm.run_angle(500, 900) + await drive_base.straight(50) + await drive_base.turn(-10) + await drive_base.straight(50) + await left_arm.run_angle(700, -200) + await drive_base.turn(30) + await drive_base.straight(-60) + await drive_base.turn(80) + await drive_base.straight(-900) # Function to classify color based on HSV def detect_color(h, s, v, reflected): if reflected > 4: diff --git a/codes_for_scrimmage/hazmat/tip the scale.py b/competition_codes/hazmat/tip the scale.py similarity index 100% rename from codes_for_scrimmage/hazmat/tip the scale.py rename to competition_codes/hazmat/tip the scale.py diff --git a/competition_codes/regional-final/Final_combined.py b/competition_codes/regional-final/Final_combined.py new file mode 100644 index 0000000..976ce7b --- /dev/null +++ b/competition_codes/regional-final/Final_combined.py @@ -0,0 +1,221 @@ +from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor +from pybricks.parameters import Button, Color, Direction, Port, Side, Stop +from pybricks.tools import run_task, multitask +from pybricks.tools import wait, StopWatch +from pybricks.robotics import DriveBase +from pybricks.hubs import PrimeHub + +# Initialize hub and devices +hub = PrimeHub() +left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) +right_motor = Motor(Port.B) +left_arm = Motor(Port.C) +right_arm = Motor(Port.D) +lazer_ranger = UltrasonicSensor(Port.E) +color_sensor = ColorSensor(Port.F) + +# DriveBase configuration +WHEEL_DIAMETER = 68.8 # mm (adjust for your wheels) +AXLE_TRACK = 180 # mm (distance between wheels) +drive_base = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK) +drive_base.settings(600, 500, 300, 200) +drive_base.use_gyro(True) + +WALL_DISTANCE = 300 # mm + +async def drive_forward(): + """Drive forward continuously using DriveBase.""" + drive_base.drive(400, 0) + + +async def monitor_distance(): + """Monitor ultrasonic sensor and stop when wall is detected.""" + while True: + distance = await lazer_ranger.distance() + print('Distancing...',distance) + + if distance < WALL_DISTANCE: + # Stop the drivebase + await drive_base.stop + print(f"Wall detected at {distance}mm!") + break + + # Small delay to prevent overwhelming the sensor + await wait(50) + +# New Section +async def Run1(): # From M8_5.py + right_arm.run_angle(1000,450) + left_arm.run_angle(500,90) + await drive_base.straight(200) + + await drive_base.turn(-40) + await drive_base.straight(325) + await left_arm.run_angle(500,-90) + + await drive_base.straight(-100) + await drive_base.straight(50) + await left_arm.run_angle(500,180) + + await drive_base.straight(-90) + left_arm.run_angle(500,-180) + await drive_base.turn(-20) + await drive_base.turn(15) + + await drive_base.straight(-173) + await drive_base.turn(45) + await drive_base.straight(120) + left_arm.run_angle(1000,670) + + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + right_arm.run_angle(5000,450, Stop.HOLD) + + await drive_base.turn(-35) + await drive_base.straight(297) + await drive_base.turn(63) + await drive_base.straight(170) + + await drive_base.turn(-80) + await drive_base.straight(87) + await drive_base.turn(-15) + + await drive_base.straight(-90) + await drive_base.turn(-100) + await drive_base.arc(-500,None,600) + + +async def Run2(): # From Heavy_lifting_final.py + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(536) + await drive_base.turn(60, Stop.HOLD) + await drive_base.straight(30) + await right_arm.run_angle(5000, 2900) + await drive_base.straight(40) + await right_arm.run_angle(5000, -4000) + await drive_base.straight(-60) + await drive_base.turn(-60) + await drive_base.straight(-670) + + +async def Run3(): # tip the scale.py + right_arm.run_angle(500,400) + await drive_base.straight(800) + await drive_base.turn(90) + await drive_base.straight(86) + await right_arm.run_angle(800,-600) + await right_arm.run_angle(900,800) + + await drive_base.straight(-100) + await drive_base.turn(90) + await drive_base.straight(800) + drive_base.brake() + + +async def Run4(): # From Send_Over_Final.py + + await drive_base.straight(920) + await drive_base.turn(-90,Stop.HOLD) + await drive_base.straight(65) + #Solve + drive_base.turn(-10) + await left_arm.run_angle(10000,-4000) + await drive_base.straight(-110) + await drive_base.turn(90) + + await multitask( + drive_forward(), + monitor_distance() + ) + +# Add Rishi's code here +async def Run5(): + await drive_base.straight(700) + await drive_base.turn(-20) + await drive_base.straight(110) + await drive_base.straight(-210) + await drive_base.turn(63) + await drive_base.straight(130) + await right_arm.run_angle(1000, -1200) + await drive_base.straight(84) + await right_arm.run_angle(300, 1200) + await drive_base.straight(-875) + +# Add - Adi's code here +async def Run6(): + await drive_base.straight(500) + await right_arm.run_angle(300,500) + await drive_base.straight(-75) + await right_arm.run_angle(300, -900) + await drive_base.straight(-350) + await wait(1000) + await drive_base.straight(800) + await drive_base.straight(-200) + await drive_base.turn(-15) + await drive_base.straight(350) + await drive_base.turn(-100) + await drive_base.straight(-80) + await left_arm.run_angle(500, -900) + await drive_base.straight(50) + await drive_base.straight(50) + await left_arm.run_angle(700, 250) + await drive_base.turn(30) + await drive_base.straight(-60) + await drive_base.turn(80) + await drive_base.straight(-900) + + + +# Function to classify color based on HSV +def detect_color(h, s, v, reflected): + if reflected > 4: + if h < 4 or h > 350: # red + return "Red" + elif 3 < h < 40 and s > 70: # orange + return "Orange" + elif 47 < h < 56: # yellow + return "Yellow" + elif 70 < h < 160: # green - do it vertically not horizontally for accuracy + return "Green" + elif 210 < h < 225: # blue - do it vertically not horizontally for accuracy + return "Blue" + elif 260 < h < 350: # purple + return "Purple" + else: + return "Unknown" + return "Unknown" + + +async def main(): + while True: + h, s, v = await color_sensor.hsv() + reflected = await color_sensor.reflection() + color = detect_color(h, s, v, reflected) + + if color == "Red": + print('Running Mission 3') + await Run3() #red + elif color == "Orange": + print('Running Mission 6') + await Run6() #orange + elif color == "Yellow": + print('Running Mission 4') + await Run4() #yellow + elif color == "Green": + print('Running Mission 1') + await Run1() #green - vertically + elif color == "Blue": + print('Running Mission 5') + await Run5() #blue - vertically + elif color == "Purple": + print('Running Mission 2') + await Run2() #purple - vertically + else: + print(f"Unknown color detected (Hue: {h}, Sat: {s}, Val: {v})") + await wait(10) +# Run the main function +run_task(main()) \ No newline at end of file diff --git a/competition_codes/sectionals/sectional_main_experimental.py b/competition_codes/sectionals/sectional_main_experimental.py new file mode 100644 index 0000000..dabb297 --- /dev/null +++ b/competition_codes/sectionals/sectional_main_experimental.py @@ -0,0 +1,350 @@ +from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor +from pybricks.parameters import Button, Color, Direction, Port, Side, Stop +from pybricks.tools import run_task, multitask +from pybricks.tools import wait, StopWatch +from pybricks.robotics import DriveBase +from pybricks.hubs import PrimeHub + +# Initialize hub and devices +hub = PrimeHub() +left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) +right_motor = Motor(Port.B,Direction.CLOCKWISE) # Specify default direction +left_arm = Motor(Port.C, Direction.CLOCKWISE) # Specify default direction +right_arm = Motor(Port.D, Direction.CLOCKWISE,[[12,36],[12,20,24]]) #Added gear train list for gear ration +lazer_ranger = UltrasonicSensor(Port.E) +color_sensor = ColorSensor(Port.F) + +# DriveBase configuration +WHEEL_DIAMETER = 68.8 # mm (adjust for your wheels) +AXLE_TRACK = 180 # mm (distance between wheels) +drive_base = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK) +drive_base.settings(600, 500, 300, 200) +drive_base.use_gyro(True) + +WALL_DISTANCE = 300 # mm + +async def drive_forward(): + """Drive forward continuously using DriveBase.""" + drive_base.drive(400, 0) + +async def drive_backward(): + """Drive forward continuously using DriveBase.""" + drive_base.drive(400, 0) + +async def async_drive(speed, direction): + drive_base.d + + +async def monitor_distance(): + """Monitor ultrasonic sensor and stop when wall is detected.""" + while True: + distance = await lazer_ranger.distance() + print('Distancing...',distance) + + if distance < WALL_DISTANCE: + # Stop the drivebase + drive_base.stop() + print(f"Wall detected at {distance}mm!") + break + + # Small delay to prevent overwhelming the sensor + await wait(50) + +# Experimental - Removed forge and who live here part +async def Run1(): # From M8_5.py + right_arm.run_angle(500,30) + left_arm.run_angle(500,90) + await drive_base.straight(200) + + await drive_base.turn(-40) + await drive_base.straight(325) + await left_arm.run_angle(500,-90) + + await drive_base.straight(-100) + await drive_base.straight(50) + await left_arm.run_angle(500,180) + + await drive_base.straight(-90) + left_arm.run_angle(500,-180) + await drive_base.turn(-20) + await drive_base.turn(15) + + await drive_base.straight(-173) + await drive_base.turn(45) + await drive_base.straight(120) + left_arm.run_angle(1000,670) + + await right_arm.run_angle(4000,-30, Stop.HOLD) + await right_arm.run_angle(4000,30, Stop.HOLD) + await right_arm.run_angle(4000,-30, Stop.HOLD) + await right_arm.run_angle(4000,30, Stop.HOLD) + await right_arm.run_angle(4000,-30, Stop.HOLD) + right_arm.run_angle(4000,30, Stop.HOLD) + + # await drive_base.turn(-35) + # await drive_base.straight(297) + # await drive_base.turn(63) + # await drive_base.straight(170) + + # await drive_base.turn(-80) + # await drive_base.straight(87) + # await drive_base.turn(-15) + + await drive_base.straight(-90) + #await drive_base.turn(-100) + await drive_base.arc(200,None,-300) + drive_base.stop() + +async def Run2(): # experiment with ferris wheel for silo + await drive_base.straight(410) + #await drive_base.turn(-20) + #await drive_base.straight(536) + #await drive_base.turn(60, Stop.HOLD) + #await drive_base.straight(30) + for i in range(3): + await right_arm.run_angle(10000, -360) + await drive_base.straight(-400) + +# Experimental - This to solve forge, who lived here and heavy lifting combined +async def Run2_1(): + await right_arm.run_target(50,50) + #await right_arm.re + #await multitask( + await right_arm.run_angle(50,-30) + await drive_base.arc(350,113, None) + #) + await drive_base.turn(-60) + await drive_base.straight(-40) + + await right_arm.run_angle(500,-90) # arm down + await wait(100) + await drive_base.turn(20) # turn right a little bit + #await wait(100) + await right_arm.run_angle(500,90) #arm up + await drive_base.turn(-20) #reset position + + await drive_base.straight(50) + await drive_base.turn(-15) + await drive_base.straight(50) + await drive_base.turn(-25) + + await drive_base.straight(-50) + await drive_base.turn(-100) + await drive_base.arc(-500,None,600) + drive_base.brake() + + +async def Run3(): # tip the scale.py + right_arm.run_angle(500,30) + await drive_base.straight(800) + await drive_base.turn(90) + await drive_base.straight(86) + await right_arm.run_angle(800,-140) + await right_arm.run_angle(900,140) + + await drive_base.straight(-100) + await drive_base.turn(90) + await drive_base.straight(800) + drive_base.brake() + + +async def Run4(): # From Send_Over_Final.py + + await drive_base.straight(920) + await drive_base.turn(-90,Stop.HOLD) + await drive_base.straight(65) + #Solve + drive_base.turn(-10) + await left_arm.run_angle(10000,-3000) + await drive_base.straight(-110) + await drive_base.turn(90) + + await multitask( + drive_forward(), + monitor_distance() + ) + +async def Run_3_4(): #combined angler artifacts and tip the scale - experimental + await drive_base.straight(920) + await drive_base.turn(-90,Stop.HOLD) + await drive_base.straight(65) + #Solve + drive_base.turn(-10) + await left_arm.run_angle(10000,-3000) + await drive_base.straight(-110) + await drive_base.turn(90) + await drive_base.arc(-150,-95, None) + + await drive_base.straight(100) + await right_arm.run_angle(800,-150) + await right_arm.run_angle(900,150) + + await drive_base.straight(-80) + await drive_base.turn(-67) + await drive_base.straight(450,Stop.COAST_SMART) + await drive_base.arc(10,-25, None) + #await drive_base.turn(-23, Stop.COAST_SMART) + + await multitask( + drive_forward(), + monitor_distance() + ) + + +# Add Rishi's code here +async def Run5(): + await drive_base.straight(700) + await drive_base.turn(-20) + await drive_base.straight(110) + await drive_base.straight(-210) + await drive_base.turn(63) + await drive_base.straight(130) + await right_arm.run_angle(1000, -90) + await drive_base.straight(84) + await right_arm.run_angle(300, 90) + await drive_base.straight(-875) + +# Add - Adi's code here +async def Run6(): + await drive_base.straight(500) + await right_arm.run_angle(300,500) + await drive_base.straight(-75) + await right_arm.run_angle(300, -900) + await drive_base.straight(-350) + await wait(1000) + await drive_base.straight(800) + await drive_base.straight(-200) + await drive_base.turn(-15) + await drive_base.straight(350) + await drive_base.turn(-100) + await drive_base.straight(-80) + await left_arm.run_angle(500, -900) + await drive_base.straight(50) + await drive_base.straight(50) + await left_arm.run_angle(700, 250) + await drive_base.turn(30) + await drive_base.straight(-60) + await drive_base.turn(80) + await drive_base.straight(-900) + +async def arc_back(radius, angle): + #print(radius, angle) + drive_base.arc(radius, angle, None) + +async def lift_right_arm(): + await right_arm.run_angle(100, -90) + +# This is a refactor of Salvage operation mission without wait and realignment +async def Run6_1(): #experimental + + await drive_base.straight(500) + await right_arm.run_angle(100,90) + await drive_base.straight(-75) + + #ack back while raising arm + await multitask ( + lift_right_arm(), + arc_back(-215, -45) + ) + + #align to raise the ship + await drive_base.straight(-150) + await drive_base.turn(-45) + + #await drive_base.straight(-350) + #await wait(1000) + + #Solve ship + await drive_base.straight(800) + await drive_base.straight(-200) + await drive_base.turn(-15) + await drive_base.straight(350) + await drive_base.turn(-100) + await drive_base.straight(-80) + await left_arm.run_angle(500, -700) + await drive_base.straight(50) + await drive_base.straight(50) + await left_arm.run_angle(700, 250) + await drive_base.turn(15) + await drive_base.straight(-80) + await drive_base.turn(80) + await drive_base.straight(-900) + drive_base.stop() + +async def Run6_7(): # experiment with ferris wheel for Site Markings + await drive_base.straight(500) + + await right_arm.run_angle(100, -10) + await wait(50) + #await multitask ( + #lift_right_arm() + #await right_arm.run_angle(100, 10) + #await arc_back(-215, -140) + await drive_base.straight(-300) + await drive_base.arc(-150, -140, None) + + await drive_base.straight(-300) + await wait(50) + await right_arm.run_angle(50, 50) + #await drive_base.straight(-300) + drive_base.stop() + +# Function to classify color based on HSV +def detect_color(h, s, v, reflected): + if reflected > 4: + if h < 4 or h > 350: # red + return "Red" + elif 3 < h < 40 and s > 70: # orange + return "Orange" + elif 47 < h < 56: # yellow + return "Yellow" + elif 70 < h < 160: # green - do it vertically not horizontally for accuracy + return "Green" + elif 195 < h < 198: # light blue + return "Light_Blue" + elif 210 < h < 225: # blue - do it vertically not horizontally for accuracy + return "Blue" + elif 260 < h < 350: # purple + return "Purple" + + else: + return "Unknown" + return "Unknown" + + +async def main(): + while True: + h, s, v = await color_sensor.hsv() + print(color_sensor.color()) + print(h,s,v) + reflected = await color_sensor.reflection() + color = detect_color(h, s, v, reflected) + print(color) + + + if color == "Red": + print('Running Mission 3') + await Run3() #red + elif color == "Orange": + print('Running Mission 6') + await Run6_1() #orange + elif color == "Yellow": + print('Running Mission 4') + await Run_3_4() #yellow + elif color == "Green": + print('Running Mission 1') + await Run1() #green - vertically + elif color == "Blue": + print('Running Mission 5') + await Run5() #blue - vertically + elif color == "Purple": + print('Running Mission 2') + await Run6_7() #purple - vertically + elif color == "Light_Blue": + print("Running Mission 2_1") + await Run2_1() + else: + print(f"Unknown color detected (Hue: {h}, Sat: {s}, Val: {v})") + await wait(10) +# Run the main function +run_task(main()) \ No newline at end of file diff --git a/missions/Boat.py b/missions/Boat.py index bb42eb7..47064db 100644 --- a/missions/Boat.py +++ b/missions/Boat.py @@ -2,26 +2,36 @@ from pybricks.hubs import PrimeHub from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor from pybricks.parameters import Button, Color, Direction, Port, Side, Stop from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task,multitask +from pybricks.tools import wait, StopWatch, run_task, multitask hub = PrimeHub() +# Initialize both motors. In this example, the motor on the +# left must turn counterclockwise to make the robot go forward. left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) right_motor = Motor(Port.B) -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) +arm_motor = Motor(Port.D, Direction.CLOCKWISE) +arm_motor_left= Motor(Port.C, Direction.CLOCKWISE) +# Initialize the drive base. In this example, the wheel diameter is 56mm. +# The distance between the two wheel-ground contact points is 112mm. drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) -drive_base.settings(550,700,100,100) - +print('The default settings are: ' + str(drive_base.settings())) +drive_base.settings(300,1000,300,750) +# Optionally, uncomment the line below to use the gyro for improved accuracy. drive_base.use_gyro(True) -first_run = False - async def main(): - await drive_base.straight(750) - await drive_base.straight(-650) - + await drive_base.straight(700) + await drive_base.turn(-17) + await drive_base.straight(100) + await drive_base.straight(-205) + await drive_base.turn(62) + await drive_base.straight(125) + await arm_motor.run_angle(1000, -1200) + await drive_base.straight(87) + await arm_motor.run_angle(300, 1200) + await drive_base.straight(-875) + run_task(main()) \ No newline at end of file diff --git a/missions/Boat_mission.py b/missions/Boat_mission.py deleted file mode 100644 index 6d87949..0000000 --- a/missions/Boat_mission.py +++ /dev/null @@ -1,27 +0,0 @@ -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task,multitask - -hub = PrimeHub() - -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) - -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) - -drive_base.settings(880,850,700,700) - -drive_base.use_gyro(True) - -first_run = True - -async def main(): - await drive_base.straight(750) - await drive_base.straight(-650) - -run_task(main()) \ No newline at end of file diff --git a/missions/Heavy lifting.py b/missions/Heavy lifting.py deleted file mode 100644 index 643e47d..0000000 --- a/missions/Heavy lifting.py +++ /dev/null @@ -1,37 +0,0 @@ -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task, multitask - -hub = PrimeHub() - -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) - -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) -drive_base.settings(600,500,300,200) -drive_base.use_gyro(True) - -async def main(): - await right_arm.run_angle(2000,1000) - - await drive_base.straight(200) - await drive_base.turn(-20) - await drive_base.straight(525) - await drive_base.turn(60) - await drive_base.straight(30) - - await right_arm.run_angle(2000,-1000) - await drive_base.straight(30) - await right_arm.run_angle(3000,1000) - await drive_base.straight(-60) - - await drive_base.turn(-60) - await drive_base.straight(-525) - await drive_base.turn(20) - await drive_base.straight(-200) - diff --git a/missions/Heavy_lifting_final.py b/missions/Heavy_lifting_final.py deleted file mode 100644 index 5a9dd1d..0000000 --- a/missions/Heavy_lifting_final.py +++ /dev/null @@ -1,36 +0,0 @@ -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task, multitask - -hub = PrimeHub() - -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) - -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) -drive_base.settings(600,500,300,200) -drive_base.use_gyro(True) - -async def main(): - #Get to mission - await drive_base.straight(200) - await drive_base.turn(-20) - await drive_base.straight(525) - await drive_base.turn(60) - #Solve mission - await drive_base.straight(50) - await right_arm.run_angle(2000,1000) - await drive_base.straight(-50) - await drive_base.turn(45) - await drive_base.straight(50) - await right_arm.run_angle(350,-1000) - #Return home - await drive_base.straight(-100) - await drive_base.turn(-100) - await drive_base.straight(-600) -run_task(main()) \ No newline at end of file diff --git a/missions/Bautism.py b/missions/Hypo.py similarity index 58% rename from missions/Bautism.py rename to missions/Hypo.py index aeb80c2..47064db 100644 --- a/missions/Bautism.py +++ b/missions/Hypo.py @@ -2,7 +2,7 @@ from pybricks.hubs import PrimeHub from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor from pybricks.parameters import Button, Color, Direction, Port, Side, Stop from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch, run_task +from pybricks.tools import wait, StopWatch, run_task, multitask hub = PrimeHub() @@ -23,23 +23,15 @@ drive_base.settings(300,1000,300,750) drive_base.use_gyro(True) async def main(): - await drive_base.straight(519) - await arm_motor_left.run_angle(300, -100) - await arm_motor_left.run_angle(300, 500) - await drive_base.straight(180) - await drive_base.turn(-37) - await drive_base.straight(50) - await arm_motor.run_angle(300, -400) - await drive_base.straight(-150) - await drive_base.turn(135) - await drive_base.straight(50) - await arm_motor.run_angle(300, 400) - await drive_base.straight(-75) - await arm_motor.run_angle(300, 300) - await drive_base.turn(-50) - await drive_base.straight(162) - await arm_motor.run_angle(100, -200) - await drive_base.straight(30) - await arm_motor.run_angle(50,-500) + await drive_base.straight(700) + await drive_base.turn(-17) + await drive_base.straight(100) + await drive_base.straight(-205) + await drive_base.turn(62) + await drive_base.straight(125) + await arm_motor.run_angle(1000, -1200) + await drive_base.straight(87) + await arm_motor.run_angle(300, 1200) + await drive_base.straight(-875) run_task(main()) \ No newline at end of file diff --git a/missions/Lift.py b/missions/Lift.py deleted file mode 100644 index a5e1773..0000000 --- a/missions/Lift.py +++ /dev/null @@ -1,34 +0,0 @@ -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task, multitask - -hub = PrimeHub() - -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) - -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) -drive_base.settings(600,500,300,200) -drive_base.use_gyro(True) - -async def main(): - await drive_base.straight(200) - await drive_base.turn(-20) - await drive_base.straight(525) - await drive_base.turn(60) - - await drive_base.straight(50) - await right_arm.run_angle(2000,1000) - await drive_base.straight(-50) - await drive_base.turn(45) - await drive_base.straight(50) - await right_arm.run_angle(350,-1000) - - await drive_base.turn(-100) - await drive_base.straight(-600) -run_task(main()) \ No newline at end of file diff --git a/missions/Lift2.py b/missions/Lift2.py deleted file mode 100644 index a5e1773..0000000 --- a/missions/Lift2.py +++ /dev/null @@ -1,34 +0,0 @@ -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task, multitask - -hub = PrimeHub() - -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) - -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) -drive_base.settings(600,500,300,200) -drive_base.use_gyro(True) - -async def main(): - await drive_base.straight(200) - await drive_base.turn(-20) - await drive_base.straight(525) - await drive_base.turn(60) - - await drive_base.straight(50) - await right_arm.run_angle(2000,1000) - await drive_base.straight(-50) - await drive_base.turn(45) - await drive_base.straight(50) - await right_arm.run_angle(350,-1000) - - await drive_base.turn(-100) - await drive_base.straight(-600) -run_task(main()) \ No newline at end of file diff --git a/missions/M8_5.py b/missions/M8_5.py index 95ecc9e..7b81ba5 100644 --- a/missions/M8_5.py +++ b/missions/M8_5.py @@ -19,31 +19,47 @@ drive_base.settings(600,500,300,200) drive_base.use_gyro(True) async def main(): - left_arm.run_angle(1000, 300) - right_arm.run_angle(1000,500) - await drive_base.straight(320) + + right_arm.run_angle(1000,450) + left_arm.run_angle(500,-90) + await drive_base.straight(200) - await right_arm.run_angle(5000,-500, Stop.HOLD) - await right_arm.run_angle(5000,500, Stop.HOLD) - await right_arm.run_angle(5000,-500, Stop.HOLD) - await right_arm.run_angle(5000,500, Stop.HOLD) - await right_arm.run_angle(5000,-500, Stop.HOLD) + await drive_base.turn(-40) + await drive_base.straight(325) + await left_arm.run_angle(500,90) + await drive_base.straight(-100) + await drive_base.straight(50) + await left_arm.run_angle(500,-180) + + await drive_base.straight(-90) + left_arm.run_angle(500,180) await drive_base.turn(-20) - await drive_base.straight(277) - await drive_base.turn(20) - await drive_base.straight(65) + await drive_base.turn(15) - await drive_base.turn(-30) - right_arm.run_angle(50,500) + await drive_base.straight(-173) await drive_base.turn(45) - await drive_base.straight(-145) - await drive_base.turn(-60) - await drive_base.straight(90) - await left_arm.run_angle(1000,-450) - await drive_base.straight(-145) - await left_arm.run_angle(1000,450) - await drive_base.straight(10) - await drive_base.turn(35) - await drive_base.straight(-600) + await drive_base.straight(120) + left_arm.run_angle(1000,-670) + + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + await right_arm.run_angle(5000,450, Stop.HOLD) + await right_arm.run_angle(5000,-450, Stop.HOLD) + right_arm.run_angle(5000,450, Stop.HOLD) + + await drive_base.turn(-35) + await drive_base.straight(297) + await drive_base.turn(63) + await drive_base.straight(170) + + await drive_base.turn(-80) + await drive_base.straight(87) + await drive_base.turn(-15) + + await drive_base.straight(-90) + await drive_base.turn(-100) + await drive_base.arc(-500,None,600) + run_task(main()) \ No newline at end of file diff --git a/missions/New_MapReveal/New_MapReveal_Mineshaft.py b/missions/New_MapReveal/New_MapReveal_Mineshaft.py new file mode 100644 index 0000000..2113b9b --- /dev/null +++ b/missions/New_MapReveal/New_MapReveal_Mineshaft.py @@ -0,0 +1,38 @@ +from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor +from pybricks.parameters import Button, Color, Direction, Port, Side, Stop +from pybricks.tools import run_task, multitask +from pybricks.tools import wait, StopWatch +from pybricks.robotics import DriveBase +from pybricks.hubs import PrimeHub + +# Initialize hub and devices +hub = PrimeHub() +left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) +right_motor = Motor(Port.B) +left_arm = Motor(Port.C) +right_arm = Motor(Port.D) +lazer_ranger = UltrasonicSensor(Port.E) +color_sensor = ColorSensor(Port.F) + +# DriveBase configuration +WHEEL_DIAMETER = 68.8 # mm (adjust for your wheels) +AXLE_TRACK = 180 # mm (distance between wheels) +drive_base = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK) +drive_base.settings(600, 500, 300, 200) +drive_base.use_gyro(True) + +WALL_DISTANCE = 200 # mm + +async def main(): + await drive_base.straight(700) + await drive_base.turn(-20) + await drive_base.straight(110) + await drive_base.straight(-220) + await drive_base.turn(63) + await drive_base.straight(130) + await right_arm.run_angle(1000, -1200) + await drive_base.straight(84) + await right_arm.run_angle(300, 1200) + await drive_base.straight(-875) + +run_task(main()) \ No newline at end of file diff --git a/missions/Set2.py b/missions/Rishi.py similarity index 83% rename from missions/Set2.py rename to missions/Rishi.py index 9298da3..7d84ee2 100644 --- a/missions/Set2.py +++ b/missions/Rishi.py @@ -37,14 +37,6 @@ async def main(): await drive_base.straight(-100) await drive_base.turn(-54) await arm_motor.run_angle(10000, -3000) - await drive_base.straight(250) - await drive_base.turn(-5) - await arm_motor.run_angle(10000, 7000) - await drive_base.straight(-50) - await drive_base.turn(68) - await arm_motor.run_angle(10000, -6000) await drive_base.straight(200) - await arm_motor.run_angle(10000, 4000) - await drive_base.turn(-40) - await arm_motor.run_angle(10000, 7000) + await arm_motor.run_angle(10000, 10000) run_task(main()) \ No newline at end of file diff --git a/missions/Sand Mission.py b/missions/Sand Mission.py deleted file mode 100644 index 368ba5c..0000000 --- a/missions/Sand Mission.py +++ /dev/null @@ -1,29 +0,0 @@ -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch -from pybricks.tools import run_task,multitask - -hub = PrimeHub() - -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) -right_arm = Motor(Port.D) - -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) - -drive_base.settings(400,500,100,100) - -drive_base.use_gyro(True) - - -async def main(): - await drive_base.straight(500) - await right_arm.run_angle(300,100) - await drive_base.straight(-100) - await right_arm.run_angle(300,-100) - await drive_base.straight(-350) - -run_task(main()) \ No newline at end of file diff --git a/missions/Send_Over_Final.py b/missions/Send_Over_Final.py index db9a179..61a1f33 100644 --- a/missions/Send_Over_Final.py +++ b/missions/Send_Over_Final.py @@ -19,28 +19,41 @@ drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track= drive_base.settings(600,500,300,200) drive_base.use_gyro(True) +WALL_DISTANCE = 200 # mm + +async def drive_forward(): + """Drive forward continuously using DriveBase.""" + drive_base.drive(400, 0) + + +async def monitor_distance(): + """Monitor ultrasonic sensor and stop when wall is detected.""" + while True: + distance = await lazer_ranger.distance() + print('Distancing...',distance) + + if distance < WALL_DISTANCE: + # Stop the drivebase + await drive_base.stop + print(f"Wall detected at {distance}mm!") + break + + # Small delay to prevent overwhelming the sensor + await wait(50) + async def main(): - #Get to mission - await drive_base.straight(920) + await drive_base.straight(-920) await drive_base.turn(-90,Stop.HOLD) await drive_base.straight(65) - #Solve mission + #Solve drive_base.turn(-10) await left_arm.run_angle(10000,-4000) - #Get to Red Start await drive_base.straight(-110) await drive_base.turn(90) - await drive_base.straight(500) - while True: - distance_mm = await lazer_ranger.distance() - print('distancing...',distance_mm) - - if distance_mm < 300: - drive_base.stop - break - else: - drive_base.straight(300) - print('running...') - await wait(10) +await multitask( + drive_forward(), + monitor_distance() + ) + run_task(main()) \ No newline at end of file diff --git a/missions/mission_09_old.py b/missions/mission_09_old.py deleted file mode 100644 index ffdf445..0000000 --- a/missions/mission_09_old.py +++ /dev/null @@ -1,44 +0,0 @@ -# ---JOHANNES--- -# THIS CODE IS NOT USED ANYMORE AND SHOULD NOT BE USED!!!!!! -from pybricks.hubs import PrimeHub -from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor -from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch - -hub = PrimeHub() - -# Initialize both motors. In this example, the motor on the -# left must turn counterclockwise to make the robot go forward. -left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) -right_motor = Motor(Port.B) - -arm_motor = Motor(Port.E, Direction.CLOCKWISE) -arm_motor.run_angle(299,90, Stop.HOLD) -# Initialize the drive base. In this example, the wheel diameter is 56mm. -# The distance between the two wheel-ground contact points is 112mm. -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=54, axle_track=140) - -print('The default settings are: ' + str(drive_base.settings())) -drive_base.settings(100,1000,166,750) -# Optionally, uncomment the line below to use the gyro for improved accuracy. -drive_base.use_gyro(True) - -async def solveM9(): - print("Solving Mission 9") - await drive_base.turn(45) - await drive_base.straight(260) - await arm_motor.run_angle(500,-500, Stop.HOLD) - await drive_base.straight(-40) - await drive_base.turn(92) - await drive_base.straight(-120) - await drive_base.straight(220) - await arm_motor.run_angle(500,100, Stop.HOLD) - await drive_base.turn(-50) - await drive_base.straight(-600) -async def main(): - await drive_base.straight(50) - print("Hello, Robot is starting to run.") - await solveM9() - -run_task(main()) \ No newline at end of file diff --git a/missions/tip the scale.py b/missions/tip the scale.py index 3a4264e..5a0af2e 100644 --- a/missions/tip the scale.py +++ b/missions/tip the scale.py @@ -20,29 +20,18 @@ drive_base.settings(600,500,300,200) drive_base.use_gyro(True) async def main(): - left_arm.run_angle(600,200) - right_arm.run_angle(500,200) - await drive_base.straight(70) + + right_arm.run_angle(500,400) + await drive_base.straight(800) + await drive_base.turn(90) + await drive_base.straight(88) + await right_arm.run_angle(100,-300) + await right_arm.run_angle(400,400) - await drive_base.turn(-70) - await drive_base.straight(900) - await drive_base.turn(115) - - await drive_base.straight(75) - await drive_base.straight(33) - await right_arm.run_angle(500,-250) - await right_arm.run_angle(500,250) - await drive_base.turn(66) - await drive_base.straight(7) - - await left_arm.run_angle(560,-390) #going down - print('turning now...') - await drive_base.turn(40) # turning right - await left_arm.run_angle(-410,-400) #lift a little bit - - await drive_base.turn(-46.5) #ma din din din dun - await drive_base.turn(-40) - await drive_base.straight(900) + await drive_base.straight(-100) + await drive_base.turn(90) + await drive_base.straight(800) + drive_base.brake() + run_task(main()) - diff --git a/missions/Send_Over.py b/utils/FINAL_STARTER_BLANK_CODE.py similarity index 53% rename from missions/Send_Over.py rename to utils/FINAL_STARTER_BLANK_CODE.py index 61e2d37..4afe3d7 100644 --- a/missions/Send_Over.py +++ b/utils/FINAL_STARTER_BLANK_CODE.py @@ -1,31 +1,29 @@ -from pybricks.hubs import PrimeHub from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor from pybricks.parameters import Button, Color, Direction, Port, Side, Stop -from pybricks.robotics import DriveBase -from pybricks.tools import wait, StopWatch from pybricks.tools import run_task, multitask +from pybricks.tools import wait, StopWatch +from pybricks.robotics import DriveBase +from pybricks.hubs import PrimeHub +# Initialize hub and devices hub = PrimeHub() - left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) right_motor = Motor(Port.B) +left_arm = Motor(Port.C) -left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE) right_arm = Motor(Port.D) - -drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180) - -drive_base.settings(600,500,300,200) +lazer_ranger = UltrasonicSensor(Port.E) +color_sensor = ColorSensor(Port.F) +# DriveBase configuration +WHEEL_DIAMETER = 68.8 # mm +AXLE_TRACK = 180 # mm +drive_base = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK) +drive_base.settings(600, 500, 300, 200) drive_base.use_gyro(True) +WALL_DISTANCE = 200 # mm + async def main(): + # Your code goes here - await drive_base.straight(915) - await drive_base.turn(-90) - await drive_base.straight(60) - await left_arm.run_angle(10000,-4000) - await drive_base.straight(-90) - await drive_base.turn(80) - await drive_base.straight(2000) - -run_task(main()) \ No newline at end of file +run_task(main()) \ No newline at end of file diff --git a/utils/tests/colorsensortest.py b/utils/tests/colorsensortest.py new file mode 100644 index 0000000..3d5a8d9 --- /dev/null +++ b/utils/tests/colorsensortest.py @@ -0,0 +1,69 @@ +from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor +from pybricks.parameters import Button, Color, Direction, Port, Side, Stop +from pybricks.tools import run_task, multitask +from pybricks.tools import wait, StopWatch +from pybricks.robotics import DriveBase +from pybricks.hubs import PrimeHub + +# Initialize hub and devices +hub = PrimeHub() + +color_sensor = ColorSensor(Port.F) + +# Color Settings +# https://docs.pybricks.com/en/latest/parameters/color.html +print("Default Detected Colors:", color_sensor.detectable_colors()) + +# Custom color Hue, Saturation, Brightness value for Lego bricks +Color.MAGENTA = Color(315,100,60) +Color.BLUE = Color(240,100,100) +Color.CYAN = Color(180,100,100) +Color.RED = Color(350, 100, 100) +LEGO_BRICKS_COLOR = [ + Color.BLUE, + Color.GREEN, + Color.WHITE, + Color.RED, + Color.YELLOW, + Color.MAGENTA, + Color.NONE +] +magenta_counter = 0 +stable_color = None +real_color = None +#Update Detectable colors +color_sensor.detectable_colors(LEGO_BRICKS_COLOR) +print(f'Yellow:{Color.YELLOW} : {Color.YELLOW.h}, {Color.YELLOW.s}, {Color.YELLOW.v}') +print("Updated Detected Colors:", color_sensor.detectable_colors()) +async def main(): + while True: + global magenta_counter, stable_color, real_color + color_reflected_percent = await color_sensor.reflection() + print("Reflection: ", color_reflected_percent) + if color_reflected_percent > 15: + color_detected = await color_sensor.color() + + if color_detected == Color.MAGENTA: + magenta_counter += 1 + else: + magenta_counter = 0 + stable_color = color_detected + + # Only accept magenta if it's been stable for a while - usually triggers before other colors so we gotta do this :| + if magenta_counter > 10: + stable_color = Color.MAGENTA + if stable_color != Color.MAGENTA: + stable_color = await color_sensor.color() + + real_color = stable_color + #if(color_detected != Color.NONE): + # return + + print("Magenta counter: ", magenta_counter) + if real_color is not None: + print(f'Detected color: {real_color} : {real_color.h}, {real_color.s}, {real_color.v}') + else: + print("No valid color detected yet.") + await wait(50) + +run_task(main()) \ No newline at end of file