前言

1.基本定位:ROS2(Robot Operating System 2)不是传统意义上的“操作系统”,而是一款运行在 Linux、Windows、macOS 乃至 RTOS 之上的开源机器人中间件与开发框架,为机器人应用提供通信、驱动、算法、工具链一站式支持 。

2.版本演进:2020 年发布 ROS1 最终版,官方维护将于 2025 年终止;ROS2 自 2017 年起进入稳定迭代,2022 年推出首个 5 年长支持版(LTS),全面取代 ROS1 成为官方主线 。

3.分布式架构:取消 ROS1 的中心 Master 节点,采用基于 DDS(Data Distribution Service)的 P2P 发现机制,任何节点故障不会导致系统整体崩溃,支持热插拔与弹性扩展 。

4.实时性与 QoS:底层 DDS 提供毫秒级实时传输、可配置 QoS 策略(可靠/尽最大努力、历史深度、截止期限等),满足工业控制、自动驾驶等高实时场景 。

5.跨平台支持:原生支持 Ubuntu、Windows、macOS,同时可移植到 FreeRTOS、Zephyr 等嵌入式实时系统,甚至裸机环境,为“云-边-端”统一开发奠定基础 。

6.多语言与混合编程:核心客户端库提供 C++(rclcpp)与 Python3(rclpy)两种官方 API,节点间通过话题/服务/动作通信,语言无关,可在同一项目中混合使用 。

7.功能包管理: 以“功能包(Package)”为最小软件单元,使用 colcon 构建工具与 ament 编译系统,支持 CMake、Python setuptools 等多种构建后端,依赖管理与并行编译更加清晰 。

8.启动与部署:launch 文件支持 Python、XML、YAML 三种格式,可一次性启动多节点并配置参数、重映射、命名空间;结合容器与 snap 打包,实现一键部署与 OTA 升级 。

9.安全机制:内置 SROS2 插件,提供节点身份认证、通信加密与访问控制,符合工商业部署对数据保密与功能安全的要求 。

10.生态与社区:官方维护导航2(Navigation 2)、MoveIt2、rosbag2、Gazebo 等成熟项目,涵盖感知、规划、控制、仿真全链路;全球社区活跃,每年 5 月 23 日“世界海龟日”发布新版本 。

1.编写发布话题的节点

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using namespace std::chrono_literals;

class TalkerNode : public rclcpp::Node
{
public:
    TalkerNode()
        : Node("talker"), count_(0)
    {
        pub_ = create_publisher<std_msgs::msg::String>("my_topic", 10);
        timer_ = create_wall_timer(
            1s, [this]() {
                auto msg = std_msgs::msg::String();
                msg.data = "Hello ROS2 [" + std::to_string(count_++) + "]";
                RCLCPP_INFO(get_logger(), "Publish: '%s'", msg.data.c_str());
                pub_->publish(msg);
            });
    }

private:
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_;
    rclcpp::TimerBase::SharedPtr timer_;
    size_t count_;
};

int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<TalkerNode>());
    rclcpp::shutdown();
    return 0;
}

2.编写订阅话题的节点

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class ListenerNode : public rclcpp::Node
{
public:
    ListenerNode()
        : Node("listener")
    {
        sub_ = create_subscription<std_msgs::msg::String>(
            "my_topic", 10,
            [this](std_msgs::msg::String::UniquePtr msg) {
                RCLCPP_INFO(get_logger(), "Received: '%s'", msg->data.c_str());
            });
    }

private:
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_;
};

int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<ListenerNode>());
    rclcpp::shutdown();
    return 0;
}

3.修改工程配置文件CMakeLists.txt

在生成的工程源文件CMakeLists.txt末尾添加如下几行:
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

add_executable(talker src/talker.cpp)
ament_target_dependencies(talker rclcpp std_msgs)

add_executable(listener src/listener.cpp)
ament_target_dependencies(listener rclcpp std_msgs)

install(TARGETS
  talker
  listener
  DESTINATION lib/${PROJECT_NAME})

4.ros2机器人操作系统常见命令

# 1.1 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

# 1.2 创建 C++ 功能包(依赖 rclcpp + std_msgs)
ros2 pkg create --build-type ament_cmake topic_demo_cpp \
       --dependencies rclcpp std_msgs

cd topic_demo_cpp/
xxx@xxx-virtual-machine:~/ros2_ws/src/topic_demo_cpp$ ls
CMakeLists.txt  include  package.xml  src

