1

C++ で ROS を使用しており、void callback() でトピックからデータを受け取った後、このデータを int main() の変数に渡す必要があります。これまでにわかったことは、ブースト共有ポインターを使用してそれを行うことができ、「メンバー関数としてコールバックを持つプログラム内のクラス」を使用する必要があるということです。これまでの私のコードの一部:

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 を使用した実装を示していますが、それを使用できるかどうかはわかりません。助けてくれてありがとう。

4

1 に答える 1

2

あなたが与えられたアドバイスは良いです:

「メンバー関数としてコールバックを持つプログラム内のクラス」を使用します

あなたはそのようにします:

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を知らないので、あなたのコードから理解したものを投げただけであることに注意してください。もちろん調整します。

于 2013-04-18T12:44:56.283 に答える