Flask—远程查看行空板USB摄像头视频

简介:通过Mind+创建一个Python程序,使用Flask扩展库构建Web服务,手机、电脑通过浏览器远程查看USB摄像头视频画面。通过实验,初步了解Flask扩展库的概念和使用方法。

此前通过OpenCV库在行空板上查看USB摄像头视频的实验,我们了解了Mind+进行Python编程的两种模式,了解了Python第三方库的概念。现在我们将通过Flask库搭建一个可以远程查看行空板摄像头画面的Web服务,实现自制远程监控。
在这里插入图片描述

1. 实验目标

(1) 初步了解Flask库的概念和用法
(2) 了解Flask的图形化编程模式
(3) 了解Flask的代码编程模式

2. 实验所需资源

硬件:
(1) 电脑
(2) USB摄像头
(3) 行空板
(4) 数据线
本文实验所用的台式电脑为Windows7操作系统,行空板为V0.3.5版本,数据线为Type-C接口。
软件:
(1) 电脑安装Mind+软件
本文实验所用的Mind+软件版本为V1.8.0 RC3.1。
(2) Python环境及Flask、OpenCV库为Mind+自带版本

3. Flask库的概念和特点

Flask是一个轻量级的Python Web框架,它提供了构建Web应用程序所需的基本工具和库,设计简单且易于扩展,它具有以下特点:
轻量级框架: Flask设计简单且易于理解,适用于快速开发小型到中型的Web应用程序。
基于Werkzeug和Jinja2: Werkzeug处理底层的HTTP请求和响应,Jinja2用于生成HTML页面。
路由: 使用装饰器(@app.route)将URL映射到相应的处理函数,使得处理HTTP请求变得直观和简单。
模板引擎: 使用Jinja2模板引擎渲染动态内容,允许在HTML中嵌入Python代码,同时支持模板继承和变量替换。
请求和响应处理: 提供了简洁的API来访问请求数据(如表单数据)、设置响应内容和状态码,以及处理文件上传等功能。
扩展性: Flask支持大量的扩展,例如处理表单、身份验证、数据库集成等,使得开发者可以根据需求选择性地添加功能。

4. Flask库的基本用法

以下是Flask的基本使用步骤,黄色背景文字为示例代码:
4.1安装Flask:
首先,你需要在你的Python环境中安装Flask。可以使用pip命令来进行安装:

pip install Flask

4.2创建Flask应用实例:
在你的Python脚本中,导入Flask类并创建一个实例:

from flask import Flask
app = Flask(__name__)

4.3定义路由和视图函数:
路由定义了URL到Python函数的映射。使用@app.route()装饰器来定义路由,并在其后编写处理请求的视图函数。

@app.route('/')
def hello_world():
        return 'Hello, World!'

4.4运行Flask应用:
在程序的最后,调用app.run()方法来启动Flask的开发服务器。默认情况下,服务器会监听本地的5000端口。设置 debug=True 可以开启调试模式,便于查看和解决问题。

if __name__ == '__main__':
        app.run(debug=True)

4.5使用模板(可选):
Flask支持Jinja2模板引擎,你可以创建HTML模板文件,Flask通过渲染模板来生成动态内容。
• 在项目目录中创建一个名为templates的文件夹。
• 在该文件夹中编写模板文件,例如index.html。
• 在视图函数中使用render_template()函数来渲染模板。
4.6访问应用:
在浏览器中访问 localhost:5000 (默认端口),即可看到 “Hello, World!” 的页面输出。
这些步骤展示了一个非常基础的 Flask 应用的创建和运行过程。随着应用复杂度的增加,你可以添加更多的路由、视图函数,使用模板引擎渲染动态内容,并集成各种 Flask 扩展来增强功能。Flask 的灵活性和简单性使得它成为开发 Web 应用和 API 的理想选择。

5. 模块(图形化)编程远程查看行空板USB摄像头视频

将USB 摄像头接入行空板,再将行空板数据线连接到电脑主机,然后打开Mind+软件,选择Python模式。

5.1在Python模式新建项目,选择“模块”模式。

在这里插入图片描述

5.2在官方扩展库添加“行空板”。

在这里插入图片描述

5.3在用户扩展库添加Flask库。

在这里插入图片描述
如果用户库没有显示“Flask”库,可以在搜索栏输入“ext”进行搜索添加。

5.4完成添加后,点击“连接远程终端”连接行空板。

在这里插入图片描述

5.5按下列顺序添加Flask模块到Python主程序

在这里插入图片描述

此处为方便演示,程序每次运行都会自动生成一次html网页文件,在实际应用中,网页应该单独编辑,Flask仅需要向网页模板中添加数据就行。另外,在网页路由标签中,此处为空,意思是访问根目录,也就是类似“http://localhost:5000/”的网址。如果此处添加标签,那么访问网页的时候就需要在上述网址后面增加标签名称。如本例中自动生成代码中可以看到摄像头页面的标签为“/video_feed”,所以直接访问摄像头画面的网址为:http://localhost:5000/video_feed。

5.6点击“运行”按钮将程序上传到行空板

