ROS 版本用法介绍(拥抱ROS2系列)

一、ROS 版本介绍

ROS (Robot Operating System) 是一个开源的机器人操作系统,旨在为机器人开发提供一种通用平台。随着ROS社区的不断发展,ROS代码库已经分为多个版本。ROS的设计是模块化的,因此ROS的各个版本对于不同应用领域有不同的重点,并且某些功能在不同版本之间也可能会有所不同。

二、ROS版本分类

根据ROS的版本管理规则,不同的ROS版本被分为主版本和发行版本两类,其中主版本一般以数字表示,而发行版本则用字母表示。主版本的变化意味着一系列的API和功能的重大修改,而发行版本的更新则意味着主要是修复BUG、更新文档、添加新软件包等。

1. ROS主版本

ROS的主版本主要包括:ROS 1 和 ROS 2。其中,ROS 1是2007年由Willow Garage开发的,并于2010年向公众发布的,目前已经到ROS 1 Melodic Morenia版本。ROS 1主要使用C++编写,过程通信库采用的是ROS通信协议,具有成熟的社区和生态系统,被广泛应用于机器人研发领域。

而ROS 2是ROS 1的升级版本,于2014年由Open Robotics推出,目前已经到ROS 2 Foxy Fitzroy版本。ROS 2在保留ROS 1的基础上,加入了更多的特性和改进,例如支持多种语言、并发支持、实时性等,使得ROS更适用于更广泛的领域。

2. ROS发行版本

ROS的发行版本是按照字母表顺序进行命名的,比如ROS 1的发行版本有:Diamondback、Electric Emys、Foxy Fritz等。以Melodic Morenia为例,下面是该版本的主要更新内容:

- 支持ARM64平台
- 增加了对于Python3的支持
- 改进了rviz的使用体验
- 新增加了robot_state_publisher软件包
- 优化了通讯机制,减少了内存和CPU占用
- 更新了很多软件包和文档

三、ROS版本选择

选择哪个ROS版本主要取决于应用需求和个人背景。通常来说,对于学界研究,ROS 1仍然是主流的选择。对于更高要求的工业应用,ROS 2可以提供更强的支持。

1. ROS 1还是ROS 2?

从发展趋势来看,ROS 2将会取代ROS 1。但在实际应用中,ROS 1仍然是一个非常成熟且广泛应用的机器人操作系统。此外,ROS 2虽然集成了更多实时特性,但也会兼容ROS 1的软件包和节点,因此两个版本的转换并不是紧急必要的。综上所述,需要根据具体需求谨慎选择ROS版本。

2. 如何选择ROS发行版本?

同样,选择ROS发行版本的最重要的因素是应用需求。例如,如果要使用某个特定的软件包,那么就需要选择对应的ROS发行版本。此外,也要考虑自己的编程语言和操作系统偏好,这些因素也会影响版本选择的决策。

四、ROS代码示例

1. ROS 1代码示例

下面是一个简单的ROS 1的发布者节点实现示例。

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise("chatter", 1000);
  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

    ROS_INFO("%s", msg.data.c_str());

    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
  }

  return 0;
}

2. ROS 2代码示例

下面是一个简单的ROS 2的发布者节点实现示例。

#include 
#include 
#include 
#include 

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

using namespace std::chrono_literals;

class MinimalPublisher : public rclcpp::Node
{
public:
  MinimalPublisher()
  : Node("talker"), count_(0)
  {
    publisher_ = this->create_publisher("chatter", 10);
    timer_ = this->create_wall_timer(
      500ms, std::bind(&MinimalPublisher::timer_callback, this));
  }

private:
  void timer_callback()
  {
    auto message = std_msgs::msg::String();
    std::stringstream ss;
    ss << "hello world " <get_logger(), "Publishing: '%s'", message.data.c_str());
    publisher_->publish(message);
  }
  rclcpp::TimerBase::SharedPtr timer_;
  rclcpp::Publisher::SharedPtr publisher_;
  size_t count_;
};

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平