RPLIDAR C1 激光雷达 + ROS2 Humble:从驱动编译到 SLAM 建图全流程

本文记录 RPLIDAR C1 在 ROS2 Humble 下的完整使用流程:硬件确认、驱动编译、参数配置、rviz 可视化、数据录制回放,一直到用 slam_toolbox 在线建图,并附常见报错排查。适合刚拿到 C1、想在 ROS2 上跑起来做室内建图的同学。

环境说明

项值
雷达RPLIDAR C1(Slamtec,360° 三角测距 2D 激光雷达)
接口USB 转串口(Silicon Labs CP210x)
波特率460800
系统Ubuntu + ROS2 Humble

坑点提示:Slamtec 的 rplidar_ros 仓库默认分支是 ROS1(catkin/roscpp)。在 ROS2 下必须切到 ros2 分支,否则 colcon 编译会直接报错。仓库支持的型号及波特率:A1/A2M8 = 115200,A2M7/A2M12/A3/S1 = 256000,S2/S3 = 1000000,C1 = 460800,T1 走 UDP。


一、硬件与权限确认

1.1 查看串口设备

ls -l /dev/ttyUSB* /dev/ttyACM*

正常应看到:

crw-rw---- 1 root dialout 188, 0  /dev/ttyUSB0

1.2 确认 USB 转串口芯片

lsusb

RPLIDAR 一般用 Silicon Labs CP210x,能看到:

Bus 003 Device 008: ID 10c4:ea60 Silicon Labs CP210x UART Bridge

1.3 串口权限

/dev/ttyUSB0 属于 dialout 组,当前用户必须在该组里才能开串口:

groups "$USER"        # 看是否含 dialout

不在的话加一下,然后重新登录生效:

sudo usermod -aG dialout "$USER"

快速自测:

timeout 1 cat /dev/ttyUSB0 >/dev/null && echo "权限 OK" || echo "无权限,需加 dialout 组"

二、安装驱动包

2.1 克隆 ros2 分支

按 ROS2 惯例放到工作区的 src/ 下:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
git clone -b ros2 https://github.com/Slamtec/rplidar_ros.git

2.2 编译

cd ~/ros2_ws
source /opt/ros/humble/setup.bash
colcon build --packages-select rplidar_ros

几秒即可编完。看到 Finished <<< rplidar_ros 就成功了。

编译时会出现一些 -Wpedantic 警告(SDK 头文件里的零长数组 data[0]),无害,可以忽略。

2.3 source 工作区

source install/setup.bash

2.4 验证可执行文件

ros2 pkg executables rplidar_ros

输出:

rplidar_ros rplidar_client
rplidar_ros rplidar_composition
rplidar_ros rplidar_node

其中 rplidar_node 是雷达节点,负责发布 /scan;rplidar_client 是测试客户端,订阅 /scan 打印到终端。

小建议:把 build/、install/、log/ 加进 .gitignore,别把编译产物提交进仓库。


三、怎么知道它是 C1?

拿到雷达先别急着选 launch 文件,型号选错波特率不对是连不上的。可以通过串口发 RPLIDAR 协议指令 GET_DEVICE_INFO(0xA5 0x50)读型号。

设备返回(示例):

model    = 0x41
firmware = 1.02
hardware = 18
serial   = D606E0F6C1E092D8A19E9FF946AA4616

关键看 model 字节的高 4 位(model >> 4),SDK 里用它区分系列:

majorModelID = devInfo.model >> 4;
case 1, 2, 3:  // A1..A3 系列
case 4:        // C 系列  → 460800
case 6:        // S1
case 7, 8:     // S2, S3

本例 model = 0x41,0x41 >> 4 = 4 → C 系列,对应波特率 460800,与 rplidar_c1_launch.py 的默认参数吻合。

其实更省事的做法是直接启动 C1 的 launch,看节点日志能不能正常出设备信息。成功时日志长这样:

RPLidar S/N: D606E0F6C1E092D8A19E9FF946AA4616
Firmware Ver: 1.02
Hardware Rev: 18
RPLidar health status : OK.
current scan mode: Standard, sample rate: 5 Khz, max_distance: 16.0 m, scan frequency:10.0 Hz

看到 health status : OK 和 current scan mode 就说明驱动和雷达通信正常。


四、启动与可视化

每次操作前先 source 两个环境(或写进 ~/.bashrc):

source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash

4.1 节点 + rviz 一键启动

ros2 launch rplidar_ros view_rplidar_c1_launch.py

rviz 自动打开,显示 /scan 的扫描点云,正常是一个 360° 的环。

(此处可插入 rviz 扫描截图)

4.2 只跑节点

ros2 launch rplidar_ros rplidar_c1_launch.py

4.3 验证数据

另开终端:

ros2 topic list                 # 应含 /scan
ros2 topic info /scan           # Type: sensor_msgs/msg/LaserScan
ros2 topic hz /scan             # 帧率,约 10 Hz
ros2 topic echo /scan --once    # 打印一帧

也可以用自带客户端:

