ROS C++如何向回调函数传递多个参数?使用boost::bind报deleted function错误
问题原因
你遇到的报错核心原因是moveit::planning_interface::MoveGroupInterface、moveit_visual_tools::MoveItVisualTools这类工具类的拷贝构造函数被显式删除了,不允许值拷贝。而你直接将局部变量传入boost::bind时,默认会做值拷贝,因此触发了deleted function的报错。
另外你当前的boost::bind写法还存在参数不匹配的问题:ROS服务回调需要接收Request、Response两个参数,你只写了占位符_1,缺少了对应Response的_2占位符。
可行解决方案
方案1:修改bind参数为引用传递(最简便,改动最小)
在传递非拷贝类型的变量时,用boost::ref()包裹变量,告诉bind传引用而非值拷贝,同时补全占位符,将main函数中创建服务的那行代码替换为以下内容即可:
ros::ServiceServer robot_server = nh.advertiseService("machine_to_robot",1, boost::bind(&operation, _1, _2, boost::ref(move_group),boost::ref(visual_tools),boost::ref(text_pose),joint_model_group));
注意指针类型的joint_model_group本身就是值传递地址,不需要用ref包裹。
方案2:封装为类(更规范,适合复杂项目)
你可以将所有全局变量、回调函数都封装到一个自定义的ROS节点类中,MoveGroupInterface、visual_tools等都作为类的成员变量,回调作为类的成员函数,绑定的时候传入类实例指针即可,不需要额外传递大量参数,也避免了全局变量的使用。
方案3:设为全局变量(不推荐,但可快速验证)
如果只是临时测试,你可以把main函数里的move_group、visual_tools等变量提到全局作用域,回调函数直接访问全局变量,不需要用bind传参,也能解决问题。
注意事项
- 你当前的回调函数中使用了
visual_tools.prompt()阻塞函数,会导致服务请求一直得不到响应,建议调试完成后删除该语句。 - 如果你的ROS节点开启了多线程回调,需要对move_group等共享资源加锁,避免多线程同时访问导致崩溃。
内容的提问来源于stack exchange,提问作者csm
相关产品推荐
相关产品推荐

