diff --git a/app.py b/app.py index a087a5f..fd62046 100644 --- a/app.py +++ b/app.py @@ -11,7 +11,8 @@ logger = logging.getLogger(__name__) # Flask 应用初始化 app = Flask(__name__) app.config['SECRET_KEY'] = 'h2Ms4pw9GzvwiFHyNPhH' # 请更换为安全的密钥 -socketio = SocketIO(app, cors_allowed_origins="*") +# socketio = SocketIO(app, cors_allowed_origins="*") +socketio = SocketIO(app) # 全局变量存储摇杆数据 joystick_data = {} @@ -38,7 +39,7 @@ def handle_joystick_data(data): # print(f"force: {force} x: {x}, y: {y}") ptz.set_pitch_speed(int(y * 100)) - ptz.set_yaw_speed(int(x * 100)) + ptz.set_yaw_speed(int(x * -100)) # direction = data.get('direction', '') # logger.info(f"收到摇杆数据:{direction}") @@ -85,27 +86,49 @@ def handle_ping(): """处理心跳检测""" emit('pong') -@app.route('/get_joystick_data') -def get_joystick_data(): - """API 端点:获取当前摇杆数据""" - from flask import jsonify - return jsonify(joystick_data) +@socketio.on('gimbal_center') +def handle_gimbal_center(): + """处理云台中心""" + ptz.center() + logger.info(f"云台回中") -@app.route('/control/') -def robot_control(action): - """ - 示例控制端点 - 可用于直接控制机器人动作 - """ - from flask import jsonify - valid_actions = ['forward', 'backward', 'left', 'right', 'stop'] +@socketio.on('gimbal_pip') +def handle_gimbal_pip(data): + """处理云台PIP""" + mode = int(data) + if mode >= 0 and mode <= 3: + ptz.set_pip_mode(mode) + logger.info(f"云台PIP {mode}") + +@socketio.on('gimbal_ir_mode') +def handle_gimbal_ir_mode(data): + """处理云台IR""" + mode = int(data) + if mode >= 0 and mode <= 9: + ptz.set_ir_mode(mode) + logger.info(f"云台IR {mode}") + +# @app.route('/get_joystick_data') +# def get_joystick_data(): +# """API 端点:获取当前摇杆数据""" +# from flask import jsonify +# return jsonify(joystick_data) + +# @app.route('/control/') +# def robot_control(action): +# """ +# 示例控制端点 +# 可用于直接控制机器人动作 +# """ +# from flask import jsonify +# valid_actions = ['forward', 'backward', 'left', 'right', 'stop'] - if action in valid_actions: - logger.info(f"执行机器人控制:{action}") - # 在这里添加实际的机器人控制逻辑 - return jsonify({'status': 'success', 'action': action}) - else: - return jsonify({'status': 'error', 'message': '无效的动作'}), 400 +# if action in valid_actions: +# logger.info(f"执行机器人控制:{action}") +# # 在这里添加实际的机器人控制逻辑 +# return jsonify({'status': 'success', 'action': action}) +# else: +# return jsonify({'status': 'error', 'message': '无效的动作'}), 400 if __name__ == '__main__': - socketio.run(app, host='0.0.0.0', port=5000, debug=True) \ No newline at end of file + socketio.run(app, host='10.21.31.250', port=5000, debug=True) \ No newline at end of file diff --git a/gimbal.py b/gimbal.py index bf8a0de..ce0b35c 100644 --- a/gimbal.py +++ b/gimbal.py @@ -185,20 +185,20 @@ if __name__ == "__main__": ptz.center() time.sleep(1) - ptz.set_pitch_speed(99) - time.sleep(1) - ptz.set_pitch_speed(0) - time.sleep(1) + # ptz.set_pitch_speed(99) + # time.sleep(1) + # ptz.set_pitch_speed(0) + # time.sleep(1) - ptz.set_yaw_speed(-99) - time.sleep(1) - ptz.set_yaw_speed(0) - time.sleep(1) + # ptz.set_yaw_speed(-99) + # time.sleep(1) + # ptz.set_yaw_speed(0) + # time.sleep(1) - ptz.set_roll_speed(-99) - time.sleep(1) - ptz.set_roll_speed(0) - time.sleep(1) + # ptz.set_roll_speed(-99) + # time.sleep(1) + # ptz.set_roll_speed(0) + # time.sleep(1) print("All commands sent.") diff --git a/templates/index.html b/templates/index.html index 6012fdf..822800c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,5 +1,6 @@ + @@ -12,6 +13,7 @@ background-color: #f0f0f0; min-height: 100vh; } + .container { display: grid; grid-template-columns: repeat(3, 1fr); @@ -21,42 +23,50 @@ margin: 0 auto; height: calc(100vh - 40px); } + .camera-frame { border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #fff; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; position: relative; } + .camera-frame.main-view { grid-column: 1 / span 2; grid-row: 1 / span 2; z-index: 10; border: 3px solid #4a90e2; - box-shadow: 0 8px 16px rgba(0,0,0,0.2); + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); } + .camera-frame.main-view .camera-title { background-color: #2c5aa0; font-size: 1.2em; } + .camera-frame.front-view { grid-column: 3 / span 1; grid-row: 1 / span 1; } + .camera-frame.back-view { grid-column: 3 / span 1; grid-row: 2 / span 1; } + .camera-frame.left-view { grid-column: 1 / span 1; grid-row: 3 / span 1; } + .camera-frame.right-view { grid-column: 2 / span 1; grid-row: 3 / span 1; } + .joystick-container { grid-column: 3 / span 1; grid-row: 3 / span 1; @@ -65,8 +75,9 @@ align-items: center; background-color: #f8f9fa; border-radius: 8px; - box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1); } + .camera-title { background-color: #4a90e2; color: white; @@ -76,14 +87,17 @@ cursor: pointer; user-select: none; } + .camera-title:hover { background-color: #3a7bc8; } + iframe { width: 100%; height: 100%; border: none; } + .status-indicator { position: absolute; top: 5px; @@ -93,20 +107,25 @@ border-radius: 50%; z-index: 5; } + virtual-joystick { --radius: 100px; } + virtual-joystick::part(joystick) { background-color: rgba(255, 255, 255, 0.2); border: 2px solid rgba(74, 144, 226, 0.5); } + virtual-joystick::part(joystick):before { background-color: rgba(74, 144, 226, 0.2); } + virtual-joystick::part(joystick):after { background-color: #4a90e2; border: 1px solid #2c5aa0; } + #connection-status { position: fixed; top: 10px; @@ -116,17 +135,43 @@ color: white; font-weight: bold; } + .connected { background-color: #28a745; } + .disconnected { background-color: #dc3545; } +
未连接
- +
+ + + + + +
+
云台
@@ -161,39 +206,62 @@ - + + \ No newline at end of file