存在三种安装方式,如下:
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
sudo apt update
sudo apt install code
参考Install Docker Engine,其他平台的左侧自行选择安装教程,不赘述了。
安装完需要将当前用户加入docker组,否则使用docker指令都需要root权限,不同平台命令有出入,这里以ubuntu18.04为例:
sudo usermod -aG docker
1、编写dockerfile,以构建ros2 foxy版本image的dockerfile.txt为例:
# 基于某个image构建,例如ubuntu的某个版本或者某个ros官方镜像
FROM ros:foxy-ros-base-focal
# 安装自己需要的环境
RUN apt-get update && apt-get install -y --no-install-recommends \
ros-foxy-desktop \
&& rm -rf /var/lib/apt/lists/*
此外,如果需要在docker中使用nvidia显卡,则需要:
# 需要使用nvidia显卡时需要配置环境变量
ENV NVIDIA_VISIBLE_DEVICES \
${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES \
${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
2、build镜像,在dockerfile.txt同目录下运行:
docker build -t : .
or:
docker build -f -t : .
3、运行container:
docker run -it --rm \
--user=$(id -u $USER):$(id -g $USER) \
--workdir="/home/$USER" \
--volume="/home/$USER:/home/$USER" \
--volume="/etc/group:/etc/group:ro" \
--volume="/etc/passwd:/etc/passwd:ro" \
--volume="/etc/shadow:/etc/shadow:ro" \
--volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
--net=host \
--gpus all \
-e DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-e XAUTHORITY=/tmp/.docker.xauth \
-v /tmp/.docker.xauth:/tmp/.docker.xauth \
-v /tmp/.X11-unix:/tmp/.X11-unix \
:
以上前7项为挂载本机用户为container中默认用户运行,否则将以root用户进入container,不推荐使用root用户进行开发操作; --net=host为将本机网络映射到container中;接着6项为使用显卡和显示相关;更多使用方法参考官方文档。
使用VSCODE一般需要一个固定的长期开发环境,因此需要container在运行完成后不会自己删除,启动时要去掉–rm,运行完成后,就已经有了一个ros2环境的container。
4、(optional)自动加载ROS环境变量
使用ROS前需要加载ROS环境变量,使用docker时可以用如下两种方法实现自动加载:
1、将source source /opt/ros/foxy/setup.bash写入当前系统用户文件夹下.bashrc的末尾,也是ROS安装完成后的官方推荐操作,但只有使用上文命令脚本运行container才会生效,因此该脚本会加载当前系统用户作为container的默认用户,也会同时执行.bashrc中的命令。
2、构建docker image时增加entrypoint.sh,在该脚本中执行source source /opt/ros/foxy/setup.bash,教程很多,这里不赘述。
打开VSCODE,以C++开发为例,在扩展插件中安装:
安装完成后重启或重新加载一下VSCODE,左边侧栏已经可以看到此时已经启动的container:
右键点击container->attach to container,就可以轻松完成VSCODE与container的链接,此时IDE已经位于ros2 foxy开发环境中,正常打开ROS工作空间即可进行开发,python同理。
使用ROS插件需要工作空间中存在src文件夹,并且代码都在该文件夹下(非常重要,ROS2实际上已经不要求代码放在src文件夹中了),此外,一般情况下,ROS插件会自动检测ROS版本,并在打开ROS工作空间时自动在.vscode文件夹中进行配置,但使用docker时偶尔会出现问题,这时候需要手动在ROS插件设置中指定ROS版本,右键ROS插件->Extension Settings,如下:
重新打开工作空间或者手动运行ROS插件的部分命令即可,具体参照ROS插件自带的说明。
vscode自带的intellisense用于代码补全时问题颇多,尤其在docker环境下,因此建议换成clangd进行开发,使用clangd需要额外再进行一些配置,步骤如下:
1、在插件中搜索clangd并安装,安装完成右下角会自动提示安装clangd server,点yes即可。
2、在ROS环境中将整个工程编译一次,需要增加"-DCMAKE_EXPORT_COMPILE_COMMANDS=1"指令,以ros2 foxy为例:
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
需要保证编译成功完成,否则部分文件的编译命令无法生成,导致clangd找不到这个文件的索引,非ROS环境类似。
3、重启VSCODE或者clangd server。