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