使用docker搭建ros2的开发环境

环境介绍

  操作系统:ubuntu20.04LTS
  docker版本:Docker version 20.10.17, build 100c701
  VS Code版本:1.64.2 f80445acd5a3dadef24aa209168452a3d97cc326 x64
  ros2版本:humble-desktop

docker安装

  docker的安装和基本使用参考博客Docker学习笔记

vscode插件推荐

  以下推荐两款在使用docker时比较好用的VS Code插件。
  1.Docker
  Docker插件能够很好的显示和管理现有的镜像、容器、仓库、挂载卷等,极大的方便了对Docker相关项目的操作和显示。
  
  2.Remote-Containers
  连接容器的远程工具,可以很方便的操作容器,最重要的是可以显示文件目录。
  

拉取ros2的docker镜像

  直接拉取ros2的docker镜像到本地:

docker pull osrf/ros:humble-desktop

  也可以根据需要在镜像仓库中查看自己想要的ros镜像版本,osrf/ros:humble-desktop镜像有1.3G左右,下载速度根据网络情况而定。如果遇到卡住的情况,重启docker然后再尝试拉取。

启动ros2的镜像并进行测试

启动ros2镜像

  使用docker run命令启动ros2的容器,命令如下:

# 使用交互式方法启动容器
docker run -it osrf/ros:humble-desktop
# 可以通过--name来指定启动容器的名字,例如
docker run -it --name ros2 osrf/ros:humble-desktop

  容器启动后,会默认进入容器的根目录,可以直接在终端中操作,也可以使用ctrl+P+Q退出命令行,让容器运行在后台,然后使用VS Coder中的Remote-Containers插件进入容器。

ctrl+P+Q快捷键在VS Code中已经被占用了,需要在设置中取消这组快捷键的绑定。

测试ros2的环境

  首先使用source命令配置ros2的环境变量:

source /opt/ros/humble/setup.sh

  建议把这一配置项添加到~/.bashrc中,这样开启新的终端也会配置也会生效:

# 添加到~/.bashrc中
echo "source /opt/ros/humble/setup.sh" >> ~/.bashrc
# source一遍
source ~/.bashrc

  然后使用ros2自带的示例节点进行测试,在VS Code中开启容器中的两个终端,分别执行demo_nodes_cpp功能包中的两个可执行文件:

# 订阅者
ros2 run demo_nodes_cpp listener
# 发布者
ros2 run demo_nodes_cpp talker

  其中talker会定时循环发布消息,listener会定时接收消息。效果如下所示:

创建一个功能包编译运行

创建工作空间

  根据自己的实际情况创建工作空间,我的工作空间目录为/home/workspace:

cd /home
mkdir -p workspace/src

下载并编译示例功能包代码

  参考教程ROS2学习笔记之C++编写简单发布订阅节点篇,我编写了一个名为cpp_pubsub的功能包并且实现了其中发布者的可执行文件,可以直接用于编译。

使用git克隆功能包代码

  使用git将该功能包下载到本地并进行编译:

# 在workspace/src目录下执行克隆命令,将功能包克隆到src中
git clone https://gitee.com/SAquarius/ros2_example.git .

编译并运行功能包

  下载的文件夹中有Readme文件简单说明了编译和运行过程,如下所示:

# 在工作空间目录下执行以下命令
# 编译功能包
colcon build --symlink-install
# 配置本地变量
source install/setup.bash
# 运行可执行程序
ros2 run cpp_pubsub publisher

  执行效果如下所示:

debug功能包中的可执行程序

  1.为了调试可执行程序,需要在编译时增加cmake的编译类型参数为Debug模式,具体命令参见代码仓库中的Readme说明。
  2.ros2的docker镜像中没有安装gdb调试器,因此需要使用apt-get update之后使用apt-get install gdb命令安装gdb调试器。
  3.使用VS Code进行调试时,需要配置工作区中相关的文件。

工作区相关配置文件及说明

  在工作空间目录中创建.vscode文件夹用于存放工作区的配置文件,配置文件有三个,如下所示:

c_cpp_properties.json

  该文件主要用于描述c和cpp文件的相关配置项,比如使用的编译器,头文件搜索路径等。其中的配置不会影响到整个工作目录的正常使用,仅仅服务于编码时的智能提示:

{
    "configurations": [
        {
            "name": "ROS",
            "includePath": [
                "${workspaceFolder}/**",
                "/opt/ros/humble/include/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "gnu17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-x64",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

tasks.json

  该文件用于定义运行的自动化脚本任务,比如执行编译命令等。这里使用以下配置项定义一个用于编译所有功能包的任务(可在终端-运行任务菜单选项中手动点击执行):

{
  "version": "2.0.0",
  "tasks": [                                                            
    {
      "type": "shell",                                                  
      "label": "colcon build",                             
      "command": "colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Debug",               
      "args": [], 
      "options": {
        "cwd": "${workspaceFolder}"                                     
      },
      "problemMatcher":"$msCompile"                            
    }
  ]
}

launch.json

  该文件用于启动一项调试任务,每项任务可以在侧边栏的调试选项卡中自由选择,这里配置了两项调试任务,一个是具有复用性的Python程序调试项,另一个是C++可执行程序的调试项,其中preLaunchTask选项可以在启动调试前自动调试tasks.json中定义的编译指令进行编译(注意:多文件调试的时候不建议使用preLaunchTask选项,以免因为与正在调试的可执行程序发生读写冲突导致编译失败,建议多程序调试和编译过程分开。):

{
    "configurations": [
        {
            "name": "Python: ${fileBasenameNoExtension}",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": true,
            "preLaunchTask": "colcon build"
        },
        {
            "name": "调试ros节点-publisher(cpp)",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/cpp_pubsub/publisher",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "preLaunchTask": "colcon build"
        }
    ]
}

debug可执行程序

debug使用Python编写的程序

  在侧边栏中点击运行和调试选项卡,打开需要调试的Python源文件,打断点后选择Python: ${fileBasenameNoExtension}的调试启动项开始当前Python文件的调试:

debug使用C++编写的程序

  在侧边栏中点击运行和调试选项卡,在需要调试的Python源文件上打断点后选择调试ros节点-publisher(cpp)的调试启动项开始调试:


当珍惜每一片时光~