3、激光雷达硬件接口:串口通信基础、USB转串口驱动安装、设备权限配置、udev规则编写

好,咱们进入第三章。前面两章我们把激光雷达的选型和ROS2环境搭好了,现在该真刀真枪地连硬件了。

说实话,我见过太多新手在这步卡住。雷达插上电脑,没反应。或者有反应,但ROS2节点就是启动不了。折腾半天,最后发现是串口权限没配好。嗯,这节课咱们就把这些坑一个个填平。

3.1 串口通信基础:雷达在说什么语言?

激光雷达和电脑之间怎么聊天?说白了,就是串口通信。大部分单线雷达用的都是UART(通用异步收发器),通过TX(发送)和RX(接收)两根线传数据。

你想想看,雷达每秒转个十几二十圈,每圈采几千个点,数据量其实不小。所以串口的波特率通常设得比较高——115200、230400,甚至921600。波特率就是每秒传多少位,数值越大,传得越快。

串口通信三要素:

  • 波特率:双方约定好的“说话速度”,必须一致
  • 数据位:通常8位,一次传一个字节
  • 停止位:通常1位,表示一帧结束

我刚开始做机器人时,买了个便宜的雷达模块,怎么调都读不到数据。后来用示波器一看,TX线上根本没信号——原来是雷达的波特率设成了256000,而我代码里写的是115200。对不上暗号,自然聊不起来。

3.2 USB转串口:电脑怎么认识雷达?

现在的笔记本电脑,谁还带串口啊?都是USB口。所以雷达的串口信号得先转成USB信号,电脑才能识别。这个转换工作,由一颗叫“USB转串口芯片”的小东西完成。

市面上常见的芯片有这几款:

芯片型号 厂商 Linux驱动 常见雷达品牌
CP2102 Silicon Labs cp210x 思岚A1/A2、镭神
CH340 南京沁恒 ch341 部分国产雷达
FT232 FTDI ftdi_sio Hokuyo、SICK
PL2303 Prolific pl2303 老款雷达

小技巧:不确定雷达用的是什么芯片?插上USB,然后运行 lsusb 命令。输出里会显示芯片的厂商ID和产品ID。比如 10c4:ea60 就是CP2102。

3.3 安装USB转串口驱动

好消息是,Ubuntu 22.04的内核已经内置了大部分USB转串口驱动。你插上雷达,系统通常能自动识别。但为了保险,我建议手动确认一下驱动是否加载成功。

步骤很简单:

  1. 插上雷达的USB线
  2. 打开终端,运行 dmesg | tail -20
  3. 看最后几行,有没有类似 cp210x converter now attached to ttyUSB0 的信息

如果看到 ttyUSB0 或 ttyACM0,说明驱动加载成功,设备节点已经创建好了。

万一没识别出来怎么办?别急,手动加载一下驱动模块:

# 以CP2102为例
sudo modprobe cp210x

# 查看已加载的模块
lsmod | grep cp210

我记得有一次,客户拿了个很冷门的雷达,插上后系统完全没反应。查了半天,发现芯片是CH340G,但内核没带驱动。后来手动装了ch341驱动才搞定。所以,如果你用的是国产雷达,建议先确认芯片型号,再查驱动支持情况。

3.4 设备权限配置:为什么打不开串口?

驱动装好了,设备节点也有了。你兴冲冲地运行ROS2节点,结果报错:

[ERROR] [launch]: Caught exception in launch: 
[open()] failed: Permission denied

为什么会这样?因为默认情况下,/dev/ttyUSB0 的属主是root,普通用户没有读写权限。你想想看,ROS2节点是以你的用户身份运行的,当然打不开。

临时解决办法是改权限:

sudo chmod 666 /dev/ttyUSB0

但这样每次拔插雷达都要重新改,太麻烦了。正确的做法是把你的用户加到 dialout 组里:

sudo usermod -a -G dialout $USER

然后注销重新登录,或者重启一下。之后你的用户就有权限访问串口设备了。

注意:加组后必须重新登录才能生效。如果你不想注销,可以运行 newgrp dialout 临时切换组身份。

3.5 udev规则编写:让雷达有固定的名字

好,权限问题解决了。但还有个麻烦事:每次插拔雷达,设备节点名可能变。今天叫 ttyUSB0,明天可能变成 ttyUSB1。如果你的ROS2启动脚本里写死了 /dev/ttyUSB0,那插了别的USB设备后,雷达就找不到了。

解决方案就是写udev规则。udev是Linux的设备管理器,可以让我们根据设备的唯一标识(比如USB端口号、芯片序列号)来创建固定的符号链接。

我个人习惯的做法是这样的:

  1. 先找到雷达的USB设备信息
# 查看USB设备详情
udevadm info -a -n /dev/ttyUSB0 | grep -i serial

输出里会有一行 ATTRS{serial}=="0001" 之类的信息,这就是芯片的序列号。每个雷达的序列号都是唯一的。

  1. 创建udev规则文件
sudo nano /etc/udev/rules.d/99-lidar.rules
  1. 写入规则
# 思岚A1雷达,根据序列号创建固定链接
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", SYMLINK+="lidar"

# 如果有多台雷达,可以继续添加
# SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="lidar2"
  1. 重新加载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger

之后,你拔插雷达,/dev/lidar 这个链接就会一直指向你的雷达,不管它实际是 ttyUSB0 还是 ttyUSB5。

udev规则字段说明:

  • SUBSYSTEM:设备子系统,串口设备是 tty
  • ATTRS{idVendor}:USB厂商ID,4位十六进制
  • ATTRS{idProduct}:USB产品ID,4位十六进制
  • ATTRS{serial}:芯片序列号,唯一标识
  • SYMLINK+=:创建的符号链接名

我曾经帮一个客户调试多雷达系统,四台雷达同时工作。如果没有udev规则,每次启动都要手动确认哪个端口对应哪台雷达,简直崩溃。写好规则后,/dev/lidar_front、/dev/lidar_back 一目了然,再也没出过错。

3.6 本章知识体系

下面这张图把整个硬件接口的流程串起来了,你可以对照着理一理思路:

激光雷达硬件接口知识体系 雷达UART串口 TX / RX 两根线 USB转串口芯片 CP2102 / CH340 / FT232 电脑USB接口 识别为 /dev/ttyUSB0 Linux内核驱动加载 cp210x.ko / ch341.ko / ftdi_sio.ko 设备权限配置 加入 dialout 组 sudo usermod -a -G dialout $USER udev规则编写 创建固定符号链接 /dev/lidar → /dev/ttyUSB0 ROS2节点可稳定访问雷达 serial_driver → 雷达驱动节点 → /scan话题 💡 核心思路:物理连接 → 驱动加载 → 权限配置 → 固定命名,四步缺一不可

嗯,到这里,激光雷达的硬件接口部分就讲完了。你可能会觉得,不就是插个USB线嘛,怎么这么多门道?但相信我,把这些基础打牢了,后面写驱动代码、调参数的时候,你会感谢今天花时间搞懂了这些细节。