ros2 run rplidar_ros rplidar_client

五、Launch 参数详解

rplidar_c1_launch.py 支持以下参数,都能在命令行覆盖:

参数默认值说明
channel_typeserial通道类型,串口为serial(T1 才用 udp)
serial_port/dev/ttyUSB0串口设备路径
serial_baudrate460800C1 必须为 460800
frame_idlaserscan 消息的坐标系名
invertedfalse雷达倒装时设true,角度翻转 180°
angle_compensatetrue角度补偿,让每帧点在角度上均匀分布
scan_modeStandard扫描模式,见下一节

常用覆盖示例:

# 换扫描模式
ros2 launch rplidar_ros rplidar_c1_launch.py scan_mode:=Sensitivity

# 改电机转速(扫描频率)
ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0

# 雷达倒装
ros2 launch rplidar_ros rplidar_c1_launch.py inverted:=true

# 用固定串口名(配合后文 udev 规则)
ros2 launch rplidar_ros rplidar_c1_launch.py serial_port:=/dev/rplidar

# 多参数组合:建图场景
ros2 launch rplidar_ros rplidar_c1_launch.py \
    scan_mode:=Sensitivity scan_frequency:=5.0 serial_port:=/dev/rplidar

六、扫描模式与角分辨率

6.1 扫描模式

通过 scan_mode 选择工作模式,SDK 里定义了几种:

模式特点适用场景
Standard标准模式,均衡通用,默认
Express快速采样高帧率需求
Sensitivity高灵敏度,弱信号更强远距离、暗光
Stability高稳定性,抗干扰强光、复杂环境

C1 早期固件(如 1.02)不支持 GET_LIDAR_CONF 查询(该命令需 fw 1.24+),所以具体支持哪几个模式以节点能成功启动、日志里 current scan mode 正确为准。

6.2 角分辨率怎么算

C1 采样率固定 5000 点/秒(5 KHz),与电机转速无关。角分辨率由"每圈点数"决定:

每圈点数 = 采样率 ÷ 扫描频率
角分辨率 = 360° ÷ 每圈点数
扫描频率每圈点数角分辨率
5 Hz10000.36°
10 Hz(默认)5000.72°
12 Hz4170.86°

实用结论:

  • 建图(静态环境):低转速(5 Hz),每圈点更密,地图细节更丰富。
  • 避障(动态环境):高转速(12 Hz),刷新更快。
# 建图推荐:慢转 + 高灵敏
ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0 scan_mode:=Sensitivity

七、数据录制与回放

7.1 录制

ros2 bag record /scan /tf

Ctrl+C 停止,生成 rosbag2_年_月_日_.../ 目录。

7.2 查看信息

ros2 bag info rosbag2_2026_07_06_17_00_00/

7.3 回放

# 终端 1:回放
ros2 bag play rosbag2_2026_07_06_17_00_00/

# 终端 2:开 rviz 看回放
ros2 launch rplidar_ros view_rplidar_c1_launch.py

回放时 /scan 来自 bag 而非真实雷达,可用于离线调参、复现问题、离线跑 SLAM。


八、SLAM 建图(slam_toolbox)

这是大多数同学买 C1 的目的——室内建图。

8.1 方案对比

方案里程计需求特点
slam_toolbox(推荐)需要 odom TFROS2 官方维护,室内建图稳定,可手持(配伪 odom)
cartographer可纯激光精度高,配置较复杂
hector_slam不需要纯激光,但 ROS2 移植版较少

下面以 slam_toolbox online_async(在线异步建图)为例,适合手持 C1 扫一遍建图。

8.2 安装

sudo apt install ros-humble-slam-toolbox ros-humble-nav2-map-server

8.3 发布静态 TF

slam_toolbox 需要 TF 树:map → odom → base_link → laser。

  • base_link → laser:雷达相对机器人本体的位姿(示例假设雷达装在中心,无偏移);
  • odom → base_link:里程计位姿。手持建图没有真实里程计时,先发个静态的占位,slam_toolbox 会自己发布 map → odom。
# 雷达相对本体
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 base_link laser

# 占位里程计(真实机器人应换成轮式里程计节点)
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 odom base_link

真实机器人上,odom → base_link 要由轮式里程计/IMU 融合节点发布,不能长期用静态 TF。

8.4 三个终端启动建图

# 终端 1:启动雷达(建图用慢转)
ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0

# 终端 2:发布静态 TF(上面两条命令)

# 终端 3:启动 slam_toolbox 在线建图
ros2 launch slam_toolbox online_async_launch.py

slam_toolbox 默认打开 rviz 并显示 /map(OccupancyGrid)。手持雷达缓慢平移、转身,地图会逐步长出来。

(此处可插入建图过程 rviz 截图)

8.5 保存地图

ros2 run nav2_map_server map_saver_cli -f my_map

生成 my_map.pgm(栅格图,可直接当图片看)和 my_map.yaml(元数据,后续导航用)。

