当前位置: 首页 > news >正文

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
}
http://www.dtcms.com/a/519988.html

相关文章:

  • 7sch C++ <B> weak_ptr circular reference 1/99
  • Docker 拉取 MySQL 5.7 镜像、启动容器并进入 MySQL
  • 苏州建设网站制作wordpress做教育网站
  • 代理记账网站模板如何自己开网址
  • 【Linux基础知识系列:第一百五十三篇】现代网络管理:NetworkManager与nmcli
  • D028 vue+django知识图谱可视化系统|AI 相关
  • 秒杀系统设计:打造高并发、高可用架构的实战指南
  • 当无符号与有符号整数相遇:C++中的隐式类型转换陷阱
  • Maya Python入门:创建球体polySphere、创建工具架、编辑工具架、查看命令的长名称
  • 邯郸市做网站的公司广州手机网站建设报价
  • 数据结构3:复杂度
  • 记录一下c中数据元素 值传递和地址传递
  • springboot高校网上订餐平台的设计与实现(代码+数据库+LW)
  • Datawhale人工智能的数学基础 202510第4次作业
  • 公司网站建立费用太原seo团队
  • 做视频网站的备案要求平面设计兼职接单
  • HarmonyOS分布式Kit:解锁跨设备协同开发的无限可能
  • 南京制作网站优化绵阳专业网站建设
  • perplexity的comet AI浏览器无法下载,一直是等待网络连接
  • 【Day 82】虚拟化-虚拟网络
  • 哈尔滨口碑好的建站公司佛山招收网站设计
  • 【Linux基础知识系列:第一百五十一篇】启动加载器GRUB配置
  • 2025 前端框架决战:Vue 与 React 分析优缺点及使用场景!
  • 频繁读写文件,page cache不及时释放的后果
  • 网站不同网站建设归工商局管还是工信局管
  • Java 虚拟线程(Virtual Threads)正式落地!Spring Boot 如何拥抱 Project Loom?
  • 石家庄网站开发工程师招聘网优秀包装设计案例
  • iOS 混淆工具链实战 多工具组合完成 IPA 混淆与加固 无源码混淆
  • win10桌面windows bing图标如何删除
  • Gin笔记一之项目建立与运行