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 /應該說“根的根”規則文件。