Exemple #1
0
def main():
	# Camera setup
	camera_stack = []
	camera_n = Semaphore(0)
	camera_s = Semaphore(1)
	cameras = Camera(camera_stack, camera_n, camera_s)

	# Start the thread
	cameras.start()
	
	# Try to pull from the stack every 1 second and print data
	for i in range(0, 10):
		time.sleep(1)
		camera_n.acquire()
		camera_s.acquire()
		left_lines = camera_stack.pop()
		right_lines = camera_stack.pop()
		camera_s.release()
		
		print(i)
		if right_lines != None:
			for line in right_lines:
				for rho, theta in line:
					print(rho, theta)
		else:
			print("No right lines")
			
		if left_lines != None:
			for line in left_lines:
				for rho, theta in line:
					print(rho, theta)
		else:
			print("No left lines")
	
	# Stop camera thread and wait for it to finish
	cameras.stop()
	cameras.join()
class HeliosController(Observable):
    md = None
    ds = None
    acl = None
    cam = None
    status = {}

    def __init__(self, conffile):
        Observable.__init__(self)
	cp = ConfigParser()
	cp.read(conffile)

	if not Globals.globSimulate:
	    wiringpi.wiringPiSetupGpio()

	self.md = MotorDriver([
		    cp.getint("MotorDriver", "LEFT_L"),
		    cp.getint("MotorDriver", "LEFT_R"),
		    cp.getint("MotorDriver", "RIGHT_L"),
		    cp.getint("MotorDriver", "RIGHT_R"),
		    cp.getint("MotorDriver", "VERTICAL_L"),
		    cp.getint("MotorDriver", "VERTICAL_R"),
		    ])
	self.md.start()

	self.ds = DistanceSensor(
		    cp.getint("DistanceSensor", "TRIGGER"),
		    cp.getint("DistanceSensor", "ECHO")
		    )
	self.ds.start()

	self.acl = AltitudeControlLoop(self.md, self.ds)

	self.update("MotorDriver", self.md)
	self.update("DistanceSensor", self.ds)
	self.update("AltitudeControlLoop", self.acl)

	self.md.subscribe(self.update)
	self.ds.subscribe(self.update)
	self.acl.subscribe(self.update)

	self.setCamera(False)
	#self.acl.debug = True
	#self.md.debug = True

    def shutdown(self):
	self.md.shutdown()
	self.md.join()
	self.ds.shutdown()
	self.ds.join()
	self.setCamera(False)

    def turnLeft(self):
        self.md.turnLeft()
    def turnRight(self):
        self.md.turnRight()

    def forward(self):
        self.md.forward()
    def backward(self):
        self.md.backward()
    def up(self):
        self.md.up()
    def down(self):
        self.md.down()

    def setSpeed(self, val):
    	self.md.setSpeed(val)
    def setAuto(self, val):
    	self.acl.setAuto(val)
    def setHeight(self, val):
    	self.acl.setHeight(val)
    def setForceDescent(self, val):
        self.acl.setForceDescent(val)
    def setSingleSteerMode(self, val):
    	self.md.setSingleSteerMode(val)

    def setCamera(self, val):
	if self.cam == None:
	    if val:
		print "HeliosController enabling camera"
		self.cam = Camera()
		self.cam.subscribe(self.updateImage)
		self.cam.start()
	    else:
		print "HeliosController tried to disable camera, but is not active"
	else:
	    if val:
		print "HeliosController tried to enable camera, but is already active"
	    else:
		print "HeliosController disabling camera"
		self.cam.shutdown()
		self.cam.join()
		self.cam = None
		self.status["cameraImage"] = "data:image/jpeg;base64," + base64.b64encode(open("nocam.jpg","rb").read())

	self.status["cameraActive"] = True if self.cam != None else False
	self.emit("HeliosController", self)

    def updateImage(self, id, cam):
	self.status["cameraImage"] = "data:image/jpeg;base64," + base64.b64encode(cam.getImage())

    def getImage(self):
	if self.cam != None:
	    return self.cam.getImage()
	return open("nocam.jpg","rb").read()

    def update(self, etype, src):
	if etype == "MotorDriver":
	    self.status["statLeft"] = src.statusLeft()
	    self.status["statRight"] = src.statusRight()
	    self.status["statVert"] = src.statusVert()
	    self.status["pwmValue"] = src.getPWM()
	    self.status["singleSteeringMode"] = src.getSingleSteerMode()

	if etype == "DistanceSensor":
	    self.status["currentAltitude"] = src.getCurrentDistance()
	    self.status["altitudeHistory"] = src.getDistanceHistory()

	if etype == "AltitudeControlLoop":
	    self.status["requestedAltitude"] = src.getHeight()
	    self.status["maintainAltitude"] = src.getAuto()
	    self.status["forceDescent"] = src.getForceDescent()

	self.emit("HeliosController", self)

    def getStatus(self):
        return self.status
