Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
144 commits
Select commit Hold shift + click to select a range
371078f
Add picture
farrellw Nov 6, 2016
1f473e6
Add more comm test files
Nov 6, 2016
b855aa0
Merge branch 'master' of https://github.com/jwarshaw/RaspberryDrive i…
farrellw Nov 6, 2016
cb3876e
Merge pull request #2 from jwarshaw/distance_camera
farrellw Nov 6, 2016
e847e45
Merge pull request #3 from jwarshaw/folders
jwarshaw Nov 6, 2016
024b6ad
Merge pull request #4 from jwarshaw/comm
jwarshaw Nov 6, 2016
ff96c30
Add images
farrellw Nov 6, 2016
cc6cb57
Merge pull request #5 from jwarshaw/picture_branch
farrellw Nov 6, 2016
4f5168c
Change blob loop in infinite loop
hfyfe Nov 6, 2016
f2ae292
Merge pull request #6 from jwarshaw/change_blob_branch
farrellw Nov 6, 2016
549d0e0
Add file that loops and gets images from pi camera
farrellw Nov 7, 2016
90aa14d
Merge pull request #7 from jwarshaw/transfer_picture_branch
farrellw Nov 7, 2016
4c33991
Merge branch 'master' of https://github.com/chi-bobolinks-2016/Raspbe…
hfyfe Nov 7, 2016
be7ca05
add picar class with initialize, drive forward, drive backward, drive…
hfyfe Nov 7, 2016
d6a3027
Refactor into two separate methods
farrellw Nov 7, 2016
01a3967
add first attempt at server
hfyfe Nov 7, 2016
021f1e4
Merge pull request #8 from jwarshaw/analyze_pic_server
hfyfe Nov 7, 2016
0152fd1
Spread responsibility between analyze pic server and analyze
farrellw Nov 7, 2016
39bd878
add control statements
hfyfe Nov 7, 2016
0eb781a
Add relative path to analyze pic server
farrellw Nov 7, 2016
78be1f5
Delete line loading an unnecessary module
farrellw Nov 7, 2016
bf8f582
Merge pull request #9 from jwarshaw/combine_analysis_branch
farrellw Nov 7, 2016
5ecf3b5
update
hfyfe Nov 7, 2016
c3a96e4
Add controller aka analyze pic server
Nov 7, 2016
17114ca
add connect simple lib
hfyfe Nov 7, 2016
cef3438
refactor to clean up
Nov 7, 2016
da1faf1
Merge pull request #11 from jwarshaw/driver-code
farrellw Nov 7, 2016
5358e03
update
hfyfe Nov 7, 2016
4e939a4
Merge pull request #10 from jwarshaw/putting_parts_together
hfyfe Nov 7, 2016
0b78ac3
cleaning up server file
hfyfe Nov 7, 2016
22cfe55
Merge branch 'master' of https://github.com/jwarshaw/RaspberryDrive i…
hfyfe Nov 7, 2016
16159e5
refactor controller to get image, analyze image, send instruction
Nov 7, 2016
5b123d6
server update
hfyfe Nov 7, 2016
ab306d5
Add logic to only analyze picture if the picture is a valid image
Nov 8, 2016
7d5011a
Refactor around error statement. Change from getting greg to getting…
Nov 8, 2016
9c9a11a
Delete unnecessary function, get image x times. That logic done in c…
Nov 8, 2016
b385d24
Fix merge conflict. Kept Henry's changes on driving server. Fixed i…
Nov 8, 2016
9837da4
Merge pull request #12 from jwarshaw/controller_branch
jwarshaw Nov 8, 2016
33675b3
Move logic from analyze pic path to controller/controller
Nov 8, 2016
725dbac
Merge pull request #13 from jwarshaw/controller_organization
hfyfe Nov 8, 2016
e5071b2
add verbosity to server
hfyfe Nov 8, 2016
e948739
Add psuedocode logic
Nov 8, 2016
932eb7e
Relocate view for easy accessiblility in ssh command from server.
farrellw Nov 8, 2016
5fed127
Merge pull request #14 from jwarshaw/relocate_view_take_picture
farrellw Nov 8, 2016
5a39c3f
Merge branch 'master' into start_organization
Nov 8, 2016
360d35a
Add start camera function and controller psuedocode logic
Nov 8, 2016
e21acf6
Add start camera functionality to controller
Nov 8, 2016
ff174fe
Add exit logic
farrellw Nov 8, 2016
23e1682
Merge pull request #15 from jwarshaw/relocate_view_take_picture
farrellw Nov 8, 2016
da59c55
save
hfyfe Nov 8, 2016
155a480
resolving conflicts
hfyfe Nov 8, 2016
219e0a5
Remove dead files
Nov 8, 2016
a5adf8d
Remove artifact file
Nov 8, 2016
e400126
cleaning up errors
hfyfe Nov 8, 2016
81f711f
syntax error
hfyfe Nov 8, 2016
de54136
Start thread logic to start camera while async running program
Nov 8, 2016
4b15bea
Merge branch 'master' into start_organization
Nov 8, 2016
ced4a90
adding driver files
hfyfe Nov 8, 2016
88b18a4
Start thread for starting server. Needs work
Nov 8, 2016
76d6476
Commented out
Nov 8, 2016
b8f7454
Merge branch 'master' into start_organization
Nov 8, 2016
8de1659
removing driver code
hfyfe Nov 8, 2016
f11e862
Merge pull request #17 from jwarshaw/start_organization
Garner412 Nov 8, 2016
2b5c105
Run pictures, server, analyzation at the same time. Still need to im…
Nov 8, 2016
a008e81
Merge pull request #18 from jwarshaw/auto_start_server
Garner412 Nov 8, 2016
c216511
Move psuedocode around for readability. Push server ending function …
Nov 8, 2016
786da1e
Merge pull request #19 from jwarshaw/refactor_controller
Garner412 Nov 8, 2016
7248504
Merge branch 'master' into detectLines
Nov 8, 2016
782af93
Add line detector file
Nov 8, 2016
c68d5c7
Merge pull request #20 from jwarshaw/detectLines
farrellw Nov 8, 2016
55f06ba
Update analyze module
Nov 8, 2016
ba1f783
Merge pull request #21 from jwarshaw/detectLines
farrellw Nov 8, 2016
68be584
Change controller logic to implment John/Henry analyzeLine
Nov 8, 2016
bfcc75d
Fix merge conflict in analyzeLine
Nov 8, 2016
cf5268b
Organize logic for first test run. Call run Analyze lines in control…
Nov 8, 2016
4052376
Merge pull request #22 from jwarshaw/test_run_1
farrellw Nov 8, 2016
40253e3
Flip cam vert and horiz
Nov 8, 2016
4eefa90
Merge pull request #23 from jwarshaw/camera
farrellw Nov 8, 2016
36ddf99
Remove views folder including artifact and duplicte files
Nov 9, 2016
4daafcf
Merge pull request #24 from jwarshaw/cleaner
farrellw Nov 9, 2016
5639776
Remove init file from controllers folder
Nov 9, 2016
0f05ed8
Merge pull request #25 from jwarshaw/cleaner
farrellw Nov 9, 2016
c815bed
Remove artifact files from models folder
Nov 9, 2016
56af72b
Merge pull request #26 from jwarshaw/cleaner
farrellw Nov 9, 2016
0d485da
Remove models folder and copy pertinent files to root directory
Nov 9, 2016
9aa740b
Merge pull request #27 from jwarshaw/cleaner
farrellw Nov 9, 2016
2f64aaa
To merge
Nov 9, 2016
3ff7db0
Merge branch 'master' of https://github.com/jwarshaw/RaspberryDrive
Nov 9, 2016
b663720
Change import path
Nov 9, 2016
e0f74b3
Merge pull request #28 from jwarshaw/change_import_path
jwarshaw Nov 9, 2016
02e82a7
Add gitignore file
Nov 9, 2016
9aefad7
Add images folder to gitignore file
Nov 9, 2016
2f0765a
Merge pull request #29 from jwarshaw/cleaner
jwarshaw Nov 9, 2016
cc1b1c1
Remove artifact files from root directory and add library to readme
Nov 9, 2016
26703e2
Merge pull request #30 from jwarshaw/cleaner
farrellw Nov 9, 2016
688fc15
Remove dud pyc files
Nov 9, 2016
23d61b2
Remove artifact pyc files
Nov 9, 2016
d312c5b
Merge pull request #31 from jwarshaw/cleaner
farrellw Nov 9, 2016
fccc440
Merge branch 'master' of https://github.com/jwarshaw/RaspberryDrive
Nov 9, 2016
385fbd1
Break driver code in controller into functions
farrellw Nov 9, 2016
5300385
Adjust psuedocode
farrellw Nov 9, 2016
88aafe8
Merge pull request #32 from jwarshaw/refactor_controller
farrellw Nov 9, 2016
b718e04
Delete get image x times
Nov 9, 2016
dd80bae
Merge down to master
Nov 9, 2016
059e73c
Delete unnecessary thread code
Nov 9, 2016
ee3ed3a
Merge pull request #33 from jwarshaw/oopd_python_controller
farrellw Nov 9, 2016
230ebff
Create file to test image caching
Nov 9, 2016
211997b
Merge pull request #34 from jwarshaw/image_caching
farrellw Nov 9, 2016
fd45c34
add image caching capability. Images are saved as a zero index
Nov 9, 2016
4ba0578
Commented out code explaining
Nov 9, 2016
1e6fda9
Reorganize driver code in controller into methods
Nov 9, 2016
4b50387
Merge pull request #35 from jwarshaw/img_cache
Garner412 Nov 9, 2016
75c74ca
add correct server files, again
Nov 9, 2016
7e1b71e
Take out unnecessary returns and semicolons in controller
Nov 9, 2016
36f0099
Merge pull request #36 from jwarshaw/taking_out_returns_and_semicolons
farrellw Nov 9, 2016
4dfd269
Take out extra unneeded return
Nov 9, 2016
5ecb17e
Merge pull request #37 from jwarshaw/taking_out_returns_and_semicolons
farrellw Nov 9, 2016
746b37a
Remove unnecessary images in images folder
Nov 9, 2016
51cead3
Merge pull request #38 from jwarshaw/remove_extra_images
farrellw Nov 9, 2016
e0f8a7e
Merge branch 'master' of https://github.com/jwarshaw/RaspberryDrive
Nov 9, 2016
ae9f6c7
fixing whitespace
Nov 9, 2016
b470000
renaming files
Nov 9, 2016
a7d6822
refactor of processing and blob recognition into classes
Nov 9, 2016
08dcd54
resolving merge conflicts
Nov 9, 2016
45e7122
Merge pull request #39 from jwarshaw/pair-garner412,hfyfe
jwarshaw Nov 9, 2016
9c70902
Add temp file sequence to take picture file
Nov 9, 2016
74bff7f
Add logic to test pictures
Nov 9, 2016
158f9d4
Merge pull request #40 from jwarshaw/takePicture
Garner412 Nov 9, 2016
a68b9b1
Merge branch 'master' into color_testing
Nov 9, 2016
e2c33e3
Add easy driver code to driver_code_test for getting and testing images
Nov 9, 2016
5433927
Merge pull request #41 from jwarshaw/color_testing
jwarshaw Nov 9, 2016
ff21cb8
Reduce picture loop to 15 pictures
farrellw Nov 9, 2016
04d0fb6
Merge pull request #42 from jwarshaw/pictureloop
jwarshaw Nov 9, 2016
b7a87f5
Remove temp file code
farrellw Nov 9, 2016
9018c20
Merge pull request #43 from jwarshaw/pictureloop
jwarshaw Nov 9, 2016
3cfff48
add carmaneuvers class
Nov 9, 2016
de835be
does this change capitals
Nov 9, 2016
c33e92b
trying delete
Nov 9, 2016
639a892
readd
Nov 9, 2016
d74b524
Add temp pic file sequence to takepicture file
farrellw Nov 9, 2016
c5c2bda
Merge pull request #44 from jwarshaw/cam-update
farrellw Nov 9, 2016
1acd019
update to image detection logic
Nov 9, 2016
96468cc
Merge branch 'master' of https://github.com/jwarshaw/RaspberryDrive i…
Nov 9, 2016
28e48cc
update controller to use new logic
Nov 9, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
images/
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
# RaspberryDrive
Use a Raspberry Pi 3 to drive an RC Car

