ROS::message_filters中的一个报错(mt::TimeStamp……)

                <p>&#x300E;&#x65B9;&#x4FBF;&#x68C0;&#x7D22;&#x300F; ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(msg);</p>
  1. 瞎扯一会儿:

博主是大学生,最近一直使用ROS进行机器人控制编程。由于项目需要对多个接受者(Subscriber)进行同时接收。于是决定使用ROS里面的message_filters进行多消息接受的同步。

官方链接如下:message_filters – ROS Wiki

并参考学习了这篇文章:时间同步及在回调函数中发布ROS消息_罗宾酱的博客-CSDN博客_ros时间同步函数

个人觉得上面的文章非常不错。( 强烈推荐!!!

  1. 遇见的问题:(Header header 的缺失)

ROS::message_filters中的一个报错(mt::TimeStamp……)

主要报错如下:

###最开始显示的信息:
/opt/ros/noetic/include/message_filters/sync_policies/approximate_time.h: In instantiation of 'bool message_filters::sync_policies::ApproximateTime::checkInterMessageBound() [with int i = 0; M0 = rfid_reader::DataDev_ >; M1 = tracer_msgs::TracerStatus_ >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]':
主要报错如下:

/opt/ros/noetic/include/message_filters/sync_policies/approximate_time.h:170:85: error: &#x2018;value&#x2019; is not a member of &#x2018;ros::message_traits::TimeStamp<rfid_reader::datadev_<std::allocator<void> >, void>&#x2019;
170 | ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<messages, i>::type>::value(msg);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
/opt/ros/noetic/include/message_filters/sync_policies/approximate_time.h:181:86: error: &#x2018;value&#x2019; is not a member of &#x2018;ros::message_traits::TimeStamp<rfid_reader::datadev_<std::allocator<void> >, void>&#x2019;
181 | previous_msg_time = mt::TimeStamp<typename mpl::at_c<messages, i>::type>::value(previous_msg);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
/opt/ros/noetic/include/message_filters/sync_policies/approximate_time.h:187:87: error: &#x2018;value&#x2019; is not a member of &#x2018;ros::message_traits::TimeStamp<rfid_reader::datadev_<std::allocator<void> >, void>&#x2019;
187 | previous_msg_time = mt::TimeStamp<typename mpl::at_c<messages, i>::type>::value(previous_msg);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~</typename></rfid_reader::datadev_<std::allocator<void></typename></rfid_reader::datadev_<std::allocator<void></typename></rfid_reader::datadev_<std::allocator<void>

报错原因:

消息类型中没有Head,就是没有时间戳信息。所以不能够同步。

解决方法:

在自定义消息中添加 Header header 即可。(可以看一下 松灵机器人的官方ROS包里的源代码,就像下面这样),个人觉得看官方源码确实收获不小。

ROS::message_filters中的一个报错(mt::TimeStamp……)

添加后即可编译成功:

ROS::message_filters中的一个报错(mt::TimeStamp……)

!!!不要忘记

在Cmakelists.txt中的find_package添加 message_filters

ROS::message_filters中的一个报错(mt::TimeStamp……)
  1. 学霸题,反思一下(C++与python的区别):

由于博主使用ROS C++与python ,在使用python时却没有出现相同的问题。那么问题来了,what f**k ? 有必要研究一番,(下面是官方文档里的c++与python中的相关代码部分)

//C++
typedef sync_policies::ApproximateTime MySyncPolicy;
// ApproximateTime takes a queue size as its constructor argument, hence MySyncPolicy(10)
Synchronizer sync(MySyncPolicy(10), image1_sub, image2_sub);
sync.registerCallback(boost::bind(&callback, _1, _2));
#python相关代码
ts = message_filters.ApproximateTimeSynchronizer([mode_sub, penalty_sub], 10, 0.1, allow_headerless=True)

我们注意到python代码中多了一个奇怪的参数『 allow_headerless=True』,并且官方文档中给出了相关解释:

ROS::message_filters中的一个报错(mt::TimeStamp……)

如果某些消息的类型不包含标头字段,则 ApproximateTimeSynchronizer 默认拒绝添加此类消息。 但是,它的 Python 版本可以使用 allow_headerless=True 构建,它使用当前的 ROS 时间代替任何缺失的 header.stamp 字段:

那么终于可以解释得通了(不得不吹一下python。不但numpy好用,还这么贴心)。虽然但是,我还是主要使用C++(doge)。

如果帮到了你,可以麻烦点一个赞吗?

ROS::message_filters中的一个报错(mt::TimeStamp……)

(图片来自网络,侵删)

Original: https://www.cnblogs.com/litecdows/p/15864391.html
Author: litecdows
Title: ROS::message_filters中的一个报错(mt::TimeStamp……)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609960/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • “XZ”格式文件解压

    1、下载xz 官网:https://tukaani.org/xz/ 例:wget https://nchc.dl.sourceforge.net/project/lzmautils…

    Linux 2023年6月6日
    0111
  • c++仿照go语言的error,函数返回值封装

    c++仿照go语言,程序返回错误时,可以附加错误信息 #ifndef __ERRORMSG_H_ #define __ERRORMSG_H_ #include struct Err…

    Linux 2023年6月14日
    093
  • linux命令之wget下载

    wget wget 是一个下载文件的工具。 格式 wget [&#x53C2;&#x6570;] [URL&#x5730;&#x5740;] 常用参…

    Linux 2023年5月27日
    089
  • 《拉钩课程 — 分布式技术原理与实战》学习笔记

    1、分布式系统是用来解决集中式架构的性能瓶颈问题,其核心是可扩展性,其特点包括:不出现单点故障、无状态等。依照 CAP 理论,分布式系统只能在 CP 和 AP 之间做取舍。 2、B…

    Linux 2023年6月16日
    0141
  • 2021年3月-第01阶段-Linux基础-Linux系统的启动流程

    Linux系统的启动流程 理解Linux操作系统启动流程,能有助于后期在企业中更好的维护Linux服务器,能快速定位系统问题,进而解决问题。 上图为Linux操作系统启动流程 1….

    Linux 2023年6月8日
    0129
  • CentOS7下安装mysql8.0.25

    一、mysql的rpm包准备 官网下载完整rpm包 解压后有多个rpm包, 挑选如下图的5个rpm包上传至linux 二、使用rpm -ivh安装rpm包 按如下安装顺序依次安装 …

    Linux 2023年6月6日
    0136
  • 【V4L2】V4L2框架浅析

    概述 V4L2(Video4Linux的缩写)是Linux下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。 V4L2支持的设备十分广泛,但是其中只有很少…

    Linux 2023年6月13日
    0123
  • 使用SpringBoot校验客户端传来的数据

    前端的数据校验都是辣鸡!后端天下第一! 如果想完美地贯彻原则, 理论上来说就应该让前端那边少传数据过来, 有些的东西能查的就自己查出来。 常用的数据校验like this: /**…

    Linux 2023年6月14日
    080
  • zabbix自定义监控进程与日志

    zabbix自定义监控进程与日志 zabbix自定义监控进程与日志 zabbix自定义监控进程 zabbix自定义监控日志 zabbix自定义监控进程 现在我们需要监控客户端的某一…

    Linux 2023年6月13日
    0130
  • CentOS7.6下Oracle19C RAC集群詳細搭建步驟

    CentOS7.6搭建RAC 1.系统环境配置 1.1概述 ​ 搭建两个节点的rac集群,其每个节点均有两个网卡,public网卡和private网卡。两个节点的主机名分别为rac…

    Linux 2023年6月13日
    078
  • [Git专题] 环境搭建

    环境搭建 在正式使用 Git 之前,首先应当安装 Git 并完成一些基础配置,本章内容就教大家在 Ubuntu 和 CentOS 上安装 Git 的方法。 如果你使用的是基于 De…

    Linux 2023年6月14日
    082
  • AIX系统NTP同步配置

    前言 当AIX系统的本地时间与时间服务器授出的标准时间误差大于±1000秒时。xntpd服务将无法同步时间并变得无法正常工作,请进行ntp配置前,先修改AIX系统的本地时间,尽量和…

    Linux 2023年6月6日
    0124
  • kafka能做什么?kafka集群配置 (卡夫卡 大数据)

    什么是Kafka 官网介绍: 几个概念: 详细介绍 : 操作kafka: kafka集群 消息测试 问题检测 什么是Kafka 官网介绍: ApacheKafka®是一个分布式流媒…

    Linux 2023年6月7日
    0133
  • GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看。支持cat、more、head…vim 目录的内容可以被查看。ls、tree w 文件的内容可以被添…

    Linux 2023年6月6日
    0117
  • MySQL启动报:[ERROR] The server quit without updating PID file

    修改配置后 MySQL启动不了,报错: 看见这个不要惊慌,先把刚才修改的配置注释掉,看是不是配置有误!大部分是手误造成。 如果不行,再尝试一下方法: 解决方法 : 给予权限,执行 …

    Linux 2023年6月13日
    088
  • Shell语法

    在 Shell 中引号分为 2 种:单引号、双引号。 ( 1 )双引号 由双引号括起来的字符,除 $ 、倒引号和反斜线( \ )仍保留其特殊功能外,其余字符通常作为普通字符对待。 …

    Linux 2023年5月28日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球