前言
这一篇笔记是基于上一篇笔记的基础上,补充一下如何针对 ROS 进行配置。关于 vscode 以及 docker 的基本设置可以参考我的上一篇笔记: vscode 配置 docker 开发环境(一)
操作系统
目前在 ubuntu 和 deepin 测试过没问题,在 macOS 下可以运行 ros 以及 rqt_gui,但是 rviz 对 openGL 版本有要求用 XQuartz 没办法解决,所以建议在 mac 下使用 vnc 或者虚拟机之类的办法。
前提条件
这里假设机器已经至少安装好:
- 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
如下:
# 基础镜像
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
如下:
{
"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:
来运行本地连接
测试
-
rqt_gui 和 rviz 都能成功打开
-
运行基本的 ros 项目:(listener 和 talker)
这里图方便就找了 ros 官方教程中的第一个项目来测试,一个节点打印消息,另一个节点订阅该消息同样打印出来,结果如下:
结语
总的来说,这还是只是很初步的设置,也还没有跑过很大型的项目;后续如果有遇到其他问题还会进行补充。