ROS订阅回调 - 使用boost :: bind和成员函数

时间:2017-08-26 20:13:14

标签: c++ c++11 boost ros reference-wrapper

我试图订阅ROS中的不同主题(每个弹出的车辆一个),使用相同的回调。我的想法是boost::bind将主题名称作为附加参数传递,因此我知道应该在回调中访问哪个车辆。

问题在于,尽管我已经就该主题提出了多个问题,但似乎没有一个解决方案可行。

基本上,我有以下类VOBase,其中包含std::map<std::string, VOAgent*> agents_,其成员函数如下:

void VOBase::callback_agentState(const custom_msgs::VState::ConstPtr& vStateMsg,
        std::string topic) {
    // [...] regex to find agent name from topic string
    std::string agent_name = match.str();
    // [...] Check if agent name exists, else throw exception

    // Process message
    agents_[agent_name]->pos_ = vStateMsg->pose.position;  // etc.
}

我通过此订阅致电:

void VOBase::callback_agentList(const custom_msgs::VehicleList& vehListMsg) {
    // [...] New agent/vehicle found: process vehListMsg and get agent_name string

    // Subscribe to VState
    topic_name = agent_name + "/state_estimate";
    subscribers_[topic_name] = nodeHandlePtr->subscribe<custom_msgs::VState>(topic_name, 1,
        std::bind(&VOBase::callback_agentState, this, _1, topic_name));
}

但是,我收到了template argument deduction/substitution failed所有候选人和此错误:

mismatched types ‘std::reference_wrapper<_Tp>’ and ‘VO::VOBase*’
                    typename add_cv<_Functor>::type&>::type>()(

我已经测试了很多解决方案,例如使用std::ref(this)获取std::reference_wrapper<_Tp>而不是VO::VOBase*(参考文件无法生存:use of deleted function),使用boost::bind代替{std::bind 1}}(但是在C ++ 11之后它应该是完全相同的),在回调函数参数(以及...::ConstPtr中)中有和没有subscribe<acl_msgs::ViconState::ConstPtr>的ROS消息等等。所以我和#39;我只是在这里处理部分解决方案及其排列...

任何线索?

1 个答案:

答案 0 :(得分:0)

我没有查看您展示的代码的细节(很难找出未显示的信息并推断出所需的信息)。

但是,上次我帮助过ROS订阅和类型推导的人时,很明显处理程序应该将shared_ptr带到消息中。这可能有助于您开始看到解决方案: