【ROS2】驱动开发-雷达篇
雷达(Radar/Lidar)模块驱动,因为数据接口简单,低复杂度,在 ROS2 中常也是 直接发送Topic 模式的驱动。
1. 什么是雷达
雷达运行的电子原理与声波反射原理非常相似。如我们超声波章节介绍的那样,当你朝着山谷方向喊叫时,会听到回声。若已知声音在空气中的传播速度,便能估算出物体的距离和大致方向。只要知晓声速,便可将回声返回所需时间大致换算为距离。

如图所示,雷达运用电磁能脉冲的原理与此极为相似。射频能量向反射物体发射并被其反射,其中一小部分能量会返回雷达装置。这种返回的能量被称为回波,与声学术语完全一致。雷达装置通过回波来确定反射物体的方位和距离。
雷达(RADAR)一词是由"无线电探测与测距"(RAdio Detection And Ranging)英文首字母缩略而成。该术语于1940年11月由美国海军中校塞缪尔·M·塔克与F·R·弗斯正式创制,1943年经二战同盟国协商通过后,在国际范围内获得普遍认可。
雷达指通过反射电磁波来探测物体位置的电子设备。在某些条件下,雷达系统可测量目标的方位、高度、距离、航向及速度。所用电磁波频率不受黑暗影响,并能穿透雾霭云层,使得雷达系统能够定位因距离遥远、光线昏暗或天气恶劣而肉眼无法辨识的飞机、船舶等障碍物。(由于采用电磁波工作机制,雷达能在任何条件下正常运行。)
现代雷达从目标回波信号中获取的信息远不止测距数据,但通过测量延迟时间计算距离仍是其核心功能之一。
1.1 雷达系统基本构成
下图展示了初级雷达装置的工作原理。雷达天线向目标发射微波信号,该信号经目标反射后由接收装置捕获。接收天线采集到的电信号称为回波或返回信号。雷达信号由大功率发射器产生,并由高灵敏度接收器进行接收。

1.2 脉冲 / Time-of-Flight (ToF) — 最直观的方法
原理:发射一短脉冲,测量脉冲发出到回波到达的往返时间 t。距离 R 为往返时间的一半乘以传播速度(电磁波近似光速 c):

优缺点:实现简单,但高精度 ToF 需要很高的时钟分辨率(纳秒级),且脉冲压缩和匹配滤波常用于提升距离分辨率与灵敏度。
1.3 FMCW(调频连续波)— 实际毫米波雷达常用
调频连续波雷达因其独特优势成为当前最主流技术方案。FMCW 雷达(调频连续波雷达)与传统的脉冲雷达最大的不同是,它持续发射能量,而不是间歇发射短脉冲。因此,不需要高峰值功率的脉冲放大器;平均功率更稳定,接收机可以同步接收反射信号,适合短距与中距探测(如车载毫米波雷达)。

所谓“锯齿状”指的是发射波的频率随时间线性变化(chirp),如下图所示:
- 红色线条 —— 发射信号(Transmit Signal)
- 红色线表示发射波的频率随时间的线性变化:

- 调频斜率为:

- 这就是所谓的 “锯齿波(sawtooth chirp)” —— 每一个上升段都是一次调频周期。
- 红色线表示发射波的频率随时间的线性变化:
- 蓝色线条 —— 回波信号(Received Signal)
蓝色线代表从目标反射回来的信号,其波形与发射波完全相同,但存在时间延迟 τ:

由于存在延迟,蓝线相对红线向右平移。这意味着当回波返回时,其频率比当前发射频率略低。 - 混频(multiply)
- 在雷达发送信号的同时,它 保存一份自己刚刚发射出去的波形副本。
- 当回波回来时,它把**“接收到的波**”与“自己发射的那份副本”做混频(multiply)

经过混频得到的低频信号频率 fb(这应该是一段复杂的数学推导):
fb= S * τ
我们知道信号传播时间与距离的关系:
#根据上一章节推导的公式
R= (c * τ)/2 =>
τ = 2R/c
#代入上式得
fb= S*(2R/c) => R= (c*fb)/(2*S)
也就是说,混频的主要目的是把 微秒级别的时间延迟,转换成 几十 kHz 的可测频率,这样就可以用常规电子设备直接测距。
FMCW 测速原理
如你所见,这些波完全不同。
- 橙色的波是雷达发射的信号。
- 顶部的蓝色波: 是针对 靠近 雷达的车辆 反射回来的波——波长变短。
- 底部的蓝色波: 是针对 远离 雷达的车辆 反射回来的波——波长变长。
通过计算频率的偏移,我们就能确定车辆的速度和运动方向:这就是所谓的 多普勒效应。

