7.3 Web控制平台

实时视频流传输

使用MJPEG流实现低延迟视频传输:

def generate_frames():
    while True:
        ret, frame = camera.read()
        if not ret:
            break
        # 压缩为JPEG
        ret, jpeg = cv2.imencode('.jpg', frame)
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                   mimetype='multipart/x-mixed-replace; boundary=frame')

控制指令安全机制

确保控制指令安全可靠:

# 指令验证装饰器
def validate_command(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if not current_user.is_authenticated:
            return "Unauthorized", 401
        if system_state != "MANUAL":
            return "Auto mode active", 403
        return f(*args, **kwargs)
    return decorated

@app.route('/control/forward')
@validate_command
def control_forward():
    chassis.forward()
    return "OK"

响应式界面设计

使用Bootstrap实现响应式界面:

<div class="container-fluid">
  <div class="row">
    <!-- 视频区域 -->
    <div class="col-lg-8">
      <img src="/video_feed" class="img-fluid">
    </div>
    
    <!-- 控制区域 -->
    <div class="col-lg-4">
      <div class="control-panel">
        <button class="btn btn-primary" onclick="sendCommand('forward')">
          <i class="bi bi-arrow-up"></i>
        </button>
        <!-- 其他控制按钮 -->
      </div>
      
      <!-- 状态显示 -->
      <div class="status-card">
        <h5>系统状态</h5>
        <div id="system-state">SEARCHING</div>
        <div id="battery-level">12.4V (78%)</div>
      </div>
    </div>
  </div>
</div>