Çok özdeş USB aygıt sorunu
Dört kameralı bir Rasperry Pi'm var. fswebcam
Kameraları /dev/video0
.. olarak tanımlayan pixu alıyorum video3
. Bazen kamera video0
, vide02
, video4
ve video6
fakat şimdilik bunu unutabilirsiniz.
Bir kamera numarasını tanımlamak için kalıcı bir kimliğe ihtiyacım var ki, örneğin video0
, her zaman aynı kameradır, çünkü fotoğraflara resim yazarım. Ne yazık ki bu güvenilir bir şekilde gerçekleşmiyor - açılışta kameralar şu şekilde sıralanıyor video0
... video3
ancak her zaman aynı şekilde değil.
Kameraların hepsi aynı ID ve seri numarasına sahip.
Bu sorunun çözümü udev kurallarını içerir, ancak burada birçok balık kancası da vardır.
Komutu verirseniz
udevadm info –attribute-walk –path=/dev/video0
çıktının şapını alıyorsunuz ama göze çarpan bitler
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
KERNELS bit bir USB hub portudur. Dört kamerayla bunlardan dördü var - yeniden başlatma sırasında değişmiyorlar, ancak video{x}
bir bağlantı noktasıyla ilişkili değişebilir.
Bu yüzden bir video numarasını USB hub portuna bağlamak için bir udev kuralına ihtiyacımız var:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
Basit görünüyor - kameraya erişin
fswebcam –d $realpath /dev/camera0
İşe yaramazsa, bunu bir udev kuralına koyarsanız ve sistem video0'u (önyükleme sırasında) farklı bir bağlantı noktasına atadıysa, udev kuralı yoksayılır. /dev/camera0
Temelde sembolik bağlantı diyor no such device
. Kare bir.
İstediğimiz şey, bir bağlantıyı bir video{x}
numaraya değil, bir USB hub adresine bağlamak . Python programını aldı.
İlk adım koşmaktı
fswebcam –d /dev/video${x} tst.jpg
için x
1 ve 8 arasında varlığı tst.jpg
bu görüntü sayısına bir kamera olup olmadığını her çağrıdan sonra tespit ettiği. Bundan aktif video numaralarının bir listesini yapın. Tecrübelerim benim ya 0,1,2,3
da 0,2,4,6
kullandığım kameralar içindi.
Diğerleri elbette bu listeyi farklı bir işlem kullanarak oluşturabilir.
Sonra listedeki her video numarası için
udevadm info –attribute-walk –path=/dev/videox > dd
ve özü KERNELS= line
den dd
. Bu işlemden sonra kameralar için USB port adreslerinin bir listesi çıkar. Bu listeyi, bir sonraki adımda her zaman aynı sırayla işlemesi için sıralayın. Buna "adres listesi" deyin.
Şeyi udevadm … > dd
tekrar çalıştırın ve benzeyen bir liste yapın
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
Şimdi adres listesinde adım atın - her giriş için video listesinden ilgili girişi bulun. Gibi satır koleksiyonuna benzeyen yeni bir liste oluşturun
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
X (sembolik bağlantı numarası), adres listesindeki sıra numarası ile değiştirilir.
Şimdi çalışan bir udev kuralınız var. Önyükleme sırasında o bağlantı noktasına hangi video numarası atanırsa yapılsın bir USB hub adresine bağlı bir bağlantı.
Son listeyi bir dosyaya yazın /etc/udev/rules.d/cam.rules
. udevadm trigger
Etkinleştirmek için çalıştırın ve iş yapılır. /dev/camera2
Video numarasından bağımsız olarak aynı kamera (USB bağlantı noktası) olacaktır.