鱼缸生态数据采集与影像监控系统完整方案

这是针对上一篇的智能系统的设计方案,在列出的设备之外,还有微单和专业摄像机的采集部分,这些过度设计是为了满足上一篇提到的场景。


本方案基于树莓派4B+Arduino Nano V3.1架构,整合水质参数实时监测与水下影像采集功能,通过NFS协议直接存储至TrueNAS,实现完整的鱼缸生态数据采集与监控系统。该方案采用低功耗设计,确保7×24小时稳定运行,同时具备完善的异常检测与告警机制,为观赏鱼缸或小型水族箱提供全方位健康监测。

一、系统架构与硬件选型

1. 系统拓扑结构

2. 硬件组件清单

组件型号数量价格(元)关键特性
主控制器树莓派4B(4GB)14501.5GHz四核CPU,4GB内存,千兆以太网,四USB端口
传感器采集器Arduino Nano V3.110(已有)8路10-bit ADC,USB-CDC通信,低功耗
pH传感器DFRobot SEN039511200-14pH量程,0.01-3.0V模拟输出,含温度补偿
氨氮传感器DFRobot SEN039611500-10ppm量程,0.5-3.0V模拟输出
温度传感器DS18B2015数字温度传感器,-10℃~85℃,精度±0.5℃
水下摄像头Arducam IMX47714001296万像素,支持1080p@30fps,带防水外壳
显示屏10.1″ HDMI IPS屏15001280×800分辨率,支持横竖屏切换
供电设备5V/3A电源适配器1100树莓派主电源,需通过USB-C接口供电
USB HUB带独立电源的USB HUB1150为外接摄像头和传感器提供额外电力
杜邦线40根(不同颜色)110传感器连接,电源连接
防水外壳Sub海洋级透明罩1150保护摄像头,兼容1080p分辨率
LED灯可控温LED灯带1200基于环境光线自动调节亮度,辅助拍摄
散热片树莓派CPU散热片130降低系统温度,避免过热降频
备用SD卡32GB Class 10150系统镜像备份,快速恢复
总计  2085完整生态监测系统
数据来源:    

3. 硬件连接细节

3.1 Arduino Nano与传感器连接

连接注意事项:

  • pH传感器和氨氮传感器均使用3.3V供电可降低功耗
  • DS18B20温度传感器通过单总线连接至D4引脚
  • 所有传感器共地连接,确保数据采集一致性
  • 确保供电稳定,避免因电压波动导致数据异常

3.2 树莓派与Arduino Nano连接

  • Arduino Nano通过USB-C线连接树莓派4B的USB-A或USB-C接口
  • 树莓派会自动识别为或端口
  • 确保树莓派的USB供电稳定,建议使用5V/3A电源适配器

3.3 树莓派与摄像头连接

  • 摄像头通过CSI接口连接至树莓派4B的CSI接口
  • 摄像头需额外连接防水外壳与电源
  • 配置启用摄像头支持

3.4 显示屏与树莓派连接

  • 树莓派4B通过Micro HDMI线连接至10.1″ HDMI IPS屏
  • 配置设置屏幕分辨率与方向
  • 显示屏可选择独立供电或通过USB接口取电

二、软件环境配置

1. 树莓派系统配置

基础系统更新:

串口通信配置:

摄像头配置:

2. 树莓派服务安装

数据采集服务:

NFS客户端服务:

Grafana监控服务:

视频流服务:

3. TrueNAS存储配置

存储池创建:

  • 在TrueNAS Web界面中创建RAID-Z1存储池,至少3块硬盘
  • 推荐使用3块4TB硬盘,可用容量为6TB,可容忍1块硬盘故障
  • 在存储池中创建数据集,设置和

NFS共享配置:

  • 在TrueNAS的”共享→NFS”中创建新NFS共享
  • 共享路径设置为
  • 访问权限添加树莓派IP,设置为
  • 启用选项以允许树莓派访问
  • 不要勾选以确保权限正确

挂载配置文件:

验证挂载:

三、数据采集与处理流程

1. 传感器数据采集

Arduino Nano代码:

树莓派数据接收服务:

2. 影像数据采集与处理

树莓派视频流服务配置:

视频流Python脚本:

轻量级行为分析模型部署:

四、数据可视化与监控

1. Grafana仪表盘配置

安装Prometheus与Telegraf:

配置Telegraf读取CSV数据:

配置Grafana数据源:

  1. 登录Grafana(默认用户名/密码:admin/admin)
  2. 导航至”Configuration → Data Sources”
  3. 点击”Add data source”,选择”Prometheus”
  4. 配置URL为
  5. 点击”Save & Test”验证连接

创建传感器数据监控面板:

  1. 导航至”Dashboards → Create Dashboard”
  2. 点击”+”添加新面板
  3. 选择数据源为Prometheus
  4. 使用查询语句:,,
  5. 选择时间序列图表类型
  6. 设置阈值告警:pH<6.5或pH>8.5、NH4>10ppm、温度<20℃或温度>28℃
  7. 保存仪表盘并设置自动刷新

2. 视频流与图像展示

配置mjpg-streamer服务:

配置Chromium KiOSk模式:

在Grafana中展示图像:

  1. 创建新面板
  2. 选择”Image”面板类型
  3. 配置URL为
  4. 设置刷新间隔为10分钟
  5. 调整面板尺寸以适应显示屏

五、异常检测与告警机制

1. 传感器阈值告警

Python告警服务:

配置systemd服务:

2. 鱼类行为异常检测

行为分析Python脚本:

3. 系统可靠性增强

NFS故障自动回退:

配置systemd服务监控:

系统看门狗配置:

六、系统部署与优化

1. 系统部署流程

步骤1: 硬件准备与连接

  • 准备树莓派4B并烧录Raspberry Pi OS
  • 连接Arduino Nano至树莓派USB端口
  • 连接pH传感器至Arduino Nano的A0引脚
  • 连接氨氮传感器至Arduino Nano的A1引脚
  • 连接DS18B20温度传感器至树莓派的GPIO4引脚
  • 连接水下摄像头至树莓派CSI接口
  • 连接显示屏至树莓派Micro HDMI接口
  • 连接LED灯带至树莓派GPIO引脚

步骤2: 基础系统配置

  • 更新系统:
  • 配置SSH: → 启用SSH
  • 配置WiFi: → 网络选项 → WiFi
  • 配置摄像头: → 接口选项 → Camera
  • 配置串口:禁用控制台,确保使用

步骤3: 安装核心服务

  • 安装传感器数据接收服务
  • 安装视频流服务
  • 安装NFS客户端
  • 安装Grafana与Prometheus
  • 安装告警服务
  • 安装行为分析模型

步骤4: 配置数据采集

  • 上传Arduino代码并烧录
  • 启动传感器数据接收服务
  • 配置数据采集频率与存储路径
  • 配置传感器校准参数

步骤5: 配置影像采集

  • 配置摄像头参数与分辨率
  • 启动视频流服务
  • 配置图像保存路径与频率
  • 配置视频编码参数

步骤6: 配置存储与监控

  • 在TrueNAS上创建存储池与NFS共享
  • 配置树莓派挂载NFS
  • 配置Grafana仪表盘
  • 配置传感器阈值告警
  • 配置行为分析任务

步骤7: 优化系统性能

  • 配置轻量级桌面环境
  • 设置内存缓存区域
  • 优化Python脚本性能
  • 配置系统看门狗服务
  • 设置定期校准任务

2. 系统优化与调优

电源管理优化:

  • 使用5V/3A电源适配器确保树莓派稳定供电
  • 为高功耗外设(如摄像头)使用带独立电源的USB HUB
  • 降低摄像头分辨率至640×480,帧率至15fps
  • 使用低功耗模式运行LED灯带,仅在需要时开启

性能优化:

  • 配置使用挂载选项减少I/O操作
  • 为Grafana和Chromium浏览器分配合理内存
  • 使用设置无限制
  • 禁用不必要的服务与后台进程

数据采集优化:

  • 传感器数据采集频率设置为30秒一次,避免传感器极化
  • 使用3.3V参考电压提高ADC读取精度
  • 配置传感器定期校准任务,每月一次
  • 使用硬件看门狗防止系统卡死

视频流优化:

  • 使用较低的JPEG质量(60%)减少CPU使用
  • 调整视频编码参数,降低码率
  • 限制视频流客户端数量,避免过载
  • 使用轻量级图像处理库,减少内存占用

