第四章:传感器集成:LiDAR驱动配置(Velodyne/Ouster)、相机驱动(USB/Camera)、IMU/GNSS驱动集成
各位同学,欢迎来到传感器集成这一章。说实话,在Autoware整个系统里,传感器驱动这块是最容易出幺蛾子的地方。我见过太多项目,算法调得再好,结果传感器数据没进来,或者时间戳对不上,整个系统直接崩掉。今天我们就来把这几个核心传感器——LiDAR、相机、IMU/GNSS——的驱动配置讲透。
核心观点:传感器驱动的本质,就是把硬件原始数据转换成ROS2标准消息,同时保证时间同步。这一步做不好,后面所有感知、定位、规划都是空中楼阁。
4.1 LiDAR驱动配置:Velodyne与Ouster
LiDAR是自动驾驶的“眼睛”,但不同厂家的驱动方式差别挺大。我个人习惯先把驱动包拉下来,再根据实际硬件型号做参数调整。
4.1.1 Velodyne驱动
Velodyne的驱动在ROS2里叫velodyne_driver。嗯,这里要注意,它依赖velodyne_msgs和velodyne_pointcloud两个包。安装方式很简单:
sudo apt install ros-humble-velodyne
# 或者从源码编译
cd ~/ros2_ws/src
git clone https://github.com/ros-drivers/velodyne.git
cd ..
colcon build --packages-select velodyne
配置的关键在params.yaml文件。我遇到过最坑的事,就是有人把model参数写错了——VLP-16写成了HDL-32E,结果点云数据全是乱的。来看一个典型的配置:
# velodyne_params.yaml
velodyne_driver_node:
ros__parameters:
device_ip: "192.168.1.201" # LiDAR的IP地址
port: 2368 # 数据端口
model: "VLP16" # 型号:VLP16/HDL32E/HDL64E
rpm: 600 # 转速
frame_id: "velodyne" # 坐标系ID
scan_angle: 360.0 # 扫描角度范围
小技巧:如果你不确定LiDAR的IP,可以用sudo wireshark抓包,过滤UDP端口2368,很快就能看到数据源地址。我在现场调试时经常这么干。
4.1.2 Ouster驱动
Ouster的驱动相对新一些,官方提供了ouster-ros包。它的配置方式跟Velodyne不太一样——Ouster用的是JSON格式的配置文件。我个人觉得Ouster的驱动更现代化,但初次上手会有点懵。
# 安装Ouster驱动
cd ~/ros2_ws/src
git clone https://github.com/ouster-lidar/ouster-ros.git
cd ..
colcon build --packages-select ouster-ros
# 启动驱动
ros2 launch ouster_ros driver.launch.py \
sensor_hostname:=192.168.1.100 \
lidar_mode:=1024x10 \
timestamp_mode:=TIME_FROM_ROS_TIME \
udp_dest:=192.168.1.50
这里有个坑——lidar_mode参数。1024x10表示每帧1024个点,每秒10帧。如果你选错了模式,比如在OS1-64上用了128x20,数据量会暴增,CPU直接拉满。我曾经在项目里因为这个原因,导致整个系统延迟飙升到200ms。
警告:Ouster的timestamp_mode一定要跟你的系统时间同步方案匹配。如果你用PTP(精确时间协议),就设成TIME_FROM_PTP;如果用ROS时间,就设成TIME_FROM_ROS_TIME。混用会导致时间戳乱跳。
4.2 相机驱动配置:USB与Camera
相机驱动相对简单,但坑也不少。我主要讲两种常见情况:USB摄像头和工业相机(通过GigE或USB3 Vision)。
4.2.1 USB摄像头
ROS2里最常用的是usb_cam包。安装简单,但参数调优需要点经验。
sudo apt install ros-humble-usb-cam
# 启动
ros2 run usb_cam usb_cam_node_exe --ros-args -p video_device:=/dev/video0
配置参数时,我建议重点关注这几个:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| pixel_format | yuyv 或 mjpeg | mjpeg压缩率高,但解码耗CPU |
| image_width/height | 1280x720 | 别用1920x1080,带宽扛不住 |
| framerate | 30 | 30fps够用,再高意义不大 |
| camera_frame_id | camera_link | 跟TF树保持一致 |
避坑指南:我曾经在项目里用了一个廉价USB摄像头,结果发现/dev/video0设备节点经常被其他进程占用。解决方案是写一个udev规则,给摄像头固定一个符号链接,比如/dev/camera_front。这样不管插哪个USB口,设备名都不会变。
4.2.2 工业相机(以Basler为例)
工业相机驱动稍微复杂点。以Basler为例,需要安装pylon SDK和basler_ros2_driver。配置要点:
# 安装pylon SDK
sudo dpkg -i pylon_6.3.0.23157_linux-x86_64.deb
# 编译ROS2驱动
cd ~/ros2_ws/src
git clone https://github.com/basler/basler_ros2_driver.git
colcon build --packages-select basler_ros2_driver
配置参数时,Gain和ExposureTime是关键。我建议先让相机自动曝光,等场景稳定后再手动锁定参数。不然在隧道场景里,曝光值会剧烈变化,导致图像质量忽好忽坏。
4.3 IMU/GNSS驱动集成
IMU和GNSS是定位系统的核心。在Autoware里,它们通常一起使用,通过EKF(扩展卡尔曼滤波)融合。
4.3.1 IMU驱动
IMU驱动相对标准化。以常见的Xsens MTi系列为例:
# 安装xsens驱动
sudo apt install ros-humble-xsens-driver
# 启动
ros2 run xsens_driver xsens_driver_node \
--ros-args -p device:=/dev/ttyUSB0 \
-p baudrate:=115200 \
-p frame_id:=imu_link
这里有个关键点——IMU的坐标系。不同厂家的IMU坐标系定义不一样。比如Xsens是右手系(X前、Y左、Z上),但有些IMU是左手系。如果你不检查坐标系,融合出来的姿态会完全错误。我建议拿到IMU后,先做一次静态测试:把IMU平放,看加速度计输出是不是(0, 0, 9.8)。
警告:IMU的零偏(bias)一定要校准。很多新手直接拿原始数据用,结果积分出来的位置漂移得离谱。我习惯在启动时让车辆静止5秒,取这段时间的均值作为零偏补偿。
4.3.2 GNSS驱动
GNSS驱动以u-blox为例,使用ublox_gps包:
sudo apt install ros-humble-ublox-gps
# 配置参数
ros2 run ublox_gps ublox_gps_node \
--ros-args -p device:=/dev/ttyACM0 \
-p baudrate:=460800 \
-p frame_id:=gps_link \
-p gnss.measurement_rate:=10 \
-p gnss.nav_rate:=10
GNSS的measurement_rate和nav_rate要匹配。我见过有人设成测量率20Hz,导航率5Hz,结果数据乱套了。标准做法是两者一致,比如都设10Hz。
4.4 传感器时间同步
这是传感器集成里最容易被忽视的一环。说白了,如果LiDAR的扫描时间跟相机曝光时间对不上,融合出来的点云着色就是错的。
我推荐两种方案:
- 硬件同步:用PTP(IEEE 1588)或GPS的PPS信号。所有传感器都同步到同一个时钟源。这是最可靠的方式。
- 软件同步:用ROS2的
message_filters做近似时间同步。适合精度要求不高的场景。
# 软件同步示例
from message_filters import ApproximateTimeSynchronizer, Subscriber
lidar_sub = Subscriber(self, PointCloud2, "/velodyne_points")
camera_sub = Subscriber(self, Image, "/camera/image_raw")
ats = ApproximateTimeSynchronizer(
[lidar_sub, camera_sub],
queue_size=10,
slop=0.05 # 允许的时间偏差,单位秒
)
ats.registerCallback(self.sync_callback)
个人经验:软件同步的slop参数别设太大。我一般设0.05秒(50ms)。如果设成0.1秒,你会发现点云和图像对不上,尤其是车辆高速行驶时。
4.5 本章知识体系
下面这张图展示了传感器集成的整体架构。你可以看到,所有传感器数据最终都汇聚到ROS2的/sensing命名空间下,然后被感知和定位模块消费。
嗯,到这里传感器集成的内容就差不多了。记住一个原则:先让每个传感器单独跑通,再考虑同步和融合。别一上来就想搞大而全的系统,容易翻车。
最后提醒:所有传感器驱动启动后,记得用ros2 topic echo /sensing/xxx检查数据是否正常。我每次调试都会开三个终端,分别看LiDAR点云、相机图像和IMU数据,确认无误后再往下走。
可可精品资料库