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

    ros2日志打印具体时间而不是时间戳

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    日志 格式 ros2
    2
    4
    460
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 2830206372
      zorrozzz
      最后由 编辑

      ros2默认的打印接口get_logger打印输出的内容中时间是以时间戳格式打印,如图:
      7289502a-47a6-41b1-87be-52096dd9b334-image.png

      查看官方文档似乎只有时间戳time的选项,没有其他时间格式
      92e44f5a-eac7-46ff-8a3d-785ac6997253-image.png

      有没有办法让其改为‘年-月-日 时:分:秒’的格式以方便系统维护和故障排查?

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

        @283020637 每猜错你想要的应该是下面这种效果

        ros2 run demo_nodes_cpp talker
        ---
        [INFO] [12:34:26.755] [talker]: Publishing: 'Hello World: 1'
        [INFO] [12:34:27.755] [talker]: Publishing: 'Hello World: 2'
        [INFO] [12:34:28.755] [talker]: Publishing: 'Hello World: 3'
        [INFO] [12:34:29.755] [talker]: Publishing: 'Hello World: 4'
        [INFO] [12:34:30.755] [talker]: Publishing: 'Hello World: 5'
        [INFO] [12:34:31.755] [talker]: Publishing: 'Hello World: 6'
        [INFO] [12:34:32.755] [talker]: Publishing: 'Hello World: 7'
        [INFO] [12:34:33.755] [talker]: Publishing: 'Hello World: 8'
        

        我看了下,目前来说没有一个好的原生方案,不过可以手动改源码实现。

        首先下载 rcutils 源码,并安装依赖:

        git clone https://github.com/ros2/rcutils.git -b humble
        sudo apt install ros-humble-mimick-vendor -y
        

        打开文件:rcutils/include/rcutils/time.h ,添加代码

        RCUTILS_PUBLIC
        RCUTILS_WARN_UNUSED
        rcutils_ret_t rcutils_time_point_value_as_hmsms_string(
            const rcutils_time_point_value_t *time_point, char *str, size_t str_size);
        

        打开文件:rcutils/src/time.c,添加代码

        rcutils_ret_t rcutils_time_point_value_as_hmsms_string(
          const rcutils_time_point_value_t * time_point,
          char * str,
          size_t str_size)
        {
          RCUTILS_CHECK_ARGUMENT_FOR_NULL(time_point, RCUTILS_RET_INVALID_ARGUMENT);
          RCUTILS_CHECK_ARGUMENT_FOR_NULL(str, RCUTILS_RET_INVALID_ARGUMENT);
          if (0 == str_size) {
            return RCUTILS_RET_OK;
          }
          // best to abs it to avoid issues with negative values in C89, see:
          //   https://stackoverflow.com/a/3604984/671658
          uint64_t abs_time_point = (uint64_t)llabs(*time_point);
          // Calculate hours, minutes, seconds, and milliseconds
          uint64_t milliseconds = abs_time_point / 1000000u; // Convert nanoseconds to milliseconds
          uint64_t seconds = milliseconds / 1000u;
          uint64_t minutes = seconds / 60u;
          uint64_t hours = minutes / 60u;
          milliseconds %= 1000u;
          seconds %= 60u;
          minutes %= 60u;
          hours %= 24u;
          
          if (rcutils_snprintf(
              str, str_size, "%s%02" PRId64 ":%02" PRId64 ":%02" PRId64 ".%03" PRId64,
              (*time_point >= 0) ? "" : "->", hours, minutes, seconds, milliseconds) < 0)
          {
            RCUTILS_SET_ERROR_MSG("failed to format time point into string");
            return RCUTILS_RET_ERROR;
          }
          return RCUTILS_RET_OK;
        }
        

        打开文件: rcutils/src/logging.c ,修改代码:

        // 修改前:
        const char * expand_time_as_seconds(
          const logging_input * logging_input,
          rcutils_char_array_t * logging_output)
        {
          return expand_time(logging_input, logging_output, rcutils_time_point_value_as_seconds_string);
        }
        
        // 修改后:
        const char * expand_time_as_seconds(
          const logging_input * logging_input,
          rcutils_char_array_t * logging_output)
        {
          return expand_time(logging_input, logging_output, rcutils_time_point_value_as_hmsms_string);
        }
        

        编译代码:

        colcon build
        

        然后source 后运行任意日志打印就可以了,也可以直接替换系统库里的头文件和库

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

        1 条回复 最后回复 回复 引用 0
        • 2830206372
          zorrozzz
          最后由 编辑

          感谢大佬答疑👍

          1 条回复 最后回复 回复 引用 0
          • 2830206372
            zorrozzz
            最后由 编辑

            按照大佬的思路再优化一下,年月日也出来了
            4e601478-0a58-4e38-8e75-58e78ab15e25-image.png

            优化了上面大佬回答中的rcutils_time_point_value_as_hmsms_string

            rcutils_ret_t rcutils_time_point_value_as_hmsms_string(
              const rcutils_time_point_value_t * time_point,
              char * str,
              size_t str_size)
            {
              RCUTILS_CHECK_ARGUMENT_FOR_NULL(time_point, RCUTILS_RET_INVALID_ARGUMENT);
              RCUTILS_CHECK_ARGUMENT_FOR_NULL(str, RCUTILS_RET_INVALID_ARGUMENT);
              if (0 == str_size) {
                return RCUTILS_RET_OK;
              }
            
              int64_t seconds = *time_point / (1000 * 1000 * 1000);
              int64_t milliseconds = *time_point / 1000000u % 1000;
            
              struct tm* timeinfo;
              int year, month, day, hour, minute, second;
            
              timeinfo = localtime(&seconds);
              year = timeinfo->tm_year + 1900;
              month = timeinfo->tm_mon + 1;
              day = timeinfo->tm_mday;
              hour = timeinfo->tm_hour;
              minute = timeinfo->tm_min;
              second = timeinfo->tm_sec;
            
              if (rcutils_snprintf(
                  str, str_size, "%s%04d-%02d-%02d %02d:%02d:%02d.%03lu",
                  (*time_point >= 0) ? "" : "->", year, month, day, hour, minute, second, milliseconds) < 0)
              {
                RCUTILS_SET_ERROR_MSG("failed to format time point into string");
                return RCUTILS_RET_ERROR;
              }
              return RCUTILS_RET_OK;
            }
            

            前面要加上 #include <time.h>

            另外编译rcutils时还要需要先安装performance-test-fixture

            sudo apt install ros-humble-performance-test-fixture
            
            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS