构建含ros的yolov8镜像
dockerfile如下
FROM ultralytics/ultralytics:latest
# change source to aliyun
RUN sed -i s@/archive.ubuntu.com/@/mirrors.ustc.edu.cn/@g /etc/apt/sources.list \
&& mv /etc/apt/sources.list.d/coral-edgetpu.list /etc/apt/sources.list.d/coral-edgetpu.bak
# nvidia container runtime
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES all
RUN apt-get update \
&& apt-get install -y lsb-release vim iputils-ping
RUN echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list \
&& apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
RUN apt-get update \
&& apt-get install -y ros-noetic-desktop-full \
&& echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc \
&& apt-get -y update --fix-missing \
&& apt-get clean
值得一提的是由于最后一层镜像,安装ros时需要输入地区和键盘信息(非常无聊的设置),但是镜像构建是不能交互的,也就是说,没办法输入任何信息给构建中的镜像,从而构建会卡死在输入地区这一步。解决方法是构建到最后一步时,创建一个临时镜像,用这个镜像建一个容器,在容器里安装ros,最后commit成最终镜像。
启动yolov8_ros容器
启动容器之前要把主机的相机设备映射到容器中,参数为
-v /dev/video2:/dev/video2 \
-v /dev/video3:/dev/video3 \
注意,不同的主机和相机使用的设备名不同,可以在主机里查看。
ls /dev/video*
如果没有输出,可以安装下面的包
sudo apt-get install v4l-utils
然后
v4l2-ctl --list-devices
我的启动脚本是
xhost +
docker run -it \
--privileged \
--gpus all \
--net=host \
--env=DISPLAY \
--env=QT_X11_NO_MITSHM=1 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/ackerman/Workspace/ROSspace:/ROSspace \
-v /dev/video2:/dev/video2 \
-v /dev/video3:/dev/video3 \
ros_yolov8
容器内操作
首先要安装usb_cam
包,指令为
apt-get install ros-noetic-usb-cam
安装image相关的包
apt-get install ros-kinetic-image-*
apt-get install ros-kinetic-rqt-image-view
启动相机
roslaunch usb_cam usb_cam-test.launch
启动编译好的yolov8_ros功能包,地址为https://github.com/qq44642754a/Yolov8_ros,即可看到实时监测了。
roslaunch yolov8_ros yolo_v8.launch
rqt_graph 如图