您的位置:

ROS2与ROS1的区别

一、架构

ROS1的架构被设计为一个中心化的架构,其目标是提供通信和消息传递机制,以及运行时环境的支持。

ROS2采用了分布式系统的架构,它是一个基于数据中心的系统,消息发布和订阅通过一个可扩展的中间件进行通信。这种模式可以更好地支持分布式数据处理,同时提供了更好的实时性。

具体来说,ROS2的体系结构包括三个主要部分:

  • ROS2客户端库:提供一组API,用于创建ROS2节点、发布和订阅ROS2主题和服务
  • ROS2中间件:ROS2消息的传输使用DDS协议,通过DDS消息中间件来实现(DDS是一种分布式系统的协议,适用于高峰值、高吞吐率和低延迟的应用程序)
  • ROS2节点:在ROS2中,每个节点都是一个可执行文件,可以在ROS2中创建多个节点来完成任务

二、通信

ROS1使用XML-RPC和TCP连接进行通信,这意味着运行时系统需要打开端口以便与其他节点通信。

ROS2使用Data Distribution Service (DDS)来进行消息传递,它提供了更高的灵活性和可伸缩性。 DDS采用P2p方式传输,节点直接通过消息传递,无需经过中间服务器。ROS2引入了QoS(Quality of Service) ,它允许节点定制它们的消息传递和质量参数,以满足应用程序的不同需求。

下面是ROS2发布者和订阅者的代码示例:
  // ROS2发布者代码示例
  #include "rclcpp/rclcpp.hpp"
  #include "std_msgs/msg/string.hpp"

  int main(int argc, char * argv[])
  {
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("publisher");
    auto publisher = node->create_publisher("topic", 10);
    auto timer = node->create_wall_timer(std::chrono::seconds(1), [&]() {
      auto message = std_msgs::msg::String();
      message.data = "Hello, world!";
      publisher->publish(message);
    });
    rclcpp::spin(node);
    rclcpp::shutdown();
  }

  // ROS2订阅者代码示例
  #include "rclcpp/rclcpp.hpp"
  #include "std_msgs/msg/string.hpp"

  void subscription_callback(const std_msgs::msg::String::SharedPtr message)
  {
    RCLCPP_INFO(rclcpp::get_logger("subscription"), "I heard: '%s'", message->data.c_str());
  }

  int main(int argc, char * argv[])
  {
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("subscription");
    auto subscription = node->create_subscription
   ("topic", 10, subscription_callback);
    rclcpp::spin(node);
    rclcpp::shutdown();
  }

   
  

三、支持语言

ROS1主要支持C ++和Python两种语言,其中Python成为ROS1的主要编程语言。而ROS2提供了一系列的客户端库,支持C ++、Python、Java和JavaScript等多种编程语言。在ROS2中,您可以使用您最熟悉的编程语言来编写ROS2节点代码。

四、实时性

ROS2支持嵌入式实时操作系统(例如FreeRTOS、Zephyr、Nuttx),能够实现高实时性的应用程序。ROS2还提供了实时环境,可以实现最低10微秒的数据发布和订阅,最低150微秒(<5kHz)的状态机循环时间。

五、调试和分析工具

ROS2中提供了一些新的调试和分析工具,使用户能更方便地分析节点、主题状况等。例如,ROS2提供了可视化工具ros2-web-bridge,使用户可以在Web浏览器中监视ROS2主题。

六、资源管理

在ROS1中,使用rosmake作为构建工具来生成可执行文件和库,但是在ROS2中,ROS2使用CMake作为构建工具。当然,ROS2也支持集成CMake的需要外部库。

七、迁移

从ROS1到ROS2的迁移需要开发人员做出很多调整,因为ROS2采用了一些不同的API、工具和第三方库。 幸运的是,ROS2团队提供了有关如何迁移的详细信息,包括向后兼容的指南和代码迁移工具。

总之,ROS2相对于ROS1具有更现代的、支持更丰富的功能和协议。 ROS2是更加分布式和去中心化的设计,其提供了更灵活、可扩展和实时的功能。虽然ROS1目前仍然得到广泛应用,但是随着ROS2不断发展,未来ROS2有望成为工业自动化和机器人应用程序的首选平台。 参考资料: [1] https://docs.ros.org/en/rolling/Concepts/About-ROS-2.html [2] https://index.ros.org/doc/ros2/ [3] https://blog.csdn.net/u011517655/article/details/74104451