七、系统维护与数据管理

1. 定期维护计划

每日维护:

  • 检查系统日志,和
  • 监控NFS挂载状态,
  • 检查传感器数据,确保无异常值
  • 清理临时文件,

每周维护:

  • 用RO水冲洗传感器探头
  • 检查摄像头防水外壳是否完好
  • 验证LED灯带功能正常
  • 检查存储空间使用情况,
  • 执行系统更新,

每月维护:

  • 校准pH和氨氮传感器
  • 检查存储池健康状态
  • 执行一次完整的系统备份
  • 清理过期快照,保留最近7天的每日快照
  • 检查硬件连接,确保无松动或腐蚀

季度维护:

  • 执行一次完整的存储池自检
  • 检查所有硬件组件的性能状态
  • 验证备份恢复流程
  • 更新所有软件至最新稳定版本
  • 执行一次完整的系统健康检查

2. 数据管理策略

传感器数据管理:

  • 每日生成一个CSV文件,命名格式为
  • 每周生成一个汇总文件,包含平均值、最大值和最小值
  • 每月执行一次数据压缩,使用工具压缩旧CSV文件
  • 设置自动清理策略,保留最近365天的原始数据
  • 使用ZFS快照功能保护传感器数据,每日一次快照

影像数据管理:

  • 视频文件按小时存储,命名格式为
  • 图像文件按分钟存储,每10分钟保存一张,命名格式为
  • 每月执行一次视频转码,将高码率视频转换为低码率版本用于长期存储
  • 设置自动清理策略,保留最近30天的原始视频,365天的低码率视频
  • 使用ZFS压缩功能优化存储空间,对图像文件启用压缩

数据备份与恢复:

  • 在TrueNAS上配置每日自动快照,保留最近7天
  • 每周配置一次增量备份,保留最近4周
  • 每月配置一次完整备份,保留最近12个月
  • 配置异地备份,可使用TrueNAS的CloudSync功能将关键数据备份至云存储
  • 设置定期备份验证任务,确保备份可恢复

八、系统故障处理与应急预案

1. 常见故障处理

传感器数据丢失:

  • 检查Arduino与树莓派的USB连接是否正常
  • 验证传感器供电是否稳定,电压是否在0.01-3.3V范围内
  • 检查传感器校准参数是否正确
  • 重启传感器数据接收服务:

视频流中断:

  • 检查摄像头电源与连接状态
  • 确认NFS挂载是否正常
  • 检查mjpg-streamer服务状态:
  • 重启视频流服务:
  • 检查CPU使用率是否过高,必要时降低分辨率或帧率

NFS连接问题:

  • 检查网络连接:
  • 检查NFS服务状态:
  • 尝试重新挂载:
  • 检查TrueNAS的NFS服务是否正常
  • 若持续失败,检查是否已自动切换

系统崩溃:

  • 检查看门狗服务是否已触发重启
  • 若未自动重启,手动重启系统
  • 检查SD卡状态,必要时更换
  • 从备份恢复系统,
  • 检查所有外设连接,确保稳定

2. 应急预案

NAS宕机应急预案:

  • 配置NFS故障自动回退脚本,将数据临时存储至本地缓存
  • 启用系统看门狗,防止因NAS故障导致系统卡死
  • 设置定期备份至外部存储设备
  • 配置警报服务,当NAS宕机超过1小时时发送通知
  • 准备备用存储方案,如将数据临时存储至移动硬盘

传感器失效应急预案:

  • 配置多路传感器冗余,当一路失效时自动切换
  • 设置传感器失效阈值,连续10次读取失败则触发告警
  • 准备备用传感器,可在传感器失效时快速更换
  • 设置传感器数据异常检测,当数值剧烈波动时触发检查
  • 配置手动数据采集接口,允许通过手机APP临时读取数据

系统升级与维护:

  • 在维护期间,配置自动回退到本地缓存
  • 使用锁定关键系统包,防止意外更新
  • 在升级前创建系统快照:
  • 使用环境进行系统升级,避免直接升级导致系统不稳定
  • 升级后验证所有服务功能正常,再删除快照

九、总结与扩展建议

本方案提供了一个完整的鱼缸生态数据采集与影像监控系统,整合了Arduino Nano的传感器采集能力与树莓派4B的影像处理能力,通过直接挂载TrueNAS实现数据的长期安全存储。系统采用低功耗设计,确保7×24小时稳定运行,同时具备完善的异常检测与告警机制。

方案优势:

  • 数据安全:直接写入TrueNAS的ZFS存储池,享受RAID-Z1冗余保护
  • 实时监控:Grafana仪表盘与视频流展示,提供全面的系统状态
  • 异常检测:传感器阈值告警与鱼类行为分析,确保及时发现问题
  • 低功耗设计:合理配置硬件与软件,确保系统长期稳定运行
  • 可扩展架构:模块化设计,便于未来添加更多传感器或功能

未来扩展建议:

  1. 添加更多传感器:如溶解氧传感器、盐度传感器等,丰富水质监测数据
  2. 集成AI识别:部署更复杂的鱼类识别模型,区分不同鱼类种类与健康状态
  3. 添加自动控制:根据水质数据自动调节过滤系统、温控设备等
  4. 扩展视频分析:实现鱼类计数、活动模式分析等高级功能
  5. 添加远程访问:通过内网穿透或云服务实现远程监控与管理
  6. 集成环境控制:根据光照条件自动调节LED灯带亮度,模拟自然环境
  7. 添加多鱼缸支持:扩展系统支持多个鱼缸的监测与管理

注意事项:

  • 确保所有传感器和摄像头都使用防水设计,避免水损坏
  • 定期校准传感器,确保数据准确性
  • 监控系统温度,避免过热导致性能下降
  • 定期备份系统与配置,确保可恢复性
  • 遵循安全最佳实践,防止系统被未授权访问

通过本方案,用户将获得一个全面、可靠且易于扩展的鱼缸生态监测系统,不仅能够实时监控水质参数,还能捕捉水下影像,为鱼类健康与鱼缸生态平衡提供数据支持,实现对微观生命的深度共情与科学管理。

参考来源

[1]鱼群健康AI影像拍摄方案_分析_监测_养殖户

http://www.sohu.com/a/878592778_100229004

[2]树莓派+MCC 118 实现数据采集|树莓派实验室

[3]TrueNASM-Series-Scalable Storage for Maximum Uptime

[4]鱼缸测试手机性能介绍

[5]边缘计算鱼类识别:如何实现高效精准的智能识别方案?水族_智灵_模型

[6]两个 USB摄像头(OV4689)接入树莓派3B+,并通过 WiFi 实时上传到服务器,在网页上查看实时视频流。使用树莓派3视频采集接口-CSDN博客

[7]云计算-教程:在Linode平台上用TrueNAS搭建大规模存储系统-Akamai中国-SegmentFault 思否

[8]关于图形处理单元(GPU)的全部内容-Microsoft 支持

[9]鱼群健康AI影像拍摄方案|体表|养殖|拍摄方案|观赏鱼|饲料_手机网易网

[10]树莓派行业应用案例|树莓派实验室

[11]TrueNASCommunity Edition|Free Open Source Storage

[12]不只为游戏!实测独显在网络应用的重要性-太平洋电脑网

[13]GStreamer|树莓派实验室

[14]树莓派4B-快懂百科

[15]RAID Organizations for Improved Reliability and Performance: A Not Entirely Unbiased Tutorial (1st revision)

[16]A Wearable RFID-Based Navigation System for the Visually Impaired

[17]PVE下安装TruenasScale_NAS存储_什么值得买

[18]FLEdge: Benchmarking Federated Machine Learning Applications in Edge Computing Systems

[19]Raspberry4b启动摄像头_树莓派4b打开摄像头-CSDN博客

[20]RAIDZ1/Z2/Z3最少需要多少硬盘?故障容忍度分别是多少?编程语言-CSDN问答

[21]Distributed Gesture Controlled Systems for Human-MACHINE Interface

[22]树莓派摄像头硬件选型建议:接口匹配新手教程-CSDN博客

[23]教程:在Linode平台上用TrueNAS搭建大规模存储系统-CSDN博客

[24]RAIDZ1/Z2/Z3最少需要多少硬盘?故障容忍度分别是多少?编程语言-CSDN问答

[25]再谈树莓派供电不足解决方案-今日头条

[26]关于树莓派4B的碎碎念,供电不足和64位RDP的坑-哔哩哔哩