## Libraries
Python 2
SimpleCV
PiCamera
File renamed without changes.
Binary file added analyzeLine.pyc
Binary file not shown.
49 changes: 49 additions & 0 deletions analyzeblob.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import SimpleCV
import cv2
import time

class AnalyzeBlob(object):

def __init__(self,img,blob):
self.vertical_boundary = 0.3
self.width_boundary = 0.4
self.img = img
self.blob = blob
self.angle_to_turn = 30

def isBlobBlocking(self):
if (self.__heightBelowThreshold() and self.__widthSufficientToBlock()):
return True

def isBlobDetectedOnLeft(self):
if (self.__anglingFromLeft() and self.__largeObjectStartingNearLeft()):
return True

def isBlobDetectedOnRight(self):
if (self.__anglingFromRight() and self.__largeObjectStartingNearRight()):
return True

def __anglingFromRight(self):
return self.blob.angle() < self.angle_to_turn

def __largeObjectStartingNearRight(self):
return (self.blob.maxX() > self.img.size()[0] * 0.95) and (self.blob.width() > self.img.size()[0] * 0.8) and (self.blob.maxY() > self.img.size()[1] * 0.3)

def isBlobBlockingMoreRight(self):
self.blob.angle() > 0

def __anglingFromLeft(self):
print self.blob.angle()
return self.blob.angle() > 90 - self.angle_to_turn

