Docker与ROS
date
May 7, 2022
Property
slug
DockerLoveROS
status
Published
tags
工程经验
summary
如何在Docker下使用ROS
type
Post
Docker下ROS的安装
目前虽然有了小鱼的fishros.com可以非常方便快速的安装ROS,但是在实际的部署中,要是有基于Docker的ROS可以非常方便快速的部署,同时也可以避免每个人不同的环境部署问题,在我觉得Docker对于工程部署落地具有挺大的意义。
Docker基础镜像的安装
这里选用了Ubuntu18.04、Cuda10.2作为其基础镜像,原因还是因为18是目前算是资料最多的,Cuda10.2是目前支持各类Pytorch最多的。
iamge的制作
Dockerfile
的制作#!/bin/bash
ARG CUDA="10.2"
ARG SYSTEM="18.04"
FROM nvidia/cuda:${CUDA}-devel-ubuntu${SYSTEM}
RUN apt-key del 7fa2af80
RUN apt update; exit 0
# 需要安装tzdata,不然安装ROS会出现报错
RUN apt-get install -y tzdata
RUN apt install git -y && \
apt install wget
RUN apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/3bf863cc.pub
RUN wget -qO - https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add -
RUN apt update
CMD echo 'source /etc/profile' >> ~/.bashrc
# 安装相关库
RUN apt-get update && \
apt-get install -y \
build-essential \
libgl1-mesa-dev \
libglew-dev \
libsdl2-dev \
libsdl2-image-dev \
libglm-dev \
libfreetype6-dev \
libglfw3-dev \
libglfw3 \
libglu1-mesa-dev \
freeglut3-dev \
vim
# conda安装
RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh && \
sh ./Miniconda3-py37_4.8.3-Linux-x86_64.sh -b -p /opt/conda && \
rm ./Miniconda3-py37_4.8.3-Linux-x86_64.sh && \
export PATH=$PATH:/opt/conda/bin && \
conda install conda-build
ENV PATH $PATH:/opt/conda/envs/env/bin:/opt/conda/bin
CMD source ~/.bashrc
CMD ["/bin/bash"]
setup_dev.bash
文件#!/bin/bash
u18_cuda102_gcc7_docker() {
echo "starting U18_Cuda102_GCC7 docker"
xhost +local:docker;
docker run -it -d \
--runtime=nvidia \
--name="U18_Cuda102_GCC7_dev" \
-v /etc/localtime:/etc/localtime:ro \
-v /dev/input:/dev/input \
# 文件挂载的位置要设置成为自己的位置
-v "/media/henry/HenryDataDisk/MyDockerFiles/PaperDataset:$HOME/docker_shared" \
-v "$U18_Cuda102_GCC7_GIT:$HOME/paper_code" \
--shm-size=6G \
--workdir $HOME/ \
--net=host \
--add-host U18_Cuda102_GCC7_dev:127.0.0.1 \
--hostname=U18_Cuda102_GCC7_dev \
--privileged=true \
--env=DISPLAY \
--env=XDG_RUNTIME_DIR \
--env=QT_X11_NO_MITSHM=1 \
--device=/dev/dri:/dev/dri \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v /etc/localtime:/etc/localtime:ro \
$U18_Cuda102_GCC7_DOCKER
u18_cuda102_gcc7_docker_attach;
}
u18_cuda102_gcc7_go(){
docker exec -it -e "COLUMNS=$COLUMNS" -e "LINES=$LINES" U18_Cuda102_GCC7_dev /bin/bash
}
u18_cuda102_gcc7_docker_attach() {
docker exec -it -e "COLUMNS=$COLUMNS" -e "LINES=$LINES" U18_Cuda102_GCC7_dev /bin/bash
}
按照如下的步骤执行
- 在
Dockerfile
文件目录下启动终端并执行:
docker build -t u18_cuda102_gcc7:latest .
- 等image构建完成,开始依次在终端中执行如下:
export U18_Cuda102_GCC7_DOCKER=u18_cuda102_gcc7:latest
export U18_Cuda102_GCC7_GIT=/home/henry/DockerEnvSetup/U18_Cuda102_GCC7 # update
source $U18_Cuda102_GCC7_GIT/docker/setup_dev.bash
- 在终端中启动镜像:
u18_cuda102_gcc7_docker
- 在启动镜像之后,要初始化conda,运行如下:
conda init
source ~/.bashrc
ROS的安装
- 在ROS安装前要保证安装
tzdata
,不知道为什么不这样做在安装过程中总是会卡在这一步
apt-get install -y tzdata
- 因为在添加源的时候会出现
lsb_release: not found
,所以要先执行如下
apt-get update && apt-get install -y lsb-release && apt-get clean all
E: Malformed entry 1 in list file /etc/apt/sources.list.d/ros-latest.list (Component)
E: The list of sources could not be read.
rm /etc/apt/sources.list.d/ros-latest.list
apt-get update && apt-get install -y lsb-release && apt-get clean all
- 设置软件源,个人还是比较推崇直接用官方国外源,之前用国内源出现一些很奇怪不好解决的问题:
- 国外源:
sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
- 设置密钥:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
- 安装:
apt-get update
apt-get install ros-melodic-desktop-full
apt-get install ros-melodic-rqt*
- 初始化rosdep:
rosdep init
rosdep update
- 安装rosinstall:
apt-get install python-rosinstall
- 加载环境变量设置文件:
source /opt/ros/melodic/setup.bash
- 创建并初始化工作目录
ROS使用一个名为catkin的ROS专用构建系统。为了使用它,用户需要创建并初始化,catkin工作目录,如下所示。除非用户创建新的工作目录,否则此设置只需设置一次。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
目前,只有src目录和CMakeLists.txt文件在catkin工作目录中,使用catkin_make命令来构建。
cd ~/catkin_ws/
catkin_make
- 设置环境变量
sudo apt install net-tools
gedit ~/.bashrc
在其后面粘贴如下:
其中的ip如下获得:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2F49415c19-705e-4a3e-a672-e306d2238f46%2FUntitled.png%3Ftable%3Dblock%26id%3D7189b2fe-2665-4c80-82b6-9f98dcb6cec6%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3DY1rssDJ1eAV_kp8RX0FpAb9tXAuvVDpOlJ4cTo_ryRI?table=block&id=7189b2fe-2665-4c80-82b6-9f98dcb6cec6&cache=v2)
# Set ROS melodic
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash
# Set ROS Network
#ifconfig
export ROS_HOSTNAME=192.168.89.135
export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311
# Set ROS alias command
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'
- 使用vscode使用docker container连接,为了后面的开发和多个终端的开启,接着在非docker的终端中运行:
xhost +
使得可以x11可以被调用可视化。
然后开始跑小乌龟测试:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
测试Rviz可视化
roscore
rosrun rviz rviz
安装完成!
在使用中可能需要安装这包:
pip install rospkg
镜像的保存:
docker commit -a 'lintheyoung' -m 'u18_cuda102_gcc7_ros-rviz' cecf24068fe6 u18_cuda102_ros:last
Docker中ROS的通讯
Abstract
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2F4f9cac24-e930-4b03-9c6f-3650257df1b0%2FUntitled.png%3Ftable%3Dblock%26id%3D88990def-574e-434b-a2af-69b2967e1870%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3DmHp8xCLnXDHIHm_qhUqwav95ziuiyg747X0-2djBE9Q?table=block&id=88990def-574e-434b-a2af-69b2967e1870&cache=v2)
Detail
还是使用docker去做通讯的测试:
# pull对应ubuntu16-18的镜像
docker pull ros:kinetic
docker pull ros:melodic
# 查看images
docker images
在主机启动ROS:
# 先ifconfig查看主机(非Docker)的ip
ifconfig
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2F8b97f28f-5184-4ef7-af05-b8fe8317b0f1%2FUntitled.png%3Ftable%3Dblock%26id%3D90548206-56e1-4b46-9620-fb8b63df61bc%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3DKepnQEwtCymDR1wbcfBpkoO1kfYeTL3n0QS3TW9VbmA?table=block&id=90548206-56e1-4b46-9620-fb8b63df61bc&cache=v2)
其中的
11311
端口是固定的:export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.1
roscore
在Docker_0中启动:
先要查看刚才pull下来的ROS各个版本的images:
docker images
主要是查看后面的ID(圆圈):
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2Fec2739f5-d369-4f5b-b7cb-6908c6344eea%2FUntitled.png%3Ftable%3Dblock%26id%3Da9daca36-95cd-47f4-8dc9-fe0d008a5a62%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3D79FQ7yiVCAw4O7UqktyrKIwmFZHPfYZlbbmYxjEVKAI?table=block&id=a9daca36-95cd-47f4-8dc9-fe0d008a5a62&cache=v2)
后面对应启动即可:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2Fb4693ae2-3001-4513-98c6-2dbf20af0c9d%2FUntitled.png%3Ftable%3Dblock%26id%3D895c2d7d-d430-4674-94b6-4596c555231b%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3DTOS4DBwMSIjR_VBjfkWUwYEkAAptkcoYYurTryKaPhg?table=block&id=895c2d7d-d430-4674-94b6-4596c555231b&cache=v2)
# docker ros:kinetic start
docker run -it a3c5711abb29
# net-tools install
apt update
apt install net-tools
ifconfig
# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.3
# topic publish start
rostopic pub -r 10 /chatter std_msgs/String "this is ros:kinetic"
同理启动另一个Docker:
# docker ros:melodic start
docker run -it cc08986d42e5
# net-tools install
apt update
apt install net-tools
ifconfig
# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.4
# topic listen start
rostopic echo /chatter
# return
>> data: "this is ros:kinetic"
在同个Master下都可以查看收发:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2Fee03fe87-158b-45ad-bd5f-3649e0b21a2a%2FUntitled.png%3Ftable%3Dblock%26id%3D5d963fb5-0c97-4dc6-9a0a-cea0ef22c5b4%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3DSU0KvQPOHcQsq3Zs5fKUUyFWWaOg_GqTFGHI2bydRb8?table=block&id=5d963fb5-0c97-4dc6-9a0a-cea0ef22c5b4&cache=v2)
时延小于
0.5ms
:![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F43dc7bda-86e1-48d9-8e17-3efe45d6f33f%2F9d3a3f63-0d7b-4bd7-bb5d-7e3f87e02b3f%2FUntitled.png%3Ftable%3Dblock%26id%3Dc1130afe-5d9d-42c2-82d5-02b54d5edc33%26spaceId%3D43dc7bda-86e1-48d9-8e17-3efe45d6f33f%26expirationTimestamp%3D1739188800000%26signature%3DqLWW9FzFZblb5B2Xo1pxMxHShULqhK4KPY6gHHFTGT4?table=block&id=c1130afe-5d9d-42c2-82d5-02b54d5edc33&cache=v2)