// Global varibles
static pthread_t thr_trajctory_follower;
-static pthread_t thr_trajctory_recalc;
static struct timeval tv_start; /**< Absolute time, when trajectory started. */
/** Stores the actually followed trajectory object */
perror("move_init: pthread_create");
exit(1);
}
- // Thread of trajectory recalc
- pthread_attr_init (&tattr);
- pthread_attr_getschedparam (&tattr, ¶m);
- param.sched_priority = TRAJ_RECALC_PRIO;
- ret = pthread_attr_setschedparam (&tattr, ¶m);
- if(ret) {
- perror("move_init: pthread_attr_setschedparam(recalc)");
- exit(1);
- }
- //pthread_create(&thr_trajctory_recalc, NULL, trajctory_recalc, NULL);
-
- // Thread update Map
- pthread_attr_init (&tattr);
- pthread_attr_getschedparam (&tattr, ¶m);
- param.sched_priority = UPDATE_MAP_PRIO;
- ret = pthread_attr_setschedparam (&tattr, ¶m);
- if(ret) {
- perror("pthread_attr_setschedparam");
- exit(1);
- }
- //pthread_create(&thr_update_map, NULL, thread_update_map, NULL);
-
+
FSM_TRANSITION(wait_for_command);
}
}
+#define FIND_NEW_WAY(target) \
+do { \
+ enum target_status ret = new_goal(target); \
+ switch (ret) { \
+ case TARGET_OK: \
+ FSM_TRANSITION(movement); \
+ break; \
+ case TARGET_ERROR: \
+ printf("Target error\n"); \
+ FSM_SIGNAL(MAIN, EV_MOTION_DONE, NULL); \
+ break; \
+ case TARGET_NOT_REACHABLE: \
+ FSM_TRANSITION(wait_and_try_again); \
+ break; \
+ } \
+} while(0)
+
+
FSM_STATE(wait_for_command)
{
enum target_status ret;
FSM_SIGNAL(MAIN, EV_MOTION_DONE, NULL);
FSM_TRANSITION(wait_for_command);
break;
+ case EV_OBSTACLE_ON_ROAD:
+ FIND_NEW_WAY(¤t_target);
+ break;
case EV_TRAJECTORY_LOST:
FSM_TRANSITION(reset_mcl);
break;
case EV_MOVE_STOP:
FSM_TRANSITION(wait_for_command);
break;
+ case EV_OBSTACLE_ON_ROAD:
+ /* ignore it */
+ break;
case EV_EXIT:
stop();
break;
FSM_SIGNAL(LOC, EV_RESET, NULL);
break;
case EV_FOUND_AFTER_RESET:
- FSM_TRANSITION(movement);
- printf("TODO: start motion again\n");
+ FIND_NEW_WAY(¤t_target);
break;
case EV_MOVE_STOP:
FSM_TRANSITION(wait_for_command);
case EV_TRAJECTORY_LOST:
case EV_RETURN:
case EV_TIMER:
+ case EV_OBSTACLE_ON_ROAD:
DBG_PRINT_EVENT("unhandled event");
}
}
FSM_STATE(wait_and_try_again)
{
- enum target_status ret;
switch (FSM_EVENT) {
case EV_ENTRY:
stop();
FSM_TIMER(1000);
break;
case EV_TIMER:
- ret = new_goal(¤t_target);
- switch (ret) {
- case TARGET_OK:
- FSM_TRANSITION(movement);
- break;
- case TARGET_ERROR:
- printf("Target error\n");
- FSM_SIGNAL(MAIN, EV_MOTION_DONE, NULL);
- break;
- case TARGET_NOT_REACHABLE:
- FSM_TRANSITION(wait_and_try_again);
- break;
- }
+ FIND_NEW_WAY(¤t_target);
+ break;
case EV_MOVE_STOP:
FSM_TRANSITION(wait_for_command);
break;
case EV_TRAJECTORY_LOST:
case EV_RETURN:
case EV_FOUND_AFTER_RESET:
- case EV_EXIT:
+ case EV_OBSTACLE_ON_ROAD:
DBG_PRINT_EVENT("unhandled event");
+ break;
+ case EV_EXIT:
+ break;
}
}
* License: GNU GPL v.2
*/
+#include <map.h>
+#include <movehelper_eb2008.h>
+#include <pthread.h>
+#include <robomath.h>
#include <robot_eb2008.h>
+#include <robot_orte.h>
+#include <servos_eb2008.h>
#include <signal.h>
+#include <sys/time.h>
+#include <time.h>
#include <unistd.h>
-#include <servos_eb2008.h>
-#include <movehelper_eb2008.h>
-#include <robot_orte.h>
-#include <robomath.h>
-#include <map.h>
+#include "map_handling.h"
+
#define THREAD_PRIO_MOTION 30
#define THREAD_PRIO_MAIN 25
}
}
+ pthread_attr_t tattr;
+ struct sched_param param;
+ pthread_t thr_obstacle_forgeting;
+ int ret;
+
+ // Trajectory follower thread
+ pthread_attr_init (&tattr);
+ pthread_attr_getschedparam (&tattr, ¶m);
+ param.sched_priority = OBST_FORGETING_PRIO;
+ ret = pthread_attr_setschedparam (&tattr, ¶m);
+ if(ret) {
+ perror("robot_start: pthread_attr_setschedparam()");
+ exit(1);
+ }
+ ret = pthread_create(&thr_obstacle_forgeting, &tattr, thread_obstacle_forgeting, NULL);
+ if(ret) {
+ perror("robot_start: pthread_create");
+ exit(1);
+ }
+
return 0;
}
/* estimated position */
struct est_pos_type est_pos;
- /* goal position */ /* FIXME: Move away */
- struct ref_pos_type goal;
- struct TrajectoryConstraints goal_trajectory_constraints;
- struct final_heading goal_final_heading;
-
struct motion_irc_type odometry;
struct joy_data_type joy_data;
struct drives_type drives;
/*Thread priorities*/
#define TRAJ_FOLLOWER_PRIO 255 /* As high as possible */
-#define UPDATE_MAP_PRIO 10 /* Priority of the thread for updating map with detected obstacles. */
-#define TRAJ_RECALC_PRIO 0 /* As low as possible */
+#define OBST_FORGETING_PRIO 10 /* Priority of the thread for forgeting detected obstacles. */
#endif /* ROBOT_EB2008_H */