[27]NAS最新消息:免费升到企业级,威联通QuTS Hero系统正式下放-今日头条

[28]树莓派ARM架构下如何解决USB外设供电不足问题?编程语言-CSDN问答

[29]树莓派4B电源问题怎么办?ZOL问答

[30]与Prometheus集成

[31]MultiStream: A Simple and Fast Multiple Cameras Visual Monitor and Directly Streaming

[32]Metrics监控数据导出格式:JSON、CSV与Prometheus格式对比-CSDN博客

[33]构建高效家庭与商业监控系统:mjpg-streamer实战教程-CSDN博客

[34]从命令行运行Prometheus查询

[35]MJPG-Streamer:轻量级视频流传输工具的深度解析-百度开发者中心

[36]手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现_摄像头mjpg 模式 保存视频-CSDN博客

[37]树莓派通过tftp加载zImage和nfs挂载文件系统的配置_树莓派支持 tftp-CSDN博客

[38]Real-time Lane detection and Motion Planning in Raspberry Pi and Arduino for an Autonomous Vehicle Prototype

[39]树莓派4B监控CPU占用率、内存使用率、磁盘使用量以及CPU温度_python_旺仔牛奶opo-GitCode-AI社区

[40]在树莓派上部署NFS文件存储服务器-今日头条

[41]Resilient Edge: Can we achieve Network Resilency at the IoT Edge using LPWAN and WiFi?

[42]【LEDE】树莓派上玩LEDE终极指南-64-挂载UVC摄像头-MJPG-…

[43]【ROS学习】ROS主从机通信的利器—NFS文件系统挂载_ros 主机从机-CSDN博客

[44]树莓派串口通信数据丢失如何解决?编程语言-CSDN问答

[45]玩转Python」搭建远程监控系统,从此小偷绕道走!哔哩哔哩

[46]群辉挂载linuxnfs,树莓派挂载群晖NFS分区-CSDN博客

[47]树莓派的mjpeg-streamer实现简单的监控功能_mjpegstreamer-CSDN博客

[48]Telegraf远程文件插件CSV头写入机制优化解析-CSDN博客

[49]树莓派程序systemd 服务开机自启动/暂停/检查_树莓派systemd-CSDN博客

[50]接入Telegraf数据_日志服务(SLS)阿里云帮助中心

[51]基于树莓派摄像头的实时视频流服务器完整指南-CSDN博客

[52]Telegraf介绍和使用_大数据_鲁先生.-云原生

[53]树莓派5-学习笔记5:树莓派+群辉NAS搭建个人监控中心_树莓派搭建黑群晖-CSDN博客

[54]Telegraf指标采集器全指南:从入门到企业级实战 在云原生和物联网时代,指标数据的采集与监控成为系统可观测性的基石。掘金

[55]TrueNAS作为海康摄像头NAS存储的详细配置指南-百度开发者中心

[56]Evaluation of ZFS as an efficient WLCG storage backend

[57]TrueNAS无法舍弃,虚拟机nfs挂载邪修解决方案_truenas虚拟机-CSDN博客

[58]TrueNAS做为海康摄像头NAS储存详细配置_truenasnfs-CSDN博客

[59]A Conversation with Jeff Bonwick and Bill Moore

[60]NFS挂载失败常见原因及解决方法?编程语言-CSDN问答

[61]TrueNASM-Series-Scalable Storage for Maximum Uptime

[62]zfs文件系统详解-freebsd-zfs初体验-(原创不易一键三连)

[63]TrueNAS中文显示乱码如何解决?编程语言-CSDN问答

[64]ZFS_百度百科

http://baike.baidu.com/view/959414.htm

[65]ZFS实际性能比BTRFS/EXT4性能差距不小,看实测你再决定是否迁移!哔哩哔哩_bilibili

[66]TrueNAS_百度百科

[67]Design, Implementation, and Evaluation of an External Pose-Tracking System for Underwater Cameras

[68]Design, Configuration, Implementation, and Performance of a Simple 32 Core Raspberry Pi Cluster

[69]TrueNAS25.10 正式发布:NVMe-oF 支持+OpenZFS 性能飞升!今日头条

[70]UWA360CAM: A 360° 24/7 Real-Ti Streaming Camera System for Underwater Applications

[71]在树莓派上部署NFS文件存储服务器|树莓派实验室

[72]我的TrueNASSCALENAS,ZFS加速这块有点小坑

[73]教你一招,轻松实现TNAS和云盘数据同步!厂商动态-中关村在线

[74]Jetson nano NFS挂载配置_jetson nano 不能挂载-CSDN博客

[75]TrueNAS25.10 正式发布:NVMe-oF 支持+OpenZF._什么值得买

[76]【ROS学习】ROS主从机通信的利器—NFS文件系统挂载_ros 主机从机-CSDN博客

[77]挂载文件系统失败故障排查

[78]Data-centric FinGPT: Democratizing Internet-scale Data for Financial Large Language Models

[79]如何配置开机自动挂载NFS共享

[80]Applications of Deep Neural Networks with Keras

[81]2.7.网络|迁移规划指南|Red Hat Enterprise Linux|7|Red Hat …

[82]Employing AI and ML for Data Analytics on Key Indicators: Enhancing Smart City Urban Services and Dashboard-Driven Leadership and Decision-Making

[83]树莓派上OpenCV部署指南:从安装到图像识别实战-百度开发者中心

[84]python读取csv报错_reas_csv positional argument-CSDN博客

[85]IoT Ground Sensing Systems for Early Wildfire Detection Technologies, Challenges and Opportunities

[86]1.4 实现鱼类识别/检测模型_深度学习案例精粹最新章节-QQ阅读女生网

[87]树莓派USB设备自动挂载-CSDN博客

[88]python邮件告警SMTP服务-CSDN博客

[89]树莓派+OpenCV,打造物品识别与动物识别系统!与非网

[90]树莓派USB存储设备自动挂载-CSDN博客

[91]零基础玩转边缘计算:30分钟搭建你的第一个边缘节点-CSDN博客

[92]基于深度学习的鱼类目标及死亡状态检测方法研究与应用-豆丁网

[93]树莓派挂载移动硬盘-腾讯云开发者社区-腾讯云

[94]配置阈值-Amazon ManagedGrafana

[95]SpaceYLO: A Human-Inspired Model for Real-time, On-board Spacecraft Feature Detection

[96]Grafana告警配置:基于 Prometheus 指标设置阈值,实现短信 / 邮件告警

[97]在树莓派上部署Yolov5模型实现目标检测-开发者社区-阿里云

[98]grafana 配置告警规则-CSDN文库

[99]叙述YOLOv5部署在树莓派的全部过程-CSDN文库

智能鱼缸叙事系统实验方案

以下内容中关于缸内生态搭配和设备仅供参考,后续有更加有针对性的研究方案。


一、系统架构概述

“溪流缸编年史”项目是一个融合了计算机视觉、多模态感知、智能体协同与创意写作的综合系统,旨在通过一年时间构建一个从简单到复杂的水族缸智能叙事平台。整个系统的核心理念是**”数据驱动叙事”**,通过高维度生物特征识别、多源环境数据融合和Deep Agents智能体调度,将微观生态缸中的生物行为、环境变化与宏观世界新闻事件相结合,生成具有戏剧性和深度的生态叙事。

系统架构分为四个层次:物理层(鱼缸造景与传感器)、感知层(多模态数据采集与处理)、智能层(Deep Agents智能体协同与决策)、叙事层(故事生成与呈现)。这四个层次紧密耦合,形成一个闭环系统:环境变化触发生物行为,生物行为引发智能体决策,决策结果转化为叙事内容,同时叙事内容又可能通过环境干预影响缸内生态。

二、硬件与软件基础配置

2.1 物理层配置

鱼缸选择:120cm超白缸作为基础容器,其高透光度能提供更好的视觉体验。

造景材料:

  • 石头:青龙石、鹅卵石(用于构建”急流区”)
  • 沉木:1-2块(构建”深潭区”避难所)
  • 底砂:溪流砂(厚度5-10cm)
  • 水草:水榕、蜈蚣草、九冠草(提供遮蔽和生态平衡)
  • 生物配置:初期6-8条孔雀鱼、2-3条黑壳虾,后期逐步增加其他物种

