zoukankan      html  css  js  c++  java
  • 【ROS】使用ros::Timer周期性调用函数遇到bug

    背景

    在类A内,声明了一个ros::timer变量,然后使用该定时器周期性调用函数。遇到了报错。

    类A代码如下,

    A.h 类的声明

    class A
    {
    void initA(ros::NodeHandle& nh);
    ros::NodeHandle node_;
            ros::Timer xxxx_timer_;
        
            bool radarMapUpdate(const ros::TimerEvent& /*event*/);
    };

    A.cpp 类的定义

    void A::initA(ros::NodeHandle& nh)
    {
        node_ = nh;
    
        xxxx_timer_ = node_.createTimer(ros::Duration(0.05), &A::radarMapUpdate, this);
    }
    
    bool A::radarMapUpdate()
    {
        ....;
    }

    报错内容如下,

    /home/gordon/ros_ws/src/xxxxxxxx/radar_grid_map.cc:1402:93:   required from here
    /usr/include/boost/function/function_template.hpp:231:11: error: no match for call to ‘(boost::_mfi::mf1<bool, xag_nav::planning::RadarGridMap, const ros::TimerEvent&>) (const ros::TimerEvent&)’
               BOOST_FUNCTION_RETURN(boost::mem_fn(*f)(BOOST_FUNCTION_ARGS));
               ^
    In file included from /usr/include/boost/bind/mem_fn.hpp:215:0,
                     from /usr/include/boost/mem_fn.hpp:22,
                     from /usr/include/boost/function/detail/prologue.hpp:18,
                     from /usr/include/boost/function.hpp:24,
                     from /opt/ros/kinetic/include/ros/forwards.h:40,
                     from /opt/ros/kinetic/include/ros/common.h:37,
                     from /opt/ros/kinetic/include/ros/ros.h:43,
                     from /home/gordon/ros_ws/src/xxxxxx/radar_grid_map.h:13,
                     from /home/gordon/ros_ws/src/xxxxxx/radar_grid_map.cc:3:
    /usr/include/boost/bind/mem_fn_template.hpp:163:7: note: candidate: R boost::_mfi::mf1<R, T, A1>::operator()(T*, A1) const [with R = bool; T = xag_nav::planning::RadarGridMap; A1 = const ros::TimerEvent&]
         R operator()(T * p, A1 a1) const
           ^
    /usr/include/boost/bind/mem_fn_template.hpp:163:7: note:   candidate expects 2 arguments, 1 provided
    /usr/include/boost/bind/mem_fn_template.hpp:168:25: note: candidate: template<class U> R boost::_mfi::mf1<R, T, A1>::operator()(U&, A1) const [with U = U; R = bool; T = xag_nav::planning::RadarGridMap; A1 = const ros::TimerEvent&]
         template<class U> R operator()(U & u, A1 a1) const
                             ^
    /usr/include/boost/bind/mem_fn_template.hpp:168:25: note:   template argument deduction/substitution failed:
    In file included from /usr/include/boost/function/detail/maybe_include.hpp:18:0,
                     from /usr/include/boost/function/detail/function_iterate.hpp:14,
                     from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:52,
                     from /usr/include/boost/function.hpp:64,
                     from /opt/ros/kinetic/include/ros/forwards.h:40,
                     from /opt/ros/kinetic/include/ros/common.h:37,
                     from /opt/ros/kinetic/include/ros/ros.h:43,
                     from /home/gordon/ros_ws/src/xxxxxxx/radar_grid_map.h:13,
                     from /home/gordon/ros_ws/src/xxxxxxx/radar_grid_map.cc:3:
    /usr/include/boost/function/function_template.hpp:231:11: note:   candidate expects 2 arguments, 1 provided
               BOOST_FUNCTION_RETURN(boost::mem_fn(*f)(BOOST_FUNCTION_ARGS));
               ^
    In file included from /usr/include/boost/bind/mem_fn.hpp:215:0,
                     from /usr/include/boost/mem_fn.hpp:22,
                     from /usr/include/boost/function/detail/prologue.hpp:18,
                     from /usr/include/boost/function.hpp:24,
                     from /opt/ros/kinetic/include/ros/forwards.h:40,
                     from /opt/ros/kinetic/include/ros/common.h:37,
                     from /opt/ros/kinetic/include/ros/ros.h:43,
                     from /home/gordon/ros_ws/src/xxxxxxx/radar_grid_map.h:13,
                     from /home/gordon/ros_ws/src/xxxxxxx/radar_grid_map.cc:3:
    /usr/include/boost/bind/mem_fn_template.hpp:176:25: note: candidate: template<class U> R boost::_mfi::mf1<R, T, A1>::operator()(const U&, A1) const [with U = U; R = bool; T = xag_nav::planning::RadarGridMap; A1 = const ros::TimerEvent&]
         template<class U> R operator()(U const & u, A1 a1) const

    解决方案

    报错的意思,大致是找到了boost库中的候选函数,但是实参和形参对应不上!

    据此,把函数 bool radarMapUpdate() {} 改成 void radarMapUpdate() {} 即可。

    写在最后

    由于对ros timer的理解不深,使用过程中会存在一些玄学的错误。比如,timer没有成功地周期性调用函数!

    长个心眼。

  • 相关阅读:
    日期时间检查(格式为:YYYY-MM-DD HH:MM:SS)
    日期合法性验证(格式为:YYYY-MM-DD或YYYY/MM/DD )
    [转]Attribute在.net编程中的应用
    WCF
    [转]使用C#开发ActiveX控件
    在 IIS 中承载 WCF 服务
    [转]一个完整的Installshield安装程序实例
    反射
    特性
    迭代器
  • 原文地址:https://www.cnblogs.com/gdut-gordon/p/13467778.html
Copyright © 2011-2022 走看看