You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中USB设备映射问题:KinectV2无法被容器识别

问题:Docker容器无法识别Kinect V2 USB设备

我在将USB设备映射到Docker容器时遇到问题,希望在容器中使用连接到USB端口的Kinect V2。

已尝试的容器启动命令:

xhost +
docker run --rm -it --user ros -v /dev:/dev --device-cgroup-rule='c *:* rmw' -v /run/udev:/run/udev --ipc=host pu:v4 bash

容器内执行lsusb的输出:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

宿主机执行lsusb的输出(Kinect V2设备可见):

Bus 004 Device 002: ID 045e:02c4 Microsoft Corp. Xbox NUI Sensor

我的Dockerfile内容:

FROM osrf/ros:noetic-desktop

ARG ROS_DISTRO=noetic

ARG USERNAME=ros
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USERNAME \
 && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
 && mkdir /home/$USERNAME/.config && chown $USER_UID:$USER_GID /home/$USERNAME/.config


# Set up sudo
RUN apt-get update \
 && apt-get install -y sudo \
 && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\
 && chmod 0440 /etc/sudoers.d/$USERNAME \
 && rm -rf /var/lib/apt/lists/*



# install ros packages
RUN apt-get update && apt-get install -y &&\
   apt-get install python3-pip -y && \
   rm -rf /var/lib/apt/lists/*

RUN apt-get update && \
   apt-get install build-essential cmake pkg-config  -y && \
   apt-get install libusb-1.0-0-dev -y && \	
   apt-get install libturbojpeg0-dev -y && \
   apt-get install libglfw3-dev -y && \		
   apt-get install libopenni2-dev -y && \
   apt-get install git -y && \
   apt-get install ros-noetic-catkin -y
	
RUN apt update && apt upgrade -y \
   && apt install -y \
   libusb-1.0-0-dev \
   libturbojpeg \
   libturbojpeg0-dev \
   libjpeg-turbo8-dev \
   libglfw3-dev \
   libopenni2-dev \
   freeglut3-dev \
   uuid-dev \
   libsdl2-dev \
   usbutils \
   python3-catkin-tools \
   python3-rosdep \
   alsa-utils \
   ros-${ROS_DISTRO}-ros-core \
   ros-${ROS_DISTRO}-vision-opencv \
   ros-${ROS_DISTRO}-nodelet-core \
   ros-${ROS_DISTRO}-perception-pcl \
   ros-${ROS_DISTRO}-compressed-depth-image-transport \
   ros-${ROS_DISTRO}-compressed-image-transport \
   ros-${ROS_DISTRO}-geometry \
   ros-${ROS_DISTRO}-depth-image-proc \
   python3-opencv \
   udev \
   nano \
   && apt-get clean

WORKDIR /home

RUN git clone https://github.com/OpenKinect/libfreenect2.git

WORKDIR /home/libfreenect2

RUN mkdir build &&\
   cd build && \
   cmake .. \
   -DCMAKE_INSTALL_PREFIX=$HOME/freenect2 \
   -DENABLE_CXX11=ON && \
   make && \
   make install && \
   mkdir -p /etc/udev/rules.d/ && \
   cp /home/libfreenect2/platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/

WORKDIR /home

RUN mkdir -p kinect_ws/src

WORKDIR /home/kinect_ws/src

RUN git clone https://github.com/paul-shuvo/iai_kinect2_opencv4.git

WORKDIR /home/kinect_ws/src/iai_kinect2_opencv4

RUN rosdep install -r -y --from-paths .

WORKDIR /home/kinect_ws

解决方法

1. 精准映射Kinect设备

避免用-v /dev:/dev全盘映射,改用--device参数直接指定Kinect的USB设备:

  • 先在宿主机获取设备路径:
    ls -l /dev/bus/usb/004/002
    
  • 启动容器时添加设备映射:
    docker run --rm -it --user ros --device=/dev/bus/usb/004/002 --device-cgroup-rule='c 189:* rmw' -v /run/udev:/run/udev --ipc=host pu:v4 bash
    
    (其中189是USB设备的主设备号,可通过上面ls -l输出的crw-rw-r-- 1 root root 189, xxx ...获取)

2. 修复容器内用户权限

在Dockerfile中添加,将ros用户加入plugdev组(USB设备默认归属该组):

RUN usermod -aG plugdev $USERNAME

3. 临时用特权模式测试

如果上述方法无效,可先使用--privileged参数启动容器(仅用于测试,正式环境慎用):

docker run --rm -it --privileged --user ros -v /run/udev:/run/udev --ipc=host pu:v4 bash

4. 验证容器内设备权限

进入容器后执行以下命令,检查设备权限并调整:

# 查看设备权限
ls -l /dev/bus/usb/004/002
# 临时赋予读写权限
sudo chmod 666 /dev/bus/usb/004/002

内容的提问来源于stack exchange,提问作者REINALDO KAMINSKI NETO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:17:08