Lazy loaded image
🤖 ROS 理论与实践
ROS 1 入门 01|Noetic 环境、Catkin 工作空间与核心概念
Words 4197Read Time 11 min
2024-9-9
2026-9-6
📌
本文基于 Ubuntu 20.04 + ROS Noetic(ROS 1),面向初学者梳理 ROS 的核心概念与常用命令。建议按章节顺序操作,并在每次打开新终端后确认 ROS 环境已加载。

一、安装与配置 ROS 环境

1.1 安装 ROS

ROS 发行版需要与 Ubuntu 版本匹配。可在 ROS 安装页面查看各版本的系统要求。本文使用 Ubuntu 20.04,因此选择 ROS Noetic。
序号
名称
发布时间
支持时间
操作系统支持
1
ROS Melodic Morenia
发布于2018年5月
LTS长期支持到2023年5月
建议在Ubuntu 18.04上安装
2
ROS Noetic Ninjemys
发布于2020年5月
最新的LTS长期支持到2025年5月
建议在Ubuntu 20.04上安装
先确认 Ubuntu 版本,再选择对应的 ROS 发行版:
常见 Ubuntu 版本及代号如下:
  • Ubuntu 12.04 LTS:Precise
  • Ubuntu 14.04 LTS:Trusty
  • Ubuntu 15.04:Vivid
  • Ubuntu 15.10:Wily
  • Ubuntu 16.04 LTS:Xenial
  • Ubuntu 18.04 LTS:Bionic
  • Ubuntu 20.04 LTS:Focal
具体安装步骤参考:在 Ubuntu 上安装 ROS Noetic

1.2 管理环境

