在回调函数和main函数之间传递变量 < >我使用ROS和C++,在接收到空格回调()中的一个主题的数据之后,我需要把这个数据传递给int()中的变量。到目前为止,我发现我可以使用boost共享指针来实现这一点,并且应该使用“程序中的类以及回调函数作为成员函数”。 到目前为止,我的部分代码: double pos_z; void callback(gazebo_msgs::LinkStates msgs_ls) { double pos_z = msgs_ls.pose[43].position.z pos_z = pos_z + 1; } int main(int argc, char **argv) { ros::init(...); ros::Nodehandle n; ros::Subscriber ls_sub = n.subscribe("/gazebo/link_states", 10, callback); ros::ServiceClient sls_client = n.serviceClient<gazebo_msgs::SetLinkState>("/gazebo/set_link_state"); gazebo_msgs::SetLinkState setLinkState; while (ros::ok)) { setLinkState.request.link_state.position.z = pos_z; sls_client.call(setLinkState); } double pos_z; 无效回调(gazebo_msgs::LinkStates msgs_ls) { 双pos_z=msgs_ls.pose[43]。position.z pos_z=pos_z+1; } int main(int argc,字符**argv) { ros::init(…); ros::nodehandlen; ros::订阅者ls_sub=n.subscribe(“/gazebo/link_states”,10,回调); ros::ServiceClient sls_client=n.ServiceClient(“/gazebo/set_link_state”); gazebo_msgs::SetLinkState SetLinkState; while(ros::ok)) { setLinkState.request.link_state.position.z=pos_z; sls_客户端调用(setLinkState); }

在回调函数和main函数之间传递变量 < >我使用ROS和C++,在接收到空格回调()中的一个主题的数据之后,我需要把这个数据传递给int()中的变量。到目前为止,我发现我可以使用boost共享指针来实现这一点,并且应该使用“程序中的类以及回调函数作为成员函数”。 到目前为止,我的部分代码: double pos_z; void callback(gazebo_msgs::LinkStates msgs_ls) { double pos_z = msgs_ls.pose[43].position.z pos_z = pos_z + 1; } int main(int argc, char **argv) { ros::init(...); ros::Nodehandle n; ros::Subscriber ls_sub = n.subscribe("/gazebo/link_states", 10, callback); ros::ServiceClient sls_client = n.serviceClient<gazebo_msgs::SetLinkState>("/gazebo/set_link_state"); gazebo_msgs::SetLinkState setLinkState; while (ros::ok)) { setLinkState.request.link_state.position.z = pos_z; sls_client.call(setLinkState); } double pos_z; 无效回调(gazebo_msgs::LinkStates msgs_ls) { 双pos_z=msgs_ls.pose[43]。position.z pos_z=pos_z+1; } int main(int argc,字符**argv) { ros::init(…); ros::nodehandlen; ros::订阅者ls_sub=n.subscribe(“/gazebo/link_states”,10,回调); ros::ServiceClient sls_client=n.ServiceClient(“/gazebo/set_link_state”); gazebo_msgs::SetLinkState SetLinkState; while(ros::ok)) { setLinkState.request.link_state.position.z=pos_z; sls_客户端调用(setLinkState); },c++,class,boost,callback,shared-ptr,C++,Class,Boost,Callback,Shared Ptr,关于共享指针:这可以是boost::shared_ptr a_ptr(&a,noop_deletewithauto noop_delete=[](double*){}但我真的不明白如何实现这个。我也不清楚提到的以回调函数作为成员函数的类。示例显示了使用C的实现,我不知道是否可以使用它。 谢谢你的帮助。给你的建议很好: 使用“在程序中使用回调函数作为成员函数的类” 你是这样做的: class SuperCoolRobot { public: SuperCoolRobot ():pos_z(0)

关于共享指针:这可以是
boost::shared_ptr a_ptr(&a,noop_delete
with
auto noop_delete=[](double*){}
但我真的不明白如何实现这个。我也不清楚提到的以回调函数作为成员函数的类。示例显示了使用C的实现,我不知道是否可以使用它。
谢谢你的帮助。

给你的建议很好:

使用“在程序中使用回调函数作为成员函数的类”

你是这样做的:

class SuperCoolRobot {
public:
  SuperCoolRobot ():pos_z(0) {
    // Note : we provide the callback (a member) + a state (this)
    ls_sub = n.subscribe("/gazebo/link_states", 10, SuperCoolRobot::link_state_callback, this);
  }

  void link_state_callback(gazebo_msgs::LinkStates msgs_ls) {
    pos_z = msgs_ls.pose[43].position.z + 1;
  }

  void run() {
    gazebo_msgs::SetLinkState setLinkState;
    while (ros::ok))
    {
      setLinkState.request.link_state.position.z = pos_z;
      sls_client.call(setLinkState);
    }
  }
protected:
  // state here
  ros::Nodehandle n;
  ros::Subscriber ls_sub;
  double pos_z;
};
那么主要的,

int main(int argc, char **argv) {
  SuperCoolRobot robot;
  robot.run();
}

请注意,我不知道ROS,所以我只是抛出了我从您的代码中理解的内容。当然要修改它。

添加自动noop_deleter=[](double){}作为全局声明和boost::shared_ptr z_ptr(&z,noop_deleter)主要是。我在回调中也需要这个,可能是一个像double这样的参数,但它不能编译。至于回调代码中的类,除了类{void callback}之外,我不知道如何启动,但仅此而已。谢谢你的回答。问题:subscribe不能有“this”作为一个参数。还有其他方法吗?@user2294285这很奇怪,ROS文档说它可以:好的,我搜索了链接,但我没有找到“this”作为参数。你能告诉我哪个订阅版本吗?
这是一个特殊值:当前对象上的指针(
supercolrobot*
,在这种情况下)。“this”用作
subscribe
函数的第4个参数,该函数期望
T*obj
,其“T”表示“任何类型”。第3个参数是具有特定签名的T obj的成员方法,这正是我们的
链接状态回调(…)
已经完成。仍在查找
*
&
无效回调(gazebo_msgs::LinkStates msgs_ls)
中的某个地方/以某种方式。。。