zyp 4 weeks ago
commit 3f13857294

@ -19,6 +19,8 @@ from car import CAR
import threading
import cv2
app = Flask(__name__, static_url_path='')
# 照片保存路径
PHOTO_PATH = "photo.jpg"
def gen_frames(): # generate frame by frame from camera
picam2 = Picamera2()
@ -42,6 +44,18 @@ def index():
def video_feed():
#Video streaming route. Put this in the src attribute of an img tag
return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
#---------------------------------------------------------------------------------
@app.route('/take_photo')
def take_photo():
picam2 = Picamera2()
picam2.configure(picam2.create_video_configuration(main={"format": 'XRGB8888', "size": (640, 480)}))
picam2.start()
frame = picam2.capture_array() # Capture a single frame
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
cv2.imwrite(PHOTO_PATH, frame) # Save the frame as a JPEG file
return send_file(PHOTO_PATH, as_attachment=True) # Send the file to download
#---------------------------------------------------------------------------------------
# def gen(camera):
# """Video streaming generator function."""
@ -69,9 +83,6 @@ car = CAR()
@app.route('/control/')
def control_index():
word = """指令:\n
/led: 灯光闪烁\n
/led_light: 打开全部灯光\n
/led_dark: 关闭全部灯光\n
/stop(/Q): 小车停止运动\n
/forward(/W): 小车开始运动\n
/back(/S): 小车向后运动\n

@ -3,11 +3,11 @@ import os
import time
import RPi.GPIO as GPIO
from base_ctrl import BaseController
#######################################
#############信号引脚定义##############
#######################################
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#底盘连接
def is_raspberry_pi5():
with open('/proc/cpuinfo', 'r') as file:
for line in file:
@ -17,75 +17,18 @@ def is_raspberry_pi5():
else:
return False
#云台连接
base = BaseController('/dev/ttyAMA0', 115200)
class CAR:
def __init__(self):
self.LED0 = 10 #LED0的IO口定义
self.LED1 = 9 #LED1的IO口定义
self.LED2 = 25 #LED2的IO口定义
self.ENA = 13 #//L298 使能A
self.ENB = 20 #//L298 使能B
self.IN1 = 19 #//电机接口1
self.IN2 = 16 #//电机接口2
self.IN3 = 21 #//电机接口3
self.IN4 = 26 #//电机接口4
GPIO.setup(self.LED0, GPIO.OUT, initial=GPIO.HIGH) ##led0初始化为高电平
GPIO.setup(self.LED1, GPIO.OUT, initial=GPIO.HIGH) ##led1初始化为高电平
GPIO.setup(self.LED2, GPIO.OUT, initial=GPIO.HIGH) ##led2初始化为高电平
GPIO.setup(self.ENA, GPIO.OUT, initial=GPIO.LOW) ##ENA初始化为低电平
GPIO.setup(self.ENB, GPIO.OUT, initial=GPIO.LOW) ##ENB初始化为低电平
GPIO.setup(self.IN1, GPIO.OUT, initial=GPIO.LOW) ##IN1初始化为低电平
GPIO.setup(self.IN2, GPIO.OUT, initial=GPIO.LOW) ##IN2初始化为低电平
GPIO.setup(self.IN3, GPIO.OUT, initial=GPIO.LOW) ##IN3初始化为低电平
GPIO.setup(self.IN4, GPIO.OUT, initial=GPIO.LOW) ##IN4初始化为低电平
def led(self):
GPIO.output(self.LED0,False)
GPIO.output(self.LED1,False)
GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 亮 亮
time.sleep(0.5)
GPIO.output(self.LED0,True)
GPIO.output(self.LED1,False)
GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 灭 亮 亮
time.sleep(0.5)
GPIO.output(self.LED0,False)
GPIO.output(self.LED1,True)
GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 灭 亮
time.sleep(0.5)
GPIO.output(self.LED0,False)
GPIO.output(self.LED1,False)
GPIO.output(self.LED2,True)###LED0,LED1,LED2 = 亮 亮 灭
time.sleep(0.5)
GPIO.output(self.LED0,False)
GPIO.output(self.LED1,False)
GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 亮 亮
time.sleep(0.5)
GPIO.output(self.LED0,True)
GPIO.output(self.LED1,True)
GPIO.output(self.LED2,True)###LED0,LED1,LED2 = 灭 灭 灭
time.sleep(0.5)
print("run: led")
def led_light(self):
GPIO.output(self.LED0,False)
GPIO.output(self.LED1,False)
GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 亮 亮
print("run: led_light")
def led_dark(self):
GPIO.output(self.LED0,True)
GPIO.output(self.LED1,True)
GPIO.output(self.LED2,True)###LED0,LED1,LED2 = 灭 灭 灭
print("run: led_dark")
input_x = 0
input_y = 0
input_speed = 0
input_acc = 0
def stop(self): # 停止运行
GPIO.output(self.ENA,False)
GPIO.output(self.ENB,False)
GPIO.output(self.IN1,False)
GPIO.output(self.IN2,False)
GPIO.output(self.IN3,False)
GPIO.output(self.IN4,False)
base.send_command({"T":1,"L":0,"R":0})
print("run: stop move")
def Q(self): # 停止的快捷键
@ -95,7 +38,7 @@ class CAR:
def forward(self): # 前进
base.send_command({"T":1,"L":0.2,"R":0.2})
time.sleep(2)
time.sleep(1)
base.send_command({"T":1,"L":0,"R":0})
print("run: move !!!!forward")
@ -105,12 +48,9 @@ class CAR:
self.forward()
def back(self): # 后退
GPIO.output(self.ENA,True)
GPIO.output(self.ENB,True)
GPIO.output(self.IN1,True)
GPIO.output(self.IN2,False)
GPIO.output(self.IN3,True)
GPIO.output(self.IN4,False)
base.send_command({"T":1,"L":-0.2,"R":-0.2})
time.sleep(1)
base.send_command({"T":1,"L":0,"R":0})
print("run: move back")
def S(self): # 后退的快捷键
@ -119,12 +59,9 @@ class CAR:
self.back()
def left(self): # 左转
GPIO.output(self.ENA,True)
GPIO.output(self.ENB,True)
GPIO.output(self.IN1,False)
GPIO.output(self.IN2,True)
GPIO.output(self.IN3,True)
GPIO.output(self.IN4,False)
base.send_command({"T":1,"L":-0.2,"R":0.2})
time.sleep(0.5)
base.send_command({"T":1,"L":0,"R":0})
print("run: move left")
def A(self): # 左转的快捷键
@ -133,15 +70,28 @@ class CAR:
self.left()
def right(self): # 右转
GPIO.output(self.ENA,True)
GPIO.output(self.ENB,True)
GPIO.output(self.IN1,True)
GPIO.output(self.IN2,False)
GPIO.output(self.IN3,False)
GPIO.output(self.IN4,True)
base.send_command({"T":1,"L":0.2,"R":-0.2})
time.sleep(0.5)
base.send_command({"T":1,"L":0,"R":0})
print("run: move right")
def D(self): # 右转的快捷键
self.right()
def d(self):
self.right()
def up(self):
self.input_y+=10
base.gimbal_ctrl(self.input_x, self.input_y, self.input_speed, self.input_acc)
def down(self):
self.input_y-=10
base.gimbal_ctrl(self.input_x, self.input_y, self.input_speed, self.input_acc)
def yunleft(self):
self.input_x-=10
base.gimbal_ctrl(self.input_x, self.input_y, self.input_speed, self.input_acc)
def yunright(self):
self.input_x+=10
base.gimbal_ctrl(self.input_x, self.input_y, self.input_speed, self.input_acc)

@ -22,6 +22,7 @@
</style>
</head>
<body>
<h5>实时视频流</h5>
<img src="{{ url_for('video_feed') }}">
<p> 小车控制界面</p>
<bodylink = "red">
@ -29,19 +30,38 @@
<div id="container" class="container">
<div>
<button id="front" type="button" onclick="forward()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-up"> </button>
<button id="front" type="button" onclick="forward()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-up" style="margin-left: 56px;"> </button>
</div>
<div>
<!-- <div>
<button id="printButton" type="button" onclick="printClicked()" class="btn btn-lg btn-primary">打印点击</button>
</div>
</div> -->
<div>
<button type="button" onclick="left()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-left" > </button>
<button type="button" onclick="stop()" class="btn btn-lg btn-primary glyphicon glyphicon-stop"> </button>
<button type="button" onclick="right()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-right" > </button>
<!-- ---------------------------------------- -->
<button type="button" onclick="takePhoto()">拍照</button>
<!-- ---------------------------------------- -->
</div>
<button id="rear" type="button" onclick="back()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-down" style="margin-left: 56px;"> </button>
</div>
<div>
<button id="up" type="button" onclick="up()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-up" style="margin-left: 56px;"> </button>
</div>
<!-- <div>
<button id="printButton" type="button" onclick="printClicked()" class="btn btn-lg btn-primary">打印点击</button>
</div> -->
<div>
<button id="rear" type="button" onclick="back()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-down"> </button>
<button type="button" onclick="yunleft()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-left" > </button>
<button type="button" onclick="guiwei()" class="btn btn-lg btn-primary glyphicon glyphicon-stop"> </button>
<button type="button" onclick="yunright()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-right" > </button>
</div>
<button id="down" type="button" onclick="down()" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-down" style="margin-left: 56px;"> </button>
</div>
</div>
@ -75,8 +95,13 @@
<script>
function printClicked() {
console.log("132465789891651354684");
// console.log("132465789891651354684");
}
// ---------------------------------------
function takePhoto() {
window.location.href = "{{ url_for('take_photo') }}"; // 重定向到拍照请求
}
// ---------------------------------------
function forward() {
console.log("132465789891651354684");
$.ajax({
@ -162,7 +187,104 @@
}
});
} function up() {
// console.log("132465789891651354684");
$.ajax({
type: "GET",
dataType: "json",
url: "/control/up" ,
data: $('#form1').serialize(), //提交的数据
success: function (result) {
console.log(result); //打印服务端返回的数据(调试用)
if (result.resultCode == 200) {
}
;
},
error : function() {
}
});
} function yunleft() {
// console.log("132465789891651354684");
$.ajax({
type: "GET",
dataType: "json",
url: "/control/yunleft" ,
data: $('#form1').serialize(), //提交的数据
success: function (result) {
console.log(result); //打印服务端返回的数据(调试用)
if (result.resultCode == 200) {
}
;
},
error : function() {
}
});
}
function yunright() {
// console.log("132465789891651354684");
$.ajax({
type: "GET",
dataType: "json",
url: "/control/yunright" ,
data: $('#form1').serialize(), //提交的数据
success: function (result) {
console.log(result); //打印服务端返回的数据(调试用)
if (result.resultCode == 200) {
}
;
},
error : function() {
}
});
}
function down() {
// console.log("132465789891651354684");
$.ajax({
type: "GET",
dataType: "json",
url: "/control/down" ,
data: $('#form1').serialize(), //提交的数据
success: function (result) {
console.log(result); //打印服务端返回的数据(调试用)
if (result.resultCode == 200) {
}
;
},
error : function() {
}
});
}
function guiwei() {
// console.log("132465789891651354684");
$.ajax({
type: "GET",
dataType: "json",
url: "/control/guiwei" ,
data: $('#form1').serialize(), //提交的数据
success: function (result) {
console.log(result); //打印服务端返回的数据(调试用)
if (result.resultCode == 200) {
}
;
},
error : function() {
}
});
}
</script>
<script>
function refreshPage() {

Loading…
Cancel
Save