我们知道:
- (f_D) —— 频率偏移(已测量,细节暂略)
- (lambda) —— 波长
1.4 激光雷达(LiDAR, Light Detection and Ranging)
激光雷达(LiDAR, Light Detection and Ranging)是一种利用激光脉冲探测目标位置的传感器。它与雷达(RADAR)原理类似,但使用光波(通常是红外或可见光),波长很短,精度更高。基本工作流程:
- 发射激光脉冲
- 一般是短脉冲或者调频连续光(FMCW-LiDAR)
- 激光遇到目标反射回传
- 接收光信号
- 接收器捕捉回波光子
- 测量时间或相位差
- 通过脉冲飞行时间或相位差计算距离
其测距原理 & 测速原理 ,这里不再描述。
2. Radar和Lidar 的区别
| 对比项目 | Radar(雷达) | LiDAR(激光雷达) |
|---|---|---|
| 工作原理 | 发射电磁波(微波/毫米波),接收反射波并计算距离与速度 | 发射激光(可见光/红外),接收反射光并计算距离与形状 |
| 波长范围 | 毫米级(mm-wave,24GHz、77GHz 等) | 纳米级(光波,905nm、1550nm 等) |
| 测距方式 | 飞行时间或调频连续波(FMCW) | 飞行时间(ToF)或相位差测距 |
| 测速方式 | 多普勒效应(频率偏移) | 多普勒效应或多帧距离变化 |
| 测距精度 | 厘米~米级 | 毫米~厘米级 |
| 角分辨率 | 低(需阵列天线提升) | 高(可直接生成高密度点云) |
| 探测距离 | 中远距离(数百米~公里) | 近中距离(几十~几百米) |
| 抗干扰能力 | 强(可穿透雾、雨、尘) | 弱(易受雨雾、阳光、反射率影响) |
| 对目标反射率依赖 | 低(几乎任何物体都可反射) | 高(暗色或吸光物体难探测) |
| 速度测量能力 | 优秀(天然支持多普勒测速) | 一般(需算法估计或频移检测) |
| 数据类型 | 距离 + 速度(二维信息) | 高精度三维点云(3D 信息) |
| 计算复杂度 | 低 | 高(需点云重建和滤波) |
| 成本与体积 | 较低、结构简单 | 较高、光学机械结构复杂 |
| 典型应用 | 汽车自适应巡航、碰撞预警、物位检测、测速雷达 | 自动驾驶3D建图、环境识别、无人机避障、测绘 |
| 优点总结 | 成本低、抗干扰强、测速准 | 分辨率高、建模精、测距精度高 |
| 缺点总结 | 分辨率低、无法生成精细3D图像 | 易受天气影响、成本高 |
- Radar:擅长“看得远、看得稳、测得准(速度)”,但画面分辨率低。
- LiDAR:擅长“看得清、看得细、建模精”,但怕天气、成本高。
3. 超声波模块 和雷达模块的区别
| 方面 | 超声波传感器(Ultrasonic Sensor) | 雷达传感器(Radar Sensor) |
|---|---|---|
| 工作原理 | 利用声波(通常 20 kHz ~ 40 kHz)发射和回波时间测距(Time-of-Flight,ToF)。传感器发射超声波脉冲,碰到物体后反射回传感器,通过计算声波传播时间求得距离。 | 利用电磁波(微波或毫米波,频率 24 GHz、77 GHz、或 79 GHz 等)发射和回波频移测距。通过发射波与回波的时延或多普勒频移,计算目标距离和相对速度。 |
| 测量类型 | 主要测量距离(绝对距离),部分高端模块可测速度但不常见。 | 可测距离和速度(相对运动),多普适合动态目标检测。 |
| 测量精度 | 精度一般在 ±1~3 mm(近距离),有效测量范围约 2 cm ~ 4 m。 | 精度受波长和信号处理影响,距离精度通常 1~10 cm,速度精度可达 cm/s 级别。 |
| 测量范围 | 短至中距离,通常 2~400 cm;受声波衰减影响,远距离测量困难。 | 中到远距离,典型汽车毫米波雷达可达 200 m 以上。 |
| 分辨率 / 波束宽度 | 波束较宽(一般 15° ~ 30°),容易受旁边障碍物干扰。 | 波束窄(几度到十几度可调),可分辨多个目标,抗干扰能力强。 |
| 对环境影响 | 对空气温度、湿度敏感;雨、风、软质物体(布料、泡沫)反射差,可能导致测量误差。 | 对气象环境适应性好(雨、雾、灰尘影响小);对金属、硬质物体反射效果最佳。 |
| 响应速度 | 中低速,适合静态或慢速目标。 | 高速动态目标检测能力强,适合车辆、无人机等高速场景。 |
| 硬件成本 | 低成本,常用于教育、机器人避障、简单测距。 | 高成本,常用于汽车 ADAS(辅助驾驶)、无人驾驶、工业检测。 |
| 典型应用 | 机器人避障、液位测量、物体存在检测、自动门开关、停车辅助低速探测。 | 汽车雷达(自适应巡航、盲点监测)、无人驾驶环境感知、工业物体测速、无人机避障。 |
| 接口与 ROS 使用 | 常通过 GPIO/ADC 接口连接 MCU/Raspberry Pi,ROS 中常通过 /ultrasonic/distance、/ultrasonic/velocity topic 发布。 | 通常通过 CAN 总线、UART、USB 或以太网连接,ROS 中常通过 /radar/objects、/radar/velocity 等 topic 或自定义消息发布。 |
雷达理论上能检测 1 m 内障碍物,但精度、盲区、最小测距限制都让它不如超声波直观可靠。因此,常见做法是 1 m 内靠超声波,1 m 以上靠雷达。
4. IWR1443 Redar 模块
WR1443 器件是一款基于 FMCW 雷达技术 的集成单芯片毫米波传感器,
可在 76–81 GHz 频段 工作,支持 高达 4 GHz 的连续调频(chirp)带宽。该芯片集成了 3 发射天线(TX)与 4 接收天线(RX) 的单片系统。其系统结构图如下:

