2个不稳定版本
0.3.0 | 2021年12月2日 |
---|---|
0.1.1 | 2021年7月11日 |
#609 in 硬件支持
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