1、产品介绍
1.1 产品结构
Airy 结构图如图所示,M3螺钉,航空插头,弧形防护罩:

注意事项 :
1)本机接地方式:本雷达采用机壳与内部电路板共地设计。
2)安装环境建议:当安装环境中的设备外壳为浮地状态时,为确保设备正常工作并防止潜在干扰,建议通过非金属绝缘件或其他方式,使雷达外壳与设备外壳之间实现电气隔离。
1.2 FOV 分布
Airy 的 FOV 在水平方向的角度范围是 0 ~ 360°,在垂直方向的角度范围是 0~ 90°,角度间隔为约为 0.947°分布。96 路通道与真实的垂直角度对应关系如图:

Airy 因其设计架构及扫描时序限制,每秒约有 9 ms 时间无法接收点云,也就是每 10 帧点云中有 1 帧点云出现约 32°的点云缺口。该缺口的起始角度在量产固件上可配置,用户可根据实际需求配置在影响较小的位置处。实际工程中可以考虑通过判别点数量将残缺帧剔除,防止影响后面算法处理
1.3 参数规格


1.3.1 数据验算
转速与点频完美匹配
转速 600:结合帧率 10 Hz,这里的单位显然是 600 rpm(转/分钟),即每秒转 10 圈(600/60 = 10 rps),与帧率严格对应。
点频验算:上一轮得知水平角分辨率 0.4°,即每圈 900 个水平点;线数 96。
理论单圈点云:900 × 96 = 86,400 点。
理论每秒点数:86,400 × 10 Hz = 864,000 pts/s。
参数规格中给出的实际值是 856,320 pts/s,两者高度吻合
1.3.2 亮点分析
这几个参数暴露了它并非普通商用雷达,而是为严苛环境和复杂系统集成设计的:
防护等级 IP67 / IP6K9K :这是极其硬核的指标。IP67 代表完全防尘且可短时浸水;IP6K9K 代表能承受 80°C 高温、100 bar 高压水蒸气喷射(常用于洗车房或越野泥泞场景)。这意味着它是车规级耐候性产品。
时间同步 :GPS,PTP & gPTP:支持 gPTP(广义精确时间协议) 是汽车以太网(Automotive Ethernet)的标准,说明它原生适配 自动驾驶域控制器,能实现微秒级的多传感器时钟同步,绝非普通工控雷达可比。
体积重量:φ60mm × 63mm,重量仅 230g。在 96 线雷达里属于极轻量级,显然是给无人机(UAV)或轻量化机器人设计的吊舱式结构。
1.3.3 功率问题
产品功率 58 W ------这是最需要注意的"电老虎"参数!一台 128 线的旗舰车载雷达(如禾赛 AT128)功耗通常在 20W~30W 左右。这款 96 线雷达功耗高达 58W,几乎是同行的两倍。
供电压力 :车载 12V 系统需要提供近 5A 的持续电流,线束和电源模块必须单独加强。
散热噩梦 :仅有 60mm 直径的紧凑全金属外壳,内部发热量高达 58W,表面温升会非常明显。如果你的应用场景是无人机,58W 的功耗会大幅缩短续航时间(锂电池供电时,这相当于又挂载了一台小型无人机电机)。
猜测原因:极有可能是为了达到 260m 测距(尤其 10% 低反物体 30m),采用了高功率的激光发射器,以"功耗换探测能力"。
1.3.4 通讯与带宽问题
以太网传输速率 100 Base-TX:这是百兆以太网(100 Mbps)。
数据量计算:856,320 pts/s。假设每个点包含距离(2字节)+ 强度(1字节)+ 时间戳(4字节)+ 额外标志位,保守估计单点占 10~12 字节,数据流约 8.5~10 MB/s(约 80 Mbps)。
风险提示:100 Base-TX 的理论有效载荷极限约 90+ Mbps。带宽余量非常小(仅有 10%~20%)。实际使用中,若网络中有广播风暴或重传,极易导致数据丢包。强烈建议直连工控机,避免经过普通网络交换机。
1.4 接口说明