雷达模块的原理相对复杂,我们只是简单地描述下,其基本工作原理如下:
- 1. 配置阶段(Configuration)
- 外部主机(如 MCU、PC)通过 UART/SPI 发送配置命令,设置参数包括:
- 起始频率(Start Frequency)
- 调频带宽(Bandwidth)
- Chirp 时长
- Chirp 数量与 Frame 周期
- 采样率、ADC 通道数、输出格式等
- 外部主机(如 MCU、PC)通过 UART/SPI 发送配置命令,设置参数包括:
- 2. 触发阶段(Trigger)
通过软件命令或硬件引脚(如 SYNC_IN)触发一次雷达帧。雷达开始发射 FMCW 信号(一帧通长包含多个chirp 波)。 - 3. 信号采集(Signal Acquisition)
回波信号经过混频,与本地发射副本相乘,得到 beat 信号,再由 ADC 数字化。 - 4.信号处理(Signal Processing)
硬件加速器或 DSP 执行:- 1D FFT:得到目标距离(Range)
- 2D FFT:叠加多个 chirp,得到速度信息(Doppler)
- CFAR 检测:自动检测目标峰值
- 角度估计(可选):根据多天线相位差求出方位角
- 5. 结果输出(Output)
结果通过 UART 或 SPI 输出,包括目标距离、速度、角度、功率等信息。
5. Redar/Lidar 驱动需要的接口
不同的Redar/Lidar 厂商,根据自己芯片,会出现不同的接口和数据结构,我们给出一些必要的常见接口,和数据类型。
[Radar Node]
├── Publishers
│ ├─ /radar/pointcloud (PointCloud2) #输出雷达测得的点云数据,包括距离、角度和回波强度。
├── Services
│ ├─ /radar/start #启动雷达帧采集
│ ├─ /radar/stop # 停止雷达采集。
│ ├─ /radar/get_status #查询雷达工作状态(是否在线、采集正常、故障标志)。
├── Parameters
│ ├─ chirp_config #定义 chirp 信号参数(频率、带宽等),用于测距和测速。
│ ├─ frame_config # 定义一帧中 chirp 数量和帧率,用于速度估计和数据采集控制。
5.1 pointcloud 详细介绍(2D/3D雷达)
sensor_msgs/PointCloud 是 ROS(ROS1/ROS2 都可用)中 二维/三维点云的旧版消息类型,主要用于表示一个采样的点集合,每个点包含空间坐标,可附加若干通道信息(如强度)。
消息结构如下:
sensor_msgs/PointCloud
├─ header
│ ├─ seq # 消息序号
│ ├─ stamp # 时间戳
│ └─ frame_id # 坐标系
├─ points[] # 点列表,每个点是 geometry_msgs/Point32
│ ├─ x
│ ├─ y
│ └─ z
└─ channels[] # 附加信息数组
├─ name # 通道名称,如 "intensity"
└─ values[] # 对应每个点的值
在ROS2 中, LiDAR 由于精度高,主要用于定位/建图/避障。Radar可测速、抗干扰强、用于运动目标检测和跟踪。
我们以LiDAR 为例(主要测试距离),针对PointCloud 数据结构,主要关注points 下x, y, z, 其它可以不填。
雷达一般输出的原始数据主要有以下几类:
| 数据 | 说明 |
|---|---|
r | 目标到雷达的径向距离(米) |
θ | 水平方向角度(Azimuth, rad/°) |
φ | 垂直方向角度(Elevation, rad/°),某些平面雷达没有 |
v | 多普勒速度(m/s) |
intensity | 雷达回波强度(可选) |
2D 雷达(平面,只有水平角 θ)
假设雷达安装在水平面,Z 方向为 0:

