Project

General

Profile

Statistics
| Branch: | Revision:

scoutos / scout / libscout / src / behaviors / WH_Robot.cpp @ 5d0687a9

History | View | Annotate | Download (3.74 KB)

1
#include "WH_Robot.h"
2
#include "../helper_classes/Order.h"
3

    
4
/** @Brief: warehouse robot constructor **/
5
WH_Robot::WH_Robot(std::string scoutname):Behavior(scoutname, "WH_Robot")
6
{
7
  nav_map = new navigationMap(scoutname);
8
  curr_task = DEFAULT_TASK;
9
  name = scoutname;
10
  reg_failed = 1;
11
}
12

    
13
WH_Robot::~WH_Robot()
14
{
15
  delete(nav_map);
16
}
17

    
18
Duration WH_Robot::get_worst_case_time(State start_state, State target_state)
19
{
20
  return nav_map->get_worst_case_time(start_state, target_state);
21
}
22

    
23
int WH_Robot::exec_task()
24
{
25
  ROS_INFO("WH_robot: Executing a task");
26
  assert(curr_task != DEFAULT_TASK);
27
  
28
  Path new_path = nav_map->shortest_path(curr_task->get_dest());
29
  curr_task->set_path(new_path);
30
  for(int i=0; i<new_path.len; i++)
31
  {
32
    Turn t = new_path.path[i];
33
    ROS_INFO("making turn %d at state %d", (int)t, (int)nav_map->get_state());
34
    nav_map->update_state(t);
35
    Duration time = nav_map->get_time_remaining();
36
    while(time.sec > 0)
37
      time = nav_map->get_time_remaining();
38
  }
39
  ROS_INFO("Path complete at state %d", (int)nav_map->get_state());
40
  srand(0xDEADBEEF);
41
  int error = rand() % 12;
42
  if(error < 6) //Fail with 1/2 probability
43
  {
44
    ROS_INFO("WH_robot: TASK COMPLETE!");
45
    return TASK_COMPLETED;
46
  }
47
  else
48
  {
49
    ROS_INFO("WH_robot: TASK FAILED!");
50
    return TASK_FAILED;
51
  }
52
}
53

    
54
void WH_Robot::robot_callback(const std_msgs::String::ConstPtr& msg)
55
{
56
  std::cout << "robot callback called." << std::endl;
57
  if(msg->data.compare(0, 11, "REG_SUCCESS") == 0)
58
  {
59
    id = atoi(msg->data.substr(12).c_str());
60
    reg_failed = 0;
61
  }
62
  else if(msg->data.compare(0, 8, "SET_TASK") == 0)
63
  {
64
    ROS_INFO("WH_ROBOT: Setting robot task");
65
    char* string = (char*)msg->data.c_str();
66
    char* data;
67
    data = strtok(string, " ");
68
    int order_id = atoi(data);
69
    data = strtok(string, " ");
70
    Address source = atoi(data);
71
    data = strtok(string, " ");
72
    Address dest = atoi(data);
73
    Time start_time = ros::Time::now();
74
    Path path;
75
    path.len = 0;
76
    path.path = NULL;
77
    Duration est_time(0);
78

    
79
    curr_task = new Order(order_id, source, dest, start_time, path, est_time);
80
  }
81
  else
82
  {
83
    ROS_INFO("I got a bad message: %s", msg->data.c_str());
84
  }
85
}
86

    
87
void WH_Robot::run ()
88
{
89
  ROS_INFO("A WH_Robot has been created");
90

    
91
  robot_to_sched = node.advertise<std_msgs::String>("robot_to_sched", 1000);
92
  sched_to_robot = node.subscribe(name + "_topic", 1000, &WH_Robot::robot_callback, this);
93

    
94
  ROS_INFO("I am a robot. Registering with scheduler...");
95
  while(reg_failed && ok())
96
  {
97
    std_msgs::String msg;
98
    std::stringstream ss;
99
    ss << "REGISTER "<<name;
100
    msg.data = ss.str();
101
    robot_to_sched.publish(msg);
102

    
103
    spinOnce();
104
  }
105

    
106
  while(ok())
107
  {
108
    ROS_INFO("WH_ROBOT: Running main loop");
109

    
110

    
111
      std_msgs::String msg;
112
      std::stringstream ss;
113
      ss << "GET_TASK "<<id;
114
      msg.data = ss.str();
115
      robot_to_sched.publish(msg);
116

    
117
    while(curr_task == DEFAULT_TASK && ok()){
118
      spinOnce();
119
    }
120

    
121
    int error = exec_task();
122
    if(error == TASK_COMPLETED)
123
    {
124
      std_msgs::String msg;
125
      std::stringstream ss;
126
      ss << "SUCCESS "<<curr_task->getid();
127
      msg.data = ss.str();
128
      robot_to_sched.publish(msg);
129
    }
130
    else //error == TASK_FAILED
131
    {
132
      std_msgs::String msg;
133
      std::stringstream ss;
134
      ss << "FAILED "<<curr_task->getid();
135
      msg.data = ss.str();
136
      robot_to_sched.publish(msg);
137
    }
138
    delete curr_task;
139
    curr_task = DEFAULT_TASK;
140

    
141
  }
142
}
143

    
144
void WH_Robot::set_task(Order order)
145
{
146
  curr_task = new Order(order.getid(), order.get_source(), order.get_dest(), 
147
      order.get_start_time(), order.get_path(), order.get_est_time()); 
148
  return;
149
}
150