雷达(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 通道数、输出格式等
  • 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

字段介绍如下:

字段名类型含义举例
headerstd_msgs/Header包含时间戳和坐标系信息(通常是雷达的坐标系 laser_frame)header.frame_id = "laser_frame"
angle_minfloat32扫描的起始角度(弧度)-1.57 → -90°
angle_maxfloat32扫描的结束角度(弧度)+1.57 → +90°
angle_incrementfloat32每两束激光之间的角度间隔0.00436 → 0.25°
time_incrementfloat32相邻测量之间的时间间隔(秒)通常非常小(ms级)
scan_timefloat32完成一帧扫描所需时间(秒)例如 0.033s(30Hz 扫描)
range_minfloat32雷达可测的最小距离(米)0.12
range_maxfloat32雷达可测的最大距离(米)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的原理性阐述。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