3. 视觉感知硬件与数据链路
无人飞行器视觉感知系统的性能上限,往往在硬件选型与数据链路设计阶段就已经被决定。算法可以迭代,但相机、镜头、同步方式、机载算力与数据通路一旦确定,后续能优化的空间就非常有限。本节围绕“看得清、对得准、传得回、算得动”四个环节,梳理从传感器到ROS/ROS2节点的完整链路。
一、相机类型与选型依据
无人机视觉常用的相机可分为三类。第一类是卷帘快门(Rolling Shutter)CMOS相机,逐行曝光,成本低、功耗小,适合悬停或低速飞行下的建图与识别;但高速运动或强振动时会产生“果冻效应”,导致几何畸变。第二类是全局快门(Global Shutter)相机,所有像素同时曝光,适合高速飞行、视觉里程计、动态目标跟踪等对几何一致性要求高的场景。第三类是事件相机(Event Camera),只输出亮度变化事件,动态范围极高、延迟极低,适合高动态、强光照变化环境,但数据格式与传统图像差异大,算法生态尚不成熟。
选型时需重点权衡以下参数:分辨率与帧率的乘积决定数据带宽;像元尺寸影响低照度灵敏度;快门类型决定运动场景适用性;接口类型(USB3.0、GigE、MIPI CSI-2)决定传输距离与带宽上限;是否支持硬件触发与时间戳输出,直接决定多相机同步能力。例如,一台用于室内视觉里程计的四旋翼,若飞行速度约2 m/s、相机距地面1.5 m,选择1280×720@60 fps的全局快门相机通常比1920×1080@30 fps的卷帘快门相机更合适,因为前者在运动模糊与几何一致性上更可控。
二、镜头畸变与标定
广角镜头能提供更大视场,但会引入显著的径向畸变与切向畸变。径向畸变使直线向外弯曲(桶形)或向内收缩(枕形),切向畸变则源于镜头与成像平面不平行。畸变不校正,会直接破坏极线约束、三角化精度和视觉里程计的尺度一致性。
工程上通常采用张正友标定法,使用棋盘格或圆点标定板,采集15~30张不同姿态图像,通过OpenCV的calibrateCamera求解内参矩阵与畸变系数。标定结果一般包含焦距fx, fy、主点cx, cy以及畸变系数k1, k2, p1, p2, k3。对于鱼眼镜头,则使用fisheye::calibrate与等距投影模型。标定后,可通过initUndistortRectifyMap生成映射表,在图像采集线程中实时去畸变,避免在每个算法节点重复计算。
三、曝光与多传感器同步
曝光控制直接影响图像质量与算法稳定性。自动曝光(AE)在光照均匀时表现良好,但在逆光、地面反光或快速明暗切换时容易震荡。对于视觉里程计与SLAM,通常建议锁定曝光与增益,避免帧间亮度突变导致特征匹配失败。若必须使用AE,应限制曝光时间上限,防止运动模糊。
多传感器同步分为硬同步与软同步。硬同步通过飞控或同步板输出PPS/触发信号,同时触发相机曝光与IMU采样,时间对齐精度可达微秒级;软同步则依赖各传感器自身时间戳,通过ROS的message_filters做近似时间对齐,精度受系统调度与传输延迟影响,通常在毫秒级。对于VIO(视觉惯性里程计),推荐硬同步;对于慢速建图或目标检测,软同步通常足够。
四、图传与机载计算单元
图传链路承担两类任务:一是将压缩后的视频流回传地面站用于监控;二是传输遥测与指令。模拟图传延迟低但画质差、无压缩;数字图传(如5.8 GHz OFDM或4G/5G)画质好、可加密,但延迟通常在80~200 ms。若视觉算法在机载端闭环,图传仅用于监控,则延迟要求可放宽;若采用地面站算力回传控制指令,则必须把图传延迟纳入控制周期预算。
机载计算单元的选择取决于算法复杂度与功耗预算。典型方案包括:NVIDIA Jetson Orin NX(约100 TOPS,功耗10~25 W)、Jetson Xavier NX(约21 TOPS,功耗10~20 W)、瑞芯微RK3588(约6 TOPS,功耗5~10 W)以及高通RB5。对于运行VIO+轻量目标检测的机型,Xavier NX或Orin NX是常见选择;若仅运行光流与稀疏特征跟踪,RK3588即可满足。选型时需同时核对相机接口数量、MIPI CSI通道数、USB带宽与散热条件。
五、ROS/ROS2数据流搭建
在ROS/ROS2中,视觉链路通常拆分为多个节点,以降低耦合、便于替换。一个可用的最小数据流如下:
# 终端1:启动相机驱动,发布 /image_raw 与 /camera_info
ros2 launch usb_cam usb_cam.launch.py
# 终端2:去畸变节点,订阅 /image_raw,发布 /image_rect
ros2 run image_proc rectify_node
# 终端3:VIO节点,订阅 /image_rect 与 /imu/data,发布 /odom
ros2 run vins_estimator vins_node
# 终端4:目标检测节点,订阅 /image_rect,发布 /objects
ros2 run yolov5_ros detect_node
# 终端5:mavros,订阅 /odom 与 /objects,发布 /mavros/setpoint_position/local
ros2 launch mavros px4.launch
关键配置点有三处。第一,时间戳来源:相机驱动应使用硬件时间戳而非系统时间,否则与IMU对齐误差会显著增大。第二,QoS策略:图像话题数据量大,建议使用SensorDataQoS(Best Effort),避免因重传导致延迟累积;控制指令话题则应使用Reliable。第三,坐标系与TF:需建立camera_link → base_link → map的变换链,VIO输出的位姿才能被飞控正确使用。
ros2 topic delay观察);若检测节点CPU占用过高,检查是否在每帧都执行了去畸变,应改为在采集端一次性完成并发布/image_rect;若图传画面卡顿但机载算法正常,通常是图传带宽不足或编码参数过高,可降低分辨率或改用H.265。整条链路的设计原则是:采集端做重活,算法端做轻活,控制端做快活。去畸变、压缩、时间戳对齐尽量前移;算法节点只处理已校正、已同步的数据;控制指令走最短路径、最高优先级。这样即使某一环节出现延迟,也不会级联放大到飞行控制上。