#home-automation #camera #camera-image #home-assistant #thermal #detect #people

app r-u-still-there

家用自动化热成像人体存在传感器

2个不稳定版本

0.3.0 2021年12月2日
0.1.1 2021年7月11日

#609 in 硬件支持

GPL-3.0-or-later

360KB
8K SLoC

r-u-still-there

使用热成像的人体存在家用自动化传感器。

检测空间是否被占用最常见的方法是使用PIR传感器,但它的缺点是无法检测静止的人。r-u-still-there是一个可以安装在嵌入式Linux系统上并配备热成像相机的应用程序。r-u-still-there将在检测到人时通知您的家用自动化系统,并在那个人离开其视野时通知。换句话说,即使房间里的人保持静止(例如,在看电影时),您也可以用它来感知房间是否被占用。

功能

  • CPU和网络使用效率高。
  • 通过MQTT代理发送消息,允许多个不同的家用自动化系统使用。
  • 易于与Home Assistant集成。
  • 提供MJPEG流,让您感觉像《异形》里的猎人。

硬件

r-u-still-there已在各种树莓派上进行测试和使用,从低成本的0型和低速的1B+到8GB的4B。我还在BeagleBone Greens上使用它,它应该在您能连接I²C外围设备的所有Linux设备上运行。

在性能方面,如果您可以的话,我建议使用至少具有ARMv7 CPU的设备。树莓派0和1上的ARMv6 CPU可以工作,但它可能在更高的帧率和更大的尺寸下难以渲染图像流。较新处理器的SIMD指令和更快的速度会产生明显的差异。

相机

目前(截至v0.2.0),支持三种热成像相机型号

相机 分辨率 帧率 视野
松下GridEYE 8×8 1或10 FPS 60°×60°
Melexis MLX90640 32×24 0.5、1、2、4、8、16或32 FPS 55°×35° 110°×75°
Melexis MLX90641 16×12 0.5、1、2、4、8、16、32或64 FPS 55°×35° 110°×75°

建议为Melexis摄像头选择更强大的CPU,尤其是如果您打算以更高的刷新率运行它们。请注意,运行这些摄像头的较高刷新率需要400kHz的I²C总线速度(可能还需要其他配置更改)。有关更多详细信息,请参阅摄像头驱动程序的文档。

安装

您可以从cargo(crate名称为'r-u-still-there')安装仅程序。然而,首选的过程是使用.deb软件包,无论是从GitHub上的发行版手动下载,还是从我的软件包仓库下载。无论如何,我建议使用与您的硬件最匹配的版本,因为ARM指令集的每次跳跃都会在性能上带来明显的改进(即使在相同的硬件上)。

基于Debian的发行版(包括Ubuntu,Raspberry Pi OS)

有关在Raspberry Pi上安装的说明,请参阅RaspberryPi.md文件。在其他基于Debian的系统上的安装将大致相同,最大的区别在于不同设备上I²C总线的启用方式。

常见问题解答

为什么CPU使用率很高?

目前绘制温度文本相当耗费CPU资源。如果您可以禁用该功能(通过在配置文件中注释掉render.units值),CPU使用率将会下降。另一个选项是使用frame_rate_limit设置限制视频流的帧率。最后,将render.grid_size设置调低一些也可以有所帮助。

目前,在r-u-still-there中,渲染视频流是最“昂贵”的部分,因为它全部都在CPU上完成。但是,如果没有客户端连接到MJPEG流,则不会进行渲染,CPU使用率应该会下降。

如何进行配置?

对于Debian软件包,配置文件位于/etc/r-u-still-there/config.toml。如果没有在命令行参数中提供配置文件,这也是默认位置。

如何将摄像头连接到计算机?

您需要将摄像头连接到您的设备I²C总线。这因设备而异,但以下是一些设备的示例

如何获取更详细的日志?

可以使用RUST_LOG环境变量配置日志记录。设置RUST_LOG=debug将提供相当详细的日志,但如果需要更多,trace也是可用的。

我可以使用哪些MQTT代理?

我使用mosquitto,但任何支持保留消息的MQTT 3兼容代理都应该可以工作。

传感器能检测多远的人?

这取决于您使用的摄像头的分辨率和视野。更高的分辨率和更窄的视野将使摄像头能够从更远的地方检测到人。根据我的经验,GridEYE通常可以在我大约4米(13英尺)远的地方检测到我(一个中等身高、平均身材的男性)。

温度中有许多噪声(快速变化,但变化不大)。我怎样才能摆脱它?

在GridEYE上,将摄像头设置为1 FPS将在内部对图像进行降噪。我也计划在将来添加其他方法。

我如何查看摄像头图像?

