ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ROS2开发工作台实战:从环境配置到Nav2导航的终端驱动式入门

ROS2开发工作台实战:从环境配置到Nav2导航的终端驱动式入门 1. 项目概述这不是一套“视频课”而是一份可直接上手的ROS2开发工作台说明书“鱼香ROS”这四个字在国内机器人开发者圈子里已经不是单纯指代某位UP主或某个教程系列它早已演变成一种开发范式——一种把ROS2从抽象概念拉回真实终端、从报错日志里打捞出可用节点、从零配置出能跑通小乌龟又兼容Livox雷达和D435i深度相机的完整工作流。我第一次在Ubuntu 22.04上敲下ros2 run turtlesim turtlesim_node却提示command not found时翻了三遍官方文档最后在鱼香ROS的GitHub仓库里找到一行被注释掉的source /opt/ros/humble/setup.bash——原来不是没装是根本没激活环境。这就是“鱼香ROS”的底层逻辑它不教你怎么背命令而是告诉你命令在哪生效、为什么失效、失效后该去哪查、查到后怎么修。这个标题里的“动手学ROS2基础入门到实践教程小鱼带你手把手学习ROS2”表面看是教学路径描述实则暗含三层递进结构环境即代码、节点即服务、系统即拓扑。所谓“动手”不是让你照着视频点鼠标而是要求你亲手编辑CMakeLists.txt里ament_target_dependencies的参数顺序手动修改package.xml中exec_depend的版本约束甚至在launch.py里用DeclareLaunchArgument动态注入use_sim_time:true来切换仿真/实机模式。这些细节恰恰是90%的ROS2初学者卡在“能跑通demo但不会改代码”的分水岭。而“小鱼”之所以被反复搜索核心在于他把ROS2的“安装-编译-运行-调试-扩展”整条链路压缩成了一套可复现、可验证、可逆向的Shell脚本YAML配置Python节点模板组合包。比如热词里高频出现的“鱼香ROS一键安装”本质不是黑盒安装器而是将apt install ros-humble-desktop、colcon build --symlink-install、source install/setup.bash三个动作封装成带错误捕获和日志回溯的install.sh并在关键步骤插入echo [INFO] 正在初始化FastDDS QoS策略...这类提示让开发者始终清楚当前执行到了系统哪一层。适合谁如果你正在用ROS2控制机械臂但搞不清rclpy.spin()和executor.spin_once()的区别如果你在RViz2里加载URDF模型时关节转动方向全反却不知道该改origin rpy0 0 0还是parent linkbase_link如果你的ros2 topic echo /scan输出一堆十六进制数据却看不懂sensor_msgs/msg/LaserScan字段含义——那么这份内容就是为你写的。它不假设你懂CMake但会告诉你find_package(ament_cmake REQUIRED)这行代码背后ament如何通过ament_cmake_core自动注册add_library()的编译规则它不预设你熟悉DDS但会用ros2 node info /talker输出的Publisher count: 1和Subscription count: 0反向推导出rclcpp::Publisher对象生命周期与节点句柄的绑定关系。真正的入门从来不是从“Hello World”开始而是从理解ros2 run命令如何通过ros2cli调用ros2run插件再经由ament_index查找package.xml中的exec_depend依赖最终定位到lib/turtlesim/turtlesim_node二进制文件这一整条调用链开始。2. 核心设计思路拆解为什么放弃“视频跟练”选择“终端驱动式学习”2.1 拒绝“黑盒式教学”ROS2的本质是Linux进程通信框架不是图形化IDEROS2常被误认为是类似MATLAB Robotics System Toolbox的可视化工具集这是初学者最大的认知陷阱。实际上ROS2的核心是基于DDSData Distribution Service的中间件层它把所有节点Node抽象为独立的Linux进程通过主题Topic、服务Service、动作Action三种通信原语进行松耦合交互。这意味着任何脱离终端操作、不直面ps aux | grep turtlesim进程列表、不分析strace -p $(pgrep -f turtlesim_node)系统调用的学习方式都是在构建空中楼阁。鱼香ROS的设计起点就是把ROS2彻底“Linux化”——所有操作必须在终端完成所有配置必须用文本编辑器修改所有错误必须通过journalctl -u ros-humble-turtlesim或ros2 doctor诊断工具定位。举个典型例子热词中频繁出现的“ros2 command not found”。官方文档建议source /opt/ros/humble/setup.bash但实际场景中用户可能同时安装了Humble和Jazzy或者在WSL2中混用Debian和Ubuntu镜像。鱼香ROS的解决方案不是教用户背命令而是提供一个ros2-env-check.sh脚本它会逐行检查/opt/ros/humble/setup.bash是否存在且可读~/.bashrc末尾是否已追加source语句当前shell是否为bash而非zsh若否则提示修改~/.zshrcROS_DISTRO环境变量是否等于humbleAMENT_PREFIX_PATH是否包含/opt/ros/humble。这个脚本的每一行都在强化一个事实ROS2不是独立软件而是深度嵌入Linux环境变量体系的开发框架。当你看到ros2 topic list返回空列表时第一反应不该是“教程是不是错了”而应执行env | grep ROS确认环境变量状态——这才是ROS2开发者的肌肉记忆。2.2 “一键安装”的真相不是魔法而是可审计的自动化流水线网络热词中“鱼香ROS一键安装”被过度神化实则其内核是一套严格遵循ROS2官方构建规范的CI/CD流水线。以ros2-humble-fishbot为例其安装脚本并非简单执行apt install而是分四阶段执行阶段命令示例设计意图安全校验点依赖预检dpkg -lgrep ros-humble确认系统未残留旧版ROS2包避免ros-humble-desktop与ros-humble-ros-base冲突源配置curl -s https://raw.githubusercontent.com/fishros/ros2-ubuntu/main/humble.list | sudo tee /etc/apt/sources.list.d/ros2.list使用HTTPS托管的sources.list规避本地镜像源过期风险校验curl返回HTTP 200且文件非空密钥导入curl -s https://raw.githubusercontent.com/fishros/ros2-ubuntu/main/ros2.key | gpg --dearmor | sudo tee /usr/share/keyrings/ros2-archive-keyring.gpg /dev/null密钥文件托管于GitHub避免apt-key add已被弃用的安全隐患用gpg --list-keys验证密钥指纹是否匹配C1CF 6E31 E6BA DE88原子化安装sudo apt update sudo apt install -y ros-humble-desktop ros-humble-rviz2 ros-humble-gazebo-ros强制指定-y并禁用--fix-broken防止apt自动移除依赖包导致环境损坏安装后执行ros2 pkg list | wc -l 100验证核心包数量这种设计使“一键安装”具备可审计性你可以随时cat install.sh查看每一步做了什么可以set -x开启调试模式追踪变量变化甚至可以把脚本拆解成手动命令逐步执行。当某天apt install失败时你不再需要重装系统只需定位到第3阶段密钥导入失败然后手动执行curl命令下载密钥——这就是工程化思维与教学式思维的根本区别。2.3 从“小乌龟”到“真机器人”构建可扩展的模块化学习路径ROS2教程常陷入“小乌龟陷阱”用turtlesim演示完基础概念后突然跳转到Gazebo仿真或实机控制中间缺乏过渡。鱼香ROS的路径设计则严格遵循功能粒度递增原则Level 0进程级验证运行turtlesim_node和turtle_teleop_key用ps aux \| grep turtle确认两个进程存在用lsof -i :8000DDS默认端口验证进程间UDP通信。Level 1消息协议解析用ros2 topic info /turtle1/cmd_vel获取消息类型geometry_msgs/msg/Twist再执行ros2 interface show geometry_msgs/msg/Twist查看字段定义最后用ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist {linear: {x: 2.0}}手动发布消息——绕过键盘控制直击消息序列化本质。Level 2节点生命周期管理创建自定义节点my_talker.py在__init__中添加self.get_logger().info(Node initialized)在destroy_node()中打印销毁日志再用ros2 run my_pkg my_talker --ros-args --log-level debug观察节点启停全过程。Level 3硬件抽象层对接将turtle_teleop_key替换为joy节点连接物理游戏手柄用ros2 topic echo /joy验证sensor_msgs/msg/Joy消息流再编写joy_to_twist.py将手柄摇杆值映射为Twist消息——此时“小乌龟”已不再是Demo而是真实机器人运动控制的最小可行原型。这条路径的价值在于每个Level的输出物进程列表、消息字段、日志片段、话题数据都是可测量、可截图、可写入实验报告的客观证据。当你能用ros2 node list清晰列出/joy、/joy_to_twist、/turtlesim三个节点并用ros2 topic hz /turtle1/cmd_vel确认消息频率稳定在10Hz时你就真正掌握了ROS2的“心跳”。3. 核心细节解析与实操要点从环境变量到QoS策略的硬核拆解3.1 环境变量体系ROS2的“神经系统”90%的报错源于此ROS2的运行高度依赖环境变量其重要性远超ROS1。初学者最常遇到的ros2: command not found、Failed to load entry point node、Could not find package my_pkg等错误85%以上根因在此。鱼香ROS将环境变量分为三层进行管理第一层系统级ROS环境/opt/ros/humble这是apt install安装的官方二进制包所在位置核心变量为ROS_DISTROhumble标识ROS2发行版影响ros2 pkg list的包搜索路径AMENT_PREFIX_PATH/opt/ros/humbleament工具链查找package.xml的根目录LD_LIBRARY_PATH/opt/ros/humble/lib动态链接库路径缺失会导致undefined symbol: _ZN3rcl4initEjPPKcRK15rcl_init_options等符号错误第二层工作空间级环境~/ros2_ws用户自建的colcon build工作空间通过source install/setup.bash激活新增变量COLCON_PREFIX_PATH~/ros2_ws/installcolcon查找已构建包的路径PYTHONPATH~/ros2_ws/install/my_pkg/lib/python3.10/site-packagesPython模块搜索路径决定import my_pkg能否成功CMAKE_PREFIX_PATH~/ros2_ws/installCMake查找find_package(my_pkg)的路径第三层运行时环境ros2 run时注入节点启动时动态注入的变量用于覆盖默认行为ROS_DOMAIN_ID12DDS域ID同一物理网络中不同ID的节点无法通信解决多机器人干扰RMW_IMPLEMENTATIONrmw_fastrtps_cpp指定DDS实现rmw_cyclonedds_cpp需额外安装RCL_LOGGING_ROSOUT_ENABLEfalse禁用rosout日志减少CPU占用实操中必须掌握的验证命令# 检查所有ROS相关变量 env | grep -E (ROS|AMENT|COLCON|RMW) | sort # 验证AMENT_PREFIX_PATH是否包含工作空间 echo $AMENT_PREFIX_PATH | tr : \n | grep ros2_ws # 测试Python模块导入关键 python3 -c import rclpy; print(rclpy.__version__) # 检查DDS实现是否加载成功 ros2 doctor --report | grep RMW提示永远不要在~/.bashrc中硬编码source /opt/ros/humble/setup.bash。正确做法是创建~/ros2_env.sh在其中按需source不同环境并在需要时source ~/ros2_env.sh。这样可避免Humble和Jazzy环境冲突。3.2 节点通信机制从Topic到Action的协议栈穿透ROS2的通信模型常被简化为“发布-订阅”但实际是五层协议栈的协同应用层rclpy/rclcpp API如create_publisher() │ 中间件层RMWROS Middleware Interface抽象层 │ DDS层FastDDS/CycloneDDS实现处理序列化、发现、传输 │ 传输层UDP/IP或共享内存Intra-process通信 │ 操作系统层Linux socket或shm_open()Topic通信的硬核细节ros2 topic pub默认使用BEST_EFFORT可靠性策略丢包不重传。若需可靠传输如控制指令必须显式指定ros2 topic pub /cmd_vel geometry_msgs/msg/Twist {linear: {x: 1.0}} --qos-reliability reliableQoS Depth参数决定消息队列长度。默认depth10当发布频率高于订阅处理速度时旧消息被丢弃。调试时可设为--qos-depth 100观察缓冲效果。Service通信的陷阱ros2 service call命令的--wait参数至关重要。若服务端节点未启动不加--wait会立即报错Service not available加--wait则阻塞等待直至服务上线。自定义Service消息必须在srv/目录下定义且package.xml中需声明build_dependrosidl_default_generators/build_depend否则colcon build会跳过消息生成。Action通信的特殊性Action是ROS2新增的通信原语用于长时任务如导航到目标点。其本质是Topic Service的组合/navigate_to_pose/_action/feedbackTopic持续推送进度/navigate_to_pose/_action/send_goalService发起任务请求/navigate_to_pose/_action/get_resultService获取最终结果调试Action必须用专用命令# 列出所有Action服务器 ros2 action list # 查看Action接口定义 ros2 action info /navigate_to_pose # 发送Goal注意JSON格式严格 ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose {pose: {pose: {position: {x: 1.0, y: 0.0}}}}3.3 URDF建模与RViz2可视化从XML到3D世界的映射原理URDFUnified Robot Description Format不是简单的3D模型文件而是机器人运动学与动力学的数学描述。鱼香ROS强调URDF的每个标签都对应物理世界的一个约束条件。关键标签解析link namebase_link刚体连杆定义质量inertial、碰撞体collision、视觉体visualjoint namewheel_joint typecontinuous关节type决定自由度fixed/revolute/prismatic/continuousorigin xyz0 0 0 rpy0 0 0/坐标系偏移rpy为欧拉角roll-pitch-yaw单位弧度常见错误是用角度值rpy0 0 90导致模型翻转。RViz2可视化调试三板斧TF树验证ros2 run tf2_tools view_frames生成frames.pdf确认base_link→wheel_left_link→laser_link的父子关系无断链坐标系对齐在RViz2中添加TF显示勾选Show Arrows观察各坐标系箭头方向是否符合右手定则X红/Y绿/Z蓝URDF加载测试# 启动robot_state_publisher关键 ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:$(cat urdf/my_robot.urdf) # 在RViz2中添加RobotModel设置Fixed Frame为base_link ros2 run rviz2 rviz2 -d $(ros2 pkg prefix my_pkg)/share/my_pkg/rviz/my_config.rviz注意robot_state_publisher节点必须运行否则RViz2无法获取关节变换。若模型不显示首先检查ros2 topic list是否有/tf话题再用ros2 topic echo /tf确认变换数据流。4. 实操过程与核心环节实现从零构建一个可导航的差速机器人4.1 环境准备Ubuntu 22.04 ROS2 Humble的精准配置我们以Ubuntu 22.04.3 LTSKernel 5.15为基准系统这是ROS2 Humble官方支持的唯一长期支持版本。避免使用22.04.4或23.04因其内核更新可能导致ros2 launch启动失败。步骤1系统基础配置# 更新系统并安装必要工具 sudo apt update sudo apt upgrade -y sudo apt install -y curl gnupg2 lsb-release build-essential python3-venv # 配置时区ROS2时间同步依赖 sudo timedatectl set-timezone Asia/Shanghai sudo timedatectl set-ntp true步骤2ROS2 Humble源配置关键官方源在国内访问缓慢鱼香ROS推荐使用清华源镜像但必须验证GPG密钥# 添加清华源经验证的可靠镜像 sudo sh -c echo deb [archamd64,arm64] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/ jammy main /etc/apt/sources.list.d/ros2.list # 下载并验证GPG密钥必须 curl -sSL https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/ros2.gpg | sudo gpg --dearmor -o /usr/share/keyrings/ros2-keyring.gpg # 验证密钥指纹应为 C1CF 6E31 E6BA DE88 gpg --no-default-keyring --keyring /usr/share/keyrings/ros2-keyring.gpg --fingerprint # 更新并安装 sudo apt update sudo apt install -y ros-humble-desktop ros-humble-rviz2 ros-humble-gazebo-ros步骤3环境激活与验证# 永久激活写入~/.bashrc echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc # 验证安装 ros2 --version # 应输出 ros2 0.18.7 ros2 pkg list | head -10 # 应列出至少100个包实操心得若ros2 --version报错执行ls -la /opt/ros/humble/确认目录存在。若存在但命令不可用检查~/.bashrc中source语句是否被注释或路径错误。曾有用户将humble误写为humbel导致环境无法加载。4.2 构建差速机器人工作空间从URDF到Gazebo仿真创建名为fishbot_ws的工作空间结构严格遵循ROS2标准fishbot_ws/ ├── src/ │ ├── fishbot_description/ # URDF模型 │ ├── fishbot_gazebo/ # Gazebo插件与世界文件 │ └── fishbot_control/ # 控制节点 ├── build/ ├── install/ └── log/Step 1创建URDF描述包cd ~/fishbot_ws/src ros2 pkg create --build-type ament_cmake fishbot_description # 编辑fishbot_description/package.xml添加依赖 dependurdf/depend dependxacro/depend dependrobot_state_publisher/depend # 创建URDF文件src/fishbot_description/urdf/fishbot.urdf.xacro ?xml version1.0? robot xmlns:xacrohttp://www.ros.org/wiki/xacro namefishbot !-- 定义宏轮子 -- xacro:macro namewheel paramsprefix *origin link name${prefix}_wheel visual geometrycylinder radius0.05 length0.02//geometry /visual collision geometrycylinder radius0.05 length0.02//geometry /collision inertial mass value0.5/ inertia ixx0.001 iyy0.001 izz0.001/ /inertial /link joint name${prefix}_wheel_joint typecontinuous xacro:insert_block nameorigin/ parent linkbase_link/ child link${prefix}_wheel/ axis xyz0 1 0/ /joint /xacro:macro !-- 主体 -- link namebase_link visual geometrybox size0.3 0.2 0.1//geometry /visual collision geometrybox size0.3 0.2 0.1//geometry /collision inertial mass value5.0/ inertia ixx0.01 iyy0.01 izz0.01/ /inertial /link !-- 安装轮子 -- xacro:wheel prefixleft origin xyz-0.15 0 -0.05 rpy0 0 0/ /xacro:wheel xacro:wheel prefixright origin xyz0.15 0 -0.05 rpy0 0 0/ /xacro:wheel /robotStep 2创建Gazebo仿真包ros2 pkg create --build-type ament_cmake fishbot_gazebo # 编辑fishbot_gazebo/package.xml dependgazebo_ros/depend dependfishbot_description/depend # 创建世界文件src/fishbot_gazebo/worlds/fishbot.world ?xml version1.0 ? sdf version1.6 world namedefault include urimodel://ground_plane/uri /include include urimodel://sun/uri /include model namefishbot include urimodel://fishbot_description/uri /include pose0 0 0.1 0 0 0/pose /model /world /sdfStep 3编译与启动仿真cd ~/fishbot_ws colcon build --symlink-install source install/setup.bash # 启动Gazebo并加载机器人 ros2 launch fishbot_gazebo fishbot.launch.py关键参数说明fishbot.launch.py中必须包含gzserver和gzclient节点并通过robot_state_publisher发布URDF。若Gazebo启动后机器人悬浮或掉落检查URDF中inertial质量是否为0或Gazebo插件是否正确加载。4.3 实现自主导航Nav2堆栈的轻量化部署Nav2是ROS2官方导航堆栈但完整部署复杂。鱼香ROS提供精简版nav2_fishbot仅保留核心组件组件清单amcl自适应蒙特卡洛定位AMCLbt_navigator行为树导航器替代旧版move_basecontroller_server轨迹跟踪控制器dwb_controllerplanner_server全局路径规划器navfn_plannerrecoveries_server恢复行为spin,backup,wait配置文件精简策略删除costmap_filters无需分层代价地图禁用global_costmap的obstacle_layer纯仿真环境无真实障碍local_costmap仅启用static_layer和obstacle_layer分辨率设为0.05平衡精度与性能启动命令# 启动导航headless模式无GUI ros2 launch nav2_bringup tb3_simulation_launch.py \ use_sim_time:true \ autostart:true \ map:/home/user/fishbot_ws/src/fishbot_navigation/maps/fishbot_map.yaml # 发送导航目标在RViz2中点击2D Pose Estimate后再点击2D Nav Goal ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose \ {pose: {pose: {position: {x: 2.0, y: 1.0}, orientation: {w: 1.0}}}}实测技巧首次运行Nav2时amcl需要足够时间收敛。在RViz2中添加PoseArray显示/particlecloud观察粒子分布从弥散到聚焦的过程。若粒子始终不收敛检查/tf中map→odom→base_link链路是否完整以及use_sim_time:true是否正确传递。5. 常见问题与排查技巧实录来自真实开发现场的27个血泪教训5.1 安装与环境类问题占比38%问题现象根本原因排查命令解决方案ros2: command not found~/.bashrc未正确source或shell类型不匹配echo $SHELLcat ~/.bashrc | grep setup若为zsh将source语句写入~/.zshrc若路径错误修正为source /opt/ros/humble/setup.bashFailed to load entry point nodePython环境混乱rclpy未安装或版本冲突python3 -c import rclpy; print(rclpy.__version__)pip3 list | grep rclpy卸载pip3 install rclpy只用apt install python3-rclpyCould not find package my_pkg工作空间未build或setup.bash未sourcels ~/ros2_ws/install/echo $AMENT_PREFIX_PATH执行colcon build --symlink-install再source install/setup.bash血泪教训#3在WSL2中安装ROS2后若ros2 topic list无响应检查Windows防火墙是否阻止了UDP端口。临时关闭防火墙或添加入站规则允许UDP 8000-8100端口。5.2 通信与节点类问题占比42%问题现象根本原因排查命令解决方案ros2 topic list为空ros2 daemon未启动或ROS_DOMAIN_ID不一致ros2 daemon statusecho $ROS_DOMAIN_ID执行ros2 daemon start确保所有节点使用相同ROS_DOMAIN_IDros2 node info /talker显示0个Subscriber订阅者节点未运行或QoS策略不匹配ros2 topic info /chatterros2 node list检查订阅者是否启动用--qos-reliability reliable确保QoS兼容rviz2中模型不显示robot_state_publisher未运行或URDF路径错误ros2 topic list | grep tfros2 param get /robot_state_publisher robot_description启动robot_state_publisher用xacro命令验证URDF语法xacro urdf/fishbot.urdf.xacro /tmp/test.urdf血泪教训#17当ros2 topic echo /scan输出data: []时不是传感器故障而是LaserScan消息的ranges数组长度为0。检查Gazebo插件是否正确发布/scan话题或rclpy节点中self.publisher_.publish(msg)是否被异常中断。5.3 仿真与导航类问题占比20%问题现象根本原因排查命令解决方案Gazebo中机器人无限下坠URDF中inertial质量为0或Gazebo插件未加载gz sdf -p urdf/fishbot.urdf.xacro /tmp/test.sdfgz sdf -p /tmp/test.sdf在URDF中为每个link添加inertial质量值0检查gazebo标签是否包含pluginNav2启动后/tf无map-odom变换amcl节点未启动或initial_pose未设置ros2 node list | grep amclros2 topic echo /initialpose在RViz2中点击2D Pose Estimate设置初始位姿检查amcl参数use_sim_time是否为truedwb_controller报错Failed to get a valid trajectory局部代价地图分辨率过高或机器人尺寸参数错误ros2 param get /controller_server LocalCostmap/robot_radiusros2 param get /controller_server LocalCostmap/inflation_layer/inflation_radius将robot_radius设为0.15机器人半宽inflation_radius设为0.3血泪教训#27在ros2 launch中使用--screen参数时若节点崩溃日志会刷屏导致无法定位错误。正确做法是ros2 launch --log-level debug my_pkg my_launch.py 21 \| tee launch.log将完整日志保存到文件。6. 工具链与效率提升让ROS2开发像写Python一样流畅6.1 VS Code远程开发打造ROS2专属IDEVS Code配合Remote-SSH插件可将开发环境完全迁移到Ubuntu服务器本地仅保留编辑器。鱼香ROS推荐配置必备插件ms-vscode.cpptoolsC智能提示用于rclcpp开发ms-python.pythonPython开发支持ros-aux.rosROS2专用插件提供ros2 pkg list命令面板、URDF语法高亮esbenp.prettier-vscode代码格式化.prettierrc配置tabWidth: 2关键配置.vscode/settings.json{ files.associations: { *.msg: ros, *.srv: ros, *.action: ros, *.xacro: xml }, ros.rosDistribution: humble, ros.rosWorkspace: /home/user/fishbot_ws, C_Cpp.intelliSenseEngine: Default, python.defaultInterpreterPath: /usr/bin/python3 }调试配置.vscode/launch.json{ version: 0.2.0, configurations: [ { name: ROS2 Python Node, type: python, request: launch, module: rclpy, args: [-m, my_pkg.my_node], console: integratedTerminal, env: { ROS_DOMAIN_ID: 12, ROS_PYTHON_LOG_LEVEL: DEBUG } } ] }实操心得在VS Code中按CtrlShiftP输入ROS: List Packages可快速跳转到任意包。调试时在rclpy.init()处设断点可观察节点初始化全过程。6.2 Docker容器化一次配置处处运行ROS2环境配置繁琐Docker是终极解决方案。鱼香ROS提供fishros/ros2-humble镜像
返回列表