截至目前,Jetson Nano 平台官网仍不提供 Ubuntu 20.04 固件,所以应用 Jetson Nano 平台开发 ROS2 存在微小的艰难,然而好在 Docker 提供的容器技术,让咱们能十分不便的虚构出一个 Ubuntu 20.04 环境进行 ROS2 开发并通过云端疾速分享本人的开发环境,本文我将以松灵 LIMO 为例向大家演示如何应用 Docker 进行 ROS2 开发以及这种开发模式的优越性。

此外,在 ROS 开发过程中(尤其是在多人团队协同中)你肯定遇到过这样的问题:须要疾速(在不同架构机器上)部署雷同开发环境、他人电脑上能够编译但到了本人这里就会报错、无奈复现他人的 Bug、常常会呈现短少反对库或者反对库抵触的状况,尤其是一台电脑上须要做多种工作的状况(比方 深度学习、QT 开发、ROS1、ROS2)则会更蹩脚…… 这个时候咱们就有必要应用 Docker 进行开发

本文分为两局部,1-6节解说 应用 Docker+VSCode 开发方式,7 节将率领大家在 LIMO 平台进行实战

无论您之前应用什么样的形式进行开发,笔者在这里都举荐您尝试 Docker + VSCode,尽管这可能须要两三个下午的工夫进行学习,但请置信这一切都是值得的!

