1. Jetson外设及串口绑定方案详解
作为一名长期从事嵌入式开发的工程师,我深知在Jetson平台上进行外设管理和串口绑定的重要性。在实际项目中,我们经常需要连接各种传感器、摄像头和激光雷达等设备,而稳定的串口绑定是确保这些设备可靠工作的基础。本文将分享我在Jetson Orin平台上进行外设管理和串口绑定的完整方案,包含从硬件连接到软件配置的全流程。
2. 硬件环境搭建
2.1 核心设备选型与连接
Jetson Orin作为主控平台,其强大的算力和丰富的接口使其成为机器人、自动驾驶等领域的理想选择。在我们的项目中,采用了以下硬件配置:
- 主控板:Jetson Orin NX 16GB版本
- 扩展板:
- ROS扩展板:提供12V和5V电源输出
- USB Hub扩展板:4口USB3.0集线器
- 外设:
- USB摄像头:Logitech C920
- 深度相机:Intel RealSense D435i
- 激光雷达:RPLIDAR A1
提示:选择扩展板时,务必确认其供电能力是否满足所有外设的需求。我们曾遇到过因供电不足导致设备频繁掉线的情况。
2.2 电源系统设计
电源系统的稳定性直接影响外设工作的可靠性。我们的电源连接方案如下:
code复制外部电源(12V/5A)
├── ROS扩展板(12V输入)
│ ├── Jetson Orin(通过P2端子供电)
│ └── USB Hub(通过P2端子供电)
└── 激光雷达(单独12V供电)
这种设计确保了每个设备都能获得稳定的电源,避免了因电源波动导致的数据传输问题。
3. Linux系统下的设备管理
3.1 设备查询指令详解
在Ubuntu系统中,有几个关键指令用于设备管理:
-
lsusb:列出所有连接的USB设备
bash复制
$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter输出解析:
- Bus XXX:USB总线编号
- Device XXX:设备在该总线上的编号
- ID xxxx:xxxx:厂商ID(Vendor ID)和产品ID(Product ID)
-
ll /dev/:查看已注册的设备节点
bash复制
$ ll /dev/ttyUSB* crw-rw-rw- 1 root dialout 188, 0 Jan 26 10:00 /dev/ttyUSB0权限说明:
- 第一个字符'c'表示字符设备
- 'rw-rw-rw-'表示所有用户都有读写权限
- 'root dialout'表示所有者和所属组
3.2 设备绑定原理
在Linux系统中,USB设备插入时会被自动分配一个设备节点(如/dev/ttyUSB0)。但这种分配是不稳定的,可能因插入顺序或系统重启而变化。通过udev规则可以实现:
- 根据设备的固定属性(如Vendor ID)识别特定设备
- 为其分配固定的设备节点名称
- 设置一致的访问权限
4. 串口绑定详细步骤
4.1 创建udev规则文件
-
进入rules.d目录:
bash复制cd /etc/udev/rules.d/ -
创建规则文件(需要sudo权限):
bash复制sudo touch 99-usb-serial.rules sudo chmod 666 99-usb-serial.rules -
使用vim编辑文件:
bash复制sudo vim 99-usb-serial.rules
4.2 编写规则内容
以下是一个完整的规则示例:
bash复制# CH340串口设备
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", SYMLINK+="rplidar"
# RealSense相机
KERNEL=="ttyACM*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3a", MODE:="0666", SYMLINK+="realsense"
# Logitech摄像头
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0821", SYMLINK+="c920_front"
参数说明:
KERNEL=="ttyUSB*":匹配所有USB串口设备ATTRS{idVendor}和ATTRS{idProduct}:设备的厂商和产品IDMODE:="0666":设置设备访问权限SYMLINK+="device_name":创建符号链接
4.3 使规则生效
-
重新加载udev规则:
bash复制sudo udevadm control --reload-rules sudo udevadm trigger -
验证绑定结果:
bash复制
ll /dev/rplidar预期输出:
code复制lrwxrwxrwx 1 root root 7 Jan 26 10:00 /dev/rplidar -> ttyUSB0
5. 常见问题与解决方案
5.1 设备权限问题
现象:普通用户无法访问设备节点
解决方案:
- 临时方案:
bash复制sudo chmod 666 /dev/ttyUSB0 - 永久方案:
- 在udev规则中设置MODE:="0666"
- 或将用户加入dialout组:
bash复制sudo usermod -aG dialout $USER
5.2 设备绑定失败
可能原因:
- 规则语法错误
- 设备ID不匹配
- 规则文件权限不正确
排查步骤:
- 检查规则语法:
bash复制udevadm test /sys/class/tty/ttyUSB0 - 确认设备属性:
bash复制
udevadm info -a -n /dev/ttyUSB0
5.3 多设备冲突
当连接多个相同型号设备时,仅靠Vendor ID和Product ID无法区分。此时可以添加其他属性:
bash复制KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="0001", SYMLINK+="lidar_front"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="0002", SYMLINK+="lidar_rear"
获取设备序列号:
bash复制udevadm info -a -n /dev/ttyUSB0 | grep {serial}
6. 高级应用技巧
6.1 自动加载驱动
对于需要特殊驱动的设备,可以在规则中添加DRIVER参数:
bash复制ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", RUN+="/sbin/modprobe ftdi_sio"
6.2 设备热插拔脚本
通过udev规则触发自定义脚本:
bash复制ACTION=="add", KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", RUN+="/usr/local/bin/device_added.sh"
脚本示例(/usr/local/bin/device_added.sh):
bash复制#!/bin/bash
logger "Device $DEVNAME added"
/usr/bin/screen -dmS device_$DEVNAME /usr/bin/python3 /opt/scripts/device_handler.py $DEVNAME
6.3 ROS环境集成
在ROS中使用绑定后的设备,只需在launch文件中引用固定名称:
xml复制<node pkg="rplidar_ros" type="rplidarNode" name="rplidar">
<param name="serial_port" type="string" value="/dev/rplidar"/>
</node>
7. 性能优化建议
-
USB带宽管理:
- 将高带宽设备(如摄像头)单独接在USB3.0接口上
- 使用
lsusb -t查看USB设备树和带宽分配
-
延迟优化:
bash复制sudo apt install linux-lowlatency安装低延迟内核可以减少串口通信的延迟
-
缓冲区设置:
对于高速串口设备,调整缓冲区大小:bash复制stty -F /dev/rplidar 921600 raw -echo -echoe -echok
经过多个项目的实践验证,这套方案在Jetson Orin平台上表现稳定可靠。特别是在移动机器人项目中,即使频繁震动导致USB接口接触不稳定,通过完善的udev规则也能确保设备重新连接后自动恢复正确的绑定关系。