鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ROS2的get_logger()什么意思,为什么还有重载函数?

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    打印 日志 getlogger
    3
    7
    2.1k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 凌云凌
      凌云
      最后由 小鱼 编辑

      请教大佬,下面这句里面get_logger()函数是干什么的?是否可以像ROS1里面那样省略?括号里的参数“rclcpp”有什么用?有些代码这里是空的,即get_logger(),代表什么意思?谢谢。

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @凌云
        最后由 编辑

        @凌云 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的日志记录器对象。

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        凌云凌 1 条回复 最后回复 回复 引用 0
        • 凌云凌
          凌云 @小鱼
          最后由 编辑

          @小鱼 谢谢解答。创建的“日志记录器”是什么意思,可以理解为在~/.ros/log/下创建了名为‘rclcpp’的日志文件,然后将这些日志信息都存在这个文件中吗?

          小鱼小 1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @凌云
            最后由 编辑

            @凌云 这个你可能需要体验下spdlog才能理解,一个日志记录器可以选择输出到多个地方,比如说屏幕、文件、网络,这些都是可配置的。

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            凌云凌 1 条回复 最后回复 回复 引用 0
            • 凌云凌
              凌云 @小鱼
              最后由 编辑

              @小鱼 谢谢。最后再请教一个实际使用常常遇到的问题:如果我想要ROS2中指定在~/.ros/log/文件夹下的“mylog”的日志文件(自动创建)中记录日志信息,需要哪几行代码呢?

              小鱼小 1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬 @凌云
                最后由 编辑

                @凌云 你是想如何控制,不打印,改变打印格式,还是说改变文件名称。我所知的是可以在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})"
                

                新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                bamaerB 1 条回复 最后回复 回复 引用 0
                • bamaerB
                  bamaer @小鱼
                  最后由 编辑

                  @小鱼 如果我想使log记录文件以日期命名呢?比如命名为"node1-2023-7-12"

                  1 条回复 最后回复 回复 引用 0
                  • 第一个帖子
                    最后一个帖子
                  皖ICP备16016415号-7
                  Powered by NodeBB | 鱼香ROS