基础设备:

  • 过滤系统:森森过滤盒(建立硝化系统,基础水质保障)
  • 水泵:尼特利水族时光水泵(静音省电,可调节水流强度)
  • 照明:LED水草灯(带三色切换功能,模拟昼夜变化)
  • 显示设备:窄边框LCD屏幕(嵌入缸壁,显示宏观新闻)
  • 控制中心:树莓派4B(作为边缘计算节点)

传感器配置:

  • 温度传感器:DS18B20(水温监测)
  • 流速传感器:PITOT管式(水流强度监测)
  • 光照传感器:TSL2561(光照强度监测)
  • pH值传感器:Atlas Scientific pH(水质酸碱度)
  • 氧气传感器:Atlas Scientific DO(溶解氧监测)

总预算控制:通过选择性价比高的设备,初期配置总成本控制在500-800元之间,避免过度投资。

2.2 软件架构

数据采集系统:基于树莓派+Python,集成多传感器数据采集。

Deep Agents智能体系统:基于LangChain框架,采用ReAct范式,通过任务规划工具实现复杂任务分解。

数据存储设计:采用MySQL时序数据库,设计三个关联表。

三、生物特征识别与行为分析

3.1 YOLOv8小目标检测优化

鱼缸生物检测的挑战在于目标小(如青鳉鱼仅3-5cm)、背景复杂(水草、石头等遮挡)、光照变化大等。我们通过以下优化策略提升检测精度:

锚框优化:采用YOLOv8的AutoAnchor功能,通过分析鱼缸生物标注框的宽高比,动态调整锚框参数。

数据增强策略:采用Mosaic、MixUp和Copy-Paste增强,提高小目标检测能力。

特征点提取:为每条鱼提取独特视觉特征,如尾柄斑点、背鳍弯曲度等,实现个体识别。

3.2 OpenCV多目标跟踪与行为分析

多目标跟踪是理解生物行为的关键。我们采用实现多目标跟踪,并结合卡尔曼滤波预测鱼的位置。

行为向量化:将鱼类行为转化为可分析的数值特征。

行为类型计算公式阈值范围
Z字形急游计算连续帧角度变化率角度变化率 > 30°/秒
悬停不动计算位移标准差位移标准差 < 0.5cm
贴底缓游计算y轴位置与水深比值y轴位置 < 水深 × 0.2
领地争夺计算个体间欧氏距离距离 < 2cm 且 方向夹角 < 15°

3.3 社交关系网络构建

生物间的互动是构建复杂叙事的关键。我们通过欧氏距离和运动方向夹角分析,构建生物间的社交关系网络。

随着实验进展,社交网络会逐渐丰富,从简单的个体行为发展到复杂的群体互动和权力结构。初期可能只有”个体行为”,中期出现”小群体互动”,后期则形成完整的”社会阶层”。

四、环境扰动检测与宏观新闻映射

4.1 SIFT特征点匹配与环境变化检测

环境扰动包括自然变化(如藻类爆发)和人为干预(如造景调整)。我们通过SIFT特征点匹配检测环境变化。

环境变化等级划分:根据位移距离与缸体比例划分。

  1. 微调:位移 < 10%缸长,如添加一片新叶子
  2. 小变化:10% ≤ 位移 < 30%,如移动一块小石头
  3. 巨变:位移 ≥ 30%,如重新布局整个造景

4.2 宏观新闻与微观生态的智能映射

宏观新闻映射是系统的核心创新点,将外部世界事件与鱼缸微观生态变化相关联,形成独特的叙事隐喻。

新闻关键词与微观事件映射表:

宏观新闻关键词视觉符号微观生态映射故事风格
暴雨/台风云图、雨滴动画水位上升/水流变急灾难片
高温/热浪火焰、温度计爆表水温升高生存惊悚片
地震震波图、裂痕造景震动/石头倒塌灾难动作片
战争/冲突爆炸、坦克领地争夺战争纪录片
和平/丰收麦穗、鸽子食物掉落/藻类减少田园牧歌

新闻API集成:通过RESTful API获取宏观新闻,提取关键词。

环境映射控制:根据新闻关键词动态调整鱼缸环境参数。

五、Deep Agents智能体协同与动态调度

5.1 初始阶段:基础观察与简单叙事

实验初期(0-3个月),系统主要完成基础搭建和简单功能实现。此时Deep Agents系统仅包含两个子智能体:“观察员””叙事员”。

初期叙事示例:

5.2 中期阶段:任务规划与复杂叙事

实验中期(4-9个月),系统引入任务规划工具和更复杂的智能体分工,叙事内容也变得更加丰富。

中期叙事示例:

5.3 后期阶段:动态智能体管理与高级叙事

实验后期(10-12个月),系统引入动态智能体管理和高级叙事逻辑,实现从简单到复杂的叙事升级。

后期叙事示例:

六、长期稳定性测试与评估

6.1 硬件稳定性测试

鱼缸设备耐久性测试是确保系统长期稳定运行的基础。我们设计了一套完整的测试方案,监控设备性能和故障率。

测试指标:

  • 设备MTBF(平均无故障时间):目标≥5000小时
  • 传感器数据漂移:每月校准一次,确保误差<5%
  • 水泵功率稳定性:工作电流波动<10%

测试工具:基于树莓派的Prometheus监控系统,记录设备性能指标。

故障预测模型:基于LSTM的设备故障预测,提前预警潜在问题。

6.2 AI系统性能评估

Deep Agents系统性能评估关注推理延迟、任务完成率和内存占用等指标。

监控指标:

  • :LLM推理延迟(目标<1秒)
  • :任务完成率(目标>95%)
  • :任务队列长度(目标<5)
  • :内存占用(目标<200MB)

性能优化策略:

  • 当推理延迟超过2秒时,自动扩容子智能体
  • 当任务队列长度超过10时,触发任务优先级重新评估
  • 定期清理内存,仅保留最近7天的数据

6.3 叙事质量评估

叙事质量评估采用主客观结合的方法,确保故事既符合事实又有艺术性。

客观指标:

  • BERTScore:衡量生成文本与参考叙事的相似度
  • 事件覆盖率:检测到的事件在叙事中的覆盖比例
  • 逻辑连贯性:通过文本相似度计算相邻叙事片段的连贯性

主观指标:

  • 用户满意度评分(1-5分)
  • 叙事创意性评分(1-5分)
  • 生态隐喻合理性评分(1-5分)

评估工具:问卷星在线问卷,定期收集用户反馈。

七、实验时间表与阶段性目标

7.1 第一阶段:基础系统搭建(0-3个月)

主要目标:完成鱼缸造景、设备安装和基础数据采集系统。

关键里程碑:

  • 第1周:鱼缸搭建完成,设备安装调试
  • 第2周:传感器数据采集系统上线,每小时记录环境参数
  • 第3周:生物特征提取模型训练完成,个体识别准确率>80%
  • 第4周:简单叙事生成功能实现,每日自动生成一条叙事片段

技术挑战与解决方案:

  • 挑战:水下环境光线不稳定,影响视觉识别
  • 解决方案:添加红外照明和图像增强算法
  • 挑战:生物个体特征相似,难以区分
  • 解决方案:结合多种特征(颜色、斑点、行为)进行综合识别

7.2 第二阶段:环境扰动与复杂叙事(4-6个月)

主要目标:实现环境扰动检测和复杂叙事生成。

关键里程碑:

  • 第5周:环境变化检测系统上线,能够识别造景变动
  • 第6周:宏观新闻映射功能实现,能够根据新闻关键词调整环境参数
  • 第7周:叙事状态机实现,支持不同状态下的叙事风格
  • 第8周:生物社交网络分析功能上线,能够识别生物间互动模式

技术挑战与解决方案:

  • 挑战:环境变化与生物行为的因果关系难以确定
  • 解决方案:设计A/B测试,对比环境干预前后的生物行为变化
  • 挑战:宏观新闻与微观事件的关联缺乏科学依据
  • 解决方案:建立基于经验的映射规则库,通过用户反馈不断优化

7.3 第三阶段:动态智能体管理与高级叙事(7-12个月)

主要目标:实现智能体动态管理,提升叙事深度和复杂度。

关键里程碑:

  • 第9周:动态智能体管理系统上线,根据系统状态自动调整子智能体数量
  • 第10周:多模态叙事融合功能实现,结合视频、图像和文字
  • 第11周:故障预测模型训练完成,能够提前预警设备故障
  • 第12周:叙事评估系统上线,定期评估叙事质量并优化