cd ~/ros2_ws
进行编译:
colcon build --packages-select topic_demo_cpp
xxx@xxx-virtual-machine:~/ros2_ws$ colcon build --packages-select topic_demo_cpp
Starting >>> topic_demo_cpp
Finished <<< topic_demo_cpp [11.8s]                       

Summary: 1 package finished [14.4s]

然后打开两个终端进行分别运行话题程序:
source install/setup.bash
ros2 run topic_demo_cpp talker
xxx@xxx-virtual-machine:~/ros2_ws$ source install/setup.bash
ros2 run topic_demo_cpp talker
[INFO] [1757824574.074691898] [talker]: Publish: 'Hello ROS2 [0]'
[INFO] [1757824575.074382738] [talker]: Publish: 'Hello ROS2 [1]'
[INFO] [1757824576.074728664] [talker]: Publish: 'Hello ROS2 [2]'
[INFO] [1757824577.074485747] [talker]: Publish: 'Hello ROS2 [3]'
[INFO] [1757824578.074467145] [talker]: Publish: 'Hello ROS2 [4]'
[INFO] [1757824579.074780334] [talker]: Publish: 'Hello ROS2 [5]'
[INFO] [1757824580.074484087] [talker]: Publish: 'Hello ROS2 [6]'
[INFO] [1757824581.074796501] [talker]: Publish: 'Hello ROS2 [7]'
[INFO] [1757824582.074495840] [talker]: Publish: 'Hello ROS2 [8]'
[INFO] [1757824583.074519669] [talker]: Publish: 'Hello ROS2 [9]'
[INFO] [1757824584.074614101] [talker]: Publish: 'Hello ROS2 [10]'
[INFO] [1757824585.074600317] [talker]: Publish: 'Hello ROS2 [11]'
[INFO] [1757824586.074624881] [talker]: Publish: 'Hello ROS2 [12]'

打开订阅话题端的程序:
source install/setup.bash
ros2 run topic_demo_cpp listener
[INFO] [1757824626.075986925] [listener]: Received: 'Hello ROS2 [52]'
[INFO] [1757824627.076822848] [listener]: Received: 'Hello ROS2 [53]'
[INFO] [1757824628.075944581] [listener]: Received: 'Hello ROS2 [54]'
[INFO] [1757824629.076330182] [listener]: Received: 'Hello ROS2 [55]'
[INFO] [1757824630.076542621] [listener]: Received: 'Hello ROS2 [56]'
[INFO] [1757824631.076735672] [listener]: Received: 'Hello ROS2 [57]'
[INFO] [1757824632.076227658] [listener]: Received: 'Hello ROS2 [58]'
[INFO] [1757824633.075978980] [listener]: Received: 'Hello ROS2 [59]'
[INFO] [1757824634.076299550] [listener]: Received: 'Hello ROS2 [60]'
[INFO] [1757824635.076765036] [listener]: Received: 'Hello ROS2 [61]'
[INFO] [1757824636.076729668] [listener]: Received: 'Hello ROS2 [62]'
[INFO] [1757824637.076584241] [listener]: Received: 'Hello ROS2 [63]

打开第三个终端使用如下命令查看当前系统中有哪些节点:
xxx@xxx-virtual-machine:~/ros2_ws$ ros2 node list
/listener
/talker
查看有哪些服务的命令:
xxx@xxx-virtual-machine:~/ros2_ws$ ros2 service  list
/listener/describe_parameters
/listener/get_parameter_types
/listener/get_parameters
/listener/list_parameters
/listener/set_parameters
/listener/set_parameters_atomically
/talker/describe_parameters
/talker/get_parameter_types
/talker/get_parameters
/talker/list_parameters
/talker/set_parameters
/talker/set_parameters_atomically
查看有哪些接口的命令:
ronlong@tronlong-virtual-machine:~/ros2_ws$ ros2 interface  list
Messages:
    action_msgs/msg/GoalInfo
    action_msgs/msg/GoalStatus
    action_msgs/msg/GoalStatusArray
    actionlib_msgs/msg/GoalID
    actionlib_msgs/msg/GoalStatus
    actionlib_msgs/msg/GoalStatusArray
    builtin_interfaces/msg/Duration
    builtin_interfaces/msg/Time
    diagnostic_msgs/msg/DiagnosticArray
  ...

使用图形化的方式直观地显示当前ros2的消息的传递情况:rqt
在这里插入图片描述

总结

ROS2操作系统,对于发布消息具有非常好的效果,其实也可以用到其它对于信息传输比较严格的地方,以上就是使用ROS2操作系统的一些简单的演示。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