const float *depth_data = (float*)depth->data; const unsigned int *rgb_data = (unsigned int*)rgb->data; float *undistorted_data = (float*)undistorted->data; unsigned int *registered_data = (unsigned int*)registered->data; const int *map_dist = distort_map; const float *map_x = depth_to_color_map_x; const int *map_yi = depth_to_color_map_yi;
const int size_depth = 512 * 424; const int size_color = 1920 * 1080; const float color_cx = color.cx + 0.5f; // 0.5f added for later rounding
// size of filter map with a border of filter_height_half on top and bottom so that no check for borders is needed. // since the color image is wide angle no border to the sides is needed. const int size_filter_map = size_color + 1920 * filter_height_half * 2; // offset to the important data const int offset_filter_map = 1920 * filter_height_half;
// map for storing the min z values used for each color pixel float *filter_map = NULL; // pointer to the beginning of the important data float *p_filter_map = NULL;
// map for storing the color offset for each depth pixel int *depth_to_c_off = color_depth_map ? color_depth_map : new int[size_depth]; int *map_c_off = depth_to_c_off;
// initializing the depth_map with values outside of the Kinect2 range if(enable_filter){ filter_map = bigdepth ? (float*)bigdepth->data : new float[size_filter_map]; p_filter_map = filter_map + offset_filter_map;
/* Fix depth distortion, and compute pixel to use from 'rgb' based on depth measurement, * stored as x/y offset in the rgb data. */
// iterating over all pixels from undistorted depth and registered color image // the four maps have the same structure as the images, so their pointers are increased each iteration as well for(int i = 0; i < size_depth; ++i, ++undistorted_data, ++map_dist, ++map_x, ++map_yi, ++map_c_off){ // getting index of distorted depth pixel const int index = *map_dist;
// check if distorted depth pixel is outside of the depth image if(index < 0){ *map_c_off = -1; *undistorted_data = 0; continue; }
// getting depth value for current pixel const float z = depth_data[index]; *undistorted_data = z;
// checking for invalid depth value if(z <= 0.0f){ *map_c_off = -1; continue; }
// calculating x offset for rgb image based on depth value const float rx = (*map_x + (color.shift_m / z)) * color.fx + color_cx; const int cx = rx; // same as round for positive numbers (0.5f was already added to color_cx) // getting y offset for depth image const int cy = *map_yi; // combining offsets const int c_off = cx + cy * 1920;
// check if c_off is outside of rgb image // checking rx/cx is not needed because the color image is much wider then the depth image if(c_off < 0 || c_off >= size_color){ *map_c_off = -1; continue; }
// saving the offset for later *map_c_off = c_off;
if(enable_filter){ // setting a window around the filter map pixel corresponding to the color pixel with the current z value int yi = (cy - filter_height_half) * 1920 + cx - filter_width_half; // index of first pixel to set for(int r = -filter_height_half; r <= filter_height_half; ++r, yi += 1920) // index increased by a full row each iteration { float *it = p_filter_map + yi; for(int c = -filter_width_half; c <= filter_width_half; ++c, ++it) { // only set if the current z is smaller if(z < *it) *it = z; } } } }
/* Construct 'registered' image. */
// reseting the pointers to the beginning map_c_off = depth_to_c_off; undistorted_data = (float*)undistorted->data;
/* Filter drops duplicate pixels due to aspect of two cameras. */ if(enable_filter){ // run through all registered color pixels and set them based on filter results for(int i = 0; i < size_depth; ++i, ++map_c_off, ++undistorted_data, ++registered_data){ const int c_off = *map_c_off;
// check if offset is out of image if(c_off < 0){ *registered_data = 0; continue; } f const float min_z = p_filter_map[c_off]; const float z = *undistorted_data;
// check for allowed depth noise *registered_data = (z - min_z) / z > filter_tolerance ? 0 : *(rgb_data + c_off); }
if (!bigdepth) delete[] filter_map; } else { // run through all registered color pixels and set them based on c_off for(int i = 0; i < size_depth; ++i, ++map_c_off, ++registered_data){ const int c_off = *map_c_off;
// check if offset is out of image *registered_data = c_off < 0 ? 0 : *(rgb_data + c_off); } } if (!color_depth_map) delete[] depth_to_c_off; }
$ sudo dmesg -w [ 1780.341670] usb 4-4: new SuperSpeed USB device number 8 using xhci_hcd [ 1781.804378] usb 3-4: new high-speed USB device number 7 using xhci_hcd [ 1781.954783] usb 3-4: New USB device found, idVendor=045e, idProduct=02d9, bcdDevice= 0.70 [ 1781.954794] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 1781.954797] usb 3-4: Product: NuiSensor Adaptor [ 1781.954800] usb 3-4: Manufacturer: Microsoft Corporation [ 1781.955676] hub 3-4:1.0: USB hub found [ 1781.955807] hub 3-4:1.0: 1 port detected [ 1783.324924] usb 4-4: New USB device found, idVendor=045e, idProduct=02d9, bcdDevice= 0.73 [ 1783.324936] usb 4-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 1783.324940] usb 4-4: Product: NuiSensor Adaptor [ 1783.324942] usb 4-4: Manufacturer: Microsoft Corporation [ 1783.326192] hub 4-4:1.0: USB hub found [ 1783.326380] hub 4-4:1.0: 1 port detected [ 1783.808453] usb 4-4.1: new SuperSpeed USB device number 9 using xhci_hcd [ 1783.829395] usb 4-4.1: New USB device found, idVendor=045e, idProduct=02d8, bcdDevice= 1.00 [ 1783.829404] usb 4-4.1: New USB device strings: Mfr=1, Product=2, SerialNumber=4 [ 1783.829408] usb 4-4.1: Product: Xbox NUI Sensor [ 1783.829410] usb 4-4.1: Manufacturer: Microsoft [ 1783.829413] usb 4-4.1: SerialNumber: 501441643042
빌드하고 실행하니
~/src/libfreenect2/build/bin$ ./Protonect Version: 0.2.0 Environment variables: LOGFILE=<protonect.log> Usage: ./Protonect [-gpu=<id>] [gl | cl | clkde | cuda | cudakde | cpu] [<device serial>] [-noviewer] [-norgb | -nodepth] [-help] [-version] [-frames <number of frames to process>] To pause and unpause: pkill -USR1 Protonect [Info] [Freenect2Impl] enumerating devices... [Info] [Freenect2Impl] 10 usb devices connected [Info] [Freenect2Impl] found valid Kinect v2 @4:5 with serial 501441643042 [Info] [Freenect2Impl] found 1 devices libva info: VA-API version 1.14.0 libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null) [Error] [VaapiRgbPacketProcessorImpl] vaInitialize(display, &major_ver, &minor_ver): unknown libva error [Info] [Freenect2DeviceImpl] opening... [Info] [Freenect2DeviceImpl] transfer pool sizes rgb: 20*16384 ir: 60*8*33792 [Info] [Freenect2DeviceImpl] opened [Info] [Freenect2DeviceImpl] starting... [Debug] [Freenect2DeviceImpl] status 0x090000: 9729 [Debug] [Freenect2DeviceImpl] status 0x090000: 9731 [Info] [Freenect2DeviceImpl] submitting rgb transfers... [Info] [Freenect2DeviceImpl] submitting depth transfers... [Debug] [DepthPacketStreamParser] not all subsequences received 0 [Info] [Freenect2DeviceImpl] started device serial: 501441643042 device firmware: 4.0.3911.0 [Debug] [DepthPacketStreamParser] not all subsequences received 768 [Debug] [DepthPacketStreamParser] skipping depth packet [Debug] [DepthPacketStreamParser] skipping depth packet [Debug] [DepthPacketStreamParser] skipping depth packet [Debug] [DepthPacketStreamParser] skipping depth packet [Debug] [DepthPacketStreamParser] skipping depth packet [Debug] [DepthPacketStreamParser] skipping depth packet [Info] [DepthPacketStreamParser] 6 packets were lost [Info] [OpenGLDepthPacketProcessor] avg. time: 16.9263ms -> ~59.0797Hz [Info] [TurboJpegRgbPacketProcessor] avg. time: 15.0939ms -> ~66.2519Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 14.96ms -> ~66.8449Hz [Info] [TurboJpegRgbPacketProcessor] avg. time: 15.5262ms -> ~64.4071Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 14.8158ms -> ~67.4954Hz [Info] [TurboJpegRgbPacketProcessor] avg. time: 15.8073ms -> ~63.2617Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 14.3364ms -> ~69.7524Hz [Info] [TurboJpegRgbPacketProcessor] avg. time: 16.633ms -> ~60.1215Hz
잘나온다. 저번에 10세대에서는 카메라 영상(좌하단)과 3d로 재구성된 영상(우상단)이 찌그러지던데, 무슨 차이이려나?
[ 102.223422] usb 1-3: new high-speed USB device number 5 using xhci_hcd [ 102.375595] usb 1-3: New USB device found, idVendor=045e, idProduct=02d9, bcdDevice= 0.70 [ 102.375609] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 102.375615] usb 1-3: Product: NuiSensor Adaptor [ 102.375619] usb 1-3: Manufacturer: Microsoft Corporation [ 102.377490] hub 1-3:1.0: USB hub found [ 102.377643] hub 1-3:1.0: 1 port detected [ 102.832793] usb 2-3: new SuperSpeed USB device number 3 using xhci_hcd [ 105.820384] usb 2-3: New USB device found, idVendor=045e, idProduct=02d9, bcdDevice= 0.73 [ 105.820400] usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 105.820406] usb 2-3: Product: NuiSensor Adaptor [ 105.820411] usb 2-3: Manufacturer: Microsoft Corporation [ 105.825068] hub 2-3:1.0: USB hub found [ 105.825375] hub 2-3:1.0: 1 port detected [ 106.307431] usb 2-3.1: new SuperSpeed USB device number 4 using xhci_hcd [ 106.328374] usb 2-3.1: New USB device found, idVendor=045e, idProduct=02d8, bcdDevice= 1.00 [ 106.328380] usb 2-3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=4 [ 106.328381] usb 2-3.1: Product: Xbox NUI Sensor [ 106.328383] usb 2-3.1: Manufacturer: Microsoft [ 106.328384] usb 2-3.1: SerialNumber: 501441643042 [ 106.379651] usbcore: registered new interface driver snd-usb-audio [ 120.739532] usb 2-3.1: reset SuperSpeed USB device number 4 using xhci_hcd [ 163.891946] warning: `ThreadPoolForeg' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211 [ 188.498922] usb 1-3: USB disconnect, device number 5 [ 188.581688] usb 2-3: USB disconnect, device number 3 [ 188.581693] usb 2-3.1: USB disconnect, device number 4
되니 좋긴한데.. 되서 나쁘네.. 컴퓨터 바꾸어야 한다는 말이잖아.. ㅠㅠ
libfreenect2/build/bin$ ./Protonect Version: 0.2.0 Environment variables: LOGFILE=<protonect.log> Usage: ./Protonect [-gpu=<id>] [gl | cl | clkde | cuda | cudakde | cpu] [<device serial>] [-noviewer] [-norgb | -nodepth] [-help] [-version] [-frames <number of frames to process>] To pause and unpause: pkill -USR1 Protonect [Info] [Freenect2Impl] enumerating devices... [Info] [Freenect2Impl] 8 usb devices connected [Info] [Freenect2Impl] found valid Kinect v2 @2:4 with serial 501441643042 [Info] [Freenect2Impl] found 1 devices libva info: VA-API version 1.14.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_14 libva info: va_openDriver() returns 0 [Info] [VaapiRgbPacketProcessorImpl] driver: Intel iHD driver for Intel(R) Gen Graphics - 22.3.1 () [Info] [Freenect2DeviceImpl] opening... [Info] [Freenect2DeviceImpl] transfer pool sizes rgb: 20*16384 ir: 60*8*33792 [Info] [Freenect2DeviceImpl] opened [Info] [Freenect2DeviceImpl] starting... [Debug] [Freenect2DeviceImpl] status 0x090000: 9729 [Debug] [Freenect2DeviceImpl] status 0x090000: 9731 [Info] [Freenect2DeviceImpl] submitting rgb transfers... [Info] [Freenect2DeviceImpl] submitting depth transfers... [Debug] [DepthPacketStreamParser] not all subsequences received 0 [Info] [Freenect2DeviceImpl] started device serial: 501441643042 device firmware: 4.0.3911.0 [Debug] [DepthPacketStreamParser] not all subsequences received 960 [Debug] [DepthPacketStreamParser] not all subsequences received 1007 [Info] [DepthPacketStreamParser] 1 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Info] [DepthPacketStreamParser] 3 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1015 [Debug] [DepthPacketStreamParser] not all subsequences received 1015 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Info] [DepthPacketStreamParser] 3 packets were lost [Info] [OpenGLDepthPacketProcessor] avg. time: 7.41895ms -> ~134.79Hz [Info] [VaapiRgbPacketProcessor] avg. time: 3.69809ms -> ~270.41Hz [Debug] [DepthPacketStreamParser] not all subsequences received 1015 [Info] [DepthPacketStreamParser] 1 packets were lost [Info] [OpenGLDepthPacketProcessor] avg. time: 7.03777ms -> ~142.091Hz [Info] [VaapiRgbPacketProcessor] avg. time: 3.92516ms -> ~254.767Hz [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 991 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 987 [Info] [DepthPacketStreamParser] 7 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 991 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Debug] [DepthPacketStreamParser] not all subsequences received 767 [Debug] [DepthPacketStreamParser] not all subsequences received 991 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Info] [DepthPacketStreamParser] 9 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 971 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Info] [VaapiRgbPacketProcessor] avg. time: 4.29916ms -> ~232.603Hz [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Info] [DepthPacketStreamParser] 9 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 987 [Info] [OpenGLDepthPacketProcessor] avg. time: 7.66351ms -> ~130.489Hz [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Info] [DepthPacketStreamParser] 9 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Info] [DepthPacketStreamParser] 2 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1007 [Info] [VaapiRgbPacketProcessor] avg. time: 4.41688ms -> ~226.404Hz [Info] [DepthPacketStreamParser] 2 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Info] [DepthPacketStreamParser] 2 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Info] [OpenGLDepthPacketProcessor] avg. time: 6.63554ms -> ~150.704Hz [Debug] [DepthPacketStreamParser] not all subsequences received 510 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1019 [Debug] [DepthPacketStreamParser] not all subsequences received 1015 [Info] [DepthPacketStreamParser] 5 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Info] [DepthPacketStreamParser] 2 packets were lost [Info] [VaapiRgbPacketProcessor] avg. time: 4.01999ms -> ~248.757Hz [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Info] [DepthPacketStreamParser] 1 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Info] [OpenGLDepthPacketProcessor] avg. time: 6.68671ms -> ~149.55Hz [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Debug] [DepthPacketStreamParser] not all subsequences received 1022 [Info] [DepthPacketStreamParser] 5 packets were lost [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Info] [DepthPacketStreamParser] 2 packets were lost [Info] [VaapiRgbPacketProcessor] avg. time: 4.43949ms -> ~225.251Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 6.87763ms -> ~145.399Hz [Info] [VaapiRgbPacketProcessor] avg. time: 4.5502ms -> ~219.771Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 6.86435ms -> ~145.68Hz [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 959 [Debug] [DepthPacketStreamParser] not all subsequences received 895 [Debug] [DepthPacketStreamParser] not all subsequences received 511 [Debug] [DepthPacketStreamParser] not all subsequences received 959 [Info] [DepthPacketStreamParser] 5 packets were lost [Info] [VaapiRgbPacketProcessor] avg. time: 4.07819ms -> ~245.207Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 6.89874ms -> ~144.954Hz [Info] [VaapiRgbPacketProcessor] avg. time: 4.5117ms -> ~221.646Hz [Debug] [DepthPacketStreamParser] not all subsequences received 991 [Info] [DepthPacketStreamParser] 1 packets were lost [Info] [OpenGLDepthPacketProcessor] avg. time: 7.00382ms -> ~142.779Hz [Info] [VaapiRgbPacketProcessor] avg. time: 4.54288ms -> ~220.125Hz [Info] [OpenGLDepthPacketProcessor] avg. time: 7.04759ms -> ~141.892Hz [Info] [VaapiRgbPacketProcessor] avg. time: 4.4388ms -> ~225.286Hz [Debug] [DepthPacketStreamParser] not all subsequences received 959 [Info] [DepthPacketStreamParser] 1 packets were lost [Info] [Freenect2DeviceImpl] stopping... [Info] [Freenect2DeviceImpl] canceling rgb transfers... [Info] [OpenGLDepthPacketProcessor] avg. time: 7.02522ms -> ~142.344Hz [Info] [Freenect2DeviceImpl] canceling depth transfers... [Info] [Freenect2DeviceImpl] stopped [Info] [Freenect2DeviceImpl] closing... [Info] [Freenect2DeviceImpl] releasing usb interfaces... [Info] [Freenect2DeviceImpl] deallocating usb transfer pools... [Info] [Freenect2DeviceImpl] closing usb device... [Info] [Freenect2DeviceImpl] closed [Info] [Freenect2DeviceImpl] closing... [Info] [Freenect2DeviceImpl] already closed, doing nothing
디버그 모드로 하니 몇 줄 더 나오긴 한데.. 별 차이가 없어 보인다
$ LIBUSB_DEBUG=3 ./Protonect Version: 0.2.0 Environment variables: LOGFILE=<protonect.log> Usage: ./Protonect [-gpu=<id>] [gl | cl | clkde | cuda | cudakde | cpu] [<device serial>] [-noviewer] [-norgb | -nodepth] [-help] [-version] [-frames <number of frames to process>] To pause and unpause: pkill -USR1 Protonect libusb: warning [libusb_init] installing new context as implicit default [Info] [Freenect2Impl] enumerating devices... [Info] [Freenect2Impl] 8 usb devices connected [Info] [Freenect2Impl] found valid Kinect v2 @2:6 with serial 501441643042 [Info] [Freenect2Impl] found 1 devices libva info: VA-API version 1.14.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_14 libva info: va_openDriver() returns 0 [Info] [VaapiRgbPacketProcessorImpl] driver: Intel iHD driver for Intel(R) Gen Graphics - 22.3.1 () [Info] [Freenect2DeviceImpl] opening... [Info] [Freenect2DeviceImpl] transfer pool sizes rgb: 20*16384 ir: 60*8*33792 [Info] [Freenect2DeviceImpl] opened [Info] [Freenect2DeviceImpl] starting... libusb: error [udev_hotplug_event] ignoring udev action change libusb: error [udev_hotplug_event] ignoring udev action change [Debug] [Freenect2DeviceImpl] status 0x090000: 1024 [Debug] [Freenect2DeviceImpl] status 0x090000: 9729 [Debug] [Freenect2DeviceImpl] status 0x090000: 9731 [Info] [Freenect2DeviceImpl] submitting rgb transfers... [Info] [Freenect2DeviceImpl] submitting depth transfers... [Debug] [DepthPacketStreamParser] not all subsequences received 0 [Info] [Freenect2DeviceImpl] started device serial: 501441643042 device firmware: 4.0.3911.0 [Debug] [DepthPacketStreamParser] not all subsequences received 896 [Info] [OpenGLDepthPacketProcessor] avg. time: 7.5057ms -> ~133.232Hz [Info] [VaapiRgbPacketProcessor] avg. time: 4.58964ms -> ~217.882Hz [Debug] [DepthPacketStreamParser] not all subsequences received 511
$ lsusb -t -v /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 10000M ID 1d6b:0003 Linux Foundation 3.0 root hub |__ Port 3: Dev 5, If 0, Class=Hub, Driver=hub/1p, 5000M ID 045e:02d9 Microsoft Corp. |__ Port 1: Dev 6, If 0, Class=Vendor Specific Class, Driver=, 5000M ID 045e:02d8 Microsoft Corp. |__ Port 1: Dev 6, If 1, Class=Vendor Specific Class, Driver=, 5000M ID 045e:02d8 Microsoft Corp. |__ Port 1: Dev 6, If 2, Class=Audio, Driver=snd-usb-audio, 5000M ID 045e:02d8 Microsoft Corp. |__ Port 1: Dev 6, If 3, Class=Audio, Driver=snd-usb-audio, 5000M ID 045e:02d8 Microsoft Corp. /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M ID 1d6b:0002 Linux Foundation 2.0 root hub |__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/1p, 480M ID 045e:02d9 Microsoft Corp. |__ Port 5: Dev 2, If 0, Class=Vendor Specific Class, Driver=, 12M ID 04e8:730b Samsung Electronics Co., Ltd |__ Port 6: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M ID 2b7e:0134 |__ Port 6: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M ID 2b7e:0134 |__ Port 10: Dev 4, If 0, Class=Wireless, Driver=btusb, 12M ID 8087:0026 Intel Corp. AX201 Bluetooth |__ Port 10: Dev 4, If 1, Class=Wireless, Driver=btusb, 12M ID 8087:0026 Intel Corp. AX201 Bluetooth