Как отключить некоторые интерфейсы, предоставляемые камерой “Intel(R) RealSense(TM)”?

Вопрос или проблема

У меня есть камера Intel(R) RealSense(TM) Depth Camera 435.

Эта камера предоставляет множество интерфейсов. Меня интересует только один из них, который выдаёт RGB выход.

# ls /dev/video*
/dev/video0  /dev/video1  /dev/video2  /dev/video3  /dev/video4  /dev/video5  /dev/video6
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ATTR{interface}=="Intel(R) RealSense(TM) Depth Camera 435 with RGB Module Depth", ATTR{authorized}="0"

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ATTR{index}!="0", ATTR{interface}=="Intel(R) RealSense(TM) Depth Camera 435 with RGB Module RGB", ATTR{authorized}="0"

Первое правило работает и удаляет устройства, которые меня не интересуют.

Второе правило не работает. Я предполагаю, что ATTR{index}!="0" не срабатывает. Что мне использовать вместо него?

Также как сделать одно из устройств по умолчанию / первым устройством (/dev/video0)? Я пробовал использовать символическую ссылку, и это не сработало.

Ядро: 6.8.0-51-generic
Ubuntu: Ubuntu 24.04.1 LTS

Вывод команды udevadm info -a -p $(udevadm info -q path -n /dev/video0):


