Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::bind进行订阅回调时出错_C++_Boost_Ros_Boost Bind_Moveit - Fatal编程技术网

C++ 使用boost::bind进行订阅回调时出错

C++ 使用boost::bind进行订阅回调时出错,c++,boost,ros,boost-bind,moveit,C++,Boost,Ros,Boost Bind,Moveit,我们得到了这个编译错误,随后出现了更多的错误,显示在使用boost::bind作为subscribe的回调函数时,试图将subscribe参数与所有可能的候选函数相匹配 error: no matching function for call to ‘ros::NodeHandle::subscribe(const char [18], int, boost::_bi::bind_t<void, void (*)(const geometry_msgs::WrenchStamped_<

我们得到了这个编译错误,随后出现了更多的错误,显示在使用boost::bind作为subscribe的回调函数时,试图将subscribe参数与所有可能的候选函数相匹配

error: no matching function for call to ‘ros::NodeHandle::subscribe(const char [18], int, boost::_bi::bind_t<void, void (*)(const geometry_msgs::WrenchStamped_<std::allocator<void> >&, moveit::planning_interface::MoveGroup&), boost::_bi::list2<boost::arg<1>, boost::_bi::value<moveit::planning_interface::MoveGroup*> > >)’
错误:调用“ros::NodeHandle::subscribe(const char[18],int,boost::_bi::bind_t)”时没有匹配的函数
我们的代码如下。注释行显示未传递MoveGroup上下文(对象指针)时工作的代码

#include <stdio.h>
#include <boost/bind.hpp>
#include <geometry_msgs/WrenchStamped.h>
#include <moveit/move_group_interface/move_group.h>

using namespace Eigen;
using namespace std;

//void contact_callback(const geometry_msgs::WrenchStamped& msg) {
void contact_callback(const geometry_msgs::WrenchStamped& msg, moveit::planning_interface::MoveGroup &group){
    //if(msg.wrench.force.z > 5) group.stop();
}

int main(int argc, char **argv) {
    ros::init(argc, argv, "get_stiffness");
    ros::NodeHandle node_handle; 
    ros::AsyncSpinner spinner(1);
    spinner.start();
    moveit::planning_interface::MoveGroup group("manipulator");
    ros::Subscriber contact_sub;
    //contact_sub = node_handle.subscribe("/finger1/nano17ft",1,contact_callback);
    contact_sub = node_handle.subscribe("/finger1/nano17ft",100,boost::bind(contact_callback,_1,&group));
    ros::waitForShutdown();
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间特征;
使用名称空间std;
//无效联系人回调(常量几何体):{
无效联系人回调(常量几何体\u msgs::WrenchStamped&msg,moveit::规划接口::MoveGroup&group){
//如果(消息扳手力z>5)组停止();
}
int main(int argc,字符**argv){
ros::init(argc,argv,“获取刚度”);
ros::节点手柄节点\手柄;
ros::异步旋转器旋转器(1);
spinner.start();
moveit::planning_interface::MoveGroup组(“操纵器”);
ros::订户联系电话;
//contact_sub=node_handle.subscribe(“/finger1/nano17ft”,1,contact_回调);
contact_sub=node_handle.subscribe(“/finger1/nano17ft”,100,boost::bind(contact_回调,_1,&group));
ros::WaitForShutton();
返回0;
}

处理程序接收一个MoveGroup&但您将
组的地址传递给它

改为使用
ref(组)

或者,事实上

std::bind(contact_callback,std::placeholders::_1,std::ref(group))
更新

您的回拨不符合要求的签名:

void contact_callback(const geometry_msgs::WrenchStamped&, moveit::planning_interface::MoveGroup & group) {
一定是

void contact_callback(const boost::shared_ptr<geometry_msgs::WrenchStamped const>, moveit::planning_interface::MoveGroup & group) {

注意:C++标准已经提供了 STD::BooNo/Co>多年来。没有理由使用Boost版本。@ JesperJuhl有细微的差别(表达式模板,例如否定谓词,绑定到成员函数的智能指针,<代码> Boo::保护< /COD>等)。@sehe很好。感谢您指出@sehe和@JesperJuhl,我们现在收到了以下错误消息:
error:调用'ros::NodeHandle::subscribe(const char[18],int,boost:_bi::bind_t)没有匹配的函数“
此处记录了订阅声明以供参考。下一次,请链接文档:)我当前没有安装任何东西,因此。使用解决方案更新了我的答案。Live stubbed demo:太棒了!非常感谢您的帮助善良的人:)
void contact_callback(const boost::shared_ptr<geometry_msgs::WrenchStamped const>, moveit::planning_interface::MoveGroup & group) {
contact_sub = node_handle.subscribe<geometry_msgs::WrenchStamped>("/finger1/nano17ft", 100,
        boost::bind(contact_callback, _1, boost::ref(group)));
boost::function<void(const boost::shared_ptr<geometry_msgs::WrenchStamped const>&)> callback =
    boost::bind(contact_callback, _1, boost::ref(group));
contact_sub = node_handle.subscribe("/finger1/nano17ft", 100, callback);
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <iostream>

////////////////// STUBS STUBS STUBS //////
//#include <geometry_msgs/WrenchStamped.h>
namespace Eigen {}
namespace geometry_msgs {
struct WrenchStamped {}; }
namespace moveit { namespace planning_interface { struct MoveGroup { std::string name; MoveGroup(std::string s):name(s){} }; } }

namespace ros {
    void init(...) {}
    void waitForShutdown(...) {}
    struct Subscriber {};
    struct NodeHandle {
        using VoidConstPtr = void const *;
        enum class TransportHints {};
        template <typename M>
        Subscriber subscribe(const std::string &topic, uint32_t queue_size,
                const boost::function<void(const boost::shared_ptr<M const> &)> &callback,
                const VoidConstPtr &tracked_object = VoidConstPtr(),
                const TransportHints &transport_hints = TransportHints())
        { 
            (void)topic, (void)queue_size, void(tracked_object), void(transport_hints);
            callback({});
            return {};
        }
    };
    struct AsyncSpinner {
        AsyncSpinner(int) {}
        void start() {}
    };
};
//#include <moveit/move_group_interface/move_group.h>
////////////////// END STUBS END STUBS END STUBS //////

using namespace Eigen;

void contact_callback(const boost::shared_ptr<geometry_msgs::WrenchStamped const>, moveit::planning_interface::MoveGroup & group) {
    // if(msg.wrench.force.z > 5) group.stop();
    std::cout << "Invoked! " << group.name << "\n";
}

int main(int argc, char **argv) {
    ros::init(argc, argv, "get_stiffness");
    ros::NodeHandle node_handle;
    ros::AsyncSpinner spinner(1);
    spinner.start();
    moveit::planning_interface::MoveGroup group("manipulator");
    ros::Subscriber contact_sub;

    contact_sub = node_handle.subscribe<geometry_msgs::WrenchStamped>("/finger1/nano17ft", 100,
            boost::bind(contact_callback, _1, boost::ref(group)));
    {
        boost::function<void(const boost::shared_ptr<geometry_msgs::WrenchStamped const>&)> callback =
            boost::bind(contact_callback, _1, boost::ref(group));
        contact_sub = node_handle.subscribe("/finger1/nano17ft", 100, callback);
    }
    ros::waitForShutdown();
}
Invoked! manipulator
Invoked! manipulator