| 267 | } |
| 268 | |
| 269 | void cmdCallback(const ros::TimerEvent& e) { |
| 270 | // No publishing before receive traj data |
| 271 | if (!receive_traj_) return; |
| 272 | |
| 273 | ros::Time time_now = ros::Time::now(); |
| 274 | double t_cur = (time_now - start_time_).toSec(); |
| 275 | Eigen::Vector3d pos, vel, acc, jer; |
| 276 | double yaw, yawdot; |
| 277 | |
| 278 | if (t_cur < traj_duration_ && t_cur >= 0.0) { |
| 279 | // Current time within range of planned traj |
| 280 | pos = traj_[0].evaluateDeBoorT(t_cur); |
| 281 | vel = traj_[1].evaluateDeBoorT(t_cur); |
| 282 | acc = traj_[2].evaluateDeBoorT(t_cur); |
| 283 | yaw = traj_[3].evaluateDeBoorT(t_cur)[0]; |
| 284 | yawdot = traj_[4].evaluateDeBoorT(t_cur)[0]; |
| 285 | jer = traj_[5].evaluateDeBoorT(t_cur); |
| 286 | } else if (t_cur >= traj_duration_) { |
| 287 | // Current time exceed range of planned traj |
| 288 | // keep publishing the final position and yaw |
| 289 | pos = traj_[0].evaluateDeBoorT(traj_duration_); |
| 290 | vel.setZero(); |
| 291 | acc.setZero(); |
| 292 | yaw = traj_[3].evaluateDeBoorT(traj_duration_)[0]; |
| 293 | yawdot = 0.0; |
| 294 | } else { |
| 295 | cout << "[Traj server]: invalid time." << endl; |
| 296 | } |
| 297 | |
| 298 | // Report info of the whole flight |
| 299 | double len = calcPathLength(traj_cmd_); |
| 300 | double flight_t = (end_time - start_time).toSec(); |
| 301 | ROS_WARN_THROTTLE(1.0, "Drone %d, [%lf,%lf,%lf,%lf], [time, length, vel, energy]", drone_id_, |
| 302 | flight_t, len, len / flight_t, energy); |
| 303 | |
| 304 | if (isLoopCorrection) { |
| 305 | pos = R_loop.transpose() * (pos - T_loop); |
| 306 | vel = R_loop.transpose() * vel; |
| 307 | acc = R_loop.transpose() * acc; |
| 308 | |
| 309 | Eigen::Vector3d yaw_dir(cos(yaw), sin(yaw), 0); |
| 310 | yaw_dir = R_loop.transpose() * yaw_dir; |
| 311 | yaw = atan2(yaw_dir[1], yaw_dir[0]); |
| 312 | } |
| 313 | |
| 314 | cmd.header.stamp = time_now; |
| 315 | cmd.trajectory_id = traj_id_; |
| 316 | cmd.position.x = pos(0); |
| 317 | cmd.position.y = pos(1); |
| 318 | cmd.position.z = pos(2); |
| 319 | cmd.velocity.x = vel(0); |
| 320 | cmd.velocity.y = vel(1); |
| 321 | cmd.velocity.z = vel(2); |
| 322 | cmd.acceleration.x = acc(0); |
| 323 | cmd.acceleration.y = acc(1); |
| 324 | cmd.acceleration.z = acc(2); |
| 325 | cmd.yaw = yaw; |
| 326 | cmd.yaw_dot = yawdot; |
nothing calls this directly
no test coverage detected