#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
可以控制循环的速度,当前面的程序执行完后,可以外加适当的延迟以达到我们选择的速度500msrclcpp::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
中
使用该命令可以查看该话题的相关信息
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
使用面向对象编程,使用类继承 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::SharedPtr
的 timer_
, 用以接受 create_wall_timer
回传的变量
create_wall_timer
用来创建一个延迟函数,时间设置为500ms,并调用回调函数 timer_callback
打印信息