README.md

May 29, 2026 · View on GitHub

eBPF Go Python ROS2 STM32 Performance

基于 eBPF 的机器人实时控制
安全监控系统

在 Linux 内核里埋三个探针,无侵入地守护机器人的每一次控制循环
邢栋 · 天津中德应用技术大学 机械工程学院 · 2026


项目概述

机器人控制系统的实时性失效是导致安全事故的主要根源——控制周期抖动、串口通信中断、CPU 调度延迟三者构成了"实时性三角"。传统方案(硬件 Watchdog、应用层心跳)要么粒度太粗,要么具有侵入性。

本项目利用 eBPF(Extended Berkeley Packet Filter) 技术,在 Linux 内核中部署三个轻量级探针,实现对机器人控制循环的非侵入式、微秒级、全覆盖安全监控。


核心创新

三个内核探针

探针Hook 点监控对象告警阈值
loop_monitorkprobe/hrtimer_start控制周期抖动>500μs WARNING
>2ms CRITICAL
serial_monitorkprobe/tty_write
kprobe/tty_read
串口通信延迟读间隔>100ms 停顿
sched_monitortracepoint/sched_switchROS2 调度延迟>10ms WARNING

关键指标

  • 检测延迟 < 100ms(eBPF vs Watchdog 200ms+)
  • CPU 开销 < 1%(内核态零拷贝 ring buffer)
  • 非侵入 — 零行应用代码修改
  • 部署 — 单二进制 collector,无外部依赖
  • 架构 — Go 采集器 + REST API + Web Dashboard

系统架构

┌──────────────────────────────────────────────────────────────┐
│                    Linux 单板(树莓派 / Jetson / NUC)         │
│                                                              │
│   ┌───────────── Kernel Space ─────────────┐                 │
│   │                                         │                 │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐│                 │
│   │  │loop_monitor│ │serial_mon│ │sched_mon ││  ← eBPF 探针  │
│   │  │ hrtimer   │ │ tty_r/w  │ │sched_sw  ││                 │
│   │  └─────┬─────┘ └────┬─────┘ └────┬─────┘│                 │
│   │        │             │            │      │                 │
│   │        └─────────┬───┴────────────┘      │                 │
│   │                  │ Ring Buffer            │                 │
│   └──────────────────┼───────────────────────┘                 │
│                      │                                         │
│   ┌────────────────── User Space ─────────────┐                │
│   │                                           │                │
│   │   Go Collector (libbpf + REST :8090)       │                │
│   │        │          │          │             │                │
│   │   ┌────┴───┐ ┌───┴───┐ ┌───┴──────┐      │                │
│   │   │Web 仪表盘│ │REST API│ │告警推送  │      │                │
│   │   └────────┘ └───────┘ └──────────┘      │                │
│   └───────────────────────────────────────────┘                │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│                    STM32F103(嵌入式 MCU)                        │
│   ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│   │ FreeRTOS  │  │ MPU6050  │  │ PID 控制  │  │ IWDG     │      │
│   │ 4 任务    │  │ 100Hz    │  │ Madgwick  │  │ 硬件看门狗│      │
│   └──────────┘  └──────────┘  └──────────┘  └──────────┘      │
└──────────────────────────────────────────────────────────────────┘

探针详解

1. loop_monitor — 控制周期抖动

Hook 到 hrtimer_start,捕获高精度定时器的实际触发间隔与期望周期的偏差。

控制周期不稳 → PID 输出不准 → 机器人抖动/失稳

2. serial_monitor — 串口通信安全

Hook 到 tty_write / tty_read,监控 Linux SBC ↔ STM32 的 UART 通信健康度。

串口断连 → 传感器数据停滞 → 控制环开环 → 失控

3. sched_monitor — 任务调度延迟

Hook 到 sched_switch tracepoint,监控 ROS2 控制节点被唤醒后等待 CPU 的时间。

CPU 被抢占 → ROS2 节点得不到执行 → 实时性破坏


快速开始(5 分钟)

# 1. 编译探针 + 采集器
cd 设计/软件
make build-bpf
make build-go

# 2. 启动安全监控器(需要 root 权限加载 eBPF)
sudo BPF_DIR=bpf ./bin/collector
# 输出: [collector] Robot Safety Monitor running — API on :8090

# 3. 启动模拟机器人(含故障注入)
python3 ros2/demo_control.py --fault 5

# 4. 打开仪表盘
# 浏览器访问 http://localhost:8090

实验验证

实验内容关键发现
故障注入控制周期抖动检测eBPF 检测延迟 < 100ms,优于 Watchdog 4.8×
ESTOP 延迟50 次紧急停止测试HTTP ESTOP 平均延迟可控
eBPF vs Watchdog对比实验eBPF 检测粒度 μs 级,Watchdog ms 级
CPU 开销perf 性能测试eBPF 运行时 < 1% CPU 开销
真实机器人完整系统测试三路探针协同工作正常

API 接口

端点说明
GET /api/summary全局安全状态(NOMINAL / WARNING / CRITICAL)
GET /api/loop控制周期抖动事件历史
GET /api/serial串口通信事件历史
GET /api/sched调度延迟事件历史
GET /api/alerts安全告警列表
GET /实时安全仪表盘

技术栈

技术
内核探针C (eBPF) + libbpf + CO-RE + clang/LLVM
数据采集Go + cilium/ebpf + net/http
前端HTML5 + Chart.js(实时波形)
控制节点Python 3 + ROS2
嵌入式C + FreeRTOS + STM32 HAL + IWDG

本项目为大疆创新实习申请作品附件 · DJI Internship Portfolio