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/:可单独复制并直接执行的运行包。
S
Description
No description provided
Readme 366 MiB
Languages
Python 100%