在callback和main之间传递一个变量

Passing a variable between callback and main

本文关键字:一个 变量 callback main 之间      更新时间:2023-10-16

我在c++中使用ROS,在void callback()中从主题接收数据后,我需要将此数据传递给int main()中的变量。到目前为止,我所发现的是,我可以使用一个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);
  }

关于共享指针:这可能是boost::shared_ptr<double> a_ptr(&a, noop_deleteauto 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,所以我只是把我从你的代码理解。当然可以调整