在这里插入图片描述

注意查看“终端信息输出区”的上传和运行情况。Flask服务启动后,连接同一网络的电脑和手机等终端设备即可通过浏览器访问这个Flask服务。如果把该服务映射到外网固定IP,那么理论上,连接互联网的设备都可以访问该服务,实现远程监控。
在这里插入图片描述

上面是电脑访问http://10.1.2.3:8000/的演示效果,这里的网址还可以是分配给行空板的其他网址,每个局域网情况不一样,包括网段设置,防火墙设置都有区别。所以如果除了10.1.2.3,其他地址访问不了的话,需要检查一下你的整个网络的设置问题。下图是查看行空板IP地址的方法:
在这里插入图片描述

为了方便演示,手机无线访问的方式也是通过手机直连行空板热点,然后访问192.168.123.1:8000来进行查看。
在这里插入图片描述

实际动手尝试的朋友可能会发现,视频画面是倒的,需要翻转摄像头才能显示正的画面。还有就是网页的内容不够丰富和灵活,还有Flask服务器启动的参数不能灵活设置。等等这些问题都属于模块化编程特有的局限性,因为模块已经被封装,底层的代码难以直接修改,所以功能不够灵活。下面会演示用代码模式实现同样的功能,虽然需要一定的Python和Flask库的学习成本,但是对于想实现复杂功能和灵活编程的开发者来说,这是很有必要的。

6. 代码模式编程远程查看行空板USB摄像头视频

6.1在Python模式新建项目,选择“代码”模式。

在这里插入图片描述

6.2打开“文件系统”,在“项目中的文件”新建一个templates文件夹(用于存放html网页模板),文件夹中新建一个index.html文件。然后在根目录下新建一个app.py文件。

在这里插入图片描述

6.3通过“库管理”PIP模式安装Flask库。

在这里插入图片描述
同时检查OpenCV库有没有安装,如果未安装,须同时安装OpenCV库。

6.4双击打开index.html文件输入代码

在这里插入图片描述

<!DOCTYPE html>  <!-- 声明文档类型为HTML5 -->
<html lang="en">  <!-- 设置页面语言为英文 -->
<head>  <!-- 页面头部信息 -->
    <meta charset="UTF-8">  <!-- 设置页面字符编码为UTF-8 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  <!-- 设置页面视口宽度为设备宽度,初始缩放比例为1 -->
   <title>摄像头视频流</title>  <!-- 设置页面标题为“摄像头视频流” -->
</head>
<body>  <!-- 页面主体内容 -->
    <h1>摄像头视频流</h1>  <!-- 显示标题“摄像头视频流” -->
    <img src="{{ url_for('video_feed') }}" alt="摄像头视频流">  <!-- 显示摄像头视频流图片,src属性值为通过url_for函数生成的视频流URL,alt属性值为“摄像头视频流” -->
</body>
</html>


6.5双击打开app.py文件输入代码

在这里插入图片描述

import cv2  # 导入OpenCV库
from flask import Flask, render_template, Response  # 导入Flask库的相关模块

app = Flask(__name__)  # 创建一个Flask应用实例
cap = cv2.VideoCapture(0)  # 创建一个摄像头对象,0表示默认摄像头
if not cap.isOpened():  # 检查摄像头是否成功打开
    print("摄像头未成功打开,请检查摄像头连接情况")

def gen_frames():  # 定义一个生成帧的函数
    while cap.isOpened():  # 当摄像头打开时
        success, frame = cap.read()  # 读取摄像头的一帧画面
        if not success:  # 如果读取失败
            print('摄像头画面读取失败')  # 打印错误信息
            break  # 跳出循环
        else:  # 如果读取成功
            ret, buffer = cv2.imencode('.jpg', frame)  # 将画面编码为JPEG格式
            frame = buffer.tobytes()  # 将编码后的画面转换为字节流
            yield (b'--frame\r\n'  # 生成multipart/x-mixed-replace数据流的分隔符
                   b'Content-Type: image/jpeg\r\n\r\n'  # 设置内容类型为JPEG图片
                   + frame + b'\r\n')  # 添加帧数据

@app.route('/')  # 定义根路由
def index():
    return render_template('index.html')  # 渲染并返回index.html模板

@app.route('/video_feed')  # 定义视频流路由
def video_feed():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')  # 返回视频流数据

if __name__ == '__main__':  # 当脚本作为主程序运行时
    app.run(host='0.0.0.0', port=8000)  # 启动Flask应用,监听所有网络接口,端口为8000


6.6连接行空板并运行程序

在这里插入图片描述

效果和图形化模式完全一致,并且不存在视频画面倒置,网页重复生成,Flask服务器运行参数不能灵活设置的问题。
通过一个简单的实例,我们展示了如何快速搭建一个Web服务器,响应客户端请求,并动态生成内容。对于希望进入Web开发领域或是寻求轻量级解决方案的开发者来说,Flask无疑是一个值得深入探索的框架。