Udevadm info начинается с устройства, указанного devpath, и затем
проходит вверх по цепочке родительских устройств. Он выводит для каждого устройства
найденного, все возможные атрибуты в формате ключа udev-правил.
Правило для сопоставления может быть составлено из атрибутов устройства
и атрибутов одного единственного родительского устройства.

  изучение устройства '/devices/pci0000:00/0000:00:08.1/0000:07:00.4/usb4/4-1/4-1:1.3/video4linux/video4':
    KERNEL=="video4"
    SUBSYSTEM=="video4linux"
    DRIVER==""
    ATTR{dev_debug}=="0"
    ATTR{index}=="0"
    ATTR{name}=="Intel(R) RealSense(TM) Depth Ca"
    ATTR{power/async}=="disabled"
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_kids}=="0"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_enabled}=="disabled"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"
    ATTR{power/runtime_usage}=="0"

  изучение родительского устройства '/devices/pci0000:00/0000:00:08.1/0000:07:00.4/usb4/4-1/4-1:1.3':
    KERNELS=="4-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) Depth Camera 435 with RGB Module RGB"
    ATTRS{physical_location/dock}=="no"
    ATTRS{physical_location/horizontal_position}=="left"
    ATTRS{physical_location/lid}=="no"
    ATTRS{physical_location/panel}=="unknown"
    ATTRS{physical_location/vertical_position}=="center"
    ATTRS{power/async}=="enabled"
    ATTRS{power/runtime_active_kids}=="0"
    ATTRS{power/runtime_enabled}=="enabled"
    ATTRS{power/runtime_status}=="suspended"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{supports_autosuspend}=="1"

  изучение родительского устройства '/devices/pci0000:00/0000:00:08.1/0000:07:00.4/usb4/4-1':
    KERNELS=="4-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}=="50c3"
    ATTRS{bmAttributes}=="c0"
    ATTRS{busnum}=="4"
    ATTRS{configuration}==""
    ATTRS{devnum}=="25"
    ATTRS{devpath}=="1"
    ATTRS{idProduct}=="0b07"
    ATTRS{idVendor}=="8086"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Intel(R) RealSense(TM) Depth Camera 435 "
    ATTRS{maxchild}=="0"
    ATTRS{physical_location/dock}=="no"
    ATTRS{physical_location/horizontal_position}=="left"
    ATTRS{physical_location/lid}=="no"
    ATTRS{physical_location/panel}=="unknown"
    ATTRS{physical_location/vertical_position}=="center"
    ATTRS{power/active_duration}=="2164"
    ATTRS{power/async}=="enabled"
    ATTRS{power/autosuspend}=="2"
    ATTRS{power/autosuspend_delay_ms}=="2000"
    ATTRS{power/connected_duration}=="2164"
    ATTRS{power/control}=="auto"
    ATTRS{power/level}=="auto"
    ATTRS{power/persist}=="1"
    ATTRS{power/runtime_active_kids}=="0"
    ATTRS{power/runtime_active_time}=="2037"
    ATTRS{power/runtime_enabled}=="enabled"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{product}=="Intel(R) RealSense(TM) Depth Camera 435 "
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="012523021278"
    ATTRS{speed}=="5000"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="147"
    ATTRS{version}==" 3.20"

  изучение родительского устройства '/devices/pci0000:00/0000:00:08.1/0000:07:00.4/usb4':
    KERNELS=="usb4"
    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}=="0608"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="4"
    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 6.8.0-51-generic xhci-hcd"
    ATTRS{maxchild}=="2"
    ATTRS{power/active_duration}=="1791955"
    ATTRS{power/async}=="enabled"
    ATTRS{power/autosuspend}=="0"
    ATTRS{power/autosuspend_delay_ms}=="0"
    ATTRS{power/connected_duration}=="11764481"
    ATTRS{power/control}=="auto"
    ATTRS{power/level}=="auto"
    ATTRS{power/runtime_active_kids}=="1"
    ATTRS{power/runtime_active_time}=="1791941"
    ATTRS{power/runtime_enabled}=="enabled"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="9972540"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{power/wakeup}=="disabled"
    ATTRS{power/wakeup_abort_count}==""
    ATTRS{power/wakeup_active}==""
    ATTRS{power/wakeup_active_count}==""
    ATTRS{power/wakeup_count}==""
    ATTRS{power/wakeup_expire_count}==""
    ATTRS{power/wakeup_last_time_ms}==""
    ATTRS{power/wakeup_max_time_ms}==""
    ATTRS{power/wakeup_total_time_ms}==""
    ATTRS{product}=="xHCI Host Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="0000:07:00.4"
    ATTRS{speed}=="10000"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="1078"
    ATTRS{version}==" 3.10"

  изучение родительского устройства '/devices/pci0000:00/0000:00:08.1/0000:07:00.4':
    KERNELS=="0000:07:00.4"
    SUBSYSTEMS=="pci"
    DRIVERS=="xhci_hcd"
    ATTRS{ari_enabled}=="0"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0330"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{current_link_speed}=="8.0 GT/s PCIe"
    ATTRS{current_link_width}=="16"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{dbc}=="disabled"
    ATTRS{dbc_bInterfaceProtocol}=="01"
    ATTRS{dbc_bcdDevice}=="0010"
    ATTRS{dbc_idProduct}=="0010"
    ATTRS{dbc_idVendor}=="1d6b"
    ATTRS{device}=="0x1639"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="56"
    ATTRS{local_cpulist}=="0-15"
    ATTRS{local_cpus}=="ffff"
    ATTRS{max_link_speed}=="16.0 GT/s PCIe"
    ATTRS{max_link_width}=="16"
    ATTRS{msi_bus}=="1"
    ATTRS{msi_irqs/57}=="msix"
    ATTRS{msi_irqs/58}=="msix"
    ATTRS{msi_irqs/59}=="msix"
    ATTRS{msi_irqs/60}=="msix"
    ATTRS{msi_irqs/61}=="msix"
    ATTRS{msi_irqs/62}=="msix"
    ATTRS{msi_irqs/63}=="msix"
    ATTRS{msi_irqs/64}=="msix"
    ATTRS{numa_node}=="-1"
    ATTRS{power/async}=="enabled"
    ATTRS{power/control}=="on"
    ATTRS{power/runtime_active_kids}=="2"
    ATTRS{power/runtime_active_time}=="11765048"
    ATTRS{power/runtime_enabled}=="forbidden"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/runtime_usage}=="1"
    ATTRS{power/wakeup}=="enabled"
    ATTRS{power/wakeup_abort_count}=="0"
    ATTRS{power/wakeup_active}=="0"
    ATTRS{power/wakeup_active_count}=="0"
    ATTRS{power/wakeup_count}=="0"
    ATTRS{power/wakeup_expire_count}=="0"
    ATTRS{power/wakeup_last_time_ms}=="0"
    ATTRS{power/wakeup_max_time_ms}=="0"
    ATTRS{power/wakeup_total_time_ms}=="0"
    ATTRS{power_state}=="D0"
    ATTRS{remove}=="(not readable)"
    ATTRS{rescan}=="(not readable)"
    ATTRS{reset}=="(not readable)"
    ATTRS{reset_method}=="pm"
    ATTRS{resource0}=="(not readable)"
    ATTRS{revision}=="0x00"
    ATTRS{subsystem_device}=="0x50ae"
    ATTRS{subsystem_vendor}=="0x17aa"
    ATTRS{vendor}=="0x1022"

  изучение родительского устройства '/devices/pci0000:00/0000:00:08.1':
    KERNELS=="0000:00:08.1"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{ari_enabled}=="0"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{current_link_speed}=="8.0 GT/s PCIe"
    ATTRS{current_link_width}=="16"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{device}=="0x1635"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="2"
    ATTRS{irq}=="42"
    ATTRS{local_cpulist}=="0-15"
    ATTRS{local_cpus}=="ffff"
    ATTRS{max_link_speed}=="16.0 GT/s PCIe"
    ATTRS{max_link_width}=="16"
    ATTRS{msi_bus}=="1"
    ATTRS{msi_irqs/42}=="msi"
    ATTRS{numa_node}=="-1"
    ATTRS{power/async}=="enabled"
    ATTRS{power/autosuspend_delay_ms}=="100"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_kids}=="5"
    ATTRS{power/runtime_active_time}=="11765057"
    ATTRS{power/runtime_enabled}=="enabled"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{power/wakeup}=="enabled"
    ATTRS{power/wakeup_abort_count}=="0"
    ATTRS{power/wakeup_active}=="0"
    ATTRS{power/wakeup_active_count}=="0"
    ATTRS{power/wakeup_count}=="0"
    ATTRS{power/wakeup_expire_count}=="0"
    ATTRS{power/wakeup_last_time_ms}=="0"
    ATTRS{power/wakeup_max_time_ms}=="0"
    ATTRS{power/wakeup_total_time_ms}=="0"
    ATTRS{power_state}=="D0"
    ATTRS{remove}=="(not readable)"
    ATTRS{rescan}=="(not readable)"
    ATTRS{reset}=="(not readable)"
    ATTRS{reset_method}=="pm"
    ATTRS{revision}=="0x00"
    ATTRS{secondary_bus_number}=="7"
    ATTRS{subordinate_bus_number}=="7"
    ATTRS{subsystem_device}=="0x17aa"
    ATTRS{subsystem_vendor}=="0x50ae"
    ATTRS{vendor}=="0x1022"

  изучение родительского устройства '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{power/async}=="enabled"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_kids}=="20"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_enabled}=="disabled"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{waiting_for_supplier}=="0"

Ответ или решение

Чтобы отключить некоторые интерфейсы, предоставляемые камерой Intel(R) RealSense(TM) Depth Camera 435 и оставить только интерфейс, который выдает RGB-выход, необходимо воспользоваться механизмом правила udev. Поскольку ваше текущее правило не срабатывает, мы рассмотрим возможные причины и предложим решение.

Теория

Камера Intel RealSense подключается через USB и распознается системой как набор устройств, представляющих разные функции камеры (например, RGB, глубина и инфракрасный). Каждое из этих устройств отображается в системе как /dev/videoN.

Правила udev позволяют управлять устройствами на уровне ядра. Благодаря их использованию можно автоматически выполнять определенные действия при добавлении или удалении устройств. Ваше текущее правило udev для отключения интерфейсов камеры выглядит следующим образом:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ATTR{interface}=="Intel(R) RealSense(TM) Depth Camera 435 with RGB Module Depth", ATTR{authorized}="0"

Это правило работает, так как отключает нежелательный интерфейс глубины, но, как вы указали, второе правило не работает. Предполагается, что атрибут ATTR{index}!="0" может быть причиной.

Пример

В выводе команды udevadm info -a -p $(udevadm info -q path -n /dev/video0) видно, что ATTR{index} иногда может быть 0, и это значение не всегда уникально идентифицирует интерфейс. Поиск уникального атрибута, например ATTR{bInterfaceNumber}, может помочь в точной идентификации интерфейса.

Применение

  1. Определение целевого интерфейса:
    Согласно вашему выводу, интерфейс для RGB модуля имеет bInterfaceNumber равный "03". Это может быть более надежным критерием для идентификации интерфейса, который необходимо оставить активным.

  2. Обновление правила udev:
    Обновите существующее правило следующим образом, чтобы отключить все, кроме интерфейса с bInterfaceNumber="03":

    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ATTRS{bInterfaceNumber}=="03", ATTR{authorized}="1"
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ATTRS{bInterfaceNumber}!="03", ATTR{authorized}="0"

    Эти правила обеспечивают, что только интерфейс RGB остается активным, отключая все остальные.

  3. Установка устройства по умолчанию:
    Для установки устройства по умолчанию /dev/video0 следует пользоваться механизмом persist device naming из udev. Сделайте следующее:

    • Добавьте правило в /etc/udev/rules.d/99-realsense.rules:
      SUBSYSTEM=="video4linux", ATTR{name}=="Intel(R) RealSense(TM) Depth Ca", KERNEL=="video?", SYMLINK+="video_rspl_rgb"
    • Это создаст символическую ссылку /dev/video_rspl_rgb, которую вы можете использовать в приложениях, требующих доступ по умолчанию.
  4. Перезагрузка udev:
    Примените изменения, перезапустив udev:

    sudo udevadm control --reload-rules
    sudo udevadm trigger
  5. Проверка:
    Убедитесь, что все работает корректно, путем проверки созданной ссылки и списка активных устройств.

Следуя шагам, представленным выше, вы сможете эффективно управлять интерфейсами вашей камеры, оставив активным только нужный RGB интерфейс, и установить его в качестве устройства по умолчанию в системе Ubuntu.

Оцените материал
Добавить комментарий

Капча загружается...