def __largeObjectStartingNearLeft(self):
return (self.blob.maxX() < self.img.size()[0] * 0.05) and (self.blob.width() > self.img.size()[0] * 0.8) and (self.blob.maxY() > self.img.size()[1] * 0.3)

def __heightBelowThreshold(self):
return self.blob.maxY() > self.img.size()[1] * self.vertical_boundary

def __widthSufficientToBlock(self):
print self.blob.width() > self.img.size()[0] * self.width_boundary
return self.blob.width() > self.img.size()[0] * self.width_boundary


63 changes: 63 additions & 0 deletions analyzeimage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import SimpleCV
import cv2
import time
from analyzeblob import *
from car_maneuvers import *
from PIL import Image

class AnalyzeImage(object):

def __init__(self, image,connection):
self.default_command = "stop"
self.scvImg = SimpleCV.Image(image)
self.segmented_black_white = self.scvImg.stretch(160,161)
self.black_white_blobs = self.segmented_black_white.findBlobs(minsize=100)
self.car = CarManeuvers(connection)

def runBlobFinder(self):
if (self.black_white_blobs and (len(self.black_white_blobs) > 0)):
self.analyzeBlobs()
else:
self.car.forward()
# print x
# print blob

def analyzeBlobs(self):
blobs = self.scvImg.findBlobs(minsize = 100)
# if blobs:
# for blob in blobs:
# if blob.area() > 100:
# blob.draw(color=(128,0,0))
# self.scvImg.show()
# self.scvImg.show()
# time.sleep(2)
#check if blocked
for blob in self.black_white_blobs:
print blob
analyzed_blob = AnalyzeBlob(self.scvImg,blob)

