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

标签 c++ class boost callback shared-ptr

我将 ROS 与 C++ 一起使用,在从 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 的实现,我不知道我是否可以使用它。 感谢您的帮助。

最佳答案

你的建议很好:

use a "class in the program with callback as member function"

你这样做:

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,所以我只是把我从你的代码中理解的东西扔掉了。当然要调整它。

关于c++ - 在 callback 和 main 之间传递一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16081691/

相关文章:

android - 如何使用 cmake 和 Android NDK 在 C++ 中加载线程支持

java - 创建 Java 类的新对象返回空对象

c++ - boost 日志严重性级别与系统日志严重性级别

python - 为什么字典会在我不告诉它的情况下自动打印?

python - 将 View 与模板 View django 合并

c++ - 使用函数 <void (boost::any)> 的事件系统是个好主意?

c++ - 对 Boost bcp 行为感到困惑

c++ - 在文件扩展名之前的另一个字符串中插入字符串

c++ - 在 LINUX 中使用 C++ 显示包含在特定目录中的文件

c++ - 无法初始化 ifstream "Error reading characters of string"