You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raspberry Pi Zero传感器数据实时传输至Linux笔记本并绘图方案咨询

简便实现方案(优先选择Python)

核心思路:利用现有SSH连接+标准输出传输,搭配Python绘图库实时渲染

你已经有可用的SSH连接,完全不需要额外搭建复杂的网络服务(比如TCP/UDP服务器),直接通过SSH管道将树莓派的传感器数据输出转发到笔记本,再用Python的绘图库实时解析渲染即可,这是最轻量化的方案。


1. 树莓派端:Python采集程序(示例以MPU6050为例)

Python的传感器库生态完善,代码简洁,不用手动处理底层I2C通信细节,传输上直接用标准输出即可,无需额外写传输逻辑。

import time
from smbus2 import SMBus
from mpu6050 import MPU6050

# 初始化传感器
bus = SMBus(1)
sensor = MPU6050(bus, 0x68)
sensor.set_accel_range(sensor.ACCEL_RANGE_2G)
sensor.set_gyro_range(sensor.GYRO_RANGE_250DEG)

while True:
    # 读取传感器数据
    accel_data = sensor.get_accel_data()
    gyro_data = sensor.get_gyro_data()
    current_time = time.time()
    
    # 输出CSV格式数据(方便笔记本端解析),强制刷新缓冲区保证实时性
    print(f"{current_time},{accel_data['x']},{accel_data['y']},{accel_data['z']},{gyro_data['x']},{gyro_data['y']},{gyro_data['z']}", flush=True)
    time.sleep(0.1)  # 10Hz采样频率,可按需调整

安装依赖(树莓派上执行):

pip3 install smbus2 mpu6050-raspberrypi

2. 笔记本端:Python实时绘图程序

用matplotlib的FuncAnimation模块读取SSH管道传来的实时数据,动态更新图表。

import sys
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 初始化数据缓存(只保留最近100个点,避免卡顿)
timestamps = []
accel_x = []
accel_y = []
accel_z = []

# 配置图表布局
fig, (ax_x, ax_y, ax_z) = plt.subplots(3, 1, figsize=(8, 6))
line_x, = ax_x.plot([], [], label='Accel X')
line_y, = ax_y.plot([], [], label='Accel Y')
line_z, = ax_z.plot([], [], label='Accel Z')

# 统一图表样式
for ax in [ax_x, ax_y, ax_z]:
    ax.set_ylim(-2, 2)  # 对应2G加速度量程
    ax.legend()
    ax.set_ylabel('Acceleration (g)')
ax_z.set_xlabel('Relative Time (s)')

def init_plot():
    line_x.set_data([], [])
    line_y.set_data([], [])
    line_z.set_data([], [])
    return line_x, line_y, line_z

def update_plot(frame):
    # 读取SSH管道传来的一行数据
    raw_line = sys.stdin.readline()
    if not raw_line:
        return line_x, line_y, line_z
    
    try:
        ts, ax, ay, az, gx, gy, gz = map(float, raw_line.strip().split(','))
    except ValueError:
        return line_x, line_y, line_z
    
    # 计算相对时间(从第一个数据点开始计时)
    relative_ts = ts - timestamps[0] if timestamps else 0
    timestamps.append(relative_ts)
    accel_x.append(ax)
    accel_y.append(ay)
    accel_z.append(az)
    
    # 裁剪旧数据,保持图表流畅
    if len(timestamps) > 100:
        timestamps.pop(0)
        accel_x.pop(0)
        accel_y.pop(0)
        accel_z.pop(0)
    
    # 更新图表数据
    line_x.set_data(timestamps, accel_x)
    line_y.set_data(timestamps, accel_y)
    line_z.set_data(timestamps, accel_z)
    
    # 自动调整X轴范围
    for ax in [ax_x, ax_y, ax_z]:
        ax.set_xlim(timestamps[0], timestamps[-1])
    
    return line_x, line_y, line_z

# 启动实时动画
ani = FuncAnimation(fig, update_plot, init_func=init_plot, interval=100, blit=True)
plt.tight_layout()
plt.show()

安装依赖(笔记本上执行):

pip3 install matplotlib

3. 启动方式

在笔记本终端执行以下命令,直接通过SSH管道传输数据并绘图:

ssh pi@<你的树莓派IP> 'python3 /home/pi/sensor_read.py' | python3 plot_data.py

如果需要同时保存数据到文件,可加入tee命令:

ssh pi@<你的树莓派IP> 'python3 /home/pi/sensor_read.py' | tee sensor_log.csv | python3 plot_data.py

关于语言选择的补充

  • 优先选Python:采集端无需手动实现传输逻辑,直接用标准输出+SSH管道即可;绘图端有成熟的实时渲染库,代码量少,调试成本低。
  • 如果非要用C:采集程序可以通过printf输出CSV格式数据,同样用SSH管道传输,但C需要手动处理I2C读写(比如用wiringPi或直接操作/dev/i2c-1设备),代码复杂度远高于Python,不推荐除非有性能刚需。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:40:29