Intel RealSense D415へのシンボリックリンクを自動的に設定するためにudevを使用しようとしています。これは、コンピュータが複数のカメラを使用しており、ファイル名(再起動時に変更されない)でカメラを確実に参照できる必要があるためです。
RealSense D415 in /dev
。最初の2つのデバイスへのシンボリックリンクの設定に問題はありませんが、私が知っている限り、最初とKERNEL
3番目のデバイスはプロパティを除いて同じですKERNELS
。他のカメラを接続すると変更されることがあります。
udevルールを使用してそれらをどのように区別できますか?
出力sudo udevadm info -ap /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0/video4linux/video0
:
looking at device '/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0/video4linux/video0':
KERNEL=="video0"
SUBSYSTEM=="video4linux"
DRIVER==""
ATTR{dev_debug}=="0"
ATTR{index}=="0"
ATTR{name}=="Intel(R) RealSense(TM) 415: Int"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0':
KERNELS=="2-1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="uvcvideo"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="0e"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bInterfaceSubClass}=="01"
ATTRS{bNumEndpoints}=="01"
ATTRS{iad_bFirstInterface}=="00"
ATTRS{iad_bFunctionClass}=="0e"
ATTRS{iad_bFunctionProtocol}=="00"
ATTRS{iad_bFunctionSubClass}=="03"
ATTRS{iad_bInterfaceCount}=="03"
ATTRS{interface}=="Intel(R) RealSense(TM) 415 Depth"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="ef"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bDeviceSubClass}=="02"
ATTRS{bMaxPacketSize0}=="9"
ATTRS{bMaxPower}=="440mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 5"
ATTRS{bcdDevice}=="508f"
ATTRS{bmAttributes}=="c0"
ATTRS{busnum}=="2"
ATTRS{configuration}==""
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{idProduct}=="0ad3"
ATTRS{idVendor}=="8086"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Intel(R) RealSense(TM) 415"
ATTRS{maxchild}=="0"
ATTRS{product}=="Intel(R) RealSense(TM) 415"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="removable"
ATTRS{serial}=="736613021813"
ATTRS{speed}=="5000"
ATTRS{urbnum}=="56"
ATTRS{version}==" 3.10"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb2':
KERNELS=="usb2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{authorized_default}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceProtocol}=="03"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="9"
ATTRS{bMaxPower}=="0mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bcdDevice}=="0415"
ATTRS{bmAttributes}=="e0"
ATTRS{busnum}=="2"
ATTRS{configuration}==""
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{idProduct}=="0003"
ATTRS{idVendor}=="1d6b"
ATTRS{interface_authorized_default}=="1"
ATTRS{ltm_capable}=="yes"
ATTRS{manufacturer}=="Linux 4.15.0-36-generic xhci-hcd"
ATTRS{maxchild}=="10"
ATTRS{product}=="xHCI Host Controller"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="unknown"
ATTRS{serial}=="0000:00:14.0"
ATTRS{speed}=="5000"
ATTRS{urbnum}=="101"
ATTRS{version}==" 3.00"
looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{d3cold_allowed}=="1"
ATTRS{dbc}=="disabled"
ATTRS{device}=="0xa2af"
ATTRS{dma_mask_bits}=="64"
ATTRS{driver_override}=="(null)"
ATTRS{enable}=="1"
ATTRS{irq}=="123"
ATTRS{local_cpulist}=="0-3"
ATTRS{local_cpus}=="f"
ATTRS{msi_bus}=="1"
ATTRS{numa_node}=="-1"
ATTRS{revision}=="0x00"
ATTRS{subsystem_device}=="0x310c"
ATTRS{subsystem_vendor}=="0x17aa"
ATTRS{vendor}=="0x8086"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
出力sudo udevadm info -ap /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.3/video4linux/video2
:
looking at device '/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.3/video4linux/video2':
KERNEL=="video2"
SUBSYSTEM=="video4linux"
DRIVER==""
ATTR{dev_debug}=="0"
ATTR{index}=="0"
ATTR{name}=="Intel(R) RealSense(TM) 415: Int"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.3':
KERNELS=="2-1:1.3"
SUBSYSTEMS=="usb"
DRIVERS=="uvcvideo"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="0e"
ATTRS{bInterfaceNumber}=="03"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bInterfaceSubClass}=="01"
ATTRS{bNumEndpoints}=="00"
ATTRS{iad_bFirstInterface}=="03"
ATTRS{iad_bFunctionClass}=="0e"
ATTRS{iad_bFunctionProtocol}=="00"
ATTRS{iad_bFunctionSubClass}=="03"
ATTRS{iad_bInterfaceCount}=="02"
ATTRS{interface}=="Intel(R) RealSense(TM) 415 RGB"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="ef"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bDeviceSubClass}=="02"
ATTRS{bMaxPacketSize0}=="9"
ATTRS{bMaxPower}=="440mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 5"
ATTRS{bcdDevice}=="508f"
ATTRS{bmAttributes}=="c0"
ATTRS{busnum}=="2"
ATTRS{configuration}==""
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{idProduct}=="0ad3"
ATTRS{idVendor}=="8086"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Intel(R) RealSense(TM) 415"
ATTRS{maxchild}=="0"
ATTRS{product}=="Intel(R) RealSense(TM) 415"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="removable"
ATTRS{serial}=="736613021813"
ATTRS{speed}=="5000"
ATTRS{urbnum}=="56"
ATTRS{version}==" 3.10"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb2':
KERNELS=="usb2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{authorized_default}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceProtocol}=="03"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="9"
ATTRS{bMaxPower}=="0mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bcdDevice}=="0415"
ATTRS{bmAttributes}=="e0"
ATTRS{busnum}=="2"
ATTRS{configuration}==""
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{idProduct}=="0003"
ATTRS{idVendor}=="1d6b"
ATTRS{interface_authorized_default}=="1"
ATTRS{ltm_capable}=="yes"
ATTRS{manufacturer}=="Linux 4.15.0-36-generic xhci-hcd"
ATTRS{maxchild}=="10"
ATTRS{product}=="xHCI Host Controller"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="unknown"
ATTRS{serial}=="0000:00:14.0"
ATTRS{speed}=="5000"
ATTRS{urbnum}=="101"
ATTRS{version}==" 3.00"
looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{d3cold_allowed}=="1"
ATTRS{dbc}=="disabled"
ATTRS{device}=="0xa2af"
ATTRS{dma_mask_bits}=="64"
ATTRS{driver_override}=="(null)"
ATTRS{enable}=="1"
ATTRS{irq}=="123"
ATTRS{local_cpulist}=="0-3"
ATTRS{local_cpus}=="f"
ATTRS{msi_bus}=="1"
ATTRS{numa_node}=="-1"
ATTRS{revision}=="0x00"
ATTRS{subsystem_device}=="0x310c"
ATTRS{subsystem_vendor}=="0x17aa"
ATTRS{vendor}=="0x8086"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
答え1
ここには差別化要素があるようです。
ATTRS{interface}=="Intel(R) RealSense(TM) 415 Depth"
そして
ATTRS{interface}=="Intel(R) RealSense(TM) 415 RGB"
複数のカメラを区別するには、次のものが必要な場合があります。
ATTRS{serial}=="736613021813"
マニュアルudev(7)
ページには次のように記載されています。
親デバイスと一致する複数のキーが単一のルールで指定されている場合は、すべてのキーが同じ親デバイスで一致する必要があります。
インターフェイスを区別可能にする属性は親ブロックにあり、カメラを区別可能にする属性は親ブロックにあります。したがって、複数のルール行を使用する必要があります。
各カメラには、次の一連の規則が必要です。
SUBSYSTEM=="video4linux", ATTRS{serial}!="736613021813", GOTO="not_first_camera"
SUBSYSTEM=="video4linux", KERNEL=="video*", ATTRS{interface}=="Intel(R) RealSense(TM) 415 Depth", SYMLINK+="cam1_depth"
SUBSYSTEM=="video4linux", KERNEL=="video*", ATTRS{interface}=="Intel(R) RealSense(TM) 415 RGB", SYMLINK+="cam1_rgb"
LABEL="not_first_camera"
カメラのシリアル番号が一致しない場合、最初のルールは次の2つのルールを無視します。これにより、最初のルールとそれにリンクされているラベルの間で私たちが話しているカメラのアイデンティティを確認し、インターフェースを区別することに集中できます。
LABEL=
各ブロックには、一意の行とGOTO=
一意のラベルに一致するステートメントが必要です。もちろんSYMLINK
、好きなように名前を付けることができます。
答え2
私の場合、USBハブに4つの同じカメラがあります。シリアル番号はありません。他のカメラモデルはビデオ0..video6(カメラあたり2つ)として表示されます。 fswebcamを使って写真を撮っています。カメラが2つのビデオ番号を占有している場合、1つだけが機能します。したがって、私の(同じ)カメラコレクションはビデオ0-1-2-3またはビデオ0-2-4-6です。
動作しているビデオ番号を識別するには、fswebcam -q -d /dev/videoX tpic.jpgループを実行し、[X]は0〜8で、どのX値が有効かを記録します。
次に、有効な実行ごとに udevadm info --attribute walk --name=/dev/videoX > ファイル
上記のファイルの一括出力から(KERNEL ==)[ビデオ番号]フィールドと(KERNEL ==)[USBハブポートアドレス]フィールドを抽出します。 KERNEL と KERNELS 間の通信は、再起動後も常に維持されるわけではありません。ビデオ0のカメラはビデオ2にすることができます。
したがって、抽出された情報でリストを作成してください。
カーネル == "video0"、サブシステム == "video4linux"、カーネル == "1-1.1.3:0" カーネル == "video1"、サブシステム == "video4linux"、カーネル == "1-1.1. 1: 0"
など
最後に、KERNELSフィールドのリストは、KERNELS番号(USBハブアドレス)がリスト内の常に同じ場所にあるようにソートされます。
次に、ソートされたリストの各行の末尾にシンボリックリンクを追加します。
カーネル == "video1", サブシステム == "video4linux", カーネル == "1-1.1.1:0", Symlink+="cam1" カーネル == "video0", サブシステム == "video4linux", カーネル = = = "1-1.1.3:0",SYMLINK+="cam2"
など
これにより、カメラ番号(cam1-cam4または必要に応じて)がUSBハブポートにバインドされ、ビデオ番号が転送されます。
私はすべてのことをするためにPythonを書いています - 多くのos.system bash呼び出し。
いったん効果があるものがあれば興味を失います。知っておくと良いより簡単な方法がある場合。 grepのようなものを使ってbashでこれを行うことができます。