<think>嗯,用户问的是行空M10如何使用M2006P36电机。首先,我需要确认这两个设备的规格和接口类型。行空M10应该是一款开发或者控制器,而M2006P36是某种型号的电机,可能带编码器。接下来,我得了解它们的连接方式,比如是否需要电机驱动器,通信协议是什么,是PWM、CAN还是其他类型的接口。 用户可能对硬件连接和软件配置不太熟悉,所以需要分步骤指导。首先,硬件连接部分,可能需要使用电机驱动器,比如C610或者C620,因为M2006P36通常需要配合这些驱动器使用。然后,连接到行空的GPIO、PWM输出或者CAN总线接口。这里需要确认行空的接口类型,是否有对应的引脚支持。 软件部分可能需要编写控制代码,比如使用PWM信号控制速度,或者通过CAN协议发送控制指令。另外,如果电机带有编码器,还需要读取反馈信号进行闭环控制。这时候可能需要用到PID算法。用户可能需要代码示例,比如使用Python的RPi.GPIO库或者CAN相关的库来操作。 另外,需要注意电源问题,确保电机和驱动器有合适的电源供应,避免电压或电流不足导致的问题。安全提示也很重要,比如在连接时断电操作,避免短路或损坏设备。 用户可能的背景是创客或者学生,正在做机器人或智能小车项目,所以需要具体的步骤和示例代码。可能之前遇到过连接或控制不成功的情况,需要排除常见问题,比如接线错误、驱动安装、库的版本兼容性等。 需要检查是否有行空M10的官方文档或社区支持,是否有针对M2006P36电机的具体案例。如果没有,可能需要根据类似电机的控制方法进行推断,比如使用相同的通信协议或控制方式。 还要考虑用户可能的使用环境,比如是否在教室或实验室,是否有指导老师,或者是否需要更详细的故障排除步骤。可能需要提醒用户注意电机和驱动器的匹配,确保型号兼容,避免烧毁设备。 最后,整理出一个清晰的步骤指南,从硬件连接到软件配置,再到代码示例和注意事项,确保用户能够一步步完成电机控制,并理解其中的关键点。</think>$\boxed{\text{行空M10控制M2006P36电机技术方案}}$ **设备特性说明**: - **行空M10**:基于Linux系统的开源硬件,支持Python编程,提供GPIO/PWM/I2C/UART/CAN等接口 - **M2006P36电机**:C610电调驱动的P36减速比直流无刷电机(内置编码器),需配合CAN总线或PWM信号控制 $\boxed{\text{硬件连接步骤}}$ 1. **供电系统搭建**: ```mermaid graph LR A[24V锂电池] --> B[C610电调] B --> C[M2006P36电机] B --> D[行空M10供电端] ``` 2. **信号线连接**: - **CAN总线模式**(推荐): - 电调CAN_H → 行空CAN_H(物理引脚29) - 电调CAN_L → 行空CAN_L(物理引脚30) - **PWM模式**: - 电调PWM信号线 → 行空PWM引脚(例如GPIO12) $\boxed{\text{软件配置流程}}$ **方案一:CAN总线控制(高精度闭环)** ```python import can from can.interfaces.socketcan import SocketcanBus # 初始化CAN总线 bus = SocketcanBus(channel='can0', bitrate=1000000) # 构造电机控制帧(ID需根据电调拨码设置) msg = can.Message( arbitration_id=0x200 + motor_id, # motor_id范围1-7 data=[ 0xA1, # 启停指令 (speed >> 8) & 0xFF, # 速度高字节 speed & 0xFF, # 速度低字节 0x00, 0x00, 0x00, 0x00, 0x00 ], is_extended_id=False ) # 发送控制指令 bus.send(msg) ``` **方案二:PWM控制(简易开环)** ```python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(12, GPIO.OUT) pwm = GPIO.PWM(12, 1000) # 1kHz频率 # 速度映射(占空比10%-20%对应反转-正转) speed = 15 + (target_speed / 3000) * 5 # M2006最大转速3000RPM pwm.start(speed) ``` $\boxed{\text{关键参数配置表}}$ | 参数项 | 推荐值 | |---------------|----------------------| | CAN波特率 | 1Mbps | | 电调ID | 拨码开关设置1-7 | | PWM频率 | 1000-3000Hz | | 电机保护电流 | 建议设置为10A以下 | $\boxed{\text{安全注意事项}}$ 1. **电气安全**: - 务必先连接信号线再通电 - 确保24V电源功率≥200W - 避免电机堵转超过5秒 2. **软件保护**: ```python # 增加速度渐变保护 MAX_ACCEL = 500 # RPM/s current_speed = 0 def set_speed(target): global current_speed step = MAX_ACCEL * dt # dt为控制周期 current_speed = min(max(target, current_speed - step), current_speed + step) # 发送current_speed到电机 ``` $\boxed{\text{典型应用场景}}$ - **机器人关节控制**:通过CAN总线实现多电机同步 - **智能车驱动**:配合编码器实现闭环速度控制 - **工业自动化**:利用P36减速比输出大扭矩(最大36N·m) 建议优先使用CAN总线控制方案,可通过`candump can0`命令实时监控总线数据,配合`can-utils`工具包进行深度调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值