rclcpp全面介绍

发布时间:2023-05-23

一、rclcpp::ok

在rclcpp中,rclcpp::ok()是一个非常常用的函数,它检测节点是否需要继续运行。我们可以在多个地方调用这个函数,例如在传感器数据处理代码中,以确定是否需要继续接收数据。在大多数情况下,这个函数不需要额外的参数,因为它将使用默认的上下文。代码示例:

#include <rclcpp/rclcpp.hpp>
int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node_name");
  while (rclcpp::ok()) {
    // do something here
  }
  rclcpp::shutdown();
  return 0;
}

上面的代码展示了如何在rclcpp中使用rclcpp::ok()函数来检测节点是否需要继续运行。它将在一个无限循环中运行,直到节点被关闭或拉起。在这个例子中,我们创建了一个名为"my_node_name"的节点,并在其中运行代码。最后一定要调用rclcpp::shutdown()函数,释放节点的所有资源。

二、rclcpp::spin

rclcpp::spin()函数是另一个在rclcpp中非常有用的函数。它会一直阻塞线程,直到节点被关闭或拉起。当它返回时,rclcpp::shutdown()函数也将自动被调用以释放节点的所有资源。

#include <rclcpp/rclcpp.hpp>
int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node_name");
  // create subscriber, publisher or service here
  rclcpp::spin(node);
  return 0;
}

在上面的例子中,我们使用了rclcpp::spin()函数,使节点保持运行状态,并在节点运行时创建了许多不同的ROS组件(例如subscribers、publishers或services)。

三、rclcpp_info

rclcpp_info()是在ROS2中打印信息的一种方式。我们可以使用它来向终端输出有用的调试信息或状态信息。rclcpp_info()函数接受两个参数,第一个参数是节点的指针,第二个参数是您想要打印的消息。

#include <rclcpp/rclcpp.hpp>
int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node_name");
  RCLCPP_INFO(node->get_logger(), "Hello, ROS2!");
  rclcpp::shutdown();
  return 0;
}

在上述例子中,我们使用rclcpp_info()函数,向终端输出“Hello, ROS2!”。我们向函数传递了node->get_logger()参数,以获取当前节点的日志记录器,并向其发送消息。

四、rclcpp::init

rclcpp::init()是在rclcpp中初始化节点的函数。为了使节点能够正常工作,必须在任何其他rclcpp函数之前调用它。如果在程序中有多个节点,每个节点都必须调用该函数来进行初始化。代码示例:

#include <rclcpp/rclcpp.hpp>
int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node_name");
  // do something here
  rclcpp::shutdown();
  return 0;
}

在上述例子中,我们使用rclcpp::init()函数进行节点的初始化,并在节点运行时执行一些操作。最后,我们使用rclcpp::shutdown()函数来释放所有节点资源。

五、rclcpp::Time

rclcpp::Time是在ROS2中处理时间的函数之一。它可以通过在生命周期中不断调用函数(例如rclcpp::spin()rclcpp::ok())来自己更新。我们可以使用它来记录节点数据的时间戳,或者在程序中进行有关时间的测量。

#include <rclcpp/rclcpp.hpp>
int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node_name");
  rclcpp::WallTimer timer = node->create_wall_timer(
    std::chrono::milliseconds(1000), [](){RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Timer callback!");});
  rclcpp::Time last_time = node->now();
  while (rclcpp::ok()) {
    rclcpp::Duration elapsed = node->now() - last_time;
    last_time = node->now();
    // do something here
    RCLCPP_INFO(node->get_logger(), "Elapsed time since last loop iteration: [%.6f] s",
                elapsed.seconds());
  }
  rclcpp::shutdown();
  return 0;
}

在上面的例子中,我们使用了rclcpp::Time函数来记录程序中某些操作的时间。我们声明了两个rclcpp::Time对象,last_time记录单次循环的开始时间,node->now()记录当前时间。我们还声明了一个计时器(每1000ms触发一次)并在其回调中输出一条消息。最后,在每个循环中,我们计算了elapsed时间(即距离上一个循环所经过的时间)并输出了消息。