目录
一、前置必备:环境初始化(必做)
1. 系统ROS2基础环境
2. 自定义工作空间环境
二、核心一:ros2 run 启动单个节点
1. 标准语法
2. 实操示例(官方海龟模拟器)
3. 辅助查询命令(解决找不到文件问题)
三、核心二:ros2 launch 启动多节点程序
1. 标准语法
2. 实操示例
四、自定义功能包启动完整流程
1. 编译自定义功能包
2. 加载编译后的环境
3. 命令行启动程序
五、ROS2 CMake 工具核心使用(编译底层核心)
1. CMake 在 ROS2 中的作用
2. 原生 CMake 手动编译流程(理解底层)
3. ROS2 标准 CMakeLists.txt 核心配置解析
4. CMake 高频使用场景与技巧
5. CMake 常见编译报错避坑
六、配套调试命令(开发必备)
七、核心区别总结(新手必记)
八、常见报错避坑
结语
对于刚入门 ROS 2 的开发者来说,通过命令行启动程序是最基础、最核心的操作。不同于 ROS 1,ROS 2 优化了命令行语法,将单节点启动、多节点批量启动做了明确拆分,逻辑更清晰,但也容易让新手混淆ros2 run和ros2 launch的使用场景。
本文将从零讲解 ROS 2 命令行启动程序的两种核心方式,搭配通用实操命令、场景区分、配套调试工具和自定义包启动流程,适配 Humble、Iron、Jazzy 全版本 ROS 2,新手看完即可上手实操。
一、前置必备:环境初始化(必做)
ROS 2 所有命令行操作的前提是加载环境变量,否则终端会提示「找不到命令、找不到功能包」等报错,这是新手最高频的踩坑点。
1. 系统ROS2基础环境
每次新开终端,执行对应版本的环境加载命令,以最常用的 Humble 为例:
source /opt/ros/humble/setup.bash2. 自定义工作空间环境
如果是自己创建的工作空间(如 ros2_ws),编译程序后需要额外加载工作空间环境:
source ~/ros2_ws/install/setup.bash小技巧:可以将上述命令写入~/.bashrc,实现开机自动加载,无需每次手动执行。
二、核心一:ros2 run 启动单个节点
ros2 run是 ROS 2 启动单个独立节点的专属命令,适用于只需要运行某一个功能模块的简单场景,是最基础的启动方式。
1. 标准语法
ros2 run <功能包名> <可执行文件名>
功能包名:ROS 2 项目的最小单元文件夹名称
可执行文件名:功能包编译后生成的可执行程序名称(非文件夹名)
2. 实操示例(官方海龟模拟器)
# 启动海龟仿真节点 ros2 run turtlesim turtlesim_node执行命令后,会弹出海龟仿真窗口,代表单个节点启动成功。新开终端输入下方命令,可单独启动键盘控制节点:
ros2 run turtlesim turtle_teleop_key3. 辅助查询命令(解决找不到文件问题)
新手常不知道功能包的可执行文件名称,可通过以下命令查询:
# 列出指定包内所有可执行程序 ros2 pkg executables turtlesim # 查看功能包的安装路径 ros2 pkg prefix turtlesim三、核心二:ros2 launch 启动多节点程序
实际开发中,一个机器人功能往往需要多个节点协同工作(如雷达节点+定位节点+导航节点),逐个用ros2 run启动效率极低,此时就需要ros2 launch。
ros2 launch通过读取 launch 启动文件,可一次性批量启动多个节点、配置参数、设置设备别名,是项目开发的主流启动方式。
1. 标准语法
ros2 launch <功能包名> <launch启动文件>ROS 2 主流启动文件为.py格式(Python),兼容少量老旧.xml格式文件。
2. 实操示例
# 一键启动海龟仿真全套程序 ros2 launch turtlesim turtlesim.launch.py单条命令即可完成多模块初始化,无需逐个启动节点,大幅提升开发效率。
四、自定义功能包启动完整流程
除了官方示例,我们自己编写的 ROS 2 程序,可按照「编译-加载环境-启动」三步完成启动,流程固定通用:
1. 编译自定义功能包
# 进入工作空间 cd ~/ros2_ws # 编译指定功能包 colcon build --packages-select 你的包名2. 加载编译后的环境
source install/setup.bash3. 命令行启动程序
# 启动单个自定义节点 ros2 run 你的包名 可执行文件名 # 启动自定义launch多节点程序 ros2 launch 你的包名 启动文件.py五、ROS2 CMake 工具核心使用(编译底层核心)
前文使用的colcon build是 ROS2 封装的批量构建工具,其底层完全依赖 CMake实现源码编译、依赖配置、可执行文件生成。对于自定义 C++ 功能包,必须掌握基础 CMake 用法,才能解决编译报错、自定义编译规则、配置第三方依赖等问题,是进阶开发的核心技能。
1. CMake 在 ROS2 中的作用
ROS2 功能包通过根目录的CMakeLists.txt文件定义编译规则,CMake 的核心作用:扫描源码、解析依赖、生成编译配置文件、编译生成可执行节点/库文件,最终供ros2 run调用运行。Python 包无需 CMake,仅 C++ 功能包必备。
2. 原生 CMake 手动编译流程(理解底层)
日常开发用 colcon 批量编译,但排查编译报错、自定义编译参数时,需要掌握原生 CMake 编译三步流程,适配所有 ROS2 C++ 包:
# 1. 进入功能包编译目录(ROS2 固定编译目录 build) cd ~/ros2_ws/build/你的包名 # 2. CMake 生成编译配置(加载ROS2环境、解析CMakeLists规则) cmake .. # 3. 执行编译,生成可执行文件 make -j8参数说明:-j8代表8线程编译,可根据电脑CPU核心数调整,加速编译速度。编译完成后,可执行文件会自动生成在install/你的包名/bin/目录下。
3. ROS2 标准 CMakeLists.txt 核心配置解析
新手无需手写完整配置,只需掌握核心固定字段,看懂、会修改即可,适配所有自定义C++节点:
# 1. 指定CMake最低版本(ROS2 Humble及以上推荐3.8+) cmake_minimum_required(VERSION 3.8) # 2. 定义功能包名称(必须和package.xml包名一致) project(your_package_name) # 3. 查找ROS2核心依赖(必配) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) # C++节点核心依赖 # 4. 编译可执行节点(源码文件 + 生成的节点名) add_executable(your_node src/your_node.cpp) # 5. 绑定节点依赖库 ament_target_dependencies(your_node rclcpp) # 6. 安装节点到系统目录(关键!否则ros2 run找不到节点) install(TARGETS your_node DESTINATION lib/${PROJECT_NAME} ) ament_package()4. CMake 高频使用场景与技巧
清理旧编译缓存:修改CMakeLists.txt后必须清理缓存,否则配置不生效,执行
rm -rf ~/ros2_ws/build ~/ros2_ws/install后重新编译指定C++编译标准:添加
set(CMAKE_CXX_STANDARD 17),适配ROS2新版本语法特性添加第三方库:通过
find_package(XXX REQUIRED)引入OpenCV、PCL等第三方依赖
5. CMake 常见编译报错避坑
报错:No CMAKE_CXX_COMPILER:未安装编译工具,执行
sudo apt install build-essential cmake安装依赖报错:ament_cmake not found:未source ROS2环境,编译前必须加载系统环境变量
编译成功但找不到节点:CMakeLists中未配置install安装规则,节点未部署到运行目录
六、配套调试命令(开发必备)
启动程序后,可通过以下命令查看节点状态、排查异常,适配日常调试场景:
# 查看当前所有运行的节点 ros2 node list # 查看指定节点的详细信息(话题、服务、参数) ros2 node info /节点名七、核心区别总结(新手必记)
启动命令 | 适用场景 | 核心特点 |
|---|---|---|
ros2 run | 单个节点启动、单点调试 | 简单直接,仅启动一个可执行程序,无批量配置能力 |
ros2 launch | 多节点联动、项目整体启动 | 支持批量启动、参数配置、节点管理,适合正式开发 |
八、常见报错避坑
报错:Package not found:未加载环境变量,重新执行
source环境命令即可报错:Executable not found:功能包未编译、可执行文件名输入错误
节点启动无反应:终端未加载工作空间环境,编译后必须重新 source
结语
命令行启动是 ROS 2 开发的入门基石,熟练区分ros2 run和ros2 launch的使用场景,能快速适配单点调试和项目部署场景。后续复杂的机器人导航、建图、视觉项目,均基于这两种启动方式延伸。
建议新手多实操练习,结合节点查询、状态调试命令,彻底吃透基础用法,为后续进阶开发打好基础。