技术挑战与解决方案:

  • 挑战:智能体间任务移交复杂,容易出错
  • 解决方案:采用PROMISE框架的”状态机+提示词映射”,确保任务移交的可靠性
  • 挑战:长期运行导致数据量过大,影响系统性能
  • 解决方案:引入数据分片和压缩存储策略,优化数据库性能

八、实验数据收集与分析方法

8.1 数据收集策略

多源数据收集是系统的核心,我们设计了一套完整的数据收集策略。

环境数据:

  • 采集频率:每小时一次
  • 存储方式:MySQL时序数据库,按日期分区
  • 关键参数:温度、光照、pH值、溶解氧、藻类覆盖率

生物行为数据:

  • 采集频率:每30分钟一次
  • 存储方式:MySQL关系型数据库
  • 关键参数:鱼ID、位置、速度、弯曲系数、颜色Hue值、行为类型

叙事数据:

  • 采集频率:每日一次
  • 存储方式:MySQL文本型数据库
  • 关键参数:叙事内容、叙事风格、关联事件、用户反馈

用户交互数据:

  • 采集方式:问卷星在线问卷,每月一次
  • 关键参数:用户满意度评分、叙事创意性评分、生态隐喻合理性评分

8.2 数据分析方法

数据分析帮助我们理解系统运行状况,发现潜在问题,并指导系统优化。

环境变化分析:通过时间序列分析,识别环境参数的变化模式。

生物行为分析:通过聚类分析,识别鱼类行为模式。

叙事质量分析:通过文本分析,评估叙事质量。

九、实验总结与未来展望

9.1 一年实验成果总结

一年实验将使”溪流缸编年史”系统从简单的环境监测和基础叙事发展为一个复杂的智能生态系统。主要成果包括:

  1. 技术成果:
    1. 完成了从简单到复杂的生物特征识别系统
    1. 实现了多源环境数据的融合分析
    1. 构建了基于Deep Agents的智能体协同系统
    1. 开发了从简单描述到复杂隐喻的叙事生成能力
  2. 科学成果:
    1. 揭示了微观生态系统的动态变化规律
    1. 探索了宏观事件与微观生态的潜在关联
    1. 验证了AI系统在长期运行中的稳定性
  3. 艺术成果:
    1. 生成了一系列生动有趣的生态叙事
    1. 形成了独特的”魔幻现实主义”叙事风格
    1. 为鱼缸生态缸赋予了人文内涵

9.2 系统性能与问题总结

系统性能方面,通过一年实验,我们预期达到以下指标:

  • 环境参数监测准确率:温度>95%,光照>90%,pH值>85%
  • 生物个体识别准确率:>90%
  • 行为模式识别准确率:>85%
  • 叙事生成质量:BERTScore>0.8,用户满意度>4.0/5.0

实验过程中可能遇到的问题:

  1. 硬件层面:
    1. 传感器数据漂移:通过定期校准和LSTM模型预测解决
    1. 设备故障:通过Prometheus监控和LSTM故障预测模型提前预警
  2. AI层面:
    1. 任务规划不合理:通过增加任务规划深度和优化Guard条件解决
    1. 记忆溢出:通过持久化记忆系统和上下文清理策略解决
  3. 叙事层面:
    1. 叙事连贯性不足:通过状态机和叙事模板优化解决
    1. 隐喻合理性受质疑:通过用户反馈和规则库优化解决

9.3 未来迭代方向

系统未来迭代将从硬件、算法和叙事三个维度进行。

  1. 硬件层面:
    1. 升级为高精度传感器(如pH值传感器精度从±0.1提升到±0.05)
    1. 添加更多环境控制设备(如自动喂食器、CO₂调节器)
    1. 引入更先进的显示设备(如透明OLED屏幕,实现真正的”画中画”效果)
  2. 算法层面:
    1. 引入Transformer模型增强长时序行为预测
    1. 结合强化学习优化任务调度策略
    1. 开发更复杂的生物社交网络分析模型
  3. 叙事层面:
    1. 扩展”宏观新闻→微观隐喻”规则库
    1. 开发用户交互接口,允许用户干预叙事
    1. 构建跨年度的叙事时间线,形成真正的”编年史”

十、实验操作手册

10.1 日常维护操作

每日维护(0-1个月):

时间操作内容注意事项
8:00检查设备运行状态确保传感器数据正常,水泵无异常噪音
10:00观察生物行为记录异常行为,如鱼群聚集、不进食等
15:00检查水质使用试纸快速检测pH值、氨氮和亚硝酸盐
19:00换水操作换水比例控制在10%,水温差<2℃

进阶维护(2-12个月):

  1. 环境扰动计划:
    1. 每月一次:轻微环境扰动(如添加一片新叶子)
    1. 每季度一次:中等环境扰动(如移动一块小石头)
    1. 每半年一次:重大环境扰动(如重新布局造景)
  2. 生物配置调整:
    1. 第3个月:增加鱼的数量至10-12条
    1. 第6个月:引入新物种(如锦鲤或热带鱼)
    1. 第9个月:调整生物密度,实现生态平衡

10.2 系统升级路线图

系统将经历三个主要升级阶段:

  1. 基础版(0-3个月):
    1. 功能:环境参数监测、生物个体识别、简单叙事生成
    1. 模型:GPT-3.5-turbo
    1. 智能体:观察员、叙事员
  2. 中级版(4-9个月):
    1. 新增功能:环境扰动检测、宏观新闻映射、复杂叙事生成
    1. 模型升级:部分任务使用GPT-4
    1. 智能体扩展:添加生态分析师、映射员
  3. 高级版(10-12个月):
    1. 新增功能:动态智能体管理、多模态叙事融合、故障预测
    1. 模型优化:引入LSTM+GRU混合模型进行长期预测
    1. 智能体协同:实现基于状态机的智能体动态调度

10.3 问题排查指南

常见问题与解决方案:

  1. 传感器数据异常:
    1. 症状:温度读数突然波动,或pH值显示不合理
    1. 解决方案:检查传感器连接,重新校准传感器,检查数据采集代码
  2. 生物识别失败:
    1. 症状:无法正确识别鱼类个体,或误判生物行为
    1. 解决方案:优化标注数据,调整模型参数,增加数据增强策略
  3. 叙事质量下降:
    1. 症状:叙事连贯性变差,或生态隐喻不合理
    1. 解决方案:优化Prompt工程,增加参考叙事,调整叙事风格参数
  4. 智能体任务规划不合理:
    1. 症状:任务清单过于复杂,或任务执行顺序不合理
    1. 解决方案:优化Guard条件,调整任务规划深度,增加任务优先级策略
  5. 系统性能下降:
    1. 症状:推理延迟增加,内存占用过高
    1. 解决方案:清理内存,优化模型推理,必要时升级硬件

十一、结语

“溪流缸编年史”项目不仅是一个技术实验,更是一次对微观世界与宏观世界关系的哲学探索。通过一年的实验,我们期望实现三个转变:

  1. 从简单观察到智能叙事:系统将从简单的环境参数记录,发展为能够理解生态变化、预测发展趋势并生成富有创意的生态叙事。
  2. 从孤立系统到开放世界:鱼缸不再是封闭的生态系统,而是通过宏观新闻映射与外界建立联系,形成一个”与世界同频共振的生态节点”。
  3. 从技术实验到艺术创作:系统将超越简单的技术验证,生成具有艺术价值的生态叙事作品,探索AI在创意写作领域的可能性。

最终目标是构建一个能够自主运行、不断进化的”溪流缸编年史”系统,它不仅能记录微观生态的变化,还能通过AI的创造力,赋予这些变化以意义和深度,让鱼缸从简单的观赏容器,转变为一个充满故事和哲理的”微观世界”。

通过这一项目,我们希望探索以下问题:微观世界与宏观世界之间是否存在某种神秘的联系?AI能否真正理解并讲述生命的故事?以及如何通过数据驱动的方法,构建一个既有科学性又有艺术性的智能叙事系统。

这些探索不仅对技术发展有重要意义,也可能为人类理解自然、生命和叙事提供新的视角。

参考来源

[1]【收藏必备】DeepAgents深度解读:从0到1构建复杂任务智能体-CSDN博客

[2]新手养小丑鱼:低成本海缸设备清单真的可行吗?1000+用户观点大碰撞_造景装饰_什么值得买

[3]懒人小白必看!保姆级造景指南,3 步打造绝美鱼缸造景_智能鱼缸之家

[4]静音又省电的变频水泵推荐:四款高性价比水族水泵评测_鱼缸_流量_调节

