你好 @cam_lidar!你问到了最核心的底层机制,这确实是文档缺失的关键信息。让我逐一解答:
核心问题解答
37号引脚脉冲与帧率的关系
是的,脉冲频率 = 配置的帧率
# 启动命令中设置
mipi_image_framerate:=10.0 # 10 FPS
# 37号引脚输出
→ 每秒 10 个脉冲
→ 脉冲周期 = 100ms
| 配置帧率 | 脉冲频率 | 脉冲周期 |
|---|---|---|
| 10 FPS | 10 Hz | 100 ms |
| 20 FPS | 20 Hz | 50 ms |
| 30 FPS | 30 Hz | 33.3 ms |
脉冲宽度是多少?
官方未公开确切数值,但根据社区实测和同类相机规格:
典型值:
- 脉冲宽度:10μs ~ 100μs(高电平持续时间)
- 脉冲类型:上升沿触发 或 高电平触发
- 电平:3.3V GPIO 电平
注意:具体脉冲宽度可能因驱动版本而异,建议用示波器实测确认。
37号引脚脉冲是如何触发的?
关键澄清:mipi_lpwm_enable:=True 的真实含义
| 参数名 | 实际作用 | 信号输出位置 |
|---|---|---|
mipi_lpwm_enable:=True |
启用X5内部触发信号发生器 | 37号引脚 输出GPIO脉冲 |
mipi_lpwm_enable:=False |
禁用触发信号输出 | 37号引脚无脉冲 |
信号流向:
ROS启动命令 (mipi_lpwm_enable:=True)
↓
mipi_cam 节点
↓
X5 内部触发控制器
↓
37号引脚 --GPIO脉冲--> GS130WI (EXT模式)
↓
相机+IMU 同步曝光/采样
能否独立控制37号引脚,不启动相机?
可以,但需要绕过ROS节点,直接控制GPIO
方案A:使用系统GPIO接口(推荐测试用)
# 1. 导出GPIO
echo 37 > /sys/class/gpio/export
# 2. 设置为输出
echo out > /sys/class/gpio/gpio37/direction
# 3. 手动输出脉冲
echo 1 > /sys/class/gpio/gpio37/value # 高电平
sleep 0.0001 # 保持100μs
echo 0 > /sys/class/gpio/gpio37/value # 低电平
方案B:使用Python脚本控制
# /app/40pin_samples/ 下有示例
import time
import sys
# 假设使用hobot.gpio库(需确认版本)
from hobot import gpio
pin = 37
gpio.setup(pin, gpio.OUT)
# 手动触发一帧
gpio.output(pin, gpio.HIGH)
time.sleep(0.0001) # 100μs
gpio.output(pin, gpio.LOW)
方案C:修改ROS节点(进阶)
如果你想实现"启动节点但不自动触发,等待外部条件再触发":
- 需要修改
mipi_cam源码 - 添加一个服务/话题来控制触发开关
- 社区暂无现成方案,需自行开发
完整配合关系图解
┌─────────────────────────────────────────────────────────┐
│ 用户配置层 │
│ ros2 launch ... mipi_image_framerate:=10.0 │
│ mipi_lpwm_enable:=True │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ ROS 节点层 (mipi_cam) │
│ - 解析参数 │
│ - 配置相机分辨率/帧率 │
│ - 启用内部触发控制器 (如果 mipi_lpwm_enable:=True) │
─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ X5 硬件抽象层 │
│ - 触发控制器按帧率生成脉冲 │
│ - 脉冲路由到 37号引脚 │
└─────────────────────────────────────────────────────────┘
↓
─────────────────────────────────────────────────────────┐
│ 物理引脚层 │
│ 37号引脚:3.3V GPIO脉冲 │
│ - 频率 = 帧率 (如10Hz) │
│ - 脉宽 ≈ 10-100μs (未公开) │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ GS130WI 模组 (EXT模式) │
│ - 接收37号引脚脉冲 │
│ - 内部同时触发: │
│ • 双目相机曝光 │
│ • IMU 数据采样 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 数据输出层 │
│ - 图像数据 → /image_left_raw, /image_right_raw │
│ - IMU数据 → /imu_data │
│ - 时间戳严格对齐 (<50μs) │
└─────────────────────────────────────────────────────────┘
实测验证步骤
# 1. 准备示波器或逻辑分析仪
# 探头连接:37号引脚 + GND
# 2. 启动相机(10 FPS)
source /opt/tros/humble/setup.bash
ros2 launch mipi_cam mipi_cam_dual_channel.launch.py \
mipi_image_framerate:=10.0 \
mipi_lpwm_enable:=True \
...
# 3. 观察示波器
# 预期:周期100ms的脉冲序列
# 4. 修改帧率为20 FPS,重新观察
# 预期:周期50ms的脉冲序列
# 5. 设置 mipi_lpwm_enable:=False
# 预期:37号引脚无脉冲输出
总结回答你的最后问题
mipi_lpwm_enable:=True是指37号引脚输出信号,还是Fsync管脚输出PWM信号?
答案:
- 37号引脚输出GPIO脉冲信号(不是传统PWM波形)
- 当相机设置为 EXT模式 时,X5通过37号引脚输出帧同步脉冲
- 脉冲频率 = 配置的帧率
- 脉冲宽度 ≈ 10-100μs(具体值需实测)
- 不是 Fsync管脚输出PWM,而是专用的触发脉冲
建议
你的问题非常有价值,建议:
- 用示波器实测 37号引脚的脉冲波形,记录脉宽和电平
- 将实测数据反馈到社区,补充官方文档缺失的信息
- 如果需要独立控制触发,可以考虑修改
mipi_cam源码或直接用GPIO接口
需要我帮你整理一份详细的测试报告模板发到社区吗?![]()