真实结构如下:

Airy 网络参数可配置,出厂默认采用固定 IP 和端口号模式:

把 电脑的 IP 设置为与产品同一网段上,例如192.168.1.x(x 的取值范围为 1 ~ 254),子网掩码为 255.255.255.0。未知产品网络配置信息,请连接产品并使用 Wireshark 抓取产品输出包进行分析。
1.5 产品坐标系
产品的坐标及旋转方向如图所示,关于激光雷达坐标原点数值以及 IMU
的外参,可以通过 SDK 或者 DIFOP 的对应字段获取。其它详细的协议内容参考产品手册中的内容:

1.6 Web端连接
连接激光雷达的电脑浏览器访问产品 IP 地址,这个改成192.168.1.202(默认 Device IP : 192.168.1.200)进入激光雷达 Web 首页,可以对雷达进行设置:

1.7 配套软件和开发包
1.7.1 配套软件
在 Airy 的数据检测上,可使用 Wireshark 和 tcp-dump 等免费工具获取原
始数据,而 RSView 可帮助用户更为便捷的实现对原始数据的可视化。
RSView 提供将 Airy 数据进行实时可视化的功能。RSView 也能回放保存为
".pcap"文件格式的数据,但是目前还不支持".pcapng"格式的文件。RSView 将 Airy 得到距离测量值显示为一个点。它能够支持多种自定义颜色来显示数据,例如反射强度、时间、距离、水平角度和激光线束序号。所显示的数据能够导出保存为".csv"格式,RSView 3.1.3 以后的版本支持导出".las"格式的数据。
RSView 支持在 Windows 64 位、Ubuntu 18.04 以上操作系统上运行。可从
Robosense 的官网(http://www.robosense.cn/resources)下载最新版本 RSView 软件压缩包。下载后,软件的解压路径请勿出现中文字符,软件无需安装,解压后运行可执行文件即可正常使用。
1.7.2 配套开发包
rslidar_sdk 是 ROS 平台下的驱动 SDK,请通过 github 上的 RoboSense 主页下载,或联系 RoboSense 获取。
- rslidar_sdk 依赖 rs_driver,后者是 RoboSense 的基本驱动。rs_driver 请从 github 平台下载;
- 如使用环境为 ROS2,rslidar_sdk 还依赖 rslidar_msg,这是 msg 定义文件。msg 文件请从 github 平台下载;
- 驱动 SDK 下载包内含丰富的使用指引,请在使用驱动 SDK 前,详细阅
读文件内的 README 文件及 doc 文件夹下的文档。
提示:
- SDK 获取地址:https://github.com/RoboSense-LiDAR/rsLiDAR_sdk
- rs_driver 获取地址:https://github.com/RoboSense-LiDAR/rs_driver
- msg 获取地址:https://github.com/RoboSense-LiDAR/rslidar_msg
上面3个工程角色如下:
| 目录 | 类比 | 干的活 |
|---|---|---|
| rs_driver | 摄像头驱动 | 把雷达吐出来的"乱码"翻译成"点云"------也就是一堆带 XYZ,坐标的点,告诉你"前方 5 米有堵墙"。这一步是硬核技术活。 |
| rslidar_sdk | 看图软件 | 光有点云没用,你还得能"看"它、用它。rslidar_sdk把点云包装成 ROS 节点,发布成话题,能用 rviz可视化、能录成 bag 回放。面向用户的好用工具。 |
| rslidar_msg | 图片格式(JPEG/PNG 标准) | 大家得约定"点云数据长什么样才能互相听懂"。这个包就是定义数据格式的字典,ROS2 编译时必须带着它,否则不认识这种数据。 |
- 只想看点云、做 ROS 开发 → 三个都要(ROS2)或前两个(ROS1)
- 不用 ROS,自己写 C++ 程序 → 只要 rs_driver 就够了
2、雷达数据采集
雷达数据采集在这里使用速腾的rsLiDAR_sdk开发包,此开发包运行在ROS2环境下,这里我打算在docker中构建ros2环境,并在docker中运行雷达数据采集程序。
2.1 docker 工程构建
dockerfile内容如下:
python
FROM registry.cn-hangzhou.aliyuncs.com/lx/ubuntu24_jazzy:v0.0.1
# 设置环境变量,避免交互式配置
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
# 更新软件源
RUN rm -f /etc/apt/sources.list.d/ros2-latest.list || true
RUN echo "deb [trusted=yes] http://mirrors.aliyun.com/ros2/ubuntu/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-aliyun.list
RUN apt update && apt install -y \
tzdata\
ntp\
net-tools \
vim \
openssh-server \
sudo \
build-essential \
graphviz \
graphviz-dev \
libpcl-dev \
python3-colcon-common-extensions \
python3-argcomplete \
python3-vcstool \
python3-venv \
python3-pip \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /root/code
# 在虚拟环境中安装open3d
# 创建虚拟环境lx 并安装open3d
RUN python3 -m venv /root/lx
ENV VIRTUAL_ENV=/root/lx
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN pip install -i https://mirrors.aliyun.com/pypi/simple catkin-pkg empy lark numpy opencv-python open3d
# ssh服务配置
RUN mkdir /var/run/sshd
ARG USERNAME=root
RUN echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
#USER $USERNAME
RUN echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
RUN echo "source /root/bolight/bin/activate" >> ~/.bashrc
RUN echo "export ROS_LOCALHOST_ONLY=1" >> ~/.bashrc
docker compose中配置如下:
python
services:
calib_lidar_server:
container_name: calib_lidar_deployer
build:
context: .
image: alg_base:v0.0.1
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- ./code:/root/code
- /etc/hosts:/etc/hosts
- /sys/class/net:/sys/class/net:ro
- /sys:/sys:ro
# command: sh -c "/root/code/script_run.sh && tail -f /dev/null"
command: sh -c "tail -f /dev/null"
environment:
- DISPLAY
- TZ=Asia/Shanghai
- CONTAINER_TIMEZONE=Asia/Shanghai
- NVIDIA_VISIBLE_DEVICES=all
tty: true
network_mode: "host"
ipc: host
devices:
- /dev/dri:/dev/dri
# runtime: nvidia
build.sh内容如下:
python
#/bin/bash
#允许任何客户端连接到当前用户的 X 服务器(图形显示服务)
xhost +
echo "检查镜像是否存在。"
cd alg_base
./build_image.sh
cd ..
docker compose up -d
build_image.sh内容如下:
python
#!/bin/bash
# 定义镜像名称和标签
IMAGE_NAME="alg_base"
IMAGE_TAG="v0.0.1"
DockerID=$(docker images -q $IMAGE_NAME:$IMAGE_TAG)
echo "Query Image ID:" $DockerID
IDcount=${#DockerID}
# 使用docker images命令查找镜像,并检查返回结果
if [ $IDcount -gt 0 ]; then
echo "镜像 $IMAGE_NAME:$IMAGE_TAG 存在。"
else
echo "镜像 $IMAGE_NAME:$IMAGE_TAG 不存在,准备构建镜像。"
docker build --no-cache -t $IMAGE_NAME:$IMAGE_TAG .
echo "镜像 $IMAGE_NAME:$IMAGE_TAG 构建完成。"
fi
执行build.sh构建镜像
2.2 工程配置
在code共享目录下,执行下面命令:
python
git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git
cd rslidar_sdk
git submodule update --init --recursive
cd ..
# 只需要rslidar_msg,不需要rslidar_driver(已经内置在sdk中)
git clone https://github.com/RoboSense-LiDAR/rslidar_msg
2.2.1 IP设置
在Web界面雷达参数如下,雷达IP是192.168.1.202,本机IP是192.168.1.200:

2.2.2 IMU设置
在 CMakeLists.txt里把 ENABLE_IMU_DATA_PARSE 从 OFF 改成 ON

IMU端口号设置,在config.yaml中设置imu_port设置为6682:

2.2.3 连接单个雷达时操作步骤
雷达发送的imu和点云数据话题如图所示,imu对应的topic是/rslidar_imu_data,雷达点云数据对应的topic是/rslidar_points:

在容器外(宿主机)构建容器,执行命令:
python
./build.sh
在容器内编译运行命令如下:
python
sudo apt-get install -y libpcap-dev
# 1. 进入 workspace
cd /root/code
# 2. source ROS2
source /opt/ros/jazzy/setup.bash
# 3. 编译(两个包一起,自动按依赖顺序)
colcon build --cmake-args -DENABLE_IMU_DATA_PARSE=ON
# 4. source 新环境
source install/setup.bash
# 5. 启动雷达节点 + rviz
ros2 launch rslidar_sdk start.py
新开终端验证:
source /opt/ros/jazzy/setup.bash
source /root/code/install/setup.bash
ros2 topic list # 查看话题
ros2 topic hz /rslidar_points # 点云频率
ros2 topic hz /rslidar_imu_data # IMU 频率
执行完ros2 launch rslidar_sdk start.py 弹出下面提示框:

勾选上Show unvisualizable topics后可以看到/rslidar_imu_data是灰色的,无法可视化。

查看这类数据的方法如下,实时打印:
python
ros2 topic echo /rslidar_imu_data
# 上面指令会显示所有数据,不利于观察,可以用下面指令放慢速度
# 限制输出速率(最简单)
ros2 topic echo /rslidar_imu_data --no-arr 2>&1 | watch -n 0.5 cat
# 或者用 head 只看前几条:
ros2 topic echo /rslidar_imu_data | head -n 100
# 只看一次
ros2 topic echo --once /rslidar_imu_data
# 抽样显示,每 10 条显示 1 条
ros2 topic echo /rslidar_imu_data | awk 'NR%70==1 || /^---$/'
# (IMU 一条消息约 7 行,70 行 ≈ 10 条,等于每 10 条显示一条) # 只关注某个字段
ros2 topic echo /rslidar_sdk/rslidar_imu_data/linear_acceleration --once
2.3 数据格式
2.3.1 IMU数据解析
用ros2 topic echo --once /rslidar_imu_data 采集一帧IMU数据,数据包内容如下:
python
header:
stamp:
sec: 103330
nanosec: 133410000
frame_id: rslidar
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
orientation_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
angular_velocity:
x: -0.007190534844994545
y: 0.003195793367922306
z: 0.000532632227987051
angular_velocity_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
linear_acceleration:
x: -0.0045166015625
y: -0.0592041015625
z: -0.9903564453125
linear_acceleration_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
字段逐项解释
header(标准消息头)
- stamp:时间戳,sec 是秒,nanosec 是纳秒部分
- frame_id: rslidar:坐标系名称,表示数据相对于雷达坐标系
orientation(姿态四元数)
表示 IMU 在 frame_id 坐标系下的朝向。你这帧 w=1.0 其他
0,说明驱动没真正输出姿态,只是填了个单位四元数(默认值)。RoboSense 这类雷达内置的是低精度IMU,不做姿态解算,所以 orientation 永远是默认值。
orientation_covariance、angular_velocity_covariance、linear_acceleration_covariance(协方差矩阵)
3×9 = 27 个数,描述对应数据的测量不确定度。全是 0 表示雷达不提供协方差信息(REP-145 约定0代表"未知")。这点在做严格卡尔曼滤波融合时需要自己补值。
angular_velocity(角速度,rad/s)
绕三轴的旋转速度。你这帧:
- x: -0.0072,y: 0.0032,z: 0.0005
- 三个值都接近 0 → 雷达处于静止状态(任何轻微晃动都会有 ±0.1 以上数值)
linear_acceleration(线加速度,m/s²)
三轴加速度。注意 z 轴:
- x: -0.0045,y: -0.059,z: -0.990
- 静止状态下,z 方向应该感受到 重力 ≈ ±9.81 m/s²
这里的加速度是-0.990,几乎正好 -1。这说明 RoboSense这颗 IMU 实际输出的加速度单位是g(重力加速度),不是m/s²,驱动直接把原始值塞进去了。ROS 标准规定是m/s²,所以严格意义上这违反了规范,但 RoboSense不是唯一这么做的,使用时要注意:真实加速度 (m/s²) = 数值 × 9.81例如这帧 z 实际是 -0.990 × 9.81 ≈ -9.71m/s²(向上方向感受到 -1g,符合静止状态)。
IMU数据用途
| 用途 | 怎么用 |
|---|---|
| 激光雷达点云去畸变 | 用角速度把运动中的点云"校正"回同一时刻,显著提升高速移动场景下的建图精度 |
| IMU+激光雷达融合SLAM | 如 LIO-SAM、FAST-LIO2、point-lio 等 |
| 机器人姿态估计 | 配合 EKF/UKF(如robot_localization)做里程计融合 |
| 运动检测 | 检测雷达是否在动、有没有异常震动 |
注意事项
使用前务必把加速度乘 9.81 转成 m/s²,否则下游滤波器/SLAM会跑飞。
2.3.2 IMU测试
调整雷达的摆放位置linear_acceleration向量会根据重力方向和各个轴的夹角计算各个方向的分量,静止状态下侧放雷达结果如下:
调整雷达摆放姿态时,重力加速度在传感器三个轴上的投影会发 生变化,所以静止状态下 linear_acceleration三个分量会随姿态改变。
注意:RoboSense 这颗 IMU 输出的加速度单位是g(重力加速度倍数),不是 ROS 标准的 m/s²。
静止侧放(Y 轴朝下,与垂直方向夹角约 36°)
合力 ≈ 1.00 g 静止只受重力
python
angular_velocity:
x: 0.012250540778040886
y: -0.011717909015715122
z: -0.019174760207533836
linear_acceleration:
x: -0.1204833984375
y: -0.81298828125
z: 0.583740234375
拿着雷达晃动:
python
angular_velocity:
x: 0.9182579517364502
y: -0.1691107302904129
z: 1.0506170988082886
linear_acceleration:
x: 0.049560546875
y: -0.087646484375
z: 1.396728515625
关键发现
将雷达定义的坐标系的X轴方向对准地面得到下面结果:
python
linear_acceleration:
x: 0.0667724609375
y: 1.0052490234375
z: -0.066162109375
从结果上可以看出重力加速度都投影到了Y轴上面,说明IMU的坐标系与雷达定义的坐标系并不匹配,可能差了90度。
3、多激光雷达接入
前面搞定了单个雷达ROS2发布点云和IMU数据,但是实际工作中有时需要多个雷达协同工作,这节主要记录接入2个雷达的操作步骤,绘制图像如下图所示:

3.1 修改配置
接入多个激光雷达,只需要修改config/config.yaml这一个文件,内容如下:
python
common:
msg_source: 1 # 0: not use Lidar
# 1: packet message comes from online Lidar
# 2: packet message comes from ROS or ROS2
# 3: packet message comes from Pcap file
send_packet_ros: false # true: Send packets through ROS or ROS2(Used to record packet)
send_point_cloud_ros: true # true: Send point cloud through ROS or ROS2
lidar:
- driver:
lidar_type: RSAIRY # LiDAR type - RS16, RS32, RSBP, RSAIRY, RSAIRYLITE_ETH, RSFAIRY, RSHELIOS, RSHELIOS_16P, RS128, RS80, RS48, RSP128, RSP80, RSP48,
# RSM1, RSM1_JUMBO, RSM2, RSM3, RSE1, RSMX, RSEMX.
msop_port: 6692 # Msop port of lidar
difop_port: 7782 # Difop port of lidar (Note that: For RSEMX, use the port num of DIFOP2 if both DIFOP1 & DIFOP2 exist. Default 7766.)
imu_port: 6682 # IMU port of lidar(only for RSAIRY, RSAIRYLITE_ETH, RSFAIRY, RSE1), 0 means no imu.
# If you want to use IMU, please first set ENABLE_IMU_DATA_PARSE to ON in CMakeLists.txt
user_layer_bytes: 0 # Bytes of user layer. thers is no user layer if it is 0
tail_layer_bytes: 0 # Bytes of tail layer. thers is no tail layer if it is 0
min_distance: 0.2 # Minimum distance of point cloud
max_distance: 200 # Maximum distance of point cloud (Note that: 200 normally, 300 for RSEMX)
use_lidar_clock: true # true--Use the lidar clock as the message timestamp
# false-- Use the system clock as the timestamp
dense_points: false # true: discard NAN points; false: reserve NAN points
ts_first_point: true # true: time-stamp point cloud with the first point; false: with the last point;
# these parameters are used from mechanical lidar
start_angle: 0 # Start angle of point cloud
end_angle: 360 # End angle of point cloud
# When msg_source is 3, the following parameters will be used
pcap_repeat: true # true: The pcap bag will repeat play
pcap_rate: 1.0 # Rate to read the pcap file
pcap_path: /home/robosense/lidar.pcap #The path of pcap file
ros:
ros_frame_id: rslidar_202 #Frame id of packet message and point cloud message
ros_recv_packet_topic: /rslidar_packets_202 #Topic used to receive lidar packets from ROS
ros_send_packet_topic: /rslidar_packets_202 #Topic used to send lidar packets through ROS
ros_send_imu_data_topic: /rslidar_imu_data_202 #Topic used to send imu data through ROS
ros_send_point_cloud_topic: /rslidar_points_202 #Topic used to send point cloud through ROS
ros_queue_length: 100 #Topic QoS history depth
- driver:
lidar_type: RSAIRY
msop_port: 6695
difop_port: 7785
imu_port: 6685
user_layer_bytes: 0
tail_layer_bytes: 0
min_distance: 0.2
max_distance: 200
use_lidar_clock: true
dense_points: false
ts_first_point: true
start_angle: 0
end_angle: 360
pcap_repeat: true
pcap_rate: 1.0
pcap_path: /home/robosense/lidar.pcap
ros:
ros_frame_id: rslidar_205
ros_recv_packet_topic: /rslidar_packets_205
ros_send_packet_topic: /rslidar_packets_205
ros_send_imu_data_topic: /rslidar_imu_data_205
ros_send_point_cloud_topic: /rslidar_points_205
ros_queue_length: 100
改完 yaml 后必须重新编译一次,因为 launch 加载的是 install/ 目录里的 config 副本:
python
cd /root/code
colcon build --cmake-args -DENABLE_IMU_DATA_PARSE=ON
source install/setup.bash
ros2 launch rslidar_sdk start.py
启动后日志里应该能看到两组 Msop Port: 6692 和 Msop Port: 6695。
验证新终端:
python
ros2 topic list | grep rslidar
ros2 topic hz /rslidar_points_202
ros2 topic hz /rslidar_points_205
每路都该有约 10Hz 点云、100Hz IMU。
3.2 异常处理
3.2.1 显示权限问题
在上一步执行ros2 launch rslidar_sdk start.py命令的时候报错了,主要原因是docker中是root用户,宿主机的X server 默认只接受宿主机普通用户的连接,在宿主机(注意不是docker中)执行下面命令可以解决:
python
xhost +SI:localuser:root
3.2.2 Rviz显示点云问题

将/rslidar_points_202添加到界面,点云没有显示出来,解决方法,将Fixed Frame中的rslidar改成rslidar_202就可以了。