使用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插件进入容器。
测试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)
的调试启动项开始调试:
Comments | 4 条评论
博客作者 Curious
厉害
博客作者 Curious
佳好NB
博客作者 songjiahao
@Curious 泽哥赶紧更新博客呀!
(=・ω・=)
博客作者 Curious
@songjiahao 上班加快施工博客进度