3D 雷达(有水平角 θ 和俯仰角 φ)
如果雷达是三维的,每个点有水平角 θ 和垂直角 φ(俯仰角):

- φ = 0 → 与雷达水平面平行
- φ > 0 → 高于水平面
- φ < 0 → 低于水平面
给出伪代码如下:
for r, theta, phi, v, intensity in radar_points:
x = r * math.cos(phi) * math.cos(theta)
y = r * math.cos(phi) * math.sin(theta)
z = r * math.sin(phi)
point_cloud.append((x, y, z, intensity, v))
5.2 sensor_msgs/LaserScan详细介绍(2D 雷达)
sensor_msgs/LaserScan 是 ROS(机器人操作系统)中用于表示二维激光雷达(2D LiDAR)扫描数据的标准消息类型。一般发布的topic 为**/scan**。
数据格式如下:
std_msgs/Header header
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities
字段介绍如下:
| 字段名 | 类型 | 含义 | 举例 |
|---|---|---|---|
header | std_msgs/Header | 包含时间戳和坐标系信息(通常是雷达的坐标系 laser_frame) | header.frame_id = "laser_frame" |
angle_min | float32 | 扫描的起始角度(弧度) | -1.57 → -90° |
angle_max | float32 | 扫描的结束角度(弧度) | +1.57 → +90° |
angle_increment | float32 | 每两束激光之间的角度间隔 | 0.00436 → 0.25° |
time_increment | float32 | 相邻测量之间的时间间隔(秒) | 通常非常小(ms级) |
scan_time | float32 | 完成一帧扫描所需时间(秒) | 例如 0.033s(30Hz 扫描) |
range_min | float32 | 雷达可测的最小距离(米) | 0.12 |
range_max | float32 | 雷达可测的最大距离(米) | 3.5 |
ranges[] | float32[] | 每束激光的测距结果(单位:米) | 长度 = (angle_max - angle_min) / angle_increment |
intensities[] | float32[] | 每束激光的强度值(可选) | 一些雷达没有此字段 |
5.3 pointcloud2 详细介绍(3D 雷达)
sensor_msgs/PointCloud2 是 ROS/ROS2 中 三维点云数据的标准消息类型,相比旧版 PointCloud,它具有以下特点:
- 数据结构统一、高效,可支持大规模点云
- 支持自定义字段(如 intensity、velocity、id 等)
- 可存储稠密或稀疏点云
ROS2 推荐在雷达和 LiDAR 点云发布时使用 PointCloud2。
消息结构如下:
sensor_msgs/PointCloud2
├─ header
│ ├─ seq # 消息序号
│ ├─ stamp # 时间戳
│ └─ frame_id # 坐标系
├─ height # 行数(通常 1,表示非图像化点云)
├─ width # 每行点数
├─ fields[] # 点云每个字段描述
│ ├─ name # 字段名称,例如 x, y, z, intensity, velocity
│ ├─ offset # 字段在每个点字节结构中的偏移
│ ├─ datatype # 数据类型(FLOAT32, UINT32 等)
│ └─ count # 每个点该字段占几个值(通常 1)
├─ is_bigendian # 数据字节序
├─ point_step # 每个点占字节数
├─ row_step # 每行占字节数
├─ is_dense # True = 所有点有效,False = 存在无效点
└─ data[] # 连续存储的点数据字节数组
给出python 填写的伪代码:
pc2 = PointCloud2()
....
# 点数
pc2.height = 1
pc2.width = len(radar_points)
# 定义字段
pc2.fields = [
PointField('x', 0, PointField.FLOAT32, 1),
PointField('y', 4, PointField.FLOAT32, 1),
PointField('z', 8, PointField.FLOAT32, 1),
PointField('intensity', 12, PointField.FLOAT32, 1),
PointField('velocity', 16, PointField.FLOAT32, 1)
]
pc2.is_bigendian = False
pc2.point_step = 20 # 每个点 5 个字段,每个字段 4 字节
pc2.row_step = pc2.point_step * pc2.width
pc2.is_dense = True
data_bytes = []
for pt in radar_points:
r, theta, phi, intensity, velocity = pt
x = r * math.cos(phi) * math.cos(theta)
y = r * math.cos(phi) * math.sin(theta)
z = r * math.sin(phi)
data_bytes.append(struct.pack('fffff', x, y, z, intensity, velocity))
pc2.data = b''.join(data_bytes)
至此,我们就完成了雷达原理 & 接入ROS2的原理性阐述。
更多推荐
所有评论(0)