[5]鱼虾混养 vs 龟鱼共生?我们汇总了78位水族爱好者的实战经验_造景装饰_什么值得买

[6]新手养鱼必看!30天零失败鱼缸维护指南,手残党也能养出空气缸!什么值得买

[7]Deep Agents智能体2.0深度解析:大模型应用架构革命,小白也能看懂的进阶指南-CSDN博客

[8]古法缸一年养成记!踩坑无数,终得一方治愈小天地_造景装饰_什么值得买

[9]新手养鱼开缸清单|低成本也能打造治愈

[10]鱼缸造景-快懂百科

[11]一个鱼缸怎么鱼虾混养,鱼虾混养行不行-鱼百科

[12]【海缸】Σ(°Д°;意想不到的低成本开缸邪修方案!什么值得买

[13]开一个桌面小鱼缸需要准备什么_什么值得买

[14]Efficiently Programming Large Language Models using SGLang

[15]【实操制作】4.17-用树莓派实时监测室内温湿度_树莓派温湿度-CSDN博客

[16]IoT-Based Environmental Control System for Fish Farms with Sensor Integration and Machine Learning Decision Support

[17]HAMMR-: HierArchical MultiModa Output agents for generic VQA

[18]树莓派+MCC 118 实现数据采集|树莓派实验室

[19]Quality of Answers of Generative Large Language Models vs Peer Patients for Interpreting Lab Test Results for Lay Patients: Evaluation Study

[20]从0到1:树莓派温度传感器实战指南—打造你的第一台物联网环境监测设备-CSDN博客

[21]基于机智云平台的智能鱼缸开发|手机|传感器|智能化_网易订阅

[22]10分钟手把手教你借助LangChain构建本地Agent智能体!LangChain+Agent本地部署全流程!小白也能轻松上手实操!哔哩哔哩_bilibili

[23]Efficiently Programming Large Language Models using SGLang

[24]EEA Conference & Exhibition 2021, 30 June – 1 July, Wellington, New Zealand Monitoring and Detection of Low-current HighImpedance Faults in Distribution Networks

[25]Understanding the planning of LLM agents: A survey

[26]智能家居实战:用I2C连接多个传感器的完整案例-CSDN博客

[27]Structured Thoughts Automaton: First Formalized Execution Model for Auto-Regressive Language Models

[28]如何在mysql中开发用户行为统计项目-mysql教程-PHP中文网

[29]Oscillatory rheotaxis of active droplets in microchannels

[30]YOLOv8小目标检测实战:从原理到部署的全流程指南

[31]MySQL如何进行数据库设计-MySQL数据库-亿速云

[32]基于OpenCV的运动物体检测:从理论到实践

https://cloud.baidu.com/article/3688282

[33]【YOLOV8】小目标困难场景优化_yolo小目标-CSDN博客

[34]生物信息学专业MySQL数据库课程教学方法探讨-免费论文网

[35]C# OpenCVSharp光流跟踪:如何精准捕捉运动物体的轨迹?使用c#开发物品运动轨迹-CSDN博客

[36]YOLOv8多尺度训练优化:随机缩放增强动态调尺寸,小目标AP直接涨3.9%!CSDN博客

[37]YOLOv8 AutoAnchor自动锚框计算功能使用说明-CSDN博客

[38]OpenCV实现多目标追踪(2)Frommoon-博客园

[39]Behavioral transition of a fish school in a crowded environment

[40]YOLOv8锚框机制深度解析:目标定位的先进技术-CSDN文库

[41]基于嵌入式树莓派和OpenCV的运动检测与跟踪系统.docx-原创力文档

[42]基于YOLOv8的鱼类行为识别系统:从数据集构建到UI界面实现_鱼虾视频行为分析 模型-CSDN博客

[43]YOLOv8自动锚框计算功能AutoAnchor详解-CSDN博客

[44]树莓派智能小车:使用OpenCV实现目标跟踪_树莓派小车追踪-CSDN…

[45]深度学习数据集大合集—鱼类数据集-哔哩哔哩

[46]深入解读YOLOv8Detection Model的参数设置-CSDN博客

[47]使用OpenCV实现多目标跟踪从理论到代码实践的完整指南-CSDN博客

[48]鱼缸中的鱼行为解读与健康问题分析

[49]鱼类行为学分析和总结.docx-原创力文档

[50]Attire-Based Anomaly Detection in Restricted Areas Using YOLOv8 for Enhanced CCTV Security

[51]基于PIV技术草金鱼幼鱼转弯运动动力学特性

[52]Ada-YOLO: Dynamic Fusion of YOLOV8 and Adaptive Heads for Precise Image Detection and Diagnosis

[53]机器人-毫秒级决策,秒级游动:基于MPC的仿生鱼智能控制仿真-个人文章-SegmentFault 思否

[54]YOLOv8锚框机制深度解析:目标定位的先进技术-CSDN文库

[55]狭窄通道内自推进鱼体游动的数值模拟研究

https://lxsj.cstam.org.cn/article/doi/10.6052/1000-0879-24-329

[56]目标检测:锚框的大小为什么宽乘以根号r_锚框的宽高比怎么计算-CSDN博客

[57]OpenCV实现SIFT特征检测与匹配实战-CSDN博客

[58]SAGA: A DSL for Story Management

[59]Red Sea-The Ultimate Reef Keeping Experience

Homepage CHN

[60]使用OpenCV进行SIFT特征检测-燕鹏-博客园

[61]Story Realization: Expanding Plot Events into Sentences

[62]HiChatBox鱼缸换水提醒联动水泵-CSDN博客

[63]Opencv总结6—sift算法-CSDN博客

[64]状态机工作流-.NET Framework |Microsoft Learn

[65]小智音箱鱼缸氧气泵联动通过时间调度-CSDN博客

[66]鱼缸造景检测_检测机构丨中析研究所「分析检测中心」_第三方检测报告

[67]低成本开源!乐鑫科技ESP32-S3开发板+RGB光雾联动,鱼缸炫酷得不像话-电子发烧友网

[68]基于python+opencv的SIFT算法分析_opencvpythonsift特征点匹配 平移量-CSDN博客

[69]Language-Driven Engineering

[70]RESTful简介-无线接入控制器(AC和FIT AP)V200R023C10 配置指南-华为

[71]使用OpenCV进行SIFT特征检测-燕鹏-博客园

[72]A Literature Survey Of Cognitive Complexity Metrics For Statechart Diagrams

[73]轻松掌控,一键远程:揭秘物联网设备RESTfulAPI控制之道-云原生实践

[74]State-Based Behavior Modeling in Software and Systems Engineering

[75]基于MQTT协议和RESTful API的智能家居水质监测系统_mqtt监测系统-CSDN博客

[76]C#智能设备RESTfulAPI深度开发:从物联网设备到云端控制实战_c# restful api-CSDN博客

[77]鱼缸水质参数全面解析:从物理到生物,助你打造稳定的水族环境

[78]Zero-Shot Calibration of Fishye Cameras

[79]自己动手建鱼缸,参数设置看这篇

[80]An automated vision system for measurement of zebrafish length using low-cost orthogonal web cameras

[81]鱼缸过滤全攻略:3个参数+7种过滤方式,新手也能养出空气缸什么值得买

[82]A Comprehensive Overview of Fish-Eye Camera Distortion Correction methods

[83]鱼缸设备选择指南:造浪、水泵与缸体尺寸

[84]一文看懂:怎样把像素换算为厘米?

[85]LDSA: Learning Dynamic Subtask Assignment in Cooperative Multi-Agent Reinforcement Learning

[86]Navigating Complexity: Orchestrated Problem Solving with Multi-Agent LLMs

[87]Selective decision making and collective behavior of fish by the motion of visual attention

[88]Hierarchical Reinforcement Learning with Deep Nested Agents

[89]PROMISE: A Framework for Model-Driven Stateful Prompt Orchestration

[90]Closed-loop interactions between a shoal of zebrafish and a group of robotic fish in a circular corridor

[91]Multi-Agent Collaboration: Harnessing the Power of Intelligent LLM Agents

https://arxiv.org/abs/2306.03314

[92]SWAG: Storytelling With Action Guidance

[93]全球首创双AI!DeepSeek通义千问赋能当贝智能鱼缸-当贝投影-当贝社区

[94]全球首创双AI!DeepSeek通义千问赋能当贝智能鱼缸_ZNDS资讯

http://n.znds.com/article/news/67805.html

[95]Towards Using Promises for Multi-Agent Cooperation in Goal Reasoning

[96]基于STM32的智能鱼缸设计(版本2)(监测水位、水温,控制加热棒和补水泵)(有自动模式和手动模式/阈值可以调节)

[97]当贝智能鱼缸搭载DeepSeek通义千问,行业首个双AI赋能_系统_生态_Ultra

[98]PM-FSM: Policies Modulating Finite State Machine for Robust Quadruped Locomotion

[99]【STM32项目】智能鱼缸(版本2)基于stm32的智能鱼缸设计ppt-CSDN博客

[100]当贝智能鱼缸全面接入DeepSeek!树立智能水族设备新标杆|智能化|deepseek_网易订阅

[101]PROMISE: A Framework for Model-Driven Stateful Prompt Orchestration

[102]YOLO鱼类识别:如何利用宠智灵实现高效精准的水族智能管理?模型_鱼缸_行为

[103]当贝智能鱼缸与DeepSeek完美融合:创新科技改变家居生活_天极网

[104]DeepSeekAPI接口全解析:技术实现、应用场景与最佳实践-百度开发者中心

[105]Prometheus监控服务-百度智能云

[106]DeepSeek API调用全解析:从HTTP请求到智能交互的完整指南

[107]容器监控神器Prometheus大揭秘!

[108]DeepSeek对话模块API解析:从入门到实践指南

[109]prometheusv3.5.0 发布详解:长周期支持版本带来的全新特性与性能优化|直方图|元数据_网易订阅

[110]Prometheus 监控服务-百度智能云

[111]【Prometheus监控运维必备】二、Prometheus数据模型与查询语言_prometheus查询语言-CSDN博客

[112]Multi-Agent Deep Reinforcement Learning For Persistent Monitoring With Sensing, Communication, and Localization Constraints

[113]Of Human Criteria and Automatic Metrics: A Benchmark of the Evaluation of Story Generation

[114]Feeding frequency mediates aggression and cannibalism in larval seatout, Cynosic nebulous

[115]AI-DriverPatient Monitoring with Multi-Agent Deep Reinforced Learning

[116]Automatic Story Generation: Challenges and Attempts

[117]Quantification of collective behaviour via causality analysis

[118]从LangChain到Deep Agents:构建稳定智能体的完整技术指南-CSDN博客

[119]STORYWARS: A Dataset and Instruction Tuning Baselines for Collaborative Story Understanding and Generation

[120]Effects of stocking density on survival, food intake and growth of giant gourami (Osphenemus gouramy) larvae reared in a recircult aquaculture system

[121]Prometheus监控指标设计与采集_系统_数据_标签

[122]The effects of interacting with fish in aquariums on human health and well-being: A systematic review

[123]Towards Implementing ML-Based Failure Detectors

[124]人人秀问卷调查网_在线考试_免费制作调查问卷平台-人人秀问卷调查网

[125]Comprehensive Study Of Predictive Maintenance In Industries Using Classification Models And LSTM Model

[126]Promethues 的 Agent 模式:高效转发云原生指标|服务器|谷歌|…

[127]2025年养鱼能力测试题及答案解析.doc-原创力文档

[128]使用LSTM预测设备未来一段时间内的故障风险-CSDN博客

[129]2025年鱼缸游戏测试题及答案.doc-原创力文档

[130]基于LSTM模型的工业过程数据的故障预测.pdf-原创力文档

[131]An Interference-aware Approach for Co-located Container Orchestration with Novel Metric

[132]Code Failure Prediction and Pattern Extractionusing LSTM Networks

[133]Prometheus监控与应用指标采集全解析-CSDN文库

[134]Towards Implementing ML-Based Failure Detectors

[135]Prometheus采集指标延迟如何排查?编程语言-CSDN问答

[136]【工业AI热榜】LSTM+GRU融合实战:设备故障预测准确率99.3%,附开源数据集与完整代码-CSDN博客

[137]STM32的智能鱼缸环境监测系统(开源)哔哩哔哩_bilibili

关于积水地图

其实LBS还有很多可以发挥的点,最近聊到了老兵地图,之前我还搞过绘本馆地图、北京露营地地图等。

最有意义的当属积水地图。

积水地图

那时候真好,虽然微博只有两千多粉,但发点东西,这几家地图提供商都很积极响应,高德最快,上线也最快。

自制热敏打印机连接器始末(9)为什么要在osx上添加cups才能将指令发送到打印机

这个问题我一直很困惑,正如上一篇提到的raw打印,按说raw的意思就是直接将原始指令直接发送到设备上,比如将打印机视作一个usb设备,直接通过usb写入设备不就行了吗?

我一直没有调通这样的方案。理论上是可行的,但对打印机的一些设置可能会更复杂一些,或者是我的打印机不支持这种模式。

目前能做到的就是在oxs/mac上启用cups,添加一个打印机,添加一个匹配的驱动程序,很多国产(中国大陆)的热敏打印机不提供mac的驱动程序,但实际上,这些打印机的控制板厂商就那么几家,看看打印机说明书里面提到的指令类型,比如TSPL就知道该找哪个厂商的驱动,TSPL就找TSC,他家的官网上资料可以说是非常的全了,提供了各个语言的例程。

经过反复测试,在mac上有两种方式添加打印机,一种是开启cups的web页面(在那里添加打印机,选择raw方式,但这个路径我没跑通,打印机不正常工作。),可以在cups这里添加打印机,选择对应厂商的ppa驱动程序(同一个厂商的驱动程序因不同设备而有很多型号,但比较下文件就知道大同小异,主要体现在设备的最大打印宽度、最高打印速度、分辨率这三项上,还有一个是热敏和转印模式)。另一种方式是直接在系统偏好设置-打印机这里添加打印机,选择相应的ppa文件也可以。

最后回答题目里自己设置的问题,我也不知道。一种猜测是osx为了安全起见,必须通过cups才能访问打印设备。一种猜测是打印机不具备直接简单接收指令就能打印的能力,可能还需要一些默认配置,这些配置由驱动程序来提供(ppa文件就是一个文本/配置文件,里面的内容都可以看)。

自制热敏打印机连接器始末(8)一些基本概念

其实之前参考过这篇文章

https://www.printnode.com/en/docs/what-is-raw-printing

但是他们提供的api没有命令式的,只能打文件,现在回头来看,打印机确实可以这么连接,直接安装为raw的方式就可以用程序打印了,并不需要找驱动。

当然,为了简化cups的操作,对普通用户来说,提供一个tsc的驱动在传统的打印机界面上安装会更简单一些。

在cups中添加的raw打印机只能在cups中可见,打印机与扫描仪管理中是看不见的,当然,node-printer中可以调用到这个打印机。

梳理一下基本概念:

标签打印机:重点当然在标签,每次打印一小截,标签一般是固定大小,指令如TSPL

票据打印机:重点当然是票据,按需打印长度,然后撕掉。指令如EOP。

面单打印机:快递单那种,应该是跟标签打印机差不多,只不过更大。

其实对于打印机厂商来说,很多都已经兼容多种指令了,当然不包括得力这种OEM还不提供开发文档的。

要做一个跨平台的连接器,需要满足几个条件:

(1)能够构建跨平台的发布,所以范围就锁定在electron、xamarin这样的方案上,js和c#虽然都熟悉,但最近用的多的还是js,所以优先选electron,但是其实对node不够熟悉,所以造成了上一篇关于buffer类型的困惑。

(2)搞清楚打印机在不同的操作系统如何连接,目前还没尝试usb直驱这种,在mac上还是通过cups来连接,windows上都有相应的驱动,可以不单独讨论。

(3)指令集兼容性,目前只尝试了TSPL这一种,后续还需要其他的ZPL之类的测试一下,还需要在各种指令之间转换,方便原来用某个指令集编写的程序直接对接。

(4)接入方式的兼容性,至少应该支持socket和http。

(5)统一的api,尤其是友好的RestFul模式的api,便于开发对接。

自制热敏打印机连接器始末(7)指令如何编码,尤其是汉字的编码

接下来就想为什么汉字是乱码呢?是command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);里面的汉字需要转码吗?

