默认电脑已经安装了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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