【问题标题】:Passing a variable between callback and main在回调和 main 之间传递一个变量
【发布时间】:2013-04-18 11:27:32
【问题描述】:

我在 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&lt;double&gt; a_ptr(&amp;a, noop_deleteauto noop_delete = [](double *){},但我不太明白如何实现它。我也不清楚提到的具有回调作为成员函数的类。示例显示了使用 C 的实现,我不知道我是否可以使用它。 感谢您的帮助。

【问题讨论】:

  • 在 main 中添加 auto noop_deleter = [](double ){} 作为全局声明和 boost::shared_ptr z_ptr(&z, noop_deleter)。我在回调中也需要这个,可能是像 double 这样的参数,但这不会编译。至于代码中带有回调的类,我不知道如何开始,除了可能是 class{void callback} 但仅此而已。

标签: c++ class boost callback shared-ptr


【解决方案1】:

你得到的建议很好:

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

你就是这样:

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,所以我只是抛出了我从您的代码中理解的内容。当然要调整它。

【讨论】:

  • 感谢您的回答。问题:订阅不能有“this”作为参数。还有其他方法吗?
  • @user2294285 奇怪,ROS 文档说可以:ros.org/doc/api/roscpp/html/…
  • 好的,我已经搜索了链接,但我没有找到“this”作为参数。你能告诉哪个订阅版本?
  • this 是一个特殊值:当前对象上的指针(在这种情况下为SuperCoolRobot*)。 “this”用作subscribe 函数的第四个参数,它期望T* obj 带有“T”表示“任何类型”。第三个参数是具有特定签名的 T obj 的成员方法,这正是我们的link_state_callback(...)
  • 这样做了。仍在找出void callback(gazebo_msgs::LinkStates msgs_ls) 中缺失的*&amp; 某处/不知何故...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 2023-03-17
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
相关资源
最近更新 更多