if analyzed_blob.isBlobBlocking():
print "true"
if analyzed_blob.isBlobBlockingMoreRight():
self.car.back_up_and_then_drive_left()
else:
self.car.back_up_and_then_drive_right()
return

elif analyzed_blob.isBlobDetectedOnRight():
# if analyzed_blob.blockedOnRight():
self.car.left()
return
elif analyzed_blob.isBlobDetectedOnLeft():
self.car.right()
return
#otherwise go forward
self.car.forward()

# detect blobs
# if blobs
# check left and check rightt
# is blocking?
# back up
# else
# turn (in correct direction)
Binary file added analyzeimage.pyc
Binary file not shown.
29 changes: 29 additions & 0 deletions car_maneuvers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from connect import *

class CarManeuvers(object):

def __init__(self,connection):
self.connection = connection

def forward(self):
print "executing forward"
send_command(self.connection, "forward", "0.5")

def right(self):
print "executing right"
send_command(self.connection, "right", "0.5")

def left(self):
print "executing left"
send_command(self.connection, "left", "0.5")

def back_up_then_right(self):
print "executing back up and drive right"
send_command(self.connection, "backwards", "0.75")
send_command(self.connection, "right", "0.5")

def back_up_then_left(self):
print "executing back up and drive left"
send_command(self.connection, "backwards", "0.75")
send_command(self.connection, "left", "0.5")

24 changes: 24 additions & 0 deletions connect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import socket

def new_connection():
host = '192.168.2.4'
port = 9000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
return s;

def send_command(connection,command,time):
connection.send('' + command + ' ; ' + time)
return receive_confirmation(connection)

def receive_confirmation(connection):
received = connection.recv(20)
return received;

def send_end_connection(connection):
connection.send('quit')
return

