ROS2的get_logger()什么意思,为什么还有重载函数?
-
请教大佬,下面这句里面get_logger()函数是干什么的?是否可以像ROS1里面那样省略?括号里的参数“rclcpp”有什么用?有些代码这里是空的,即get_logger(),代表什么意思?谢谢。
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);
-
@凌云 ROS2的日志系统是基于一个叫做spdlog的开源库的,spdlog中每一个日志记录器都是一个对象,都有一个名字,通过名字就可以获取到这个日志记录器对象。
接着我们说回ros2,你所说的两个函数原型应该是
get_logger
位于 /opt/ros/humble/include/rclcpp/rclcpp/node.hpp:142
/// Get the logger of the node. /** \return The logger of the node. */ RCLCPP_PUBLIC rclcpp::Logger get_logger() const;
get_logger(const std::string & name)
位于 /opt/ros/humble/include/rclcpp/rclcpp/logger.hpp
/// Return a named logger. /** * The returned logger's name will include any naming conventions, such as a * name prefix. * Currently there are no such naming conventions but they may be introduced in * the future. * * \param[in] name the name of the logger * \return a logger with the fully-qualified name including naming conventions, or * \return a dummy logger if logging is disabled. */ RCLCPP_PUBLIC Logger get_logger(const std::string & name);
第一个不带参数的get_logger是rclcpp节点的成员函数,他是直接在节点创建的时候就建立的logger对象,有默认的名字,自然不用你再传一个。
第二个函数是rclcpp下的一个函数,给我一个名字,如果不存在,我给你创建一个日志记录器对象,存在则返回对应的对象。
还有一个获取日志记录对象的函数
/// Return a named logger using an rcl_node_t. /** * This is a convenience function that does error checking and returns the node * logger name, or "rclcpp" if it is unable to get the node name. * * \param[in] node the rcl node from which to get the logger name * \return a logger based on the node name, or "rclcpp" if there's an error */ RCLCPP_PUBLIC Logger get_node_logger(const rcl_node_t * node);
这个是根据节点的指针返回对应的日志记录器,获取失败的情况下就返回名字
rclcpp
的日志记录器对象。 -
@小鱼 谢谢解答。创建的“日志记录器”是什么意思,可以理解为在~/.ros/log/下创建了名为‘rclcpp’的日志文件,然后将这些日志信息都存在这个文件中吗?
-
@凌云 这个你可能需要体验下spdlog才能理解,一个日志记录器可以选择输出到多个地方,比如说屏幕、文件、网络,这些都是可配置的。
-
@小鱼 谢谢。最后再请教一个实际使用常常遇到的问题:如果我想要ROS2中指定在~/.ros/log/文件夹下的“mylog”的日志文件(自动创建)中记录日志信息,需要哪几行代码呢?
-
@凌云 你是想如何控制,不打印,改变打印格式,还是说改变文件名称。我所知的是可以在rclcpp::init的时候传递一些参数,另外也可以同过环境变量来设置。
eg1:初始化时候关闭logger自动初始化
auto options = rclcpp::InitOptions().auto_initialize_logging(false); rclcpp::init(argc, argv, options);
参考:https://docs.ros.org/en/rolling/Tutorials/Demos/Logging-and-logger-configuration.html
eg2:输出格式控制
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})"
-
@小鱼 如果我想使log记录文件以日期命名呢?比如命名为"node1-2023-7-12"