第1章:光流传感器驱动与配置

大家好,我是你们的PX4嵌入式系统讲师。今天咱们聊聊光流传感器——这个在无人机视觉导航里不可或缺的“小眼睛”。

说实话,我第一次接触光流传感器是在一个室内定位项目里。当时GPS信号弱得可怜,无人机就像个无头苍蝇。后来换上光流传感器,嘿,稳了。今天我就把那些年踩过的坑、总结的经验,一股脑儿倒给你们。

1.1 I2C/SPI总线配置:选对“高速公路”

光流传感器和飞控通信,无非两条路:I2C和SPI。你想想看,这就像选高速公路——I2C是双车道,SPI是八车道。

I2C总线配置

  • 优点:接线简单,只用两根线(SDA、SCL)
  • 缺点:速度慢(标准模式100kHz,快速模式400kHz)
  • 适合:数据量小、距离近的场景

SPI总线配置

  • 优点:速度快(可达10MHz以上),全双工
  • 缺点:需要4根线(MOSI、MISO、SCK、CS)
  • 适合:高帧率、大数据量的光流传感器

我个人习惯:如果传感器支持SPI,优先用SPI。为什么?因为光流数据需要高频率更新,I2C在高速下容易丢包。我在一个项目中用过I2C,结果无人机悬停时老漂移,换成SPI后问题就解决了。

在PX4中配置总线,你需要修改board_config.txtdefault.cfg文件。以Pixhawk 4为例:

# I2C配置
CONFIG_I2C1=y
CONFIG_I2C1_FREQ=400000

# SPI配置
CONFIG_SPI1=y
CONFIG_SPI1_FREQ=10000000

小提示:I2C总线上可以挂多个设备,但地址不能冲突。SPI每个设备需要独立的片选信号(CS),别搞混了。

1.2 光流传感器参数:SENS_FLOW_ROT与SENS_FLOW_MAXHGT

这两个参数,说白了就是告诉飞控:传感器装歪了多少度?最高能飞多高?

SENS_FLOW_ROT:传感器安装旋转角

  • 单位:度(0-360°)
  • 默认值:0(正装)
  • 常见值:0、90、180、270

我记得有一次,客户说无人机悬停时总往左偏。我检查了半天,最后发现是传感器装反了——SENS_FLOW_ROT设成了0,实际是180度。改过来后,一切正常。

SENS_FLOW_MAXHGT:最大有效高度

  • 单位:米
  • 默认值:3.0
  • 范围:0.5 - 10.0

为什么会有限制?因为光流传感器靠图像纹理计算位移。飞得太高,地面纹理看不清,数据就不可靠了。我建议室内飞行设2-3米,室外可以放宽到5米。

警告:千万别把SENS_FLOW_MAXHGT设得太大。我曾经设到10米,结果无人机在8米高度时数据跳变,差点炸机。安全第一!

1.3 传感器校准流程:让飞控“认识”你的传感器

校准,说白了就是让飞控知道传感器的“脾气”。每个传感器都有个体差异,不校准就用,数据肯定不准。

校准步骤:

  1. 水平放置:把无人机放在水平桌面上,传感器朝下
  2. 启动校准:在QGroundControl中进入“传感器校准”页面
  3. 选择光流:点击“Flow Sensor”按钮
  4. 等待完成:系统会自动采集数据,计算偏移量
  5. 验证结果:检查校准后的参数是否合理

我曾经踩过的坑:校准时光线太暗,导致传感器采集不到足够纹理。结果校准出来的偏移量全是错的。后来我加了个补光灯,问题就解决了。记住:校准环境要和实际飞行环境尽量一致。

校准完成后,你可以用param show SENS_FLOW_*命令查看参数:

# 查看光流相关参数
param show SENS_FLOW_*
# 输出示例:
# SENS_FLOW_ROT: 0
# SENS_FLOW_MAXHGT: 3.0
# SENS_FLOW_CAL_X: 0.02
# SENS_FLOW_CAL_Y: -0.01

1.4 数据流验证:uORB消息的“体检”

校准完了,怎么知道数据对不对?这就需要看uORB消息了。uORB是PX4内部的消息总线,所有传感器数据都通过它传递。

关键uORB消息:

消息名称 说明 关键字段
sensor_flow 光流原始数据 velocity_x, velocity_y, quality
vehicle_optical_flow 融合后的光流数据 velocity_body, position_body
vehicle_attitude 姿态数据(用于补偿) roll, pitch, yaw

验证数据流,我一般用listener命令:

# 监听光流数据
listener sensor_flow 5
# 输出示例:
# sensor_flow:
#   timestamp: 123456789
#   velocity_x: 0.12
#   velocity_y: -0.05
#   quality: 85

我的验证技巧:用手轻轻移动无人机,观察velocity_x和velocity_y的变化。如果数值随移动方向变化,说明数据流正常。如果数值乱跳,检查传感器安装和校准。

你还可以用uorb top命令查看消息频率:

# 查看消息发布频率
uorb top sensor_flow
# 输出示例:
# sensor_flow: 50 Hz (20 ms)

正常光流传感器应该以50-100Hz的频率发布数据。如果频率低于30Hz,说明总线配置有问题,或者传感器本身性能不足。

总结一下:光流传感器驱动与配置,核心就是三件事——选对总线、设对参数、校好传感器。每一步都马虎不得。我在项目中见过太多因为配置不当导致的“玄学”问题,其实都是基础没打牢。

光流传感器驱动与配置知识体系 光流传感器驱动 I2C/SPI总线配置 传感器参数设置 传感器校准流程 I2C配置 SPI配置 SENS_FLOW_ROT SENS_FLOW_MAXHGT 校准步骤 数据验证 uORB消息验证 → 数据流正常

好了,这一章的内容就到这里。光流传感器的驱动和配置,说白了就是打好地基。地基稳了,后面的避障、定位才能玩得转。

专注资料整理