ROS 简单的udev rules

    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", ...

配置:

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

标签 使用
MODEL= " 0666 "
设置权限,允许任何用户读/写访问设备。
SYMLINK+ =“hokuyo”
这个设备在/dev/创建一个符号链接。
+ =”/ bin /echo “hello world” 执行任意命令。高级用法

  这是一种很好的做法,以确保为每个设备符号链接是独一无二的,因此上述实际上是可怜的练习!如果您有多个相同类型的设备(例如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 = "/bin/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规则通过运行以下的处理与适当的设备路径:
  udevadm test $( udevadm info -q path -n /dev/ttyACM0 )


要记住的事情

 检查您的规则遵循命名约定- <优先> <设备名称> .rules。技术上可以有多个规则相同的设备,和数量决定了他们会得到执行。因为我们编写插件规则,99是安全的优先方向。
  ·可以有多个规则文件中换行隔开。确保每个规则是在一行上。
  ·检查所有标签(匹配和配置)是逗号分隔。
  ·检查你的规则文件末尾有换行符。
  ·检查你的规则是由根用户——/etc/udev/rules.d /应该说“根的根”规则文件。



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值