Robot_State TrajectoryLookupTable::predict_next_pose(Robot_State &robot_state, Command &requested_command, double full_time_interval, double *distance_traveled, double delta_t) { int n = floor(full_time_interval / delta_t); double remaining_time = full_time_interval - ((double) n * delta_t); Robot_State achieved_robot_state = robot_state; // achieved_robot_state eh computado iterativamente abaixo a partir do estado atual do robo double curvature = carmen_get_curvature_from_phi( requested_command.phi, requested_command.v, GlobalState::robot_config.understeer_coeficient, GlobalState::robot_config.distance_between_front_and_rear_axles); double new_curvature = carmen_get_curvature_from_phi( achieved_robot_state.v_and_phi.phi, achieved_robot_state.v_and_phi.v, GlobalState::robot_config.understeer_coeficient, GlobalState::robot_config.distance_between_front_and_rear_axles); double max_curvature_change = GlobalState::robot_config.maximum_steering_command_rate * delta_t; // Euler method for (int i = 0; i < n; i++) { double dist_walked = predict_next_pose_step(&achieved_robot_state, &requested_command, delta_t, new_curvature, curvature, max_curvature_change); if (distance_traveled) *distance_traveled += dist_walked; } if (remaining_time > 0.0) { double dist_walked = predict_next_pose_step(&achieved_robot_state, &requested_command, delta_t, new_curvature, curvature, max_curvature_change); if (distance_traveled) *distance_traveled += dist_walked; } achieved_robot_state.pose.theta = carmen_normalize_theta(achieved_robot_state.pose.theta); robot_state = achieved_robot_state; return (achieved_robot_state); }
carmen_ackerman_traj_point_t carmen_libcarmodel_recalc_pos_ackerman(carmen_ackerman_traj_point_t robot_state, double target_v, double target_phi, double full_time_interval, double *distance_traveled, double delta_t, carmen_robot_ackerman_config_t robot_config) { double a = (target_v - robot_state.v) / full_time_interval; int n = floor(full_time_interval / delta_t); double remaining_time = full_time_interval - ((double) n * delta_t); carmen_ackerman_traj_point_t achieved_robot_state = robot_state; // achieved_robot_state eh computado iterativamente abaixo a partir do estado atual do robo double curvature = carmen_get_curvature_from_phi(target_phi, target_v, robot_config.understeer_coeficient, robot_config.distance_between_front_and_rear_axles); double new_curvature = carmen_get_curvature_from_phi(achieved_robot_state.phi, achieved_robot_state.v, robot_config.understeer_coeficient, robot_config.distance_between_front_and_rear_axles); double max_curvature_change = robot_config.maximum_steering_command_rate * delta_t; // Euler method for (int i = 0; i < n; i++) { double dist_walked = predict_next_pose_step(&achieved_robot_state, target_v, a, delta_t, new_curvature, curvature, max_curvature_change, robot_config); if (distance_traveled) *distance_traveled += dist_walked; } if (remaining_time > 0.0) { double dist_walked = predict_next_pose_step(&achieved_robot_state, target_v, a, delta_t, new_curvature, curvature, max_curvature_change, robot_config); if (distance_traveled) *distance_traveled += dist_walked; } achieved_robot_state.theta = carmen_normalize_theta(achieved_robot_state.theta); robot_state = achieved_robot_state; return (achieved_robot_state); }