对照jpPrinter.addCommand里面把原来的转码去掉了,如果在command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);中把汉字转成unico呢,试了试也不行。

把jpPrinter.addCommand恢复回去,

jpPrinter.addCommand = function(content) {
      // 将指令转成数组装起;
      var code = new encode.TextEncoder("gb18030", {
        NONSTANDARD_allowLegacyEncoding: true,
      }).encode(content);
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i]);
      }
      // command = command + content;
    };

还是会报错,throw new TypeError(‘first argument must be a string or Buffer’);

然后仔细一看,原来data复制不止是string类型,还可以是buffer类型。

那就接着从BluetoothPrinter往这里扒,因为不是蓝牙,不受每次传输的长度限制,所以把分段传输的逻辑去掉。

var data = Array.from(uint8Buf);
  var buffer = new ArrayBuffer(data.length);
  
  var dataView = new DataView(buffer);
  for (var i = 0; i < data.length; ++i) {
    dataView.setUint8(i, data[i]);
  }
  console.log(
    "data type is: " + typeof data + ", is buffer: " + Buffer.isBuffer(data)
  );

但是,还是报同样地错误。

然后发现Buffer.isBuffer(data)是false,为什么类型不对呢?

于是搜到了这里http://nodejs.cn/api/buffer.html#buffer_static_method_buffer_from_arraybuffer_byteoffset_length

