-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
111 lines (103 loc) · 5.03 KB
/
Copy pathapp.py
File metadata and controls
111 lines (103 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import serial
import cv2
import os
from picamera2 import Picamera2
from picamera2.encoders import JpegEncoder, Quality, MJPEGEncoder
from picamera2.outputs import FileOutput
from libcamera import controls
from flask import Flask
from flask_restful import Api
from pymongo import MongoClient
import urllib.parse
from flask_jwt_extended import JWTManager, jwt_required, create_access_token
from common.robot import Robot
from resources.move_forward import MoveForward
from resources.move_backward import MoveBackward
from resources.move_left import MoveLeft
from resources.move_right import MoveRight
from resources.gripper import Gripper
from resources.rotate import Rotate
from resources.up_down import UpDown
from resources.gcode import Gcode
from resources.get_image_base import GetImageBase
from resources.get_image_top import GetImageTop
from resources.get_all_states import GetAllStates
from resources.calibrate import Calibrate
from resources.get_state import GetState
from resources.step_action import StepAction
from resources.register import Register
from resources.login import Login
from resources.streaming_output import StreamingOutput
from resources.video_capture import VideoCapture
from flask_sock import Sock
from resources.websocket_handler import register as register_websocket
# Making a Connection with MongoClient
mongoClientUsername = os.environ['MONGO_CLIENT_USERNAME']
mongoClientPassword = os.environ['MONGO_CLIENT_PASSWORD']
client = MongoClient("mongodb+srv://"+mongoClientUsername+":"+urllib.parse.quote(mongoClientPassword)+"@usercluster.kgmuck4.mongodb.net/?retryWrites=true&w=majority")
# database
db = client["api_database"]
# collection
users = db["Users"]
# Connect to teensy
teensy = None
try:
teensy = serial.Serial('/dev/teensy', 9600, timeout=1)
except Exception as e:
print(f"Failed to initialize teensy")
# Connect to base camera
camera_base = None
try:
camera_base = VideoCapture("/dev/camdown0") # Original size: 640x480
except Exception as e:
print(f"Failed to initialize bottom camera: {e}")
# Connect to top camera
camera_top = None
picam2 = Picamera2()
config = picam2.create_video_configuration(main={"size": (1280, 720), "format": "RGB888"})
picam2.configure(config)
picam2.set_controls({"AeEnable": True}) # Automatic camera gain nand exposure
picam2.set_controls({"AwbEnable": True}) # Automatic white balance
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
picam2.set_controls({"Brightness": 0.05})
picam2.set_controls({"Contrast": 1.1})
picam2.set_controls({"Sharpness": 7})
camera_top = StreamingOutput()
picam2.start_recording(MJPEGEncoder(), FileOutput(camera_top), quality=Quality.HIGH)
# Initiate Robot
xmin, xmax, ymin, ymax = -160.0, 0.0, 0.0, 220.0
user_xmin, user_xmax, user_ymin, user_ymax = -150.0, -10.0, 10.0, 150.0
limits_admin = [xmin, xmax, ymin, ymax]
limits_user = [user_xmin, user_xmax, user_ymin, user_ymax]
limits = [limits_admin, limits_user]
robot = Robot(teensy, camera_base, camera_top, limits)
# Flask object
app = Flask(__name__)
api = Api(app)
sock = Sock(app)
# JWT manager
jwt = JWTManager(app)
# JWT Config
app.config["JWT_SECRET_KEY"] = os.environ['JWT_SECRET_KEY']
app.config["JWT_ACCESS_TOKEN_EXPIRES"] = False
app.config['PROPAGATE_EXCEPTIONS'] = True
app.config['SOCK_SERVER_OPTIONS'] = {'max_message_size': 16 * 1024 * 1024}
api.add_resource(Login, '/api/v1.1/robot/login', resource_class_kwargs={'users': users, 'app':app})
api.add_resource(Register, '/api/v1.1/robot/register', resource_class_kwargs={'users': users})
api.add_resource(MoveForward, '/api/v1.1/robot/moveUp', resource_class_kwargs={'robot': robot})
api.add_resource(MoveBackward, '/api/v1.1/robot/moveDown', resource_class_kwargs={'robot': robot})
api.add_resource(MoveRight, '/api/v1.1/robot/moveRight', resource_class_kwargs={'robot': robot})
api.add_resource(MoveLeft, '/api/v1.1/robot/moveLeft', resource_class_kwargs={'robot': robot})
api.add_resource(Gripper, '/api/v1.1/robot/grip/<string:grip_angle>', resource_class_kwargs={'robot': robot})
api.add_resource(Rotate, '/api/v1.1/robot/rotate/<string:rotate_angle>', resource_class_kwargs={'robot': robot})
api.add_resource(UpDown, '/api/v1.1/robot/up_down/<string:z_angle>', resource_class_kwargs={'robot': robot})
api.add_resource(Gcode, '/api/v1.1/robot/gcode/<string:x>/<string:y>', resource_class_kwargs={'robot': robot})
api.add_resource(Calibrate, '/api/v1.1/robot/calibrate', resource_class_kwargs={'robot': robot})
api.add_resource(GetImageBase, '/api/v1.1/robot/getImageBase', resource_class_kwargs={'robot': robot})
api.add_resource(GetImageTop, '/api/v1.1/robot/getImageTop', resource_class_kwargs={'robot': robot})
api.add_resource(GetAllStates, '/api/v1.1/robot/getAllStates', resource_class_kwargs={'robot': robot})
api.add_resource(GetState, '/api/v1.1/robot/getState',resource_class_kwargs={'robot': robot})
api.add_resource(StepAction, '/api/v1.1/robot/step/<string:x>/<string:y>/<string:z>/<string:rotation>/<string:grip>',resource_class_kwargs={'robot': robot})
register_websocket(sock, robot, app)
if __name__=="__main__":
app.run(host='0.0.0.0', port=5000, threaded=True)