docker容器中安装ROS1/ROS2
默认电脑已经安装了docker,没安装看这篇文章Docker 安装 (完整详细版)_docker安装-CSDN博客
ROS和docker各种结合看官方文档 dockerTutorials
在OSRF中拉取想要的 ROS 版本 docker 镜像
网址为 拉取命令在这里
我是安装noetic版本,因为这个兼容比较多现有的工程
docker pull osrf/ros:noetic-desktop-full
或者
docker pull osrf/ros:humble-desktop-full
注意这一时,可能遇到问题或报错
使用docker pull 下载镜像报错 如下
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceede
解决方法:修改docker文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com","https://0dj0t5fb.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]
}
EOF
.重启docker配置
sudo systemctl daemon-reload
sudo systemctl restart docker
如果还没有,或者报错, 就拿出私家珍藏镜像加速器了 总有一款适合你
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://registry.docker-cn.com", "https://s4uv0fem.mirror.aliyuncs.com", "https://docker.1ms.run", "https://registry.dockermirror.com", "https://docker.m.daocloud.io", "https://docker.kubesre.xyz", "https://docker.mirrors.ustc.edu.cn", "https://docker.1panel.live", "https://docker.kejilion.pro", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://hub.littlediary.cn", "https://proxy.1panel.live", "https://docker.1panelproxy.com", "https://image.cloudlayer.icu", "https://docker.1panel.top", "https://docker.anye.in", "https://docker-0.unsee.tech", "https://hub.rat.dev", "https://hub3.nat.tf", "https://docker.1ms.run", "https://func.ink", "https://a.ussh.net", "https://docker.hlmirror.com", "https://lispy.org", "https://docker.yomansunter.com", "https://docker.xuanyuan.me", "https://docker.mybacc.com", "https://dytt.online", "https://docker.xiaogenban1993.com", "https://dockerpull.cn", "https://docker.zhai.cm", "https://dockerhub.websoft9.com", "https://dockerpull.pw", "https://docker-mirror.aigc2d.com", "https://docker.sunzishaokao.com", "https://docker.melikeme.cn" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
拉取完后创建容器,但是为了能在docker中能打开窗口,将使用以下参数,只需要修改名字即可,your_name 改成你想要的名字,必须英文
docker run -it \
--name your_name \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
osrf/ros:noetic-desktop-full \
rqt
或
docker run -it \
--name ros2-humble \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="/home/zys/SLAM/algo/nav:/home/zys/SLAM/algo/nav" \
osrf/ros:humble-desktop-full \
rqt
这两种创建的版本,哪个能用用哪个,参考在docker中进行RVIZ可视化
docker run -it \
--privileged \
--network host \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--name orb3 \
orb3-ros:latest \
/bin/bash
这个时候必然会报错,上步的目的是为了创建有对应参数的容器,
错误内容正常应该为
Authorization required, but no authorization protocol specified
could not connect to display :1
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
然后
docker ps -a
查看刚刚创建的容器的 id
运行下面这句,把 $containerId 替换为容器的 id
xhost +local:`docker inspect --format='{{ .Config.Hostname }}' $containerId`
提示信息出现这个就是成功了
non-network local connections being added to access control list
然后就可以运行容器啦,$containerId 换成容器名字也可以
docker start $containerId
然后再运行以下进入容器
docker exec -it your_name /bin/bash
此时进入容器了,再在容器里面运行这句
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
或者
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
然后
source ~/.bashrc
这时候再开2个终端,每个终端都使用以下命令进入
docker exec -it your_name /bin/bash
然后把下面的3行指令按顺序分别执行在3个终端中
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
ROS2版本
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
能用键盘控制就成功了
使用以下命令退出容器
exit
每次进入容器前都需要先设置与主机的UI交互id
xhost +local:`docker inspect --format='{{ .Config.Hostname }}' $containerId`
然后启动容器
docker start $containerId
然后才能进入容器
docker exec -it your_name /bin/bash
剩下的配置和运行vins环境看这篇Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS
解决主机无法访问和容器的共享文件夹的问题,这句在主机运行
chmod -R 777 /home/zys/SLAM/algo/nav
更多推荐
所有评论(0)