是nodejs里面对Buffer有不同于js的类型定义。

于是改成:

var uint8Buf = command.getData();
  var buffer=Buffer.from(uint8Buf);
  console.log(
    "buffer type is: " + typeof buffer + ", is buffer: " + Buffer.isBuffer(buffer)
  );
  var jobid = "";
  printer.printDirect({
    data: buffer, // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

打印成功。

自制热敏打印机连接器始末(6)验证指令可以驱动打印机输出但有乱码

后来我找到了https://github.com/qihang666/BluetoothPrinter这个项目,人家用蓝牙直接连打印机,比如我手头的DL-888AW就有蓝牙,我用usb为什么就不行呢,所以我就着手将这个项目中的代码拿过来。

尽管他里面的打印机指令集叫jprinter,但指令集实际上是TSPL,所以理论上应该可以复用。

拿过来的部分是https://github.com/qihang666/BluetoothPrinter/tree/master/components/gprint,

考虑到https://github.com/tojocky/node-printer/blob/master/examples/print_raw.js这里面提示的是data部分需要string类型,所以,我把tsc.js里面的command改成了字符串类型,把

jpPrinter.addCommand = function(content) {
      // 将指令转成数组装起;
      var code = new encode.TextEncoder("gb18030", {
        NONSTANDARD_allowLegacyEncoding: true,
      }).encode(content);
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i]);
      }
    };

改成了

jpPrinter.addCommand = function(content) {
       command = command + content;
    };

然后打印的时候:

var command = tsc.jpPrinter.createNew();
  console.log(command);
  command.setSize(60, 40);
  command.setGap(2);
  command.setCls();
  command.setText(50, 10, "2", 1, 1, "Hello");
  command.setText(50, 100, "TSS24.BF2", 1, 1, "一二三");
  // command.setQR(50, 50, "L", 5, "A", "977767937@qq.com");
  command.setPagePrint();

  var data=command.getData();
  var jobid = "";
  printer.printDirect({
    data: data, // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

惊喜出现了,打印机工作了,但是汉字是乱码。

自制热敏打印机连接器始末(5)放弃直接驱动usb,尝试找替代的驱动程序

中间走了一段弯路,因为一直无法直接用程序驱动打印机打出东西来,无法验证以前的思路是否可行,所以,想着是否应该给打印机找一找mac版的驱动,然后尝试直接在电脑上打印一个pdf文件,来和程序做下对比。于是,按照打印机的说明书里说的TSPL这个语言,找到了TSC这个厂商,他们家的网站上资源真是全啊https://www.chinatsc.cn/

按照类似的规格找了几个型号的打印机,下载驱动,然后发现其实人家的驱动都在一起。

这个ppd文件就是所谓驱动,用vscode打开,发现就是文本文件,对比一下,发现基本上都是一样的,对于热敏打印机来说,只有几个参数有区别,主要是打印宽度、打印速度、打印方式(热敏/热转印)。

找到了驱动,就可以在系统的打印机管理中添加打印机,然后自选某个驱动文件,比如我试了TA200,Deli_DL_888B_NEW是可以打印文件的。

但是我用node-printer还是无法打印。

  printer.printDirect({
    data:"测试", // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

打印机有时间连动都不动。

自制热敏打印机连接器始末(4)分清楚热敏打印机的几种常用指令集

都调试起来以后,连接打印机,发现打印机根本没反应,网上找到的相关资料很少,大部分都是在windows或者linux上做的,难道是mac的osx有一些安全限制,导致打印的指令被拦截了。

于是照着这个思路查下去,终于找到了一个新的东西:CUPS。其实这个东西支持linux也支持mac,按照说明添加上打印机之后,确实能在mac的打印机列表中看到了,而且在系统打开一个文件用这个打印机打印,是有动作的,尽管是瞎走纸,没有真正的输出。但至少说明是有希望了。

那么为什么用electron-escpos还是无法打印呢,甚至依然连走纸反应都没有。

无奈又去得力的官网看了看,找到888B这个打印机的说明书,仔细瞅了一眼,竟然发现它说他的编程语言是TSPL,不兼容ESCPOS,擦,过于相信刚找到escpos这个神奇的协议的时候它所说的几乎所有的打印机都支持了。

https://blog.csdn.net/weixin_34355881/article/details/89543300这篇文章介绍了打印机主流的指令类型(ESC命令集+CPCL命令集+TSPL命令集)之间的区别。这就解释了上面我对打印机类型的模糊认识

好了,标签打印机一般用TSPL命令集,票据打印机一般用ESCPOS。而我用的得力888B(NEW)是标签打印机。

那么,就需要将原来的escpos换成tspl来写打印命令。

自制热敏打印机连接器始末(3)

接上一篇,分清楚了两种模块的规范,那么怎么解决两种规范的不同呢,似乎可以通过配置babel来实现,于是我在babel.config.js中尝试了很多办法,都没有收效,归根结底是还没有搞清楚vue和electron之间是如何各自适用这些规范的。

按照某种说法,最新的vue是遵循ES6,而electron或者说node模块是CommonJs,但是,在项目中,npm install进来的模块都放在node_modules中,怎么区分呢,如果不是babel.config.js来负责,那就应该是electron相关的,于是我找到了electronBuilder这个配置。

在vue.config.js(如果没有则在项目根目录新建)中:

module.exports = {
  configureWebpack: {
    devtool: "source-map"
  },
  pluginOptions: {
    electronBuilder: {
      // List native deps here if they don't work
      externals: ["escpos", "escpos-usb"]
      // If you are using Yarn Workspaces, you may have multiple node_modules folders
      // List them all here so that VCP Electron Builder can find them
    }
  }
  // chainWebpack: config => {
  //   config.module
  //     .rule("js")
  //     .test(/\.jsx?$/)
  //     .exclude.clear()
  //     .end()
  //     .include.add(function() {
  //       return ["./node_modules/escpos", "./node_modules/escpos-usb", "src"];
  //     })
  //     .end();
  // }
};

这个发现得益于https://medium.com/@nyorikakar/printing-with-vue-electron-and-node-f52a730e63e7这篇文章,而且我还在后面的评论中发现了https://github.com/song940/node-escpos/issues/297,最终靠这些信息搞清楚了逻辑。

(1)对于用于node的模块,需要在vue.config.js的externals那里列出,这样,vue就不会让babel啥的那些loader去处理了。

(2)负责和node打交道的代码要放在background.js中,这在前面第二个连接中可以看到,而且最关键的是在vue的代码因为是通过BrowserWindow加载的,在其初始化是webPreferences中的nodeIntegration这个属性需要配置为true,const { ipcRenderer } = window.require(“electron”);才能用。而且,这个true如果是放在.env中不能直接给process.env.ELECTRON_NODE_INTEGRATION=true,那样,调到的是字符串,不是布尔值,会出现下面的报错:

Uncaught TypeError: window.require is not a function
    at Module../node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js& (App.vue:22)
    at __webpack_require__ (bootstrap:853)
    at fn (bootstrap:150)
    at Module../src/App.vue?vue&type=script&lang=js& (App.vue?c53a:1)
    at __webpack_require__ (bootstrap:853)
    at fn (bootstrap:150)
    at Module../src/App.vue (App.vue:1)
    at __webpack_require__ (bootstrap:853)
    at fn (bootstrap:150)
    at Module../src/main.js (HelloWorld.vue?adfd:1)