Vision Anti-Pinch — use-can
V4L2 摄像头 + CAN 门状态 + YOLO/RTMW TensorRT 推理 + CMS 风险判断。 默认持续推理,将最新完整结果保存在内存;可视化和文件保存均按需开启。
Orin 直接运行
适用:Jetson AGX Orin,JetPack 5.1.2 / L4T R35.4.1、CUDA 11.4、TensorRT 8.5.x、系统 OpenCV 4.5.4;Python 3.8+,numpy、cv2。
orin/ 包含编译库、TensorRT 引擎、CAN 库、摄像头驱动、Python 运行代码和标定文件,可以单独复制到其他目录。
cd orin
./scripts/initialize_camera.sh # 开机后无 /dev/video5 时初始化,需要 sudo
./run.sh # 默认无可视化,结果保存在内存
# 或开启浏览器预览:http://设备IP:8765
./run.sh --visualize
每次只运行一个采集进程;Ctrl+C / SIGTERM 停止。关闭浏览器不会停止推理。 系统 CUDA/TensorRT/OpenCV/Python 运行环境由目标系统提供,不随包重复分发。TensorRT 引擎不能直接用于 Thor 或其他 JetPack/GPU 环境。
从源码编译
在目标 Orin 上执行,依赖 CMake 3.24+、CUDA/NPP、TensorRT、OpenCV 开发库:
./scripts/build.sh # 或 make
./scripts/initialize_camera.sh # 摄像头尚未初始化时执行
./run_camera.sh # 使用新编译的 build/libvision_native.so
源码入口复用 orin/models/engines/ 和 orin/lib/,不依赖旧版工程。
修改源码后刷新直接运行包:
./scripts/package_orin.sh # 或 make package
cd orin && sha256sum -c SHA256SUMS
打包会替换运行代码,清除已删除的旧 Python 模块,并更新文件校验值。
下游读取结果
在同一个 Python 进程中创建流水线,然后读取单个最新只读快照:
from run_camera import CameraPipeline, parse_args
with CameraPipeline(parse_args([])) as pipeline:
result = pipeline.wait_for_result(timeout=10)
# 下游自己的循环/线程中读取;首帧前为 None:
result = pipeline.latest_result # 等价于 pipeline.latest()
if result is not None:
print(result['frame_index'], result['risk'])
door_risks = result['door_risks']
skeletons = result['skeletons']
结果字段:frame_index、track_ids、boxes、skeletons(每人 133 点)、door_assignments、active_door、door_risks、risk、ungated_risk、can、capture、capture_to_result_ms、calibration_verified。
- 读取不消费结果;多个读者可以持有同一个不可变快照,旧快照不会被下一帧改写。
- 只保留最新结果,慢读者可以跳过帧;
wait_for_result(last_frame_index, timeout)可等待更新。 request_stop()请求停止,join()等待退出并传播异常;with自动回收资源。- 停止后仍保留最后快照;下游应检查运行状态和帧时间,避免使用过期结果。
result_to_dict(result)生成可修改、可序列化的副本。变量属于当前进程,不是跨进程共享内存。
CAN、风险与输出选项
0x391 的 data[0..3] 依次为左前、右前、左后、右后。默认 --can-side left,右侧使用 --can-side right。值为 0 表示对应门活跃;报文缺失或超过默认 1000 ms 时,输出 CAN_UNKNOWN、分数 null。当前接口不发送防夹执行器指令。
优先用融合后的有效手部区域判断风险,无有效手部时使用人体框兜底;最终读取 risk / door_risks。ungated_risk 仅供诊断,unknown 不能当作 clear。
标定文件来自研发机位,默认 calibration_verified=false,换机位须重新标定。
| 参数 | 作用 |
|---|---|
--visualize |
开启独立绘制线程及 HTTP 预览;默认不绘制、不编码、不监听端口 |
--save-results |
保存逐帧 JSONL 及 latest.json,默认不保存 |
--save-snapshots |
每约 10 秒保存叠加图像 |
--write-video |
保存叠加视频,可配合 --duration 限时运行 |
--output PATH |
指定保存目录,本身不启用保存 |
--no-can --active-door both |
显式模拟门状态 |
运行 ./run_camera.sh --help 或 orin/run.sh --help 查看全部选项。JSONL 每 32 MiB 轮换,保留两个历史文件;视频不轮换。开启可视化后可读取 /result.json 和 /frame.jpg。
目录
native/:实际参与编译的摄像头/CAN、CUDA/NPP、TensorRT 源码及头文件。pipeline/:运行时姿态融合、跟踪、遮挡处理、风险、可视化和结果变量。annotations/:源码运行时的标定文件。scripts/:构建、打包、摄像头初始化。orin/:可单独复制并直接执行的运行包。