Exemple #3
0
def main():
	logger.debug("Starting TCNJ IGVC 2017")
	logger.debug("Getting USB device mappings")
	device_to_path = get_device_paths()

	# GPS setup
	logger.debug("Beginning GPS setup")
	gps_coords_stack = Manager().list()
	gps_n = Semaphore(0)
	gps_s = Semaphore(1)
	gps_sensor = GPS(gps_coords_stack, gps_n, gps_s, device_to_path["GPS"])
	logger.debug("GPS setup complete")

	# LiDAR setup
	logger.debug("Beginning LiDAR setup")
	lidar_data_stack = Manager().list()
	lidar_n = Semaphore(0)
	lidar_s = Semaphore(1)
	lidar_sensor = LIDAR(lidar_data_stack, lidar_n, lidar_s, device_to_path["LIDAR"])
	logger.debug("LiDAR setup complete")

	# Camera setup
	logger.debug("Beginning camera setup")
	camera_lines_stack = Manager().list()
	camera_n = Semaphore(0)
	camera_s = Semaphore(1)
	camera_controller = Camera(camera_lines_stack, camera_n, camera_s, device_to_path["RIGHT_CAM"], device_to_path["LEFT_CAM"])
	logger.debug("Camera setup complete")

	# Compass setup
	logger.debug("Beginning compass setup")
	compass_stack = Manager().list()
	compass_n = Semaphore(0)
	compass_s = Semaphore(1)
	compass = Compass(compass_stack, compass_n, compass_s)
	logger.debug("Compass setup complete")

	# Wrap all the sensors' stacks and semaphores into 1 object
	sensors = Sensors(
		gps_coords_stack, gps_n, gps_s,
		lidar_data_stack, lidar_n, lidar_s,
		camera_lines_stack, camera_n, camera_s,
		compass_stack, compass_n, compass_s
	)

	# Start the sensor processes
	logger.debug("Setup complete")
	logger.debug("Starting GPS process")
	gps_sensor.start()
	logger.debug("Startting LiDAR process")
	lidar_sensor.start()
	logger.debug("Starting camera process")
	camera_controller.start();
	logger.debug("Starting compass process")
	compass.start();


	# Set up wiringpi2 and GPIO pin 6 as input
	logger.debug("Sensor process started, waiting for motors to turn on")
	motors_on_pin = 6
	wpi.wiringPiSetup()
	wpi.pinMode(motors_on_pin, 0)

	# Wait for motor controller to be turned on
	motors_on = False
	while not motors_on:
		value = wpi.digitalRead(motors_on_pin)
		if value == 1:
			motors_on = True
		else:
			time.sleep(1)

	logger.debug("Motors are on, begin autonomous navigation")
	path_find = Avoidance(sensors)
	path_find.start()

	time.sleep(10)

	# Stop the processes
	logger.debug("Calling for processes to stop")
	path_find.stop()
	time.sleep(1)
	gps_sensor.stop()
	lidar_sensor.stop()
	camera_controller.stop()
	compass.stop()

	# Clean up the processes
	logger.debug("Waiting for processes to end")
	path_find.join()
	gps_sensor.join()
	lidar_sensor.join()
	camera_controller.join()
	compass.join()

	print("--------------- CAMERA STACK ---------------")
	print(camera_lines_stack)
	print("--------------- GPS STACK ---------------")
	print(gps_coords_stack)
	print("--------------- LIDAR STACK ---------------")
	print(lidar_data_stack)
	print("--------------- COMPASS STACK ---------------")
	print(compass_stack)
	print("--------------- DONE ---------------")