汽车倒车影像系统搭建指南
1. 核心数据获取路由
首先,我们有一个核心数据获取的路由,其代码如下:
@data_blueprint.route("/")
def show():
app.logger.info("Starting to retrieve core data")
temperature = Sensors.get_external_temp()
boot_status = Sensors.get_boot_status()
light_status = Sensors.get_light_status()
reverse_light = Sensors.get_reverse_status()
fog_light = Sensors.get_fog_light_status()
result = {
"temperature": temperature,
"boot": boot_status,
"light": light_status,
"reverse": reverse_light,
"fog": fog_light,
}
app.logger.info("Finished retrieving core data")
app.logger.debug(f"Core data: {result}")
return jsonify(result)
此路由的作用是获取汽车的一些核心数据,如外部温度、启动状态、灯光状态等,并将这些数据以 JSON 格式返回。当代码提交并部署后,我们可以从计算机打开树莓派的应用页面,观察传感器数据。还能通过按按钮模拟汽车灯光,观察数值的变化。
2. 倒车摄像头项目概述
本项目旨在将树莓派相机配置为倒车摄像头,并将视频流传输到应用程序中。通过这个项目,我们将学习如何连接相机、配置相机设置以获得最佳图像质量。后续还会结合其他倒车传感器,构建一个完整的倒车模块,当汽车挂入倒车档时自动启动。
2.1 所需设备
为了完成这个项目,我们需要购买官方的树莓派 V2 相机模块,它由树莓派基金会开发和制造,于 2016 年 4 月推出,价格约为 25 美元,可在亚马逊或其他销售树莓派的商店购买。虽然也有类似的克隆版和早期的 V1 版本,但使用 V2 模型能减少问题。
2.2 相机连接步骤
连接相机时,务必先关闭并断开树莓派的电源供应。具体连接步骤如下:
1. 树莓派相机通过带状电缆和相机串行接口(CSI 端口)连接到树莓派,该电缆已随相机附带。
2. 除了让树莓派与相机通信,电缆还为相机供电。若之前使用的电源供应不足,相机增加的电流消耗可能需要合适的电源,项目概述中指定的 3A 电源对树莓派和相机都足够。
3. 除了树莓派 Zero,每个树莓派都有相机连接端口。这个专有连接制造成本低,但不太耐用,不过也无需过于担心,正常使用即可。
4. 先关闭树莓派电源并移除电源供应,相机模块的带状电缆已连接好,只需将另一端连接到树莓派。找到位于 LAN 端口后面的相机模块端口,这是一个狭窄的 1 英寸长的连接器。
5. 轻轻拉起连接器的塑料盖约 1/8 英寸,它不会完全分离。
6. 轻轻插入带状电缆,使暴露的“引脚”背向树莓派的 I/O 部分,朝向 HDMI 和电源连接方向,不要强行插入。若遇到困难,检查电缆方向是否正确以及插入是否方正。
7. 插入 1/8 英寸后,轻轻按下塑料盖,夹紧电缆。目视检查电缆并轻轻拉扯,确保其安装正确。
8. 准备好后,接通电源并启动树莓派。
其流程可以用以下 mermaid 流程图表示:
graph TD;
A[关闭树莓派电源并移除电源供应] --> B[找到相机模块端口];
B --> C[拉起塑料盖];
C --> D[插入带状电缆];
D --> E[按下塑料盖];
E --> F[检查电缆安装情况];
F --> G[接通电源并启动树莓派];
3. 树莓派相机首次配置
连接到树莓派后,我们需要告诉树莓派相机已连接,可使用
raspi-config
实用工具进行配置,具体步骤如下:
1. 通过 SSH 连接到树莓派,运行命令
sudo raspi-config
。
2. 使用箭头和回车键在工具中导航,向下滚动并选择“Interfacing Options”。
3. 在“Interfacing Options”菜单中选择“P1 Camera”,当询问是否启用树莓派相机时选择“yes”。
4. 当树莓派确认相机已启用后选择“OK”。
5. 使用右箭头键选择“finish”,当树莓派询问是否重启时选择“yes”。
重启后,我们可以测试相机。使用
raspistill
实用工具保存一张测试照片到树莓派桌面,命令如下:
raspistill -o Desktop/test_photo.jpg
我们可以使用
cat
命令检查照片文件的内容:
cat Desktop/test_photo.jpg
由于这是一张照片,内容不可读。要实际查看照片,可使用 SCP 命令通过 SSH 将照片从树莓派复制到计算机:
scp pi@192.168.1.210:Desktop/test_photo.jpg /Users/coburn/Desktop/
这里的 IP 地址需根据实际情况修改,本地路径也可根据自己的需求设置。打开照片查看,只要能看到内容即可,后续会改善图像质量。若无法复制文件,需检查 SCP 命令、文件是否存在以及保存照片时是否有问题,必要时检查接线。
4. 相机实时流配置
为了处理相机视频流,我们将使用 Motion 库。它是一个用于树莓派相机的 Debian 包,主要用于运动检测和视频录制,同时也有出色的流媒体功能,通过配置文件进行配置,还能作为守护进程运行,使树莓派在启动时自动配置流。具体配置步骤如下:
4.1 安装 Motion
sudo apt-get update
sudo apt-get install motion
4.2 配置 Motion 守护进程
编辑
motion
文件:
sudo nano /etc/default/motion
将
start_motion_daemon
选项改为
yes
,使文件内容如下:
# Set to 'yes' to enable the motion daemon
start_motion_daemon=yes
保存并退出文件,修改文件权限使其对所有用户可执行,然后重启树莓派:
sudo chmod 777 /etc/default/motion
sudo reboot
4.3 检查 Motion 状态
树莓派重启后,Motion 会自动启动并开始流式传输。使用以下命令检查状态:
sudo service motion status
也可以使用以下命令停止、启动或重启 Motion 服务:
sudo service motion start
sudo service motion stop
sudo service motion restart
4.4 查看 Motion 日志
虽然可以通过日志查看 Motion 的运行情况,但日志不能替代相机视频流。查看日志的命令如下:
cat /var/log/motion/motion.log
4.5 进一步配置 Motion
编辑
motion.conf
文件以进一步配置 Motion:
sudo nano /etc/motion/motion.conf
需要修改的核心配置选项如下表所示:
| Option | Value | Description | Full config line |
| ---- | ---- | ---- | ---- |
| width | 800 | 视频的像素宽度 | width 800 |
| height | 480 | 视频的像素高度 | height 480 |
| framerate | 30 | 每秒流式传输的帧数(单个图像) | framerate 30 |
| stream_quality | 100 | 视频流的百分比质量 | stream_quality 100 |
| stream_localhost | off | 限制视频流仅在树莓派上,或允许通过网络访问 | stream_localhost off |
| ffmpeg_output_movies | off | 除了流式传输外,将视频录制到树莓派的存储卡 | ffmpeg_output_movies off |
| stream_maxrate | 30 | 流式传输的最大帧率 | stream_maxrate 30 |
| rotate | 180 | 以度为单位旋转视频流,仅能以 90 度为增量 | rotate 180 |
配置完成后,保存并退出配置文件,重启 Motion 服务:
sudo service motion restart
然后在浏览器中打开树莓派的地址,使用 Motion 的默认流端口 8081:
http://pi-car:8081/
验证是否能看到相机的视频流,移动并观察视频的变化,注意视频右下角的时间戳。随着项目的推进,可能需要重新调整这些配置设置。
5. 树莓派相机焦点调整
树莓派相机 V2 的镜头焦点是手动可调的,没有自动对焦功能。如果视频画面模糊,且输出尺寸没有设置得过大(过大尺寸会降低画质),就可能需要调整镜头焦点。
所有相机都有一个焦平面(PoF),这是一条假想的线,用于定义在给定时刻哪些物体是清晰的,哪些是模糊的。调整镜头焦点就是前后移动这个焦平面。在给定距离上与镜头平行的所有物体都是清晰的,而离镜头越近或越远的物体则会越来越模糊。例如,距离相机 1 米的物体可能是清晰的,而靠近镜头的物体则可能是模糊的。因此,我们无法让相机看到的所有物体都清晰,这需要在相机安装到汽车上后进行调整。
调整树莓派相机焦点的步骤如下:
1. 找到树莓派相机模块正面的传感器和镜头组件。模块中间的小黑色方块内装有镜头,镜头有一个六边形的外壳,称为镜头筒。
2. 使用小钳子夹住镜头的外壳,如图所示。
3. 使用小螺丝刀轻推镜头筒,利用筒上的凹槽固定工具。操作时要非常小心,不要施加过大的压力,以免损坏镜头或导致整个镜头组件从模块上脱落。可以像对待眼镜或戴隐形眼镜一样小心操作。
6. 相机 Flask 代码实现
接下来,我们要创建一个新的 Flask 路由来提供相机图像。后续会扩展这个路由,使其结合倒车传感器的功能,但目前它只是简单地提供相机视频流。
6.1 创建所需文件
touch Pi_Car/reverse.py
mkdir Pi_Car/templates
touch Pi_Car/templates/reverse.html
reverse.py
文件是倒车屏幕的新路由,
reverse.html
模板文件用于渲染视频流,它存放在
templates
文件夹中,这是 Flask 存储标记文件的标准方式。
6.2 编写 reverse.py 代码
from flask import Blueprint, render_template
from flask import current_app as app
reverse_blueprint = Blueprint("reverse", __name__)
@reverse_blueprint.route("/reverse/")
def reverse():
app.logger.info("Starting to load reverse route")
stream_port = app.config.get("STREAM_PORT", 8081)
host = "pi-car"
stream_url = f"http://{host}:{stream_port}"
app.logger.debug(f"Camera streaming url: {stream_url}")
app.logger.info("Finished loading reverse route")
return render_template(template_name_or_list="reverse.html", base_url=stream_url)
这是一个新的蓝图文件,定义了一个新的路由
/reverse/
,并处理连接到视频流的逻辑。代码中包含了大量的日志记录,这是整个项目的标准做法。使用 Flask 的
render_template
函数将
reverse.html
模板的内容渲染到浏览器中。注意,不需要指定
templates
文件夹,因为 Flask 会自动在该文件夹中查找模板。通过这种方式,可以将 HTML 和标记特定的逻辑放在模板中,方便代码复用。
6.3 编写 reverse.html 模板代码
<img src="{{ base_url }}">
这不是一个完整的 HTML 文件,但在后续的整理章节中会详细介绍。这个标签告诉浏览器渲染一个图像,指向在
reverse.py
文件中构建的实时流 URL。
{{ base_url }}
是 Flask 中包含的 Jinja 模板语言,用于渲染后端逻辑中指定的值,例如
http://pi-car:8081
。
6.4 在 app.py 中注册蓝图
from .reverse import reverse_blueprint
# 在 app.py 中注册蓝图
app.register_blueprint(reverse_blueprint)
# 完整的 app.py 文件示例
import logging
from flask import Flask
from logging.handlers import RotatingFileHandler
from .data import data_blueprint
from .reverse import reverse_blueprint
def create_app(config_file="config/local_config.py"):
app = Flask(__name__) # Initialize app
app.config.from_pyfile(config_file, silent=False) # Read in config from file
if app.config.get("FILE_LOGGING"):
# Configure file-based log handler
log_file_handler = RotatingFileHandler(
filename=app.config.get("LOG_FILE_NAME", "config/pi-car.log"),
maxBytes=10000000,
backupCount=4,
)
log_file_handler.setFormatter(
logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s")
)
app.logger.addHandler(log_file_handler)
app.logger.setLevel(app.config.get("LOGGER_LEVEL", "ERROR"))
app.logger.info("----- STARTING APP ------")
app.register_blueprint(data_blueprint)
app.register_blueprint(reverse_blueprint)
app.logger.info("----- FINISHED STARTING APP -----")
return app
6.5 测试 Flask 应用
在计算机上启动 Flask 应用,访问新的 URL 路由
http://127.0.0.1:5000/reverse/
。只要树莓派开启且 Motion 服务正在流式传输视频,就可以看到实时视频。提交更改并在树莓派上进行构建,访问树莓派的 URL
http://pi-car:5000/reverse/
验证路由是否正常工作。
整个项目的流程可以用以下 mermaid 流程图表示:
graph LR;
A[核心数据获取路由] --> B[倒车摄像头项目准备];
B --> C[树莓派相机连接];
C --> D[相机首次配置];
D --> E[相机实时流配置];
E --> F[相机焦点调整];
F --> G[相机 Flask 代码实现];
G --> H[测试 Flask 应用];
通过以上步骤,我们就完成了一个基于树莓派的倒车摄像头系统的搭建,实现了从相机连接、配置到视频流传输和展示的整个过程。在实际应用中,还可以根据需要进一步扩展功能,如结合倒车传感器实现更智能的倒车辅助系统。
超级会员免费看
1928

被折叠的 条评论
为什么被折叠?



