C++ 使用boost::bind进行订阅回调时出错
我们得到了这个编译错误,随后出现了更多的错误,显示在使用boost::bind作为subscribe的回调函数时,试图将subscribe参数与所有可能的候选函数相匹配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_<
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