ROS2日志如何打印时分秒格式时间

这是一个来自鱼香ROS社区的问题,问题原文以及小鱼提供的解决方案如下:

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

ros2默认的打印接口get_logger打印输出的内容中时间是以时间戳格式打印,如图:
在这里插入图片描述

查看官方文档似乎只有时间戳time的选项,没有其他时间格式
在这里插入图片描述

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

小鱼提供的解决方案:

没猜错你想要的应该是下面这种效果

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 后运行任意日志打印就可以了,也可以直接替换系统库里的头文件和库

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值