首页 > 编程知识 正文

ROS 中udevrules 配置 USB 映射 绑定串口

时间:2023-05-06 19:08:01 阅读:249765 作者:3266

修改串口数据是在 /etc/udev/rules.d/  文件夹下面 如下图:

我们打开一个雷达的串口配置文件 rplidar.rules 看里面内容如下:

当我们想配置自己的底层USB接口,新建一个文件,再按照此格式来写。只需修改启动启动的 "  "中的内容即可,第一个KERNEL=="ttyUSB*" 这个可不用改。 最后一个SYMLINK+=" 自己随意写名称"  就是映射到的名称。

通过 

udevadm info -a -n /dev/ttyUSB0

来查看里面需要的信息。    想要配置USB0就写ttyUSB0,想配置USB1 就写ttyUSB1. 写好保存就行了。 

 

上面是简单的直接添加的过程,下面是具体的介绍。

Udev是Linux的设备管理器,动态地创建和删除节点的硬件设备。简而言之,它有助于你的电脑很容易找到你的机器人。默认情况下,硬件设备连接到Linux(Ubuntu)电脑将属于根用户。这意味着运行的任何程序(例如ROS节点)作为unpriveleged(即不是根)的用户将不能访问它们。最重要的是,设备将收到的名字如ttyACMx和ttyUSBx任意基于他们的顺序插入。幸运的是,你可以解决这个问题,和更多,udev规则。

  您可能已经有至少一个udev规则在您的系统,解决了网络设备的命名问题,你可以看一眼/etc/udev/rules.d /文件夹——它可能是70 -持久net.rules命名。

  一些驱动程序/软件已经将提供udev规则可以使用。检查/etc/udev/rules.d /文件夹,看看有什么已经安装。如果包是懒惰和给你一个udev规则自己安装,您可以使用:

  sudo cp <rule file> /etc/udev/rules.d/>

编写一个新的UDEV规则:
  

  如果你仍然需要编写自己的规则和权限设置命名你的设备,请继续阅读。规则可以得到极其复杂,但下面应该覆盖99%的ROS应用程序的用例。如果你正在寻找99.9%,我建议你从这里开始。作为一个例子,我们将检查提供的udev规则urg_nodedriver ROS:

SUBSYSTEMS=="usb",KERNEL=="ttyACM[0-9]*",ACTION=="add", ATTRS{idVendor}=="15d1", ATTRS{idProduct}=="0000",MODE="666",PROGRAM="/opt/ros/hydro/lib/urg_node/getID /dev/%k q", SYMLINK+="sensors/hokuyo_%c",GROUP="dialout"

  

  udev规则是由一个逗号分隔标记,如上所述。标签分为两个部分:匹配和配置,但是他们可以在任何顺序写入规则(令人困惑的是足够的)。

匹配:


  匹配的udev允许一部分设备管理器匹配规则,你想要的设备。经理将尝试匹配所有新设备时插入,所以重要的是规则具体只足以捕捉设备你正在寻找,否则你最终会得到一个/dev/hokuyo IMU的符号链接。有许多潜在的匹配标签,选择有用的最好的方法是让所有的设备直接从udev属性。

  运行以下cammand、插入等< devpath > /dev/ttyACM0:

  udevadm info -a -p $(udevadm info -q path -n <devpath>)

   你会得到一个列表的所有设备属性对udev可见。观察设备的…/ ttyACM0′:

    KERNEL=="ttyACM0"SUBSYSTEM=="tty"DRIVER==""

    查看父设备 '...':

    KERNELS=="3-3:1.0"SUBSYSTEMS=="usb"DRIVERS=="cdc_acm"

    ATTRS{bInterfaceClass}=="02" 

    ATTRS{bInterfaceNumber}=="00"

    查看父设备 '...':

    ...

    ATTRS{idVendor}=="0483"

    ATTRS{idProduct}=="5740" 

    ...

    每个设备的属性是一个潜在的标记。您可以使用任何的标签在第一部分过滤,和来自父母的标记设备。使用正则表达式来匹配更灵活(如[0 - 9]匹配任何数量,*匹配任何东西)。例子:

   SUBSYSTEM=="tty",KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ...

    由于udev的方式设计,你只能把标签一方设备。所以在上面的例子中你可以使用内核和theSUBSYSTEM标记在udev规则,但你不能用两个驱动andATTRS { idVendor }匹配。这通常是一个问题,因为idVendor和idProduct总是在场,并确定设备类型独特的大部分。

    你还应该添加动作标签,这通常是“添加”,有时“删除”如果你想做一些设备是不插电的时候。

    ...,ACTION=="add", ...

配置:
 现在,您已经有了一个规则匹配的设备,您可以添加几个配置标签:

  这是一种很好的做法,以确保为每个设备符号链接是独一无二的,因此上述实际上是可怜的练习!如果您有多个相同类型的设备(例如2 Hokuyos),或如果您有多个设备使用一个通用的USB-to-Serial转换器(例如FTDI),一个基本的idVendor idProduct规则不会正确区分这些设备,因为udev将所有匹配设备映射到相同的符号链接。有几种方法:
  1。直接通过设备属性:
  如果你的设备有一个惟一的标识符,如序列号、编码的属性,您就可以轻松地为每个设备创建一个独特的符号链接:

  ..., SYMLINK+=”device_$attr{serial}”, ...
  制造商将为您并不总是使它容易。如果父母设备序列号,您可以使用以下技巧使用环境变量。创建一个udev规则为父设备来存储一个环境变量:
  ..., <match parent device>..., ENV{SERIAL_NUMBER}="$attr{serial_number}"
  和一个规则为孩子装置,利用变量符号链接:
  ..., <match child device>..., SYMLINK+="device_$env{SERIAL_NUMBER}"

  2。通过一个外部程序:
  如果制造商不公开通过设备唯一标识符属性,您可以执行一个外部命令使用程序标签:
  PROGRAM="/nqdxrk/device_namer %k", SYMLINK+="%c"
  与运行标签旋转,这个命令将块(之前需要执行规则是完全处理),所以它必须很快恢复。上面Theurg_node司机使用这个标签执行ROS二进制:
  PROGRAM="/opt/ros/hydro/lib/urg_node/getID /dev/%k q", SYMLINK+="sensors/hokuyo_%c"
  替换参数% k指的是相对于/dev/设备路径,和% crefers输出程序的标记。
  运行一个新的udev规则:
  一旦你有复制/etc/udev/rules.(sudo cp)您的规则d /文件夹,您可以测试你的设备。udev认识到您的规则,运行以下命令:
 sudo udevadm control --reload-rules && sudo service udev restart && sudo udevadm trigger
  你应该能够找到一个在/dev/符号链接,链接到完整的设备路径(例如,/ dev / ttyACM0)、和设备上的权限路径应该读/写为所有用户。如果你的权限没有被设置,你/dev/中创建符号链接并没有像预期的那样,你可以试着模拟udev规则通过运行以下的处理与适当的设备路径:
 udevadmtest$(udevadm info -q path -n /dev/ttyACM0)

使用 DataAnt 监控 Apache APISIX的原理解析

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。