我的机器人上有两个激光雷达连接到 Jetson。一个在正面,一个在背面。跟踪哪个激光雷达在哪里很重要,但激光雷达是通过某种 UART 桥连接到 USB 端口的。这意味着 Linux 只能看到桥,而看不到桥后面的激光雷达。这些网桥在属性方面看起来相同,因此为它们制定 udev 规则比平常要复杂一些。
我可以从以 C++ 运行的激光雷达 SDK 访问正确的序列号。我编写了一个程序,在给定 USB 端口的情况下,给出我希望为该激光雷达使用的正确符号链接名称。但我在创建符号链接时遇到问题,因为我不确定如何基于某些 bash 脚本触发 udev 规则。
目前,脚本路径如下所示: udev 规则调用我的脚本并传递设备名称 -> 脚本查询 sdk 的序列号并查找正确的位置 -> 脚本基于此逻辑添加新的 udev 规则 -> 脚本运行udevadm control --reload-rules && udevadm trigger
。这会创建正确的 udev 规则,但不会触发它,因此不会创建符号链接。如果您在此阶段重新插入激光雷达,则会创建符号链接。然而,我希望这个过程更加自动化。
正确的方法是什么?手动创建符号链接是否有意义ln -s /dev/ttyUSB1 /dev/ttyLIDAR_FRONT
? bash 脚本可以强制运行 udev 规则吗?或者 udevadm 可以在 cli 中运行规则吗?
谢谢。
答案1
至少有两种方法可以解决此问题,而无需创建新规则并加载它们。
不要让脚本创建新
udev
规则,而是直接创建适当的符号链接。据我所知,这样做您失去的只是在后续规则中查找创建的符号链接以及链接优先级管理的
udev
能力,而不是创建符号链接。udev
udev
让您的脚本输出变量赋值,并在
IMPORT{program}
udev
规则中使用它,然后创建引用脚本设置的变量的符号链接。这将涉及诸如让脚本输出
TARGET=symlinkname
(最好具有更具体的变量名称),然后创建SYMLINK
引用%E{TARGET}
.看手册udev
;您也很有可能在/lib/udev/rules.d
系统中的现有规则中找到示例。