docker容器中安装ROS1
docker是一种虚拟化容器技术。docker基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间互相隔离。
docker容器中安装ROS1
docker是一种虚拟化容器技术。docker基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间互相隔离。
一、安装docker
方法一:建议直接使用小鱼的一键安装
执行一键安装命令之后,会出现选择安装选项,输入8选择安装docker。
方法二:如果使用方法一安装失败,可以使用官方仓库安装
安装依赖工具:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
添加Docker官方GPG秘钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加Docker软件源:根据不同的系统架构,修改arch后面的值,以arm64为例
echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装Docker引擎:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
根据以上两个方法,安装完成之后,可以输入
docker --version
查看docker版本。
启动docker守护进程
# 启动 Docker 守护进程
sudo systemctl start docker
设置开机自启:
sudo systemctl enable docker # 开机自启
验证docker是否守护进程成功
sudo systemctl status docker
若输出包含activate(running)(绿色字体),说明docker守护进程正常运行
二、拉取ROS镜像
方法一:
我拉取的是noetic版本的
sudo docker pull osrf/ros:noetic-desktop-full
拉取镜像时出现报错:Error response from daemon: Get “https://registry-1.docker.io/v2/”: context deadline exceeded
原因:docker的官方源国内封了,导致无法拉取到镜像。
拉取ROS镜像一直超时
配置加速地址:适用于Ubuntu 16.04+、Debian 8+、CentOS 7+
使用以下命令设置registry mirror:但是需要重启docker服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
方法二:
使用鱼香ROS的一键安装Docker-ROS1
wget http://fishros.com/install -O fishros && . fishros

选择数字11
选择版本,noetic,鱼香ROS后面还会直接帮忙把容器生成,按照操作执行就行。
完成之后,查看镜像名:
sudo docker images
会出现:
三、创建+启动ROS容器
<your_name>:创建容器的名字
<your_username>:当前用户名
sudo docker run -dit \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
--name=<your_name> \
-v /dev:/dev \
-v /home/<your_username>:/home/<your_username> \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-w /home/<your_username> \
osrf/ros:noetic-desktop-full
Tip1:上一行对应自己的镜像名,需要修改,通过sudo docker images查看
Tip2: 后面可以跟一些容器启动后想运行的命令(如果有命令上一行最后别忘了加换行符)
# 可选参数:
--privileged \
--net=host \
--restart=xxx \
由于我使用的是虚拟机,没有GPU,因此我输入的是:
sudo docker run -dit \
--name=ros1_noetic_livox \
--privileged \
--net=host \
--restart=unless-stopped \
-v /dev:/dev \
-v /home/reenrr:/home/reenrr \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-w /home/reenrr \
osrf/ros:noetic-desktop-full
这是创建和启动一体化的docker命令。可通过:
sudo docker ps
查看是否启动了该容器,若能看到 ros1_noetic_livox 对应的记录,状态为 Up,说明容器启动成功。
如果是已有容器了,只启动容器的话,输入:
sudo docker start 容器id/名称
四、使用容器
进入容器:
sudo docker exec -it 容器名称 /bin/bash
# (输入 exit 可以退出容器)
验证ROS环境
进入容器后,执行以下命令激活ROS并启动核心节点:
source /opt/ros/noetic/setup.bash
roscore
保持roscore运行,这个终端窗口不要关闭(roscore是ROS节点通信的核心,关闭后其他节点无法正常工作),后续操作打开新的终端。
打开两个新的终端,都需要进入容器,并且激活ROS,然后可以分别输入以下命令:
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
就可以实现ROS的小乌龟操作了
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)