# example:
# con = new_conntection
# send_command(con,"forward",0.5)
Binary file added connect.pyc
Binary file not shown.
Binary file added controllers/.DS_Store
Binary file not shown.
Binary file added controllers/camera_thread.pyc
Binary file not shown.
58 changes: 58 additions & 0 deletions controllers/controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import os
import sys
from time import sleep
sys.path.insert(0, os.getcwd())
import analyzeblob
import analyzeimage
from analyzeimage import *
from analyzeblob import *
from get_images_from_pi import get_image, valid_image
from connect import new_connection, send_command, receive_confirmation,send_end_connection
from start_camera import start_camera
from start_server import start_server
import threading

def start_server_thread():
server_thread = threading.Thread(target=start_server)
server_thread.start()

def start_camera_thread():
camera_thread = threading.Thread(target=start_camera)
camera_thread.start()

def start_all():
start_server_thread()
start_camera_thread()
sleep(7)
s = new_connection()
return s
#start the server listening on contr pi
#start the camera taking pictures on camera pi
# Sleep to make sure server connects
#start the server connection on this current server

def end_all(server):
send_end_connection(server)
server.close()
#End-all
#Camera exits automatically automatically
#Close the Server Connection on the Pi-Controller End
#Kill the server listening process

def run(server):
count = 0
while (count < 20):
instruction = "forward"
#retrieve image.
get_image(count)
if valid_image(os.getcwd() + "/gregTest.jpg"):
#Blog Detection
analyzed_image = AnalyzeImage(os.getcwd() + "/gregTest.jpg")
analyzed_image.runBlobFinder()
count += 1

server = start_all()
run(server)
end_all(server)
#exit out of controller
exit()
Binary file added controllers/server_thread.pyc
Binary file not shown.
48 changes: 0 additions & 48 deletions distance_to_camera.py

This file was deleted.

38 changes: 38 additions & 0 deletions driver_code_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import SimpleCV
from SimpleCV import Image
import cv2
import time
from start_camera import start_camera
import threading

camera_thread = threading.Thread(target=start_camera)
camera_thread.start()
from get_images_from_pi import get_image, valid_image

count = 0
while (count < 10):
get_image(count)
count += 1

exit()

# image = Image('images/9.jpg')
# # p = image.getPalette()
# # rgb = PIL.ImageColor.getrgb("blue")
# # print rgb
# blobs = image.findBlobs(threshval=(0,0,255))
# # blobs = image.findBlobsFromPalette( (p[0],p[1],p[2]) )
# # blobs = image.findBlobsFromHueHistogram((0,0,50,50))
# if blobs:
# for blob in blobs:
# print "got a blob"
# blob.draw(color=(0, 128, 0))
# image.show()
# image.show()
# time.sleep(4)






45 changes: 45 additions & 0 deletions driving_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from socket import *
import run_rc_car as picar

def createPiReceiver():
serversocket = socket(AF_INET, SOCK_STREAM)
port = 9000
new_picar = picar.PiCar()
serversocket.bind(('',port))
serversocket.listen(5)
print "New Server Created, listening on port " + str(port)
while(1):
(clientsocket, address) = serversocket.accept()
print "accepted connection from " + str(address)
while(1):
transfer = clientsocket.recv(20)
if not transfer: break
if (transfer == "quit"):
exit()
else:
transfer = transfer.split(';')
if transfer == ['']: break
print "received: " + str(transfer)
inputParser(transfer[0].strip(),float(transfer[1]),new_picar)
clientsocket.send("true")

def inputParser(command,number,car):
print 'executing ' + command + ' for ' + str(number) +' seconds'
if command == "forward":
car.go_forward(number)
elif command == "backward":
car.go_backward(number)
elif command == "right":
car.go_forward_right(number)
elif command == "left":
car.go_forward_left(number)
elif command == "backward right":
car.go_backward_right(number)
elif command == "backward left":
car.go_backward_left(number)
else:
car.stop()


createPiReceiver()
exit()
16 changes: 16 additions & 0 deletions get_images_from_pi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import os
from PIL import Image

def get_image(count):
scp_command = 'scp pi@192.168.2.5:Desktop/gregTest.jpg ' + 'images/' + str(count) + '.jpg'
os.system(scp_command)
return
# os.system('scp pi@192.168.2.5:Desktop/gregTest.jpg gregTest.jpg')
#use following to create key if needed: https://www.raspberrypi.org/documentation/remote-access/ssh/passwordless.md

def valid_image(path):
try:
Image.open(path)
except IOError:
return False
return True
Binary file added get_images_from_pi.pyc
Binary file not shown.
File renamed without changes
Binary file added images/gregTest.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading