udev rule 파악하기

About_work·2024년 8월 28일
0

realsense

목록 보기
1/3

0. 들어가기 전에: 개념

  • "kernel"이 의미하는 바를 설명하겠습니다.
  • 이와 함께 USB 포트와 /dev/videoX 장치 간의 관계도 다룹니다.

1. Kernel의 역할

  • Kernel은 운영체제의 핵심 부분으로, 하드웨어와 소프트웨어 간의 상호작용을 관리
  • RealSense 카메라 같은 장치가 연결되면, 커널은 해당 장치에 접근하고 제어하기 위한 드라이버를 로드
  • 이 드라이버는 RealSense 카메라에서 다양한 데이터를 받아서 소프트웨어가 사용할 수 있는 형태로 제공

즉, 커널은:

  • 하드웨어 장치(카메라, USB 등)를 관리하고,
  • 해당 장치가 제공하는 여러 데이터 스트림(Depth, RGB, IR 등)을 처리

2. USB 포트와 장치의 관계

  • USB 포트는 RealSense 같은 복합 장치가 운영체제에 연결되는 물리적 연결점입니다.
  • RealSense 카메라 하나가 하나의 USB 포트를 통해 여러 스트림(Depth, RGB, IR 등)을 동시에 보낼 수 있습니다.

3. /dev/videoX 가상 장치와 커널의 관계

운영체제는 하나의 물리적 장치(RealSense 카메라)에서 오는 여러 데이터 스트림을 구분하기 위해 여러 가상 장치(/dev/videoX)를 만듭니다. 각 가상 장치는 물리적 장치의 특정 스트림(예: Depth, RGB, IR 등)에 대응됩니다.

커널 드라이버의 역할:

  • 하나의 커널 드라이버(예: uvcvideo)가 전체 RealSense 카메라를 관리
  • 이 커널 드라이버는 RealSense 카메라에서 오는 다양한 스트림을 처리하고, 각각을 /dev/videoX로 분리하여 제공합니다.
  • 따라서 커널 드라이버는 하나이지만, 그 드라이버는 여러 개의 가상 장치(/dev/videoX)를 통해 각 스트림을 처리하고 접근할 수 있도록 합니다.
  • 따라서 /dev/videoX마다 별도의 커널이 존재하지 않고, 하나의 커널이 여러 스트림을 처리하고 각 스트림을 /dev/videoX 형태로 분리해 주는 것입니다.

1. 목적

  • 특정 위치의 물리적 USB port에 연결된 realsense는, 무조건 "realsense%d" 이름의 SYMLINK를 가지도록 규칙을 정하자.
  • 예:
    • usb hub port 1번 -> realsense 0
      • /dev/realsense0 -> video12
    • usb hub port 2번 -> realsense 1
      • /dev/realsense1 -> video18

2. 방법

2.1. 센서 port 를 usb port에 꼽는다.

  • 하나씩 꼽아보자.

2.2. 꼽은 usb port의 커널 경로 찾기

  • lsusb 명령어
    • 연결된 USB 장치 목록을 확인 해서, 방급 꼽은 realsense 의 포트가 어떤 포트인지 확인
    • Bus 010 Device 004: ID 8086:0b07 Intel Corp. Intel(R) RealSense(TM) Depth Camera 435

  • 실제 로봇
Bus 001 Device 007: ID 8086:0b07 Intel Corp. Intel(R) RealSense(TM) Depth Camera 435 

2.2.1. 각 부분의 의미

  1. Bus 010 Device 002:

    • Bus 010:
      • 이 장치가 연결된 USB 버스의 번호
      • USB 버스는 컴퓨터 내부에서 USB 장치들을 연결하는 통로 같은 것
    • Device 002:
      • 이 버스에 연결된 장치의 번호
      • 같은 버스에 여러 장치가 연결될 수 있고, 그 중에서 두 번째 장치라는 의미
  2. ID 8086:0b07:

    • 8086:
      • 이 숫자는 장치의 제조사(벤더) ID
      • 8086은 Intel의 고유한 ID
    • 0b07:
      • 이 숫자는 장치의 제품 ID
  3. Intel Corp. Intel(R) RealSense(TM) Depth Camera 435:

    • 이 부분은 장치의 제조사와 모델 이름을 나타냅니다.
    • Intel Corp.: 이 장치를 만든 회사는 Intel입니다.
    • Intel(R) RealSense(TM) Depth Camera 435: 이 장치의 이름은 Intel RealSense 435 깊이 카메라입니다. 이 카메라는 3D 깊이 데이터를 캡처할 수 있는 카메라입니다.

2.3. 위 realsense 가 어떤 dev/video%d 에 연결되어 있는지 확인하는 방법

  • 각 /dev/videoX 장치는 각각의 센서 또는 스트림을 다루기 위해 별도로 생성된 인터페이스를 나타냅니다.
  • 운영체제는 하나의 USB 포트에 연결된 장치가 여러 개의 스트림을 제공할 때, 이를 구분하기 위해 가상 장치(virtual devices)를 만듭니다.
  • 즉, 여러 개의 /dev/videoX 장치들은 하나의 물리적인 장치에 있는 여러 스트림을 구분해서 접근할 수 있게 해주는 것입니다.
  • Intel RealSense Depth Camera 435가 어떤 /dev/video%d에 연결되어 있는지 확인하는 방법은 다음과 같습니다.

3. v4l2-ctl 명령어로 장치 확인

  • v4l2-ctl 명령어로 연결된 장치와 그에 해당하는 /dev/video%d 파일을 확인할 수 있습니다.
  • 다음 명령어를 사용하세요:
    v4l2-ctl --list-devices
  • 이 명령어는 연결된 모든 비디오 장치의 이름과 그에 해당하는 /dev/video%d 파일들을 보여줍니다.
  • 리스트에서 Intel(R) RealSense(TM) Depth Camera 435와 그에 연결된 /dev/video0, /dev/video1, ... 파일들을 찾을 수 있습니다.
Intel(R) RealSense(TM) Depth Ca (usb-0000:00:14.0-6):
        /dev/video12 # depth
        /dev/video13 # 메타데이터 스트림
        /dev/video14 # 적외선 센서(Infrared Sensor)
        /dev/video15 # 메타데이터 스트림
        /dev/video16 # rgb
        /dev/video17 # 메타데이터 스트림

2.5. /dev/video%d 로 부터 KERNEL 찾기

xxx@xxx-company-desktop:~/Desktop$ udevadm info -q path /dev/video0
/devices/pci0000:40/0000:40:01.1/0000:41:00.0/0000:42:08.0/0000:45:00.3/usb10/10-4/10-4:1.0/video4linux/video0
  • 위에서, kernel은 10-4 임
mvp-510a@d907:~/workspace/next-navigation/bringup$ udevadm info -q path /dev/video12
/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0/video4linux/video12
mvp-510a@d907:~/workspace/next-navigation/bringup$ udevadm info -q path /dev/video13
/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0/video4linux/video13
mvp-510a@d907:~/workspace/next-navigation/bringup$ udevadm info -q path /dev/video14
/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0/video4linux/video14
mvp-510a@d907:~/workspace/next-navigation/bringup$ udevadm info -q path /dev/video15
/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0/video4linux/video15
  • 위에서, kernel은 1-6임

0. 커멘트

0.1. 커멘트에 대한 설명

  • 특정 장치(예: realsense0)에 대해 심볼릭 링크(일종의 바로가기)를 설정하는 방법
  • 요약
    • 장치에 대한 심볼릭 링크를 만들려면,
      • 먼저 lsusb를 통해 장치가 연결된 위치(포트)를 파악한 다음,
      • udevadm info -q path로 해당 장치의 커널 경로(KERNELS 위치)를 확인
      • 그런 다음 이 정보를 바탕으로 장치 파일에 심볼릭 링크를 설정

1. 디바이스 심볼릭 링크 (심링크) 매핑

  • "심볼릭 링크"는 어떤 파일이나 디렉터리에 대한 바로가기 같은 것
  • 예를 들어, realsense0이라는 이름으로, 특정 장치 파일에 접근할 수 있게 설정하고 싶을 때,
    • 심볼릭 링크를 사용할 수 있습니다.

2. 장치 위치 확인

  • lsusb 명령어를 사용하여 연결된 USB 장치 목록을 확인
    • 여기서 원하는 장치가 어떤 포트에 있는지를 알 수 있음

3. KERNELS 위치 찾기

  • udevadm info -q path 명령어를 사용하여
    • 해당 장치의 경로를 찾습니다.
    • 해당 장치 파일과 관련된 커널 경로를 보여줍니다.
  • 이 경로를 알고 있어야 심볼릭 링크를 정확하게 설정할 수 있습니다.
  • system_setup/script/udev-rule-setup.sh

0.2. 커멘트에 대한 설명 2

echo '
SUBSYSTEM=="video4linux", KERNELS=="2-3.1", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ENV{ID_USB_INTERFACE_NUM}=="00", ATTR{index}=="0", SYMLINK+="realsense0"
SUBSYSTEM=="video4linux", KERNELS=="2-3.2", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ENV{ID_USB_INTERFACE_NUM}=="00", ATTR{index}=="0", SYMLINK+="realsense1"
SUBSYSTEM=="video4linux", KERNELS=="2-3.3", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ENV{ID_USB_INTERFACE_NUM}=="00", ATTR{index}=="0", SYMLINK+="realsense2"
SUBSYSTEM=="video4linux", KERNELS=="2-2.1", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ENV{ID_USB_INTERFACE_NUM}=="00", ATTR{index}=="0", SYMLINK+="realsense3"
'  | tee /etc/udev/rules.d/realsense.rules
  • 요약
    • 이 스크립트는 USB 포트와 특정 조건에 맞는 Intel Realsense 카메라 장치가 연결될 때마다
      • 고정된 이름(realsense0, realsense1 등)으로 접근할 수 있게 하기 위해 udev 규칙을 설정하는 것입니다.
    • 이를 통해 장치가 어느 포트에 연결되든 간에, 항상 같은 이름으로 접근할 수 있도록 보장합니다.

1. udev 규칙이란?

  • udev는 Linux 시스템에서 장치가 연결되거나 제거될 때 실행되는 규칙을 정의할 수 있는 시스템
  • 이 규칙을 통해 특정 장치가 연결될 때 자동으로 설정을 적용할 수 있음
  • 예를 들어, 특정 USB 장치가 연결될 때마다 자동으로 realsense0라는 이름의 심볼릭 링크를 만들 수 있습니다.

2. 규칙 파일 생성

  • 스크립트에서 tee /etc/udev/rules.d/realsense.rules 명령어를 사용하여
    • /etc/udev/rules.d/realsense.rules 파일을 생성하거나 업데이트합니다.
    • 이 파일은 udev 규칙을 정의하는 파일입니다.

3. 규칙의 내용

  • 각 줄은 특정 조건에 맞는 장치가 연결될 때 적용될 규칙을 정의합니다.

  • 예시 규칙:

    SUBSYSTEM=="video4linux", KERNELS=="2-3.1", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", ENV{ID_USB_INTERFACE_NUM}=="00", ATTR{index}=="0", SYMLINK+="realsense0"
    • SUBSYSTEM=="video4linux": 이 규칙은 비디오 장치에 적용됩니다.
    • KERNELS=="2-3.1": 이 장치가 USB 포트 2-3.1에 연결되었을 때 적용됩니다.
    • ATTRS{idVendor}=="8086": 장치의 공급업체 ID가 8086일 때 적용됩니다. (Intel의 벤더 ID)
    • ATTRS{idProduct}=="0b07": 장치의 제품 ID가 0b07일 때 적용됩니다.
    • ENV{ID_USB_INTERFACE_NUM}=="00": USB 인터페이스 번호가 00일 때 적용됩니다.
    • ATTR{index}=="0": 비디오 장치의 인덱스가 0일 때 적용됩니다.
    • SYMLINK+="realsense0": 이 규칙이 적용될 때 /dev/realsense0이라는 심볼릭 링크가 생성됩니다.
  • 다른 줄들도 비슷한 규칙을 정의하고 있으며, USB 포트와 연결된 장치에 따라 각각 realsense1, realsense2, realsense3이라는 심볼릭 링크를 만듭니다.

4. 실행 효과

  • 이 스크립트가 실행되면, 특정 USB 포트에 Intel Realsense 카메라가 연결될 때마다 udev가 자동으로 심볼릭 링크를 만들어 줍니다.
  • 예를 들어, 2-3.1 포트에 연결된 카메라는 /dev/realsense0이라는 이름으로 접근할 수 있게 됩니다.

1. 래포지토리

1.1.

  • 센서 장착 위치에 따른 디바이스 이름(/dev/realsense%d) 규칙을 생성해주기

1.2.

  • target RGBD camera의 디바이스 이름을 이용해서 -> physical_port 정보 조회
        idx_physical_port: str = "/sys" + subprocess.Popen(
            "udevadm info --query=path --name=/dev/realsense%d" %
            self.args.camera_idx,
            shell=True,
            bufsize=64,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            close_fds=True).stdout.read().decode('utf-8').strip().split('\n')[0]

1.3.

  • 연결되어 있는 모든 RealSense 디바이스의 정보를 조회해서,
for a_connected_device in rs_context.devices:
  device_physical_port = a_connected_device.get_info(
                              rs.camera_info.physical_port)
  • target RGBD camera의 physical port와 일치하는 디바이스를 찾아서 연결
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글