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規則通過運行以下的處理與適當的設備路徑:
 udevadmtest$(udevadm info -q path -n /dev/ttyACM0)


要記住的事情

 檢查您的規則遵循命名約定- <優先> <設備名稱> .rules。技術上可以有多個規則相同的設備,和數量決定了他們會得到執行。因爲我們編寫插件規則,99是安全的優先方向。
  ·可以有多個規則文件中換行隔開。確保每個規則是在一行上。
  ·檢查所有標籤(匹配和配置)是逗號分隔。
  ·檢查你的規則文件末尾有換行符。
  ·檢查你的規則是由根用戶——/etc/udev/rules.d /應該說“根的根”規則文件。



發佈了34 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章