-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #14 from cornell-cup/script-feature
Script feature
- Loading branch information
Showing
16 changed files
with
757 additions
and
25 deletions.
There are no files selected for viewing
Submodule cs-base-station-interface
updated
1 files
+2 −6 | src/main/java/basestation/bot/connection/UDPConnectionListener.java |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
from cup_minibot_prepend import CupMiniBot | ||
from .sensor.Sensor import Sensor | ||
bot = CupMiniBot() | ||
left = Sensor(bot, 'left') | ||
right = Sensor(bot, 'right') | ||
center = Sensor(bot, 'center') | ||
|
||
end = False | ||
while(not end): | ||
|
||
while(center.read()==1): | ||
bot.move_foward(100) | ||
while(center.read() != 1): | ||
if(left.read() == 1): | ||
bot.turn_clockwise(100) | ||
else if(right.read() == 1): | ||
bot.turn_counter_clockwise(100) | ||
else: | ||
end = True | ||
break |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#COPY AND PASTE THIS CODE INTO THE GUI TERMINAL | ||
|
||
# bot.move_forward(70) | ||
# s = GPIOSensor(bot, 'right', 1) | ||
# s1 = GPIOSensor(bot, 'left', 2) | ||
# s2 = GPIOSensor(bot, 'center', 3) | ||
# state = 0 | ||
# while(True): | ||
# data = s.readAll() | ||
# j = json.loads(data) | ||
# center = j['center']['data'] | ||
# right = j['right']['data'] | ||
# left = j['left']['data'] | ||
# | ||
# if left != 1 and right != 1: | ||
# bot.move_forward(70) | ||
# else: | ||
# if left and right: | ||
# bot.move_forward(70) | ||
# state = 1 | ||
# elif right: | ||
# bot.turn_clockwise(70) | ||
# elif left: | ||
# bot.turn_counter_clockwise(70) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
import socket | ||
import sys | ||
import time | ||
import json | ||
|
||
HOST = "localhost" | ||
PORT = 11111 | ||
|
||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | ||
|
||
class SimMiniBot: | ||
""" | ||
Abstract simulator class defining the base functions of the MiniBot. More customized MiniBots may | ||
subclass this. | ||
""" | ||
def __init__(self): | ||
server_address = (HOST, PORT) | ||
sock.connect(server_address) | ||
|
||
def move_forward(self, power): | ||
""" | ||
Moves the bot forward at a percentage of its full power | ||
:param power The percentage of the bot's power to use from 0-100 | ||
:return True if the action is supported | ||
""" | ||
message = "FORWARD:" + str(power) + '\n' | ||
sock.sendall(message) | ||
return | ||
|
||
def move_backward(self, power): | ||
""" | ||
Moves the bot backward at a percentage of its full power | ||
:param power The percentage of the bot's power to use from 0-100 | ||
:return True if the action is supported | ||
""" | ||
message = "BACKWARD:" + str(power) + '\n' | ||
sock.sendall(message) | ||
return | ||
|
||
def turn_clockwise(self, power): | ||
""" | ||
Moves the bot clockwise at a percentage of its full power | ||
:param power The percentage of the bot's power to use from 0-100 | ||
:return True if the action is supported | ||
""" | ||
message = "RIGHT:" + str(power) + '\n' | ||
sock.sendall(message) | ||
return | ||
|
||
def turn_counter_clockwise(self, power): | ||
""" | ||
Moves the bot counter-clockwise at a percentage of its full power | ||
:param power The percentage of the bot's power to use from 0-100 | ||
:return True if the action is supported | ||
""" | ||
message = "LEFT:" + str(power) + '\n' | ||
sock.sendall(message) | ||
return | ||
|
||
def set_wheel_power(self, front_left, front_right, back_left, back_right): | ||
""" | ||
Sets the power of the bot's wheels as a percentage from -100 to 100. If a wheel | ||
specified does not exist, the power for that wheel is ignored. | ||
:param front_left power to deliver to the front_left wheel | ||
:param front_right power to deliver to the front_right wheel | ||
:param back_left power to deliver to the back_left wheel | ||
:param back_right power to deliver to the back_right wheel | ||
:return True if the action is supported | ||
""" | ||
message = "WHEELS:" + str(front_left) + ',' + str(front_right) + ',' + str(back_left) + ',' \ | ||
+ str(back_right) + '\n'; | ||
sock.sendall(message) | ||
return | ||
|
||
def wait(self, t): | ||
""" | ||
Waits for a duration in seconds. | ||
:param t The duration in seconds | ||
""" | ||
message = "WAIT:" + str(t) + '\n' | ||
sock.sendall(message) | ||
time.sleep(t) | ||
return | ||
|
||
def stop(self): | ||
""" | ||
Waits for a duration in seconds. | ||
:param t The duration in seconds | ||
""" | ||
message = "STOP:0" + '\n' | ||
sock.sendall(message) | ||
return | ||
|
||
def register_sensor(self, name): | ||
""" | ||
Registers a new sensor. | ||
:param name The name of the sensor | ||
""" | ||
message = "REGISTER:" + name + '\n' | ||
sock.sendall(message) | ||
return | ||
|
||
def kill(self): | ||
""" | ||
Kills TCP connection | ||
""" | ||
message = "KILL:-1" + '\n' | ||
sock.sendall(message) | ||
sock.close() | ||
return | ||
|
||
|
||
class Sensor: | ||
def __init__(self, bot, name): | ||
self.name = name | ||
bot.register_sensor(name) | ||
|
||
def read(self): | ||
return "Invalid: Abstract Sensor Class Reading" | ||
|
||
|
||
class GPIOSensor(Sensor): | ||
def __init__(self, bot, name, pin_number): | ||
Sensor.__init__(self, bot, name) | ||
self.pin_number = pin_number | ||
|
||
def readAll(self): | ||
""" | ||
Get All Sensor Data | ||
""" | ||
message = "GET:ALL" + '\n' | ||
sock.sendall(message) | ||
result = sock.recv(1024) | ||
return result | ||
|
||
def read(self): | ||
""" | ||
Get Sensor Data | ||
""" | ||
message = "GET:" + self.name + '\n' | ||
sock.sendall(message) | ||
result = sock.recv(1024) | ||
return result | ||
|
||
bot = SimMiniBot() | ||
bot.move_forward(70) | ||
s = GPIOSensor(bot, 'bot1', 1) | ||
state = 0 | ||
while(True): | ||
data = s.readAll() | ||
j = json.loads(data) | ||
center = j['center']['data'] | ||
right = j['right']['data'] | ||
left = j['left']['data'] | ||
|
||
if left and right: | ||
bot.move_forward(70) | ||
elif right: | ||
bot.turn_clockwise(70) | ||
elif left: | ||
bot.turn_counter_clockwise(70) | ||
else: | ||
if state == 0: | ||
bot.move_forward(70) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package simulator.simbot; | ||
|
||
import basestation.BaseStation; | ||
import basestation.vision.VisionCoordinate; | ||
import basestation.vision.VisionObject; | ||
import com.google.gson.JsonObject; | ||
|
||
import javax.imageio.ImageIO; | ||
import java.awt.image.BufferedImage; | ||
import java.io.File; | ||
import java.io.IOException; | ||
import java.util.List; | ||
|
||
/** | ||
* A sensor that measures color intensity based on an image provided to the simulator. | ||
*/ | ||
public class ColorIntensitySensor extends Sensor { | ||
|
||
transient BufferedImage img; | ||
private transient SimBot parent; | ||
private double lateralOffset; | ||
|
||
public ColorIntensitySensor(SimBotSensorCenter myCenter, String name, SimBot parent, double lateralOffset) { | ||
super(myCenter, name); | ||
this.parent = parent; | ||
try { | ||
img = ImageIO.read(new File("./src/main/resources/public/img/line.png")); | ||
} catch (IOException e) { | ||
e.printStackTrace(); | ||
} | ||
this.lateralOffset = lateralOffset; | ||
} | ||
|
||
public JsonObject read() { | ||
// Get the x,y coordinates of the bot. | ||
// TODO: Make it so we can do this line, not the one below. VisionCoordinate parentCoordinate = BaseStation.getInstance().getVisionManager().getBotCoordinate(parent); | ||
List<VisionObject> allLocs = BaseStation.getInstance().getVisionManager().getAllLocationData(); | ||
JsonObject jo = new JsonObject(); | ||
|
||
if (allLocs.size() == 0) { | ||
jo.addProperty("data",-1); | ||
return jo; | ||
} | ||
|
||
VisionCoordinate parentCoordinate = allLocs.get(0).coord; | ||
|
||
if (parentCoordinate == null) { | ||
jo.addProperty("data",-1); | ||
return jo; | ||
} | ||
|
||
|
||
int[] transformed = transformToPixels(parentCoordinate, this.lateralOffset); | ||
|
||
// Get pixel values | ||
if(img==null) { | ||
System.err.println("null image"); | ||
jo.addProperty("data", -1); | ||
return jo; | ||
} | ||
int rgb = img.getRGB(transformed[0], transformed[1]); | ||
if (rgb <= -16777216) { | ||
rgb=1; | ||
} else { | ||
rgb=0; | ||
} | ||
jo.addProperty("data",rgb); | ||
|
||
|
||
return jo; | ||
} | ||
|
||
private int[] transformToPixels(VisionCoordinate vc, double lateralOffset) { | ||
double X_SCALE = 100; | ||
double Y_SCALE = 100; | ||
double medial_offset = 9.5; //offset along the medial axis of the robot, positive values indicate a "forwards" offset. 62.5 corresponds with offsetting it to the front of the bot | ||
double lateral_offset = lateralOffset; //offset along lateral axis of robot, positive values indicate a "leftwards" offset, 0 indicates that there is no left/right offset | ||
int[] ret = new int[2]; | ||
|
||
double angle = vc.getThetaOrZero(); | ||
double angle_offset = Math.atan(lateral_offset/medial_offset)+angle; //intermediate step for calculating coordinates | ||
double total_offset = Math.sqrt(medial_offset*medial_offset+lateral_offset*lateral_offset); //intermediate step for calculating coordinates | ||
|
||
ret[0] = (int) Math.floor(vc.x * X_SCALE + total_offset*Math.cos(angle_offset)); | ||
ret[1] = (int) Math.floor(vc.y * Y_SCALE + total_offset*Math.sin(angle_offset)); | ||
return ret; | ||
} | ||
} |
Oops, something went wrong.