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 bash189是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
相关产品推荐
相关产品推荐

