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/ttyUSB01.2 确认 USB 转串口芯片
lsusbRPLIDAR 一般用 Silicon Labs CP210x,能看到:
Bus 003 Device 008: ID 10c4:ea60 Silicon Labs CP210x UART Bridge1.3 串口权限
/dev/ttyUSB0属于dialout组,当前用户必须在该组里才能开串口:
groups"$USER"# 看是否含 dialout不在的话加一下,然后重新登录生效:
sudousermod-aGdialout"$USER"快速自测:
timeout1cat/dev/ttyUSB0>/dev/null&&echo"权限 OK"||echo"无权限,需加 dialout 组"二、安装驱动包
2.1 克隆 ros2 分支
按 ROS2 惯例放到工作区的src/下:
mkdir-p~/ros2_ws/srccd~/ros2_ws/srcgitclone-bros2 https://github.com/Slamtec/rplidar_ros.git2.2 编译
cd~/ros2_wssource/opt/ros/humble/setup.bash colcon build --packages-select rplidar_ros几秒即可编完。看到Finished <<< rplidar_ros就成功了。
编译时会出现一些
-Wpedantic警告(SDK 头文件里的零长数组data[0]),无害,可以忽略。
2.3 source 工作区
sourceinstall/setup.bash2.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;case1,2,3:// A1..A3 系列case4:// C 系列 → 460800case6:// S1case7,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.bashsource~/ros2_ws/install/setup.bash4.1 节点 + rviz 一键启动
ros2 launch rplidar_ros view_rplidar_c1_launch.pyrviz 自动打开,显示/scan的扫描点云,正常是一个 360° 的环。
(此处可插入 rviz 扫描截图)
4.2 只跑节点
ros2 launch rplidar_ros rplidar_c1_launch.py4.3 验证数据
另开终端:
ros2 topic list# 应含 /scanros2 topic info /scan# Type: sensor_msgs/msg/LaserScanros2 topic hz /scan# 帧率,约 10 Hzros2 topicecho/scan--once# 打印一帧也可以用自带客户端:
ros2 run rplidar_ros rplidar_client五、Launch 参数详解
rplidar_c1_launch.py支持以下参数,都能在命令行覆盖:
| 参数 | 默认值 | 说明 |
|---|---|---|
channel_type | serial | 通道类型,串口为serial(T1 才用udp) |
serial_port | /dev/ttyUSB0 | 串口设备路径 |
serial_baudrate | 460800 | C1 必须为 460800 |
frame_id | laser | scan 消息的坐标系名 |
inverted | false | 雷达倒装时设true,角度翻转 180° |
angle_compensate | true | 角度补偿,让每帧点在角度上均匀分布 |
scan_mode | Standard | 扫描模式,见下一节 |
常用覆盖示例:
# 换扫描模式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.0serial_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 Hz | 1000 | 0.36° |
| 10 Hz(默认) | 500 | 0.72° |
| 12 Hz | 417 | 0.86° |
实用结论:
- 建图(静态环境):低转速(5 Hz),每圈点更密,地图细节更丰富。
- 避障(动态环境):高转速(12 Hz),刷新更快。
# 建图推荐:慢转 + 高灵敏ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0scan_mode:=Sensitivity七、数据录制与回放
7.1 录制
ros2 bag record /scan /tfCtrl+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 TF | ROS2 官方维护,室内建图稳定,可手持(配伪 odom) |
| cartographer | 可纯激光 | 精度高,配置较复杂 |
| hector_slam | 不需要 | 纯激光,但 ROS2 移植版较少 |
下面以slam_toolbox online_async(在线异步建图)为例,适合手持 C1 扫一遍建图。
8.2 安装
sudoaptinstallros-humble-slam-toolbox ros-humble-nav2-map-server8.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_publisher000000base_link laser# 占位里程计(真实机器人应换成轮式里程计节点)ros2 run tf2_ros static_transform_publisher000000odom 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.pyslam_toolbox 默认打开 rviz 并显示/map(OccupancyGrid)。手持雷达缓慢平移、转身,地图会逐步长出来。
(此处可插入建图过程 rviz 截图)
8.5 保存地图
ros2 run nav2_map_server map_saver_cli-fmy_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_rossudobashscripts/create_udev_rules.sh之后用固定名启动:
ros2 launch rplidar_ros rplidar_c1_launch.py serial_port:=/dev/rplidar卸载:
sudobashscripts/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_publisher000003.14159base_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-afrplidar_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:=46080011.4 电机不转
C1 电机由驱动协议控制启停,正常启动节点后自动转。不转的话:
- 查供电(USB 口供电不足就接独立 5V);
- 看日志有没有
checkMotorCtrlSupport相关错误; - 手拨一下转子排除卡死。
11.5 rviz 看不到扫描点
逐项查:
ros2 topicecho/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 组)和端口被残留节点占用。
参考链接
- Slamtec 官网 C1:https://www.slamtec.com/cn/Lidar/C1
- rplidar_ros(ROS2 分支):https://github.com/Slamtec/rplidar_ros/tree/ros2
- rplidar SDK:https://github.com/Slamtec/rplidar_sdk
- slam_toolbox:https://github.com/SteveMacenski/slam_toolbox
- ROS2 Humble 文档:https://docs.ros.org/en/humble/
如果对你有帮助,欢迎点赞收藏~有问题欢迎评论区交流。