ROS2(补充)Docker容器 + vscode开发
WSL+Docker创建ros2容器的过程,参考ROS2(1)安装(WSL+Docker)
1. 工作目录映射到Docker容器
在前面的文章中,我们通过一个自定义的Dockerfile文件创建了1-dockerfile-img镜像,可以通过下面步骤,映射主机的工作目录到该容器中。
首先在主机中创建ros2_ws目录:
mkdir ~/ros2_ws
然后拉取代码,这里参考《ROS2(3)入门篇 - 使用客户端库》
git clone https://github.com/ros2/examples src/examples -b humble
然后创建容器:
docker run -e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v ~/ros2_ws:/home/自己用户名/ros2_ws \
--name my_humble \
--net=host \
-it 1-dockerfile-img
具体参数解释:
-e DISPLAY=$DISPLAY 和 -v /tmp/.X11-unix:/tmp/.X11-unix: 为了容器中显示使用
-v ~/ros2_ws:/home/自己用户名/ros2_ws : 这就是要映射的工作目录,会把整个ros2_ws目录及子目录映射到容器中,注意需要使用自己的用户名,前面文章的dockerfile中已经修改默认的容器用户了
--name my_humble : 容器名称
--net=host : ROS2依赖DDS通信,共享网络可简化节点发现(避免手动配置网络)。
-it 1-dockerfile-img : 镜像
进入容器后,ls一下看看是否有ros2_ws目录了。
2. vscode配置
win端的vscode安装如下插件:
C/C++
Wsl
Dev Containers
ROS # 提供 ROS 特定语法支持,如.msg/.srv文件解析
2.1 连接WSL
ctrl+shift+p,输入WSL: Connect to WSL,连接成功后左下角会显示连接的WSL:

2.2 连接容器
确保容器Status为Up状态。
连接WSL成功后,Ctrl+Shift+P 打开命令面板,输入并选择 Dev Containers: Attach to Running Container…,连接指定的容器。此时连接容器成功,vscode上下文切换到容器中了。
2.3 打开容器中挂载的目录
直接打开文件夹选择ros工作目录打开,我的是ros2_ws,vscode文件浏览器显示:

此时可以修改代码了。
2.4 编译与调试的配置
主要是配置tasks.json和launch.json文件,前者负责编译,后者负责执行调试。
注意,我遇到了vscode中编辑容器文件无权限的问题,主要是dockerfile中编写的UID和GID和自己用户名对应的不一致导致的。通过id
用户名可以查看自己的ID
首先在ros2_ws创建.vscode目录,并添加两个文件:
sudo mkdir .vscode
cd .vscode
sudo touch tasks.json
sudo touch launch.json
tasks.json:
{"version": "2.0.0","tasks": [{"label": "colcon build","type": "shell","command": "bash", // 核心命令:使用bash执行"args": ["-c", // 表示后续字符串为要执行的命令// 拼接完整命令:加载环境 + 编译 + 参数"source /opt/ros/humble/setup.bash && colcon build --symlink-install --event-handlers console_cohesion+ --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=ON"],"options": {"cwd": "${workspaceFolder}" // 容器内的工作空间路径},"group": {"kind": "build","isDefault": true},"problemMatcher": [],"detail": "ROS 2 colcon build in container"}]
}
注意这里command字段用的是bash,因为要执行source /opt/ros/humble/setup.bash,否则找不到colcon指令。
colcon build
--symlink-install
--event-handlers console_cohesion+ //console_cohesion+ 是一个增强的控制台输出处理器,将同一包的日志合并,避免不同包日志交叉混乱。
--cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo //编译时启用优化(类似 Release 模式)。同时保留调试符号(debug info),方便调试。
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON 生成compile_commands.json是 C++ 语言服务器用于解析代码依赖的关键文件,由 CMake 生成,方便代码提示使用。
编写完后,Ctrl+Shift+P,输入Tasks:Run task,选择colcon build,即可进行单独的编译操作了。
因为我不需要编译所有ros2的例程,所以我在不想管的目录下新建了COLCON_IGNORE文件夹。但是编译还是很慢。
launch.json
{"version": "0.2.0","configurations": [{"name": "ROS2 C++ Debug (Container)","type": "cppdbg","request": "launch",// 容器内可执行文件路径(注意:install目录在容器内的工作空间下)"program": "${workspaceFolder}/install/${input:packageName}/lib/${input:packageName}/${input:executableName}","args": [], // 节点运行参数(如需要)"stopAtEntry": true,"cwd": "${workspaceFolder}","environment": [// 加载ROS 2和工作空间的库路径{"name": "LD_LIBRARY_PATH","value": "/opt/ros/humble/lib:${workspaceFolder}/install/lib:${LD_LIBRARY_PATH}"}],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "colcon build", // 调试前自动编译"miDebuggerPath": "/usr/bin/gdb", // 容器内gdb路径"logging": {"moduleLoad": false,"trace": true}}],"inputs": [{"id": "packageName","type": "pickString","description": "请选择ROS2包名","options": [ // 可选的包名列表(根据你的实际包名修改)"examples_rclcpp_minimal_publisher"],"default": "examples_rclcpp_minimal_publisher"},{"id": "executableName","type": "pickString","description": "请选择ROS2节点","options": [ // 可选的包名列表(根据你的实际包名修改)"publisher_member_function","publisher_lambda"],"default": "publisher_member_function"}]
}
当你想改想要调试的包时,只需要改inputs标签的options就可以了,调试的时候让你选。

2.5 代码提示
在 VS Code 中,按 Ctrl+Shift+P 执行 C/C++: Edit Configurations (JSON),生成 .vscode/c_cpp_properties.json
{"configurations": [{"name": "ROS2 Container","includePath": ["${workspaceFolder}/**","/opt/ros/humble/include/**", // ROS 2系统头文件路径"${workspaceFolder}/install/**/include/**" // 工作空间内包的头文件],"defines": [],"compilerPath": "/usr/bin/g++", // 容器内的g++路径"cStandard": "c17","cppStandard": "c++17", // ROS 2默认C++标准"intelliSenseMode": "linux-gcc-x64",// 关联compile_commands.json(自动解析依赖)"compileCommands": "${workspaceFolder}/build/compile_commands.json"}],"version": 4
}