如果启用,可以通过HTTP在端口9000上在/mjpeg(因此http://<IP地址>:9000/mjpeg)访问到可用的MJPEG流。如果您想在Home Assistant中使用它,您需要手动配置

这听起来很像room-assistant的功能。

是的!我之前使用过room-assistant一段时间,认为它是一个非常酷的软件。如果您想使用蓝牙进行存在感检测,它仍然是我的首选。然而,随着时间的推移,我遇到了一些痛点,我认为r-u-still-there能更好地解决这些问题。

  • room-assistant对CPU的负担可能很大,因为它会为每一帧渲染图像,不管是否有人在看。而r-u-still-there只有在有活动客户端时才会渲染图像。这导致在Raspberry Pi Model 1B+上CPU使用率大约为2%,而room-assistant在旧版本上通常是50-60%,在新版本上(v2.12.0改为使用JavaScript库进行图像渲染)会达到最大。即使进行视频流传输,r-u-still-there通常也更有性能,1 FPS的流大约占用15%的CPU,5 FPS大约占用60%的CPU。

  • r-u-still-there还有一些额外的配置选项,例如生成的热图像的大小、图像中使用的颜色方案、摄像机的帧率以及生成数据使用的单位。

  • 我的某些设备WiFi接收效果较差,所以在它们需要通信时会减慢网络上其他设备的速度。room-assistant会生成大量的网络流量,除了相当多的多播流量(可以关闭,但默认启用)外,每秒还会通过MQTT发送完整的图像。而r-u-still-there不会通过MQTT发送图像(未来可能会提供启用此选项的选项,但目前没有)。

  • 一些摄像机提供了room-assistant未公开的额外功能。例如,GridEYE可以在10 FPS的速度下运行,但这会增加图像中的噪声。大多数热摄像机也都有一个环境温度传感器,r-u-still-there也会公开。

尽管如此,我仍然非常感谢room-assistant激励我创建了r-u-still-there。

关于测量接收器延迟的警告信息是什么意思?

这通常发生在CPU无法跟上来自摄像头的帧时。尝试上面提到的减少CPU使用的建议。

我如何在Raspberry Pi上使用Melexis摄像机时,停止r-u-still-there使用几分钟后的崩溃?

Raspberry Pi的I2C时钟是基于核心时钟的,核心时钟(默认情况下)会根据整个系统的CPU使用情况进行变化。要停止这种情况,您需要设置core_freq=250。也可以设置force_turbo=1,但请注意,如果您设置了任何over_voltage_*值,保修位将永久设置。有关详细信息,请参阅超频选项文档。

如果您已设置enable_uart,则隐式设置core_freq=250,因此除非您还禁用了蓝牙,否则不需要进行任何更改。

如果您将逻辑分析仪连接到I2C总线,这个问题将表现为前几帧以全速传输(默认为100kHz,但r-u-still-there推荐的设置是400kHz),然后降至正常速度的62.5%(旧款Pi)或40%(Pi 4)。

开发

从git检出后,此存储库应该可以使用cargo构建。

git clone https://github.com/paxswill/r-u-still-there.git
cd r-u-still-there
cargo build

开发构建将优化级别提高,因为如果不进行优化,它会非常慢。

交叉编译

在目标设备上构建可能会非常慢,设备甚至可能没有足够的内存。幸运的是,使用 Rust 进行交叉编译相当简单。

无论你选择哪种方式构建软件包,如果你正在编译 32 位 ARM 架构,你需要将一些额外的标志传递给 C 编译器(根据需要将 cargo 替换为 cross

# ARMv6, for Raspberry Pi 0 and 1
TARGET_CFLAGS="-march=armv6+fp" cargo build --release --target arm-unknown-linux-musleabihf
# ARMv7, for earlier version of the Raspberry Pi 2 and BeagleBones
TARGET_CFLAGS="-march=armv7-a+simd" cargo build --release --target armv7-unknown-linux-musleabihf
# 64-bit ARMv8, for Raspberry Pi Model 4
cargo build --release --target aarch64-unknown-linux-musl

glibc

我发现使用 cross 是为 glibc 目标交叉构建最简单的方式。它只需简单设置即可工作,并且也是提供软件包所使用的方式(连同 cargo-deb)。

musl 静态构建

我使用 musl 目标进行大部分开发,因为从基于 FreeBSD 的系统进行交叉构建时它们更容易工作。在我的经验中,基于 musl 的目标也稍微慢一些,因此通过使用它们进行开发,当使用 glibc 为软件包时,我可以免费获得一个“性能提升”。我发现 musl-cross-make 是设置本地交叉工具链的最简单方式。一旦安装并可用在 $PATH 中,你将需要创建包含类似以下内容的 .cargo/config.toml

[target.arm-unknown-linux-musleabihf]
linker = "arm-linux-musleabihf-gcc"

[target.armv7-unknown-linux-musleabihf]
linker = "armv7-linux-musleabihf-gcc"

[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc"

软件包打包

使用 cargo-deb 进行 Debian 软件包的构建。 build.sh 将使用 cross 为每个架构构建,然后将其打包,并在项目目录中留下 .deb 文件。

依赖关系

~65MB
~1M SLoC