『方便检索』 ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(msg);


1. 瞎扯一会儿:

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

官方链接如下:message_filters - ROS Wiki

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

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

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

主要报错如下:

###最开始显示的信息:

/opt/ros/noetic/include/message_filters/sync_policies/approximate_time.h: In instantiation of ‘bool message_filters::sync_policies::ApproximateTime<M0, M1, M2, M3, M4, M5, M6, M7, M8>::checkInterMessageBound() [with int i = 0; M0 = rfid_reader::DataDev_<std::allocator<void> >; M1 = tracer_msgs::TracerStatus_<std::allocator<void> >; 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: ‘value’ is not a member of ‘ros::message_traits::TimeStamp<rfid_reader::DataDev_<std::allocator<void> >, void>’

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: ‘value’ is not a member of ‘ros::message_traits::TimeStamp<rfid_reader::DataDev_<std::allocator<void> >, void>’

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: ‘value’ is not a member of ‘ros::message_traits::TimeStamp<rfid_reader::DataDev_<std::allocator<void> >, void>’

187 | previous_msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(previous_msg);

| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~

报错原因:

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

解决方法:

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

添加后即可编译成功:

!!!不要忘记

在Cmakelists.txt中的find_package添加message_filters

3. 学霸题,反思一下(C++与python的区别):

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

//C++
typedef sync_policies::ApproximateTime<Image, Image> MySyncPolicy;
// ApproximateTime takes a queue size as its constructor argument, hence MySyncPolicy(10)
Synchronizer<MySyncPolicy> 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』,并且官方文档中给出了相关解释:

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

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

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


(图片来自网络,侵删)

ROS::message_filters中的一个报错(mt::TimeStamp……)的更多相关文章

  1. 解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

  2. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

  3. Eclipse中启动tomcat报错:A child container failed during start

    我真的很崩溃,先是workspace崩了,费了好久重建的workspace,然后建立了一个小demo项目,tomcat中启动却报错,挑选其中比较重要的2条信息如下: A child container ...

  4. Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

  5. MAC OS 中mount nfs 报错问题.

    记一下 MAC OS 中mount nfs 报错问题. 环境和配置文件 NFS 服务端 Ubuntu 安装 apt install nfs-kernel-server 服务端的配置文件 cat /et ...

  6. mysql 5.7.28 中GROUP BY报错问题 SELECT list is not in GROUP BY clause and contains no

    ----mysql 5.7.28 中GROUP BY报错问题 SELECT list is not in GROUP BY clause and contains no------ 解决方案: sel ...

  7. Python中常见的报错名称

    Python中常见的报错名称 1.SyntaxError 语法错误.看看是否用Python关键字命名变量,有没有使用中文符号,运算符.逻辑运算符等符号是不是使用不规范. 2.IndentationEr ...

  8. pytest——pycharm中右击运行(run)没有问题,在terminal中运行pytest报错:E ModuleNotFoundError: No module named

    参考了这个解决办法:https://blog.csdn.net/qq_36829091/article/details/82180866 我的是Windows,linux的和Windows的解决办法有 ...

  9. 关于Entity Framework中的Attached报错的完美解决方案终极版

    之前发表过一篇文章题为<关于Entity Framework中的Attached报错的完美解决方案>,那篇文章确实能解决单个实体在进行更新.删除时Attached的报错,注意我这里说的单个 ...

随机推荐

  1. 初识python: flush 实现进度条打印

    通过flush(强制刷新)实现,类似进度条打印: #!/user/bin env python # author:Simple-Sir # time:20180918 #打印进度条 import sy ...

  2. 初识python: for循环之“两数之和”

    需求:给定一个数字列表和一个目标值,找出列表中和为目标值的两个数: #!/user/bin env python # author:Simple-Sir # time:20180913 # 给定一个整 ...

  3. linux 下安装minconda3

    一.关于bashrc目录,此文件是隐藏的,如果要打开此文件需要用: vim /root/.bashrc 二.linux下关于防火墙的命令 1.查看防火墙状态 firewall-cmd --state ...

  4. Shell 里空语句怎么写 - 半角的冒号

    Python 里的空语句写作pass for x in range(10): pass Shell 里的空语句写作 : #!/bin/bash for x in {1..10} do #echo $x ...

  5. PowerShell 【Switch篇】

    如果你学过其他的高级语言一定对Switch不陌生,下面讲解一下基本语法. 例1: 1 $n=Get-Random 5 2 $s='小明考试得分' 3 switch($n) 4 { 5 0 {$m=30 ...

  6. Echart可视化学习(六)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 柱状图定制 官网找到类似实例, 适 ...

  7. 灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor)

      灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor) 近日,国内领先的云原生全栈私有云提供商灵雀云宣布,推出企业版云原生制品仓库Ala ...

  8. SSRF漏洞用到的其他协议(dict协议,file协议)

    0x00 引言 当SSRF打内网reids时,若gopher协议用不了,我们也可以用其他协议 0x01 dict协议一.定义:词典网络协议,在RFC 2009中进行描述.它的目标是超越Webster ...

  9. Tomcat部署启动时发生错误

    Tomcat启动后项目地址显示404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示. 严重: ContainerBase.addChild: start: org.apache. ...

  10. 【体验】在Adobe After Effects CC 2018中使用脚本创建窗口

    1.主界面 2.脚本编辑器主界面 3.对象浏览器 在脚本编辑器中按F1 4.写一段 ScriptUI var win = new Window('window', 'my win', [100, 10 ...