ROS2——INFO、Rate和spin_some

#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);

  auto node = rclcpp::Node::make_shared("logger_node");

  rclcpp::Rate loop_rate(500ms);
  int counter = 0;
  while (rclcpp::ok()) {
    RCLCPP_INFO(node->get_logger(), "Hello %d", counter++);
    rclcpp::spin_some(node);
    loop_rate.sleep();
  }

  rclcpp::shutdown();
  return 0;
}

  • rclcpp::Rate 可以控制循环的速度,当前面的程序执行完后,可以外加适当的延迟以达到我们选择的速度500ms
  • rclcpp::spin_some 立刻处理回调,没有任务后结束该指令,与 spin 不同,spin 在没有指令的情况下会使代码停滞运行,直到有新命令为止
  • RCLCPP_INFO 可以类比于 printf ,可以将信息打印出来,并发布到话题 /rosout
  • get_logger() 可以获得要记录的节点对象,直接在节点创建的时候就建立的logger对象,有默认的名字,get_node_logger(const rcl_node_t * node); 给我一个名字,如果不存在,我给你创建一个日志记录器对象,存在则返回对应的对象

编译并运行后,可以得到如下结果,可以看到消息的类型,节点的名字以及时间、发布的内容

tao@tao-virtual-machine:~/Documents/bookros_ws$ ros2 run br2_basics logger
[INFO] [1683337358.786960921] [logger_node]: Hello 0
[INFO] [1683337359.287385198] [logger_node]: Hello 1

/logger_node 发布了类型为 rcl_interfaces/msg/Log 的信息到话题 /rosout

image.png

使用该命令可以查看该话题的相关信息

ros2 topic echo /rosout
stamp:
  sec: 1683338436
  nanosec: 287431041
level: 20
name: logger_node
msg: Hello 2155
file: /home/tao/Documents/bookros_ws/src/br2_basics/src/logger.cpp
function: main
line: 47
---
stamp:
  sec: 1683338436
  nanosec: 787051397
level: 20

接下来我们启动一个节点,来订阅节点 logger_node 通过话题 rosout 发布的消息

ros2 run rqt_console rqt_console

image.png

使用面向对象编程,使用类继承 rclcpp::Node 的内容,这样代码更简洁明了

#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;

class LoggerNode : public rclcpp::Node
{
public:
  LoggerNode()
  : Node("logger_node")
  {
    counter_ = 0;
    timer_ = create_wall_timer(
      500ms, std::bind(&LoggerNode::timer_callback, this));
  }

  void timer_callback()
  {
    RCLCPP_INFO(get_logger(), "Hello %d", counter_++);
  }

private:
  rclcpp::TimerBase::SharedPtr timer_;
  int counter_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);

  auto node = std::make_shared<LoggerNode>();

  rclcpp::spin(node);

  rclcpp::shutdown();
  
  return 0;
}
tao@tao-virtual-machine:~/Documents/bookros_ws$ ros2 run br2_basics logger_class 
[INFO] [1683377550.915089556] [logger_node]: Hello 0
[INFO] [1683377551.415162220] [logger_node]: Hello 1
[INFO] [1683377551.914849522] [logger_node]: Hello 2
[INFO] [1683377552.415050848] [logger_node]: Hello 3
[INFO] [1683377552.915133830] [logger_node]: Hello 4
[INFO] [1683377553.415104382] [logger_node]: Hello 5
[INFO] [1683377553.914778350] [logger_node]: Hello 6

通过继承 rclcpp:Node ,创建一个名为 LoggerNode 的类,并进行命名
创建一个 TimerBase::SharedPtrtimer_ , 用以接受 create_wall_timer 回传的变量
create_wall_timer用来创建一个延迟函数,时间设置为500ms,并调用回调函数 timer_callback 打印信息