8.6 建图技巧

  • 慢:slam_toolbox 靠扫描匹配定位,走太快会丢匹配、地图错位。
  • 走回环:回到已建图区域,算法会修正累积误差。
  • 低转速:配合第六节,scan_frequency:=5.0 让每圈点更密。
  • 环境要有特征:空旷长走廊特征少容易丢,有门窗家具的房间建图更稳。

九、固定串口名(udev 规则)

USB 插拔或重启后,/dev/ttyUSB0 可能变成 ttyUSB1,launch 就找不到雷达了。用 udev 规则固定一个别名 /dev/rplidar。

驱动包自带脚本:

cd ~/ros2_ws/src/rplidar_ros
sudo bash scripts/create_udev_rules.sh

之后用固定名启动:

ros2 launch rplidar_ros rplidar_c1_launch.py serial_port:=/dev/rplidar

卸载:

sudo bash scripts/delete_udev_rules.sh

规则按 USB 的 VID:PID(10c4:ea60)匹配。如果机器上还有别的 CP210x 设备,可能要按序列号进一步区分。


十、坐标系与 TF

  • scan 消息的 header.frame_id 默认 laser(由 frame_id 参数控制)。
  • 按 RPLIDAR 规范,雷达坐标系 x 轴朝前(0°方向),角度逆时针递增。

典型 TF 树:

map
 └─ odom           (slam_toolbox / 里程计发布)
     └─ base_link  (机器人本体)
         └─ laser  (雷达,静态)

雷达倒装(线朝下)时,x 轴朝后、角度方向反转,两种处理方式二选一:

  • launch 加 inverted:=true(驱动层翻转数据);
  • 或发一个旋转 180° 的静态 TF:
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 3.14159 base_link laser

十一、常见报错排查

11.1 串口权限拒绝

现象:Permission denied: '/dev/ttyUSB0'。

groups "$USER"            # 是否在 dialout 组

不在就 sudo usermod -aG dialout "$USER" 然后重新登录。

11.2 端口被占用

现象:Failed to open serial port,或设备对指令无响应。

fuser /dev/ttyUSB0        # 看哪个 PID 占着
pgrep -af rplidar_node    # 有没有残留节点

杀掉残留进程。注意先 pgrep -af 确认 PID 再 kill -9 <PID>,别用宽泛的 pkill -f rplidar_node 误杀别的会话。

11.3 波特率不对

现象:节点起不来、无 /scan、health 异常。

C1 必须 460800。临时指定:

ros2 launch rplidar_ros rplidar_c1_launch.py serial_baudrate:=460800

11.4 电机不转

C1 电机由驱动协议控制启停,正常启动节点后自动转。不转的话:

  • 查供电(USB 口供电不足就接独立 5V);
  • 看日志有没有 checkMotorCtrlSupport 相关错误;
  • 手拨一下转子排除卡死。

11.5 rviz 看不到扫描点

逐项查:

ros2 topic echo /scan --once     # 有没有数据
ros2 topic hz /scan              # 帧率正不正常
ros2 run tf2_tools view_frames   # 生成 TF 树,确认 laser frame 存在

rviz 里确认:Fixed Frame 设为 laser(或其父坐标系存在),LaserScan 的 Topic 设为 /scan。

11.6 退出时报 failed to create guard condition

Ctrl+C 或 kill 关闭节点时可能打印:

terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
what():  failed to create guard condition: the given context is not valid...

这是 rclcpp 的已知退出异常,不是功能故障,节点退出前一直正常工作,不用管。

11.7 /scan 有数据但地图为空

  • 查 TF 树:map → odom → base_link → laser 是否完整;
  • 确认 slam_toolbox 订阅的是 /scan 且 frame 对得上;
  • 移动是否过快导致匹配失败。

十二、规格参数

设备实测(本机雷达真实返回)

项值
型号RPLIDAR C1(model0x41,C 系列)
固件 / 硬件1.02 / 18
接口USB-串口,CP210x(10c4:ea60)
波特率460800
扫描模式Standard
采样率5000 点/秒(5 KHz)
最大量程16.0 m
扫描频率10 Hz(默认,可调 5–12 Hz)
角分辨率(Standard@10Hz)≈0.72°
健康OK

官方标称(以官网为准)

项标称值
测距原理三角测距
测距范围0.15–12 m(典型),16 m 为可检测上限
扫描范围360° 全向
采样率5 KHz(固定)
激光808 nm,Class 1 人眼安全
供电5V DC,约 2.5W
扫描模式Standard / Express / Sensitivity / Stability(支持其中部分)

总结

RPLIDAR C1 在 ROS2 Humble 下跑起来其实就三步:切 ros2 分支编译 → 用 rplidar_c1_launch.py 启动(460800)→ rviz 看 /scan。要做建图再装 slam_toolbox,配好 map → odom → base_link → laser 的 TF,手持慢扫即可出图。

最容易踩的坑是用了默认 ROS1 分支和波特率没对上——记住 C1 是 460800。其次就是串口权限(dialout 组)和端口被残留节点占用。

参考链接


如果对你有帮助,欢迎点赞收藏~有问题欢迎评论区交流。

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