0%

vscode 配置 docker 开发环境(二): ROS 篇

前言

这一篇笔记是基于上一篇笔记的基础上,补充一下如何针对 ROS 进行配置。关于 vscode 以及 docker 的基本设置可以参考我的上一篇笔记: vscode 配置 docker 开发环境(一)

前提条件

这里假设机器已经至少安装好:

  • vscode - 关于 vscode 的安装方法可以参考网上的其他资源,vscode 需要安装 remote-development 插件
  • docker - 安装完成后,运行 docker --version 看是否能正确输出版本号
  • 最好已经熟悉如何通过 vscode 进入 docker container 的基本设置

vscode 中关于 docker container 的设置主要是集中在 Dockerfile.devcontainer.json。下面主要对这两个文件的设置进行总结

理想效果

  • 能够利用已有的 Dockerfile 构建 ROS 的 image 并成功通过 vscode 进入相应的 container 中
  • container 环境中能够顺利运行 ROS 相关项目
  • 可以在 container 中运行 rviz,rqt_gui 等 GUI 程序

Dockerfile

Dockerfile 中描述了 docker image 构建过程的相关配置,这里主要是以 ubuntu 18.04 为基础,再安装 ROS melodic 以及相关软件,我的 Dockerfile 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 基础镜像
FROM ubuntu:bionic

# 将操作设为飞交互式
ENV DEBIAN_FRONTEND=noninteractive

# 安装常用软件
RUN apt-get update -q && \
apt-get upgrade -yq && \
apt-get install -yq wget curl git build-essential vim sudo lsb-release locales bash-completion

# 安装 ROS 桌面版(如果在国内环境可能需要换 ROS 源提高速度)
RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros-latest.list'
RUN curl -k https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | sudo apt-key add -
RUN apt-get update -q && \
apt-get install -y ros-melodic-desktop-full python-rosdep
RUN rosdep init
RUN rosdep update

# source ros setup 脚本
RUN echo "source /opt/ros/melodic/setup.bash" >> /root/.bashrc
RUN /bin/bash -c "source /root/.bashrc"

# 设置语言
RUN apt-get update
RUN apt-get install -y locales locales-all
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8

# 设置工作目录
WORKDIR /root

.devcontainer.json

.devcontainer.json 中主要定义了进入容器的相关设置,这里除了常规的设置以外,由于需要支持 rviz, rqt_gui 等 gui 软件,需要进行额外的设置。我的 .devcontainer.json 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"name": "Existing Dockerfile",

// Sets the run context to one level up instead of the .devcontainer folder.
"context": "..",

// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
"dockerFile": "./Dockerfile",

// Set *default* container specific settings.json values on container create.
"settings": {
"terminal.integrated.shell.linux": null
},

// 安装常用的 vscode 插件
"extensions": [
//...
],

// 容器环境变量设置
"containerEnv": {
"DISPLAY": "${localEnv:DISPLAY}",
"QT_X11_NO_MITSHM": "1",
"QT_GRAPHICSSYSTEM=": "native"
},

// 进入容器时的参数
"runArgs": ["--privileged", "--net=host", "--device=/dev/dri:/dev/dri", "--name=ros-melodic-dev" ],

// 目录挂载
"mounts": [ "source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached" ]

}

以上除了基础设置以外,还针对了 ros gui 进行了相应的设置如下:

  • 利用 X server 进行图形界面的转发和显示:
    • "DISPLAY", "QT_X11_NO_MITSHM=1", "QT_GRAPHICSSYSTEM=":转发三个 qt 相关的环境变量
    • /tmp/.X11-unix:挂载 X11 unit scoker
  • 允许容器使用机器的相关设备驱动 /dev/dri
  • --priviledged, --net=host:这两个主要是让容器共享宿主机的网络

除了 .devcontainer.json 中的设置以外,host 还需要运行以下指令: xhost +local: 来运行本地连接

测试

  1. rqt_gui 和 rviz 都能成功打开

  2. 运行基本的 ros 项目:(listener 和 talker)

这里图方便就找了 ros 官方教程中的第一个项目来测试,一个节点打印消息,另一个节点订阅该消息同样打印出来,结果如下:

ros-node-example

结语

总的来说,这还是只是很初步的设置,也还没有跑过很大型的项目;后续如果有遇到其他问题还会进行补充。