| 898 | } |
| 899 | |
| 900 | void gpsHandler(const sensor_msgs::NavSatFixConstPtr& gpsMsg) |
| 901 | { |
| 902 | if (gpsMsg->status.status != 0 || isnan(gpsMsg->latitude) || isnan(gpsMsg->longitude) || isnan(gpsMsg->altitude)) |
| 903 | { |
| 904 | if(debugMode) cout<<"Bad message, status: "<<gpsMsg->status.status<<endl; |
| 905 | return; |
| 906 | } |
| 907 | // string gpsFrame = "/gps"; |
| 908 | // tf::TransformListener listener; |
| 909 | // tf::StampedTransform transformStamped_lidar_to_gps; |
| 910 | // try |
| 911 | // { |
| 912 | // // ERROR] [1639030193.661625830, 1521156822.162099906]: "lidar_link" passed to lookupTransform argument target_frame does not exist |
| 913 | // listener.waitForTransform(lidarFrame, mapFrame, gpsMsg->header.stamp, ros::Duration(0.1)); |
| 914 | // listener.lookupTransform(lidarFrame, mapFrame, gpsMsg->header.stamp, transformStamped_lidar_to_gps); |
| 915 | // } |
| 916 | // catch (tf::TransformException &ex) |
| 917 | // { |
| 918 | // ROS_ERROR("%s",ex.what()); |
| 919 | // return; |
| 920 | // } |
| 921 | |
| 922 | float x,y,z; |
| 923 | x = sin(deg2rad(gpsMsg->latitude - lati0))*rns; |
| 924 | y = sin(deg2rad(gpsMsg->longitude - longi0))*rew*cos(deg2rad(lati0)); |
| 925 | z = alti0 - gpsMsg->altitude; |
| 926 | |
| 927 | Eigen::Affine3f trans_gps_to_gpsM = pcl::getTransformation(x,y,z,0,0,0); |
| 928 | Eigen::Affine3f trans_imu_to_map = trans_gps_to_gpsM; |
| 929 | // Eigen::Affine3f trans_imu_to_map = affine_gps_to_body*trans_gps_to_gpsM*affine_gps_to_body.inverse()*affine_imu_to_body; |
| 930 | // cout<<"after conversion x y z: "<<trans_imu_to_map(0,3)<<" "<<trans_imu_to_map(1,3)<<" "<<trans_imu_to_map(2,3)<<endl; |
| 931 | nav_msgs::Odometry odomGPS; |
| 932 | // notice PoseWithCovariance order: # (x, y, z, rotation about X axis, rotation about Y axis, rotation about Z axis; float64[36] covariance |
| 933 | // different from GTSAM pose covariance order |
| 934 | |
| 935 | odomGPS.pose.covariance[0] = gpsMsg->position_covariance[0]; |
| 936 | odomGPS.pose.covariance[7] = gpsMsg->position_covariance[4]; |
| 937 | odomGPS.pose.covariance[14] = gpsMsg->position_covariance[8]; |
| 938 | odomGPS.pose.pose.position.x = trans_imu_to_map(0,3); |
| 939 | odomGPS.pose.pose.position.y = trans_imu_to_map(1,3); |
| 940 | odomGPS.pose.pose.position.z = trans_imu_to_map(2,3); |
| 941 | odomGPS.pose.pose.orientation.x = 0; |
| 942 | odomGPS.pose.pose.orientation.y = 0; |
| 943 | odomGPS.pose.pose.orientation.z = 0; |
| 944 | odomGPS.pose.pose.orientation.w = 1.0; |
| 945 | odomGPS.header.stamp = gpsMsg->header.stamp; |
| 946 | odomGPS.header.frame_id = "/map"; |
| 947 | gpsQueue.push_back(odomGPS); |
| 948 | gpsTrajPub.publish(odomGPS); |
| 949 | |
| 950 | gps_file<<odomGPS.header.stamp.toSec()<<" "<<odomGPS.pose.pose.position.x<<" "<<odomGPS.pose.pose.position.y<<" "<<odomGPS.pose.pose.position.z<< |
| 951 | " "<<odomGPS.pose.covariance[0]<<" "<<odomGPS.pose.covariance[7]<<" "<<odomGPS.pose.covariance[14]<<"\n"; |
| 952 | } |
| 953 | |
| 954 | |
| 955 | void gtHandler(const nav_msgs::Odometry::ConstPtr& gtMsg) |