| 105 | } |
| 106 | |
| 107 | void cmdCallback(const quadrotor_msgs::PositionCommandConstPtr& msg) { |
| 108 | ROS_INFO_ONCE("start"); |
| 109 | Eigen::Vector3d pt, v; |
| 110 | pt(0) = msg->position.x; |
| 111 | pt(1) = msg->position.y; |
| 112 | pt(2) = msg->position.z; |
| 113 | v(0) = msg->velocity.x; |
| 114 | v(1) = msg->velocity.y; |
| 115 | v(2) = msg->velocity.z; |
| 116 | auto cur_time = ros::Time::now(); |
| 117 | |
| 118 | // if (pt(0) > 5 && pt(1) < 3) return; |
| 119 | |
| 120 | if (traj.size() > 0) { |
| 121 | distance1 += (pt - traj.back()).norm(); |
| 122 | } |
| 123 | |
| 124 | traj.push_back(pt); |
| 125 | vel.push_back(v); |
| 126 | displayTrajWithColor(traj, 0.1, Eigen::Vector4d(1, 0, 0, 1), 0); |
| 127 | |
| 128 | double phi = msg->yaw; |
| 129 | yaw.push_back(phi); |
| 130 | yaw1.clear(); |
| 131 | yaw2.clear(); |
| 132 | for (int k = 0; k < 4; ++k) { |
| 133 | int idx = yaw.size() - 1 - 30 * k; |
| 134 | if (idx < 0) continue; |
| 135 | double phi_k = yaw[idx]; |
| 136 | Eigen::Vector3d pt_k = traj[idx]; |
| 137 | Eigen::Matrix3d Rwb; |
| 138 | Rwb << cos(phi_k), -sin(phi_k), 0, sin(phi_k), cos(phi_k), 0, 0, 0, 1; |
| 139 | for (int i = 0; i < cam1.size(); ++i) { |
| 140 | auto p1 = Rwb * cam1[i] + pt_k; |
| 141 | auto p2 = Rwb * cam2[i] + pt_k; |
| 142 | yaw1.push_back(p1); |
| 143 | yaw2.push_back(p2); |
| 144 | } |
| 145 | } |
| 146 | // displayLineList(yaw1, yaw2, 0.02, Eigen::Vector4d(0, 0, 0, 1), 0); |
| 147 | |
| 148 | // std::cout << v(0) << "," << v(1) << "," << v(2) << ","; |
| 149 | if (v.norm() < 1e-3) { |
| 150 | ROS_INFO("end, distance: %lf", distance1); |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | bool endtraj = false; |
| 155 | void trajCallback(const visualization_msgs::MarkerConstPtr& msg) { |
nothing calls this directly
no test coverage detected