如果您不会应用 docker 或者没有尝试过相似的操作,请您先浏览 《Docker 配合 VSC 开发最佳实际》(https://anthonysun256.github.io/docker-with-vsc_best-practice/)

1.镜像选取

Docker 官网镜像服务器上有很多的 ROS 开发镜像,这里咱们能够有如下抉择(这几个镜像也是笔者罕用的):• ROS 官网镜像:https://hub.docker.com/_/ros 


内含所有 ROS 发行版的根底开发镜像,而且反对多种架构,非常适合在多种架构的机器上进行部署。• althack 的开发镜像 https://hub.docker.com/u/althack

althack 提供了 VSCode 的开发工作环境模板:https://github.com/athackst/vscode_ros2_workspace
尽管模板是 ROS2 然而只有简略批改 Dockerfile 中援用的镜像名称即可改成 ROS1 环境
Dockerfile 源码:https://github.com/athackst/dockerfiles

这个镜像长处是提供了 ROS-desktop-full 的开发环境,省去了自行装置的麻烦,非常适合学习应用。毛病是只反对 PC,如果其余环境须要本人应用 Dockerfile 编译。

2.开发环境搭建

咱们新建的工作空间目录格局如下:
.
├── .devcontainer # docker 配置文件
│ ├── devcontainer.json
│ └── Dockerfile
└── src # ROS 源码目录

VSCode 会主动读取 .devcontainer 中的配置文件。对于我集体学习而言我始终应用的是 https://hub.docker.com/u/althack 的镜像和配置,上面的配置文件也是扭转于此,各位读者能够依据本人的须要进行批改:

Dockerfile:

# 改编自 https://github.com/athackst/vscode_ros2_workspace# 我应用的 ROS 学习镜像,依据您的爱好能够自行更改FROM althack/ros:melodic-gazebo as gazebo # ** [可选] 勾销正文装置其余组件 **## ENV DEBIAN_FRONTEND=noninteractive# RUN apt-get update \#    && apt-get -y install --no-install-recommends <your-package-list-here> \#    ##    # Clean up#    && apt-get autoremove -y \#    && apt-get clean -y \#    && rm -rf /var/lib/apt/lists/*# ENV DEBIAN_FRONTEND=dialog# 为 ros 用户配置主动 sourceARG WORKSPACERUN echo "if [ -f ${WORKSPACE}/install/setup.bash ]; then source ${WORKSPACE}/install/setup.bash; fi" >> /home/ros/.bashrc

如果须要 GPU 反对(须要装置 nvidia-docker [ https://anthonysun256.github.io/docker_with_nvidia/ ] )(Jetson 平台不要用这个领导!!请应用 Jetpack 套件固件自带的 nvidia-docker2 或者间接进行装置 sudo install nvidia-docker2 (应用 l4t2 的源))则在上述脚本之后追加如下指令:

RUN apt-get update \    && apt-get install -y -qq --no-install-recommends \    libglvnd0 \    libgl1 \    libglx0 \    libegl1 \    libxext6 \    libx11-6 \    && apt-get autoremove -y \    && apt-get clean -y \    && rm -rf /var/lib/apt/lists/*ENV DEBIAN_FRONTEND=dialog# Nvidia 运行时变量.ENV NVIDIA_VISIBLE_DEVICES allENV NVIDIA_DRIVER_CAPABILITIES graphics,utility,computeENV QT_X11_NO_MITSHM=1

devcontainer.json

// 改编自 https://github.com/athackst/vscode_ros2_workspace// See https://aka.ms/vscode-remote/devcontainer.json for format details.{    "dockerFile": "Dockerfile",    "build": {        "args": {            "WORKSPACE": "${containerWorkspaceFolder}"        }    },    "remoteUser": "ros",    "runArgs": [        "--network=host",        "--cap-add=SYS_PTRACE",        "--cap-add=SYS_RAWIO",        "--privileged=true",        "--security-opt=seccomp:unconfined",        "--security-opt=apparmor:unconfined",        "--volume=/tmp/.X11-unix:/tmp/.X11-unix",        // "--gpus" "all", // 勾销该正文应用 GPU 性能        "--device=/dev/bus/usb:/dev/bus/usb", // 挂载内部硬件,比方摄像头,依据须要批改门路    ],    "containerEnv": {        "DISPLAY": "${localEnv:DISPLAY}"    },    // Set *default* container specific settings.json values on container create.    "settings": {        "terminal.integrated.profiles.linux": {            "bash": {                "path": "bash"            },        },        "terminal.integrated.defaultProfile.linux": "bash"    },    // 举荐装置的插件    "extensions": [        "dotjoshjohnson.xml",        "zachflower.uncrustify",        "ms-azuretools.vscode-docker",        "ms-iot.vscode-ros",        "ms-python.python",        "ms-vscode.cpptools",        "redhat.vscode-yaml",        "smilerobotics.urdf",        "streetsidesoftware.code-spell-checker",        "twxs.cmake",        "yzhang.markdown-all-in-one"    ]}

3.启动开发环境

咱们应用 VSCode 关上文件夹,并且 Reopen in docker 即可(不要本人只应用 Dockerfile 进行构建,因为在 devcontainer.json 中咱们还挂载了一些目录,增加了一些参数)


依据网络情况不同首次启动这里可能须要期待 VSCode 装置一些组件,请急躁期待,下次启动即可极速启动

局部挂载的设施可能须要 root 权限能力拜访,这一点须要留神

4.查看图形界面

在咱们的主机中,关上一个终端,运行 xhost +
之后在咱们 VSCode 中的命令行中轻易关上一个图形界面,比方 rqt,能够看到 rqt 间接显示在了咱们的屏幕上


对于 Rviz 和 Gazebo,如果您的电脑上没有显卡、未正确装置闭源显卡驱动或者没有正确开启 nvidia-docker 显卡性能那界面会很卡,这和用不必 Docker 没有关系

5.插件简介

笔者的 devcontainer.json 中会为大家装置一些实用插件,这部分咱们简略理解一下
• ROS——这个插件能够帮忙咱们疾速更新 VSCode 中无关 ROS include 的门路,而且提供了图形界面查看 ROS 话题、服务等

按下 shift+ctrl+p 呼出快捷命令栏,输出 ros,能够看到自动更新选项

这个可说的不多,可能帮忙咱们疾速编写相应的文件,为其提供智能补全

• yaml xml xacro 语法助手

6.修复本地包 include / import 谬误

默认状况下 ROS 插件可能不会蕴含咱们本地门路的包,这并不会导致编译谬误,然而会导致咱们无奈应用智能提醒。

msg 类型的包需先编译生成对应的 c++或者python头文件(在 devel 或者 install 中寻找对应目录)

这时候咱们须要手动增加门路到 c_cpp_properties.json(留神每条门路后须要有个逗号:

提醒:咱们能够间接在左侧资源管理器中右键文件夹在弹出的菜单中复制文件夹的绝对路径

python 同理:

至此咱们就能欢快的进行开发了,而且您还能保留本人的开发环境、推送到云端或者整顿成压缩包进行分享,让团队中的所有人都能在几分钟之内领有统一的开发环境,最重要的是还不会搞坏电脑自身的环境!

7.近程开发实战

本节咱们将使用下面所讲的常识,在松灵 LIMO 上应用 docker 进行开发!

首先运行 docker 环境( docker 在默认零碎中曾经装置,这里咱们不应用图形界面,不须要开启显卡反对)

$ mkdir limo_foxy_dev && cd limo_foxy_dev$ docker run --network=host  --cap-add=SYS_PTRACE --cap-add=SYS_RAWIO --security-opt=seccomp:unconfined --security-opt=apparmor:unconfined --volume=/tmp/.X11-unix:/tmp/.X11-unix --runtime=nvidia --device /dev/ttyTHS1:/dev/ttyTHS1 --device /dev/ttyUSB0:/dev/ydlidar --device /dev/bus/usb/:/dev/bus/usb -v $(pwd)/:workspace --name limo-foxy-dev  -w /workspace -id ros:foxy$ docker exec -it limo-foxy-dev /bin/bash

这里咱们挂载了底盘通信接口、激光雷达、USB 设施到咱们的容器之中,以及将本地的 limo_foxy_dev 文件夹挂载到了容器中的 /workspace 之中并开启了一些相应的权限。

之后期待 docker 启动(第一次须要拉取近程镜像,速度稍慢,再次启动无需期待)进入之后能够看到如下界面:

接下来咱们换源,晋升下载速度:

# 更换零碎源$ sed -i "s/ports.ubuntu.com/mirrors.ustc.edu.cn/g" /etc/apt/sources.list# 更换 ros2 源$ sed -i "s/packages.ros.org/repo.huaweicloud.com/g" /etc/apt/sources.list.d/ros2-latest.list$ apt update

设置一下主动 source

$ echo "source /opt/ros/foxy/setup.bash" >> /etc/bash.bashrc

装置 rosdepc 晋升 rosdep 下载速度(留神这俩不是一个货色,多了个 c):

$ apt install -y python3-pip$ pip install rosdepc$ rosdepc init && rosdepc update

装置近程开发必备组件:

$ apt install openssh-server systemctl udev swig # 别离为 近程连贯组件 服务管制组件 驱动管制组件 雷达驱动组件$ service  ssh start$ echo -e "Port 10022\nPermitRootLogin yes\nPermitEmptyPasswords yes" >> /etc/ssh/sshd_config.d/dev.conf$ service ssh restart

重要!:容器重启后 ssh 会无奈连贯,请从新在容器中运行 service ssh start

设定明码:

$ passwd # 之后输出新的明码(在这个过程中不会显示文字,输出实现按回车即可)

之后咱们来到镜像,保障咱们的小车和电脑在同一个局域网中,在本地电脑中关上 VSCode 应用 Remote ssh 插件连贯镜像:

任选一个文件进行编辑:

Host 名称自定义,HostName 是 limo 在局域网中的 ip,Port 是 ssh-server 连贯的端口,用户是 root

保留退出。

如果大家不想应用 root 登陆请留神自定义用户组的权限,不然可能无法访问硬件(如雷达等)

从新关上 Connect to Host 选项,抉择咱们刚刚保留的条目进行连贯:

之后会弹出一个新的窗口,在那里输出咱们之前设定的明码:

之后关上咱们挂载的 workspace 文件夹,这里会再次要求咱们输出明码:

抉择信赖:

这里我在近程装置了如下插件不便我的开发:

之后关上命令行(快捷键 Shift+Ctrl+~)下载 ydlidar 的驱动并编译装置(当前目录 /workspace)

$ git clone https://ghproxy.com/https://github.com/YDLIDAR/YDLidar-SDK.git # 应用了ghproxy.com 减速$ mkdir -p YDLidar-SDK/build$ cd YDLidar-SDK/build$ cmake ..$ make$ make install # 装置 C/C++ 反对$ cd ..$ pip install . # 装置 py 反对$ cd .. && rm -r YDLidar-SDK # 删除 SDK 源码避免影响之后构建

请留神命令中 . 与 .. 的区别不要敲错了

下载 LIMO 的 ROS2 镜像(当前目录 /workspace):

$ git clone --recursive https://ghproxy.com/https://github.com/agilexrobotics/limo_ros2.git src # 应用了ghproxy.com 减速
# 61 行int optval = 115200;# 76 行optval = 3;# 108 行b_optvalue = true;# 134 行f_optvalue = 12.f;# 143 行f_optvalue = 8.f;

装置必要的反对库并编译(当前目录/workspace):

$ rosdepc install --from-paths src --ignore-src -r -y$ colcon build --symlink-install # 应用符号链接节俭空间,如果要删除源码,则应用 --merge-install

会发现有一些规范谬误输入,是失常的,不须要管。

之后 source 装置并启动雷达节点

$ source install/setup.bash$ ros2 launch limo_bringup limo_start.launch.py

而后在咱们本地的电脑上关上咱们本地的开发环境(也是在 Docker 中,依据上文所讲,应用的是 https://github.com/athackst/vscode_ros2_workspace 的模板)

在本地开发环境的终端中启动 rviz:

$ rviz2

而后订阅雷达节点,依照图示进行配置

即可看到 LIMO 近程发来的雷达信息:

至此,咱们便把握了机器人近程开发的根底操作!相熟这种办法能够极大的晋升咱们工作效率,升高机器人开发复杂度。并且您也能够将方才的开发环境提交到 Docker 的服务器之上或者输入成压缩包供别人应用,让咱们可能疾速大批量的部署完全相同的开发环境!

最初,感谢您的浏览!如果您喜爱本文请点赞分享,如有任何疑问请分割松灵机器人。