ROS 通过 Shell 环境变量确定当前使用的发行版、工作空间和软件包路径。正确加载环境脚本后,终端才能找到 roscorerosrun 等命令,以及对应的软件包。
环境脚本主要来自以下位置:
  1. 通过软件包管理器安装 ROS 时,由系统提供 setup.*sh
  1. 编译或安装 Catkin 软件包时,由 Catkin 自动生成。
  1. 旧版 rosbuild 工作空间可由 rosws 等工具生成,但 rosbuild 已停止维护,不建议在新项目中使用。
  • 设置环境变量 如果通过 Ubuntu 的 apt 安装 ROS,可在 /opt/ros/<distro>/ 目录找到 setup.*sh。以 Noetic 为例:
    • 该配置只对当前终端生效。若希望新终端自动加载,可将命令写入 ~/.bashrc
  • 验证环境是否加载成功

    1.3 创建 ROS 空间

    本文使用 Catkin 创建工作空间。以下操作适用于 ROS Groovy 及更新版本;更早的 ROS Fuerte 等版本使用 rosbuild。
    创建并初始化 Catkin 工作空间:
    执行 catkin_make 后会生成 build/devel/ 目录,并在 src/ 下创建顶层 CMakeLists.txt 链接。
    使用以下命令加载当前工作空间:
    加载后,确认 ROS_PACKAGE_PATH 包含当前工作空间的 src 目录:

    至此,环境已搭建好。

    二、认识 ROS 文件系统

    2.1 文件系统概念

    • 软件包(Package):ROS 代码的基本组织单元,可以包含库、可执行文件、脚本、配置文件等。
    • 软件包清单(package.xml):记录软件包的名称、版本、维护者、许可证和依赖关系。

    2.2 文件系统工具

    ROS 提供了一组定位和浏览软件包的命令,避免手动查找绝对路径:
    • rospack find <package>:返回软件包路径,例如 rospack find roscpp
    • roscd <package>:进入软件包目录,例如 roscd roscpp
      • 只能进入 ROS_PACKAGE_PATH 中可见的软件包。
      • 可直接进入子目录,例如 roscd roscpp/cmake
      • roscd log 可进入 ROS 日志目录;如果尚未运行过 ROS 程序,该目录可能不存在。
    • rosls <package>:列出软件包内容,例如 rosls roscpp_tutorials

    三、创建 ROS 软件包

    3.1 创建 catkin 软件包

    3.2 查看软件包依赖关系

    depends1 显示直接依赖,通常对应创建软件包时传给 catkin_create_pkg 的依赖项;这些依赖也记录在 package.xml 中:

    3.3 catkin 软件包组成

    一个合法的 Catkin 软件包至少需要满足以下条件:
    • 位于独立目录中。
    • 包含符合 Catkin 规范的 package.xml
    • 包含 Catkin 版本的 CMakeLists.txt
    最简单的软件包看起来就像这样:
    package.xml的组成部分
    • 描述标签
    • 维护者标签
    • 许可证标签
    • 依赖项标签
    notion image
    最终 package.xml

    四、构建 ROS 软件包

    4.1 catkin_make 构建软件包

    CMake工作流程
    普通 CMake 项目通常需要逐个进入构建目录执行 cmakemake
    Catkin 工作空间则可以使用 catkin_make 按依赖顺序统一构建多个软件包:
    若catkin项目没有放在工作空间的 catkin/src 目录下,比如 my_src 下,可以这样使用 catkin_make:
    对于catkin_make的高级用法,请参考catkin/commands/catkin_make

    4.2 开始构建你的软件包

    五、理解 ROS 节点

    节点(Node)是一个参与 ROS 通信的运行中进程,通常由软件包中的某个可执行文件启动。节点之间通过话题、服务或动作交换数据2
    可以把节点理解为“职责单一、能够通信的运行单元”。例如,遥控器节点发布控制指令,机器人节点接收指令并执行动作。实际机器人通常还会把传感器、控制器和执行机构拆成多个节点,使各模块能够独立开发和运行。
    notion image
    💡
    每个新终端都需要加载 ROS 和工作空间环境。如果 rosnode 等命令不可用,请检查 ~/.bashrc,或手动执行相应的 source <setup.bash> 命令。

    5.1 使用 roscore 和 rosnode

    1. 启动 ROS Master:roscore
    1. 打开新终端,列出当前节点:rosnode list
    1. 查看指定节点的信息:rosnode info /rosout
    1. 检查节点是否可达:rosnode ping <node_name>

    5.2 使用 rosrun 调出另一个节点

    在运行节点的终端中按 Ctrl+C,即可终止该节点。

    六、理解 ROS 话题与消息

    6.1 引例 - 通过键盘控制乌龟移动

    1. 启动 roscore。如果上一节的进程仍在运行,无需重复启动。
    1. 启动 turtlesim 仿真节点:rosrun turtlesim turtlesim_node
    1. 在新终端启动键盘控制节点:rosrun turtlesim turtle_teleop_key
    1. 使用方向键控制乌龟移动。
    ⚠️
    请先选中运行 turtle_teleop_key 的终端窗口,而不是 turtlesim 图形窗口,否则方向键输入无法被捕获。
    1. 运行 rosrun rqt_graph rqt_graph,查看节点与话题之间的连接关系。
    notion image
    此时系统中有两个节点:turtle_teleop_key 将键盘指令发布到话题,turtlesim_node 订阅该话题并控制乌龟运动。这体现了 ROS 的发布—订阅通信模型:发布者和订阅者通过话题交换消息,不需要直接调用对方。

    6.2 话题和话题消息类型

    命令
    使用

    6.3 发布话题消息和频率

    命令
    使用

    6.4 显示话题数据(数字和图形)

    可以用以下两种方式观察话题数据:
    执行前述发布命令后,rqt_graph 中会出现新的话题连接关系:
    notion image
    显示 /turtle1/pose/y 和 /turtle1/pose/x
    ROS/Tutorials/UnderstandingTopics/rqt_plot.png
    ROS/Tutorials/UnderstandingTopics/rqt_plot.png
    显示 /turtle1/pose/theta
    ROS/Tutorials/UnderstandingTopics/rqt_plot2.png
    ROS/Tutorials/UnderstandingTopics/rqt_plot2.png

    七、理解 ROS 服务与参数

    7.1 调用服务(输入服务参数)

    服务(Service)采用请求—响应模型:客户端发送请求,服务端处理后返回一次响应。它适合“触发一个操作并立即获取结果”的场景,与持续传输数据的话题不同。
    list命令显示turtlesim节点提供了9个服务:resetclearspawnkillturtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relativeturtlesim/get_loggersturtlesim/set_logger_level。同时还有两个与rosout节点有关的服务:/rosout/get_loggers/rosout/set_logger_level
    示例: /clear 服务
    示例: /spawn 服务

    7.2 参数(设置、获取、保存和加载)

    设置和获得参数
    现在我们修改背景颜色的红色通道值:
    该命令只修改了参数服务器中的值。要让 turtlesim 重新读取背景色,需要调用 /clear 服务:
    保存和加载参数
    在这里,我们将所有的参数写入params.yaml文件:
    你甚至可以将yaml文件重载入新的命名空间,例如copy_turtle

    八、使用 roslaunch 启动多个节点

    1. 切换工作目录,并创建 launch 文件夹
      1. 💡
        launch 文件并非必须放在名为 launch 的目录中,但采用这一约定能让项目结构更统一,也更方便维护。
    1. 创建 turtlemimic.launch 文件
        • 第 3~9 行:在 turtlesim1turtlesim2 两个命名空间中分别启动名为 sim 的节点,避免同名冲突。
        • 第 11~14 行:启动 mimic 节点,并通过 remap 将输入和输出映射到两个 turtlesim 实例,使第二只乌龟模仿第一只。
    1. 启动 launch 文件:
      1. 在新终端持续发布速度指令:
        1. notion image
      1. 使用 rqt_graph 查看节点和话题连接:
        1. notion image

      九、创建自定义消息与服务

      9.1 创建 msg

      要让 Catkin 根据 .msg 文件生成 C++、Python 等语言的代码,需要补充以下构建配置:
      1. 打开 package.xml,添加如下两行
        1. CMakeLists.txtfind_package 中加入 message_generation
          1. catkin_package 中声明运行时依赖,并登记消息文件:

            9.2 使用 rosmsg

            创建消息后,可以通过 rosmsg show 命令看看 ROS 能否识别它
            • beginner_tutorials -- 定义消息的软件包
            • Num -- 消息的名称 Num
            如果不记得msg在哪个包中,也可以省略包名称。尝试:
            你会看到:

            9.3 创建 srv

            从另一个包复制现有的srv定义,而不是手动创建新的srv。
            要让 Catkin 根据 .srv 文件生成代码,先完成 9.1 中与 package.xmlfind_package 相关的配置,再在 CMakeLists.txt 中声明服务文件:

            9.4 使用 rossrv

            创建服务后,可以通过 rossrv show 命令看看 ROS 能否识别它
            • beginner_tutorials -- 定义消息的软件包
            • AddTwoInts -- 服务的名称 AddTwoInts
            如果不记得srv在哪个包中,也可以省略包名称。尝试:
            你会看到:

            9.5 生成消息与服务代码

            CMakeLists.txt 中启用 generate_messages,并列出自定义消息依赖的软件包。本例依赖 std_msgs
            完成配置后,回到 Catkin 工作空间重新构建:
            构建成功后,Catkin 会为 msg/srv/ 中的定义生成各语言接口:
            • C++ 头文件:~/catkin_ws/devel/include/beginner_tutorials/
            • Python 消息模块:~/catkin_ws/devel/lib/python3/dist-packages/beginner_tutorials/msg/
            • Python 服务模块:~/catkin_ws/devel/lib/python3/dist-packages/beginner_tutorials/srv/
            • Lisp 接口:~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/
            消息格式的完整规范在消息描述语言中。
            如果你正在构建使用新消息的C++节点,则还需要声明节点和消息之间的依赖关系,参见catkin消息和服务构建文档
             

            参考资料

            1. http://wiki.ros.org/rosbash  2. [What is a ROS Node? - The Robotics Back-End (roboticsbackend.com)](https://roboticsbackend.com/what-is-a-ros-node/#:~:text=A ROS node%2C according to,%2C services%2C actions%2C etc.) 
            上一篇
            视觉 SLAM 01|《视觉 SLAM 十四讲》学习笔记与资料索引
            下一篇
            ROS 1 入门 02|Topic 与 Service 通信实战(C++)

            Comments
            Loading...