Robotics StackExchange | Archived questions

How to subscribe many topic in one code and save data in one txt file

I hope to subscribe many topics in one code, and I hope save the data in a txt file, so I write the code:

void receiveGPS(const sensor_msgs::NavSatFix::ConstPtr &msg) {

ofstream outfile("/home/humingming/position.csv",ios::out|ios::app);

  if(!outfile){

      cerr<<"open error!"<<endl;

exit(1);
  }

gps.header.stamp=msg->header.stamp;

string t=receivetime(gps.header.stamp.sec);

gps.status.status=msg->status.status;

gps.latitude=msg->latitude;

gps.longitude=msg->longitude;

gps.altitude=msg->altitude;

gps.positioncovariance[0]=msg->positioncovariance[0];

gps.positioncovariance[4]=msg->positioncovariance[4];

gps.positioncovariance[8]=msg->positioncovariance[8];

outfile<<t<<","<<gps.latitude<<","<<gps.longitude<<","<<gps.altitude<<endl;

outfile.close();

// ROS_INFO("The location is [%f][%f][%f]",gps.latitude,gps.longitude,gps.altitude);

}

void receiveIMU(const sensor_msgs::Imu::ConstPtr& msg) {

ofstream outfile("/home/hu/imu.csv",ios::out|ios::app);

  if(!outfile){

      cerr<<"open error!"<<endl;

      exit(1);
  }

string t=receivetime(gps.header.stamp.sec);

imuaccel.linear.x=msg->linearacceleration.x;

imuaccel.linear.y=msg->linearacceleration.y;

imuaccel.linear.z=msg->linearacceleration.z;

imuaccelcov.accel.covariance[0]=msg->linearaccelerationcovariance[0];

imuaccelcov.accel.covariance[4]=msg->linearaccelerationcovariance[4];

imuaccelcov.accel.covariance[8]=msg->linearaccelerationcovariance[8];

imuvel.angular.x=msg->angularvelocity.x;

imuvel.angular.y=msg->angularvelocity.y;

imuvel.angular.z=msg->angularvelocity.z;

imuvelcov.twist.covariance[0]=msg->angularvelocitycovariance[0];

imuvelcov.twist.covariance[4]=msg->angularvelocitycovariance[4];

imuvelcov.twist.covariance[8]=msg->angularvelocitycovariance[8];

imu_ori.w=msg->orientation.w;

imu_ori.x=msg->orientation.x;

imu_ori.y=msg->orientation.y;

imu_ori.z=msg->orientation.z;

imuoricov.twist.covariance[0]=msg->orientation_covariance[0];

imuoricov.twist.covariance[4]=msg->orientation_covariance[4];

imuoricov.twist.covariance[8]=msg->orientation_covariance[8];

outfile<<t<<","<<imuaccel.linear.x<<","<<imuaccel.linear.y<<","<<imuaccel.linear.z<<","<<imuaccel.angular.x<<","

<<imuaccel.angular.y<<","<<imuaccel.angular.z<<","<<imuori.w<<","<<imuori.x<<","<<imu_ori.y<<","

<<imu_ori.z<<endl;

outfile.close();

ROSINFO("I heard:linearaccleration[%f]/[%f]/[%f]", imuaccel.linear.x, imuaccel.linear.y, imu_accel.linear.z);

} void receiveVEL(const geometry_msgs::TwistWithCovarianceStamped::ConstPtr &msg) {

ofstream outfile("/home/hu/vel.csv",ios::out|ios::app);

  if(!outfile){

      cerr<<"open error!"<<endl;

      exit(1);
  }

string t=receivetime(gps.header.stamp.sec);

linear_vel.linear.x=msg->twist.twist.linear.x;

linear_vel.linear.y=msg->twist.twist.linear.y;

linear_vel.linear.z=msg->twist.twist.linear.z;

linearvelcov.covariance[0]=msg->twist.covariance[0];

linearvelcov.covariance[7]=msg->twist.covariance[7];

linearvelcov.covariance[14]=msg->twist.covariance[14];

outfile<<t<<","<<linearvel.linear.x<<","<<linearvel.linear.y<<","<<linear_vel.linear.z<<endl;

outfile.close();

}

private:

};

int main(int argc, char **argv) {

// Set up ROS.

ros::init(argc, argv, "receiveGPS");

ros::NodeHandle n;

Foo foo_object;

ros::Subscriber subgps = n.subscribe("gps/fix", 2, &Foo::receiveGPS,&fooobject);

ros::Subscriber subimu = n.subscribe("imu/data", 2, &Foo::receiveIMU,&fooobject);

ros::Subscriber subvel = n.subscribe("gps/vel", 2, &Foo:: receiveVEL,&fooobject);

ros::spin();

}

It does not work! I can write three codes in different ros nodes for the three topics, but I think it is complex for operating, and the data will not be in the same txt file, as up. When I use the code, it only subscribe the "gps/fix" , I hope to get your help, thank you very much!

Asked by hudaming on 2017-07-03 07:39:12 UTC

Comments

Answers