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转串口驱动。你插上雷达,系统通常能自动识别。但为了保险,我建议手动确认一下驱动是否加载成功。
步骤很简单:
- 插上雷达的USB线
- 打开终端,运行
dmesg | tail -20 - 看最后几行,有没有类似
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端口号、芯片序列号)来创建固定的符号链接。
我个人习惯的做法是这样的:
- 先找到雷达的USB设备信息
# 查看USB设备详情
udevadm info -a -n /dev/ttyUSB0 | grep -i serial
输出里会有一行 ATTRS{serial}=="0001" 之类的信息,这就是芯片的序列号。每个雷达的序列号都是唯一的。
- 创建udev规则文件
sudo nano /etc/udev/rules.d/99-lidar.rules
- 写入规则
# 思岚A1雷达,根据序列号创建固定链接
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", SYMLINK+="lidar"
# 如果有多台雷达,可以继续添加
# SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="lidar2"
- 重新加载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger
之后,你拔插雷达,/dev/lidar 这个链接就会一直指向你的雷达,不管它实际是 ttyUSB0 还是 ttyUSB5。
udev规则字段说明:
SUBSYSTEM:设备子系统,串口设备是ttyATTRS{idVendor}:USB厂商ID,4位十六进制ATTRS{idProduct}:USB产品ID,4位十六进制ATTRS{serial}:芯片序列号,唯一标识SYMLINK+=:创建的符号链接名
我曾经帮一个客户调试多雷达系统,四台雷达同时工作。如果没有udev规则,每次启动都要手动确认哪个端口对应哪台雷达,简直崩溃。写好规则后,/dev/lidar_front、/dev/lidar_back 一目了然,再也没出过错。
3.6 本章知识体系
下面这张图把整个硬件接口的流程串起来了,你可以对照着理一理思路:
嗯,到这里,激光雷达的硬件接口部分就讲完了。你可能会觉得,不就是插个USB线嘛,怎么这么多门道?但相信我,把这些基础打牢了,后面写驱动代码、调参数的时候,你会感谢今天花时间搞懂了这些细节。