GithubHelp home page GithubHelp logo

strands_executive's Introduction

The STRANDS Executive Framework

An executive framework for a mobile robot. The basic unit of behaviour for the framework is a task as defined by strands_executive_msgs/Task. The framework triggers and manages the execution of tasks plus navigation between them. The framework includes a task scheduler to optimise the execution time of a list of times.

Installation

Binary

If you are using Ubuntu, the easiest way to install the executive framework is to add the LCAS apt releases repository. You can then run sudo apt-get install ros-indigo-task-executor or ros-kinetic-task-executor. This will install the framework and it's dependencies alongside your existing ROS install under /opt/ros/indigo. Note that due to java versions, the indigo version is running an older version of prism and many of the components, we therefore recommend using kinetic if possible. If you want to run the latest version of the framework under indigo then you need to install from source and install a Java 8 package.

Source

To compile from source you should clone this repository into your catkin workspace and compile as normal. For dependencies you will also need (at least) the following repsositories: strands_navigation and mongodb_store, and Java 8 or greater (which is the default on 16.04)/ Source installs have been tested on Ubuntu 14.04 and 16.04.

Runtime Dependencies

For the executive framework to function correctly, you must have the mongodb_store nodes running. These are used by the framework to store tasks with arbitrary arguments.

roslaunch mongodb_store mongodb_store.launch

or with path specifying, where should the db is stored:

roslaunch mongodb_store mongodb_store.launch db_path:=/...

Currently the framework abstracts over navigation actions using the STRANDS topological navigation framework. Therefore you must have this framework running. For testing, or if you're not running the full topological navigation system, you can run a simulple simulated topological system with the following command:

roslaunch topological_utils dummy_topological_navigation.launch

This produces a map with 9 nodes: ChargingPoint in the centre, with v_-2, v_-1 to v_2 running vertically and h_-2 to h_2 running horizontally, joining ChargingPoint in the middle.

Running the executive framework

To start the executive framework, launch the following launch file.

roslaunch task_executor mdp-executor.launch

This launches using topolgical navigation for moving the robot. If you wish to use the MDP execution (which has additional runtime dependencies) replace top with mdp in the launch file name.

Running scheduled patrols

To test the executive framework you can try running the robot around the topological map.

Start the executive framework:

roslaunch task_executor mdp-executor.launch

With this up and running you can start the robot running continuous patrols using:

rorun task_executor continuous_patrolling.py

If this runs successfully, then your basic systems is up and running safely.

Tasks

This executive framework, schedules and manages the execution of tasks. A task maps directly to the execution of an actionlib action server, allowing you to resuse or integrate your desired robot behaviours in a widely used ROS framework.

Most task instances will contain both the name of a topological map node where the task should be executed, plus the name of a SimpleActionServer to be called at the node and its associated arguments. Tasks must contain one of these, but not necessarily both.

To create a task, first create an instance of the Task message type. Examples are given in Python, as the helper functions currently only exist for Python, but C++ is also possible (and C++ helpers will be added if someone asks for them).

from strands_executive_msgs.msg import Task
task = Task()

Then you can set the node id for where the task will be executed (or you can do this inline in the constructor):

task.start_node_id = 'WayPoint1'

If you don't add a start node id then the task will be executed wherever the robot is located when it starts executing the task. If your task will end at a different location than it starts you can also specify end_node_id. This allows the scheduler to make better estimates of travel time between tasks.

To add the name of the action server, do:

task.action = 'do_dishes'

Where 'do_dishes' is replaced by the action name argument you would give to the actionlib.SimpleActionClient constructor. If you do not specify an action, the executive will assume the task is to simply visit the location indicated by start_node_id.

You must also set the maximum length of time you expect your task to execute for. This is be used by the execution framework to determine whether your task is executing correctly, and by the scheduler to work out execution times. The duration is a rospy.Duration instance and is defined in seconds.

# wash dishes for an hour
dishes_duration = 60 * 60
task.max_duration = rospy.Duration(dishes_duration)

You can also specify the time window during which the task should be executed.

# don't start the task until 10 minutes in the future
task.start_after = rospy.get_rostime() + rospy.Duration(10 * 60)
# and give a window of three times the max execution time in which to execute
task.end_before = task.start_after + rospy.Duration(task.start_after.to_sec() * 3)

If the goal of the actionlib server related to your task needs arguments, you must then add them to the task in the order they are used in your goal type constructor. Arguments are added to the task using the provided helper functions from strands_executive_msgs.task_utils. For example, for the following action which is available under task_executor/action/TestExecution.action, you need to supply a string argument followed by a pose, then an int then a float.

# something to print
string some_goal_string
# something to test typing
geometry_msgs/Pose test_pose
# something for numbers
int32 an_int
float32 a_float
---
---
# feedback message
float32 percent_complete

To add the string, do the following

from strands_executive_msgs import task_utils
task_utils.add_string_argument(task, 'my string argument goes here')

For the pose, this must be added to the mongodb_store message store and then the ObjectID of the pose is used to communicate its location. This is done as follows

from mongodb_store.message_store import MessageStoreProxy
msg_store = MessageStoreProxy()

p = Pose()
object_id = msg_store.insert(p)
task_utils.add_object_id_argument(task, object_id, Pose)

Ints and floats can be added as follows

task_utils.add_int_argument(task, 24)
task_utils.add_float_argument(task, 63.678)

Adding a Task

Tasks can be added to the task executor for future execution via the add_tasks service. These tasks are queued or scheduled for execution, and may not be executed immediately.

add_tasks_srv_name = '/task_executor/add_tasks'
set_exe_stat_srv_name = '/task_executor/set_execution_status'
rospy.wait_for_service(add_tasks_srv_name)
rospy.wait_for_service(set_exe_stat_srv_name)
add_tasks_srv = rospy.ServiceProxy(add_tasks_srv_name, strands_executive_msgs.srv.AddTask)
set_execution_status = rospy.ServiceProxy(set_exe_stat_srv_name, strands_executive_msgs.srv.SetExecutionStatus)
    
try:
	# add task to the execution framework
    task_id = add_tasks_srv([task])
    # make sure the executive is running -- this only needs to be done once for the whole system not for every task
    set_execution_status(True)
except rospy.ServiceException, e: 
	print "Service call failed: %s"%e		

Demanding a Task

If you want your task to be executed immediately, pre-empting the current task execution (or navigation to that task), you can use the demand_task service:

demand_task_srv_name = '/task_executor/demand_task'
set_exe_stat_srv_name = '/task_executor/set_execution_status'
rospy.wait_for_service(demand_task_srv_name)
rospy.wait_for_service(set_exe_stat_srv_name)
demand_task_srv = rospy.ServiceProxy(demand_task_srv_name, strands_executive_msgs.srv.DemandTask)
set_execution_status = rospy.ServiceProxy(set_exe_stat_srv_name, strands_executive_msgs.srv.SetExecutionStatus)
    
try:
    # demand task execution immedidately
    task_id = demand_task_srv([task])
    # make sure the executive is running -- this only needs to be done once for the whole system not for every task
    set_execution_status(True)
except rospy.ServiceException, e: 
    print "Service call failed: %s"%e       

Execution Information

The current execution status can be obtained using the service strands_executive_msgs/GetExecutionStatus typically on /task_executor/get_execution_status. True means the execution system is running, false means that the execution system has either not been started or it has been paused (see below).

To see the full schedule subscribe to the topic /current_schedule which gets the list of tasks in execution order. If currently_executing that means the first element of execution_queue is the currently active task. If it is false then the system is delaying until it starts executing that task.

To just get the currently active task, use the service strands_executive_msgs/GetActiveTask on /task_executor/get_active_task. If the returned task has a task_id of 0 then there is no active task (as you can't return None over a service).

Interruptibility at Execution Time

By default the execution of tasks is interruptible (via actionlib preempt). Interruptions happen if another task is demanded while a task is running, or if the task exceeds its execution duration. If you do not wish your task to be interrupted in these condition you can provide the IsTaskInterruptible.srv service at the name <task name>_is_interruptible, e.g. do_dishes_is_interruptible from the example above. You can change the return value at runtime as this will be checked prior to interruption.

Here's an example from the node which provides the wait_action.

class WaitServer:
    def __init__(self):         
        self.server = actionlib.SimpleActionServer('wait_action', WaitAction, self.execute, False) 
        self.server.start()
        # this is not necessary in this node, but included for testing purposes
        rospy.Service('wait_action_is_interruptible', IsTaskInterruptible, self.is_interruptible)

    def is_interruptible(self, req):
        # rospy.loginfo('Yes, interrupt me, go ahead')
        # return True
        rospy.loginfo('No, I will never stop')
        return False

Creating a Routine

Our use case for task execution is that the robot has a daily routine which is a list of tasks which it carries out every day. Such are routine can be created with the task_routine.DailyRoutine object which is configured with start and end times for the robot's daily activities:

	# some useful times
    localtz = tzlocal()
    # the time the robot will be active
    start = time(8,30, tzinfo=localtz)
    end = time(17,00, tzinfo=localtz)
    midday = time(12,00, tzinfo=localtz)

    morning = (start, midday)
    afternoon = (midday, end)

    routine = task_routine.DailyRoutine(start, end)

Tasks are then added using the repeat_every* methods. These take the given task and store it such that it can be correctly instantiated with start and end times every day:

	# do this task every day
    routine.repeat_every_day(task)
    # and every two hours during the day
    routine.repeat_every_hour(task, hours=2)
    # once in the morning
    routine.repeat_every(task, *morning)
    # and twice in the afternoon
    routine.repeat_every(task, *afternoon, times=2)

The DailyRoutine declares the structure of the routine. The routine tasks must be passed to the DailyRoutineRunner to manage the creation of specific task instances and their addition to the task executor.

	# this uses the newer AddTasks service which excepts tasks as a batch
	add_tasks_srv_name = '/task_executor/add_tasks'
	add_tasks_srv = rospy.ServiceProxy(add_tasks_srv_name, AddTasks)


	# create the object which will talk to the scheduler
    runner = task_routine.DailyRoutineRunner(start, end, add_tasks_srv)
    # pass the routine tasks on to the runner which handles the daily instantiation of actual tasks
    runner.add_tasks(routine.get_routine_tasks())

    # Set the task executor running (if it's not already)
    set_execution_status(True)

strands_executive's People

Contributors

bfalacerda avatar cburbridge avatar cdondrup avatar francescodelduchetto avatar hawesie avatar heuristicus avatar lucasb-eyer avatar marc-hanheide avatar mudrole1 avatar raresambrus avatar strands-jenkins avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

strands_executive's Issues

Launch file dependencies for tasks

Some tasks require nodes to be running that

a) don't need to be running all the time
b) use up significant resources
c) take a noticeable time to start up

(vision, we're looking at you here)

The proposal is to allow the task executor to bring up and tear down a task's dependencies on demand. This is discussed in https://github.com/strands-project/strands_management/issues/52 and https://github.com/strands-project/strands_management/issues/66.

We will

  • add an action server which will bring up and tear down nodes via roslaunch
  • this action server should be told which services/topics to wait for before returning
  • get the task executor to launch this either before moving to the task, whilst moving to the task, or after moving, starting with whilst as this is probably the main use case.

Depending on scheduler development we can also schedule bring-up/tear-down as tasks, but this relies on much of the above infrastructure anyway.

make base_executor thread safe

There are a couple of potential conditions which could causes issues when the sub class is using multiple threads. I think i cleaned up most things for now, but for v2 we need some locking or something.

cannot find -lmessage_store

This is due to

target_link_libraries(cloud_merge
   ${catkin_LIBRARIES}
   ${PCL_LIBRARIES}
   ${QT_LIBRARIES}
   ${Boost_LIBRARIES}
   mongoclient
   message_store
 )

, which is in the CMakeLists.txt files of cloud_merge and semantic map

As @marc-hanheide mentioned on Gitter, explicitly linking the message_store is wong:
"that should already be resolved via ${catkin_LIBRARIES}
if the mongodb_store_cpp_clientis defined as a required dep in find_package(catkin REQUIRED COMPONENTS ... mongodb_store_cpp_client)
and we see it is, so just remove the last two lines from the target_link_libraries(cloud_merge… block
"

Also there is something wrong with the Boost Libraries, which is probably due to a missing dependency in mongodb_store_cpp_client.

Could the maintainer please fix this?

make mdp queries and execution thread safe

Queries to the navigation mdp while execution is happening causes errors. This needs to be fixed so that the robot can execute policies independent of queries being received.

create an iCal-based routine generator

using the icalendar package we can easily parse iCal format, e.g. from Google Calendar. This is parsed to generate a routine, e.g. looking at the RRULE to determine recurring events. The idea is that the DESCRIPTION field in iCal is used to program a routine by simply putting the action in to be scheduled. Question is how duration, priorities etc. can be encoded. To be discussed. @hawesie

Add pausing/preemption/removal to FIFO executor

Currently there is no way to pause or remove tasks from the executor. Also there is no error handling or feedback monitoring. All these things need to be added for robust and useful execution.

Fix strands_executive compilation so that Jenkins can build it

The full long is here: https://gist.github.com/hawesie/227bcd3916260bb056d1#file-strands_executive-jenkins-error-1

The first error I see is :

Note: jdd/../../src/jdd/JDDVars.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
error: cannot access jdd.JDD
bad class file: RegularFileObject[../../classes/jdd/JDD.class]
class file has wrong version 52.0, should be 50.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
com.sun.tools.javac.util.Abort
    at com.sun.tools.javac.comp.Check.completionError(Check.java:180)
    at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:159)
    at com.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:95)
    at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:188)
    at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:364)
    at com.sun.tools.javadoc.Start.begin(Start.java:162)
    at com.sun.tools.javadoc.Main.execute(Main.java:113)
    at com.sun.tools.javah.Main.main(Main.java:153)
javadoc: error - fatal error

@bfalacerda I think you've already looked at this, haven't you?

Add tests

This repo needs some better tests to automatically check status.

Schedule tasks with no location

This one's for @mudrole1. I'd like to schedule tasks with no location. Currently when the start node id is empty, your code just passes this on through the DistWrapper. Really there should be no distance included for these tasks. Is that possible? There is also the problem of what happens to the tasks that come after it as they can no longer take their start location from the end location of the previous task.

Schduler has problems with the topo_nav travel_time_estimator

this happened when trying to schedule and on demand task while running the simple node patrol.

[INFO] [WallTime: 1416340619.241509] Requesting preempt on state machine in state ['TASK_NAVIGATION']
[INFO] [WallTime: 1416340619.241817] Waiting for exit
[INFO] [WallTime: 1416340619.241916] Preempt requested on action 'topological_navigation'
[INFO] [WallTime: 1416340619.242330] Preempt on action 'topological_navigation' cancelling goal: 
target: WayPoint21
[INFO] [WallTime: 1416340619.460458] Concurrent state 'MONITORING' returned outcome 'preempted' on termination.
[INFO] [WallTime: 1416340619.617749] Concurrent state 'MONITORED' returned outcome 'preempted' on termination.
[WARN] [WallTime: 1416340619.618491] State 'MONITORING' in concurrence did not service preempt.
[INFO] [WallTime: 1416340619.618889] Concurrent Outcomes: {'MONITORED': 'preempted', 'MONITORING': 'preempted'}
[INFO] [WallTime: 1416340619.619064] Nav terminated with outcome preempted
[INFO] [WallTime: 1416340619.621603] State machine transitioning 'TASK_NAVIGATION':'preempted'-->'TASK_CANCELLED'
[INFO] [WallTime: 1416340619.622227] Preempt requested on state machine before executing the next state.
[INFO] [WallTime: 1416340619.622465] Last state 'TASK_NAVIGATION' did not service preempt. Preempting next state 'TASK_CANCELLED' before executing...
[INFO] [WallTime: 1416340619.622731] Execution of task 20 was cancelled
[INFO] [WallTime: 1416340619.625192] start window: 1416337800.0
[INFO] [WallTime: 1416340619.625437]          now: 1416340619.625149965
[INFO] [WallTime: 1416340619.625671] start window is open
[INFO] [WallTime: 1416340619.625926] State machine terminating 'TASK_CANCELLED':'preempted':'preempted'
[INFO] [WallTime: 1416340619.629272] Next task to execute: 19
[INFO] [WallTime: 1416340619.657006] And relax
[INFO] [WallTime: 1416340619.657216] Execution of task 19 was requested
[INFO] [WallTime: 1416340619.657476] Task 24, execute_maraton_task demanded from scheduler
[WARN] [WallTime: 1416340619.660207] lower bound 1416340676171660925
[WARN] [WallTime: 1416340619.661034] Dropped 1 existing tasks which are no longer executable
[INFO] [WallTime: 1416340619.661530] Including current task 19 in scheduling problem
[ERROR] [WallTime: 1416340619.662415] Error raised during SMACH container construction: 
Traceback (most recent call last):

  File "/opt/ros/hydro/lib/python2.7/dist-packages/task_executor/sm_base_executor.py", line 251, in execute_task
    monitor_duration = self.expected_navigation_duration(task) * 3

  File "/opt/ros/hydro/lib/python2.7/dist-packages/task_executor/base_executor.py", line 118, in expected_navigation_duration
    et = self.expected_time(start=self.current_node, target=task.start_node_id)

  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 435, in __call__
    return self.call(*args, **kwds)

  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 517, in call
    raise ServiceException("service [%s] returned no response"%self.resolved_name)

ServiceException: service [/topological_navigation/travel_time_estimator] returned no response

[ERROR] [WallTime: 1416340619.662766] Error raised during SMACH container construction: 
Traceback (most recent call last):

  File "/opt/ros/hydro/lib/python2.7/dist-packages/task_executor/sm_base_executor.py", line 251, in execute_task
    monitor_duration = self.expected_navigation_duration(task) * 3

  File "/opt/ros/hydro/lib/python2.7/dist-packages/task_executor/base_executor.py", line 118, in expected_navigation_duration
    et = self.expected_time(start=self.current_node, target=task.start_node_id)

  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 435, in __call__
    return self.call(*args, **kwds)

  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 517, in call
    raise ServiceException("service [%s] returned no response"%self.resolved_name)

ServiceException: service [/topological_navigation/travel_time_estimator] returned no response

Wait action

Add an action to wait at a waypoint. Argument should be duration to wait for or a time to wait until, unless explicitly woken. This will be used by the go-to-safepoint task to wait at the safe point. It will provide a service to allow waking.

Unnecessary aborts from the MDP executor?

@ToMadoRe reported a few of these:

[ERROR] [WallTime: 1399960961.602131] State transition is not in MDP model! Aborting...

They can occur when the human presses a button on the screen to send the robot to a particular point.

Can these happen when it really is possible to navigate between the two points? If so, I think it might be more robust to have a fallback position rather than aborting. This would make the robot more usable at AAF currently.

On demand tasks

Add service for on demand tasks. This should immediately halt the execution of the current task and switch to the demanded task. If the previous tasks can be rescheduled to run after the on demand task then they should be, else they should be dropped.

Reject tasks with no max_duration field

And check this.

stored the best primal solution in the original solution cadidate list
[WARN] [WallTime: 1398883053.545047] Number of scheduled tasks mismatch
[INFO] [WallTime: 1398883053.545489] Added 102 tasks into the schedule to get total of 0
[INFO] [WallTime: 1398883053.545808] Was able to reinstate tasks after demand
Traceback (most recent call last):
  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 618, in _handle_request
    response = convert_return_to_response(self.handler(request), self.response_class)
  File "/opt/strands/strands_ws/src/strands_executive/task_executor/src/task_executor/base_executor.py", line 232, in demand_task_ros_srv
    self.task_demanded(req.task, self.active_task)
  File "/opt/strands/strands_ws/src/strands_executive/task_executor/scripts/scheduled_task_executor.py", line 107, in task_demanded
    if self.try_schedule([currently_active_task]):
  File "/opt/strands/strands_ws/src/strands_executive/task_executor/scripts/scheduled_task_executor.py", line 183, in try_schedule
    bounded_tasks = self.bound_tasks_by_start_window(to_schedule, self.get_active_task_completion_time())
  File "/opt/strands/strands_ws/src/strands_executive/task_executor/scripts/scheduled_task_executor.py", line 165, in bound_tasks_by_start_window
    if start_after + task.max_duration <= task.end_before:
AttributeError: 'NoneType' object has no attribute 'max_duration'
[ERROR] [WallTime: 1398883053.564483] Error processing request: 'NoneType' object has no attribute 'max_duration'
None
[INFO] [WallTime: 1398883053.847247] Navigation to WayPoint0 succeeded
[INFO] [WallTime: 1398883053.847650] Starting to execute ptu_pan_tilt_metric_map
[WARN] [WallTime: 1398883058.854943] Cancelling task that has overrun task_id: 113
start_node_id: WayPoint0
end_node_id: ''
action: ptu_pan_tilt_metric_map
start_after: 
  secs: 0
  nsecs: 0
end_before: 
  secs: 0
  nsecs: 0
max_duration: 
  secs: 0
  nsecs: 0
execution_time: 
  secs: 0
  nsecs: 0
arguments: 
  - 
    first: "____int____"
    second: -150
  - 
    first: "____int____"
    second: 60
  - 
    first: "____int____"
    second: 160
  - 
    first: "____int____"
    second: -30
  - 
    first: "____int____"
    second: 20
  - 
    first: "____int____"
    second: 30

submodule not supported by bloom-release

The PRISM submodule in here will not be release-able. Either we need to release it as a separate Debian package and rosdep-end on it, or (better option), it should be snap-shotted in here with git subtree

Install targets missing for python scripts

ERROR: cannot launch node of type [task_executor/fifo_task_executor.py]: can't locate node [fifo_task_executor.py] in package [task_executor]
ERROR: cannot launch node of type [task_executor/continuous_patrolling.py]: can't locate node [continuous_patrolling.py] in package [task_executor]

Make the "distance" matrix an input to the the GetSchedule service

To make the scheduler more portable I plan to make the matrix of durations of travel times between nodes an input to the GetSchedule service. I will remove DistWrapper from the scheduler and create DurationMatrix object which must be created before the Scheduler instance for the problem is created. @mudrole1 is this ok? Once I've done this then you will need to merge the changes into your own code, else we're probably going to the get too far out of sync.

Add actionlib interface to task executor

This will allow callers to find out whether their new tasks have been included in the schedule or not. The current problem here is the way tasks are queued prior to scheduling which prevents immediate feedback.

continuous_patrolling.py not working

Hi,

I followed the instructions in here to run the continuous patrolling after I mapped the lab and inserted the topological waypoints into mongodb:

https://github.com/strands-project/strands_executive

but it doesn't work, it gives an error like this in task-scheduler.launch,

any advice ?

Cheers,
Muhannad

strands@strands-Mi956:~$ roslaunch task_executor task-scheduler.launch topological_map:=cs_lab_1
... logging to /home/strands/.ros/log/5947f234-3cd9-11e4-9889-843a4b7f0ffc/roslaunch-strands-Mi956-32634.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://strands-Mi956:60831/

SUMMARY

PARAMETERS

  • /rosdistro
  • /rosversion

NODES
/
mdp_planner (mdp_plan_exec/mdp_planner.py)
schedule_server (scheduler/scheduler_node)
scheduled_task_executor (task_executor/scheduled_task_executor.py)
wait_node (wait_action/wait_node.py)

ROS_MASTER_URI=http://localhost:11311

core service [/rosout] found
process[mdp_planner-1]: started with pid [32659]
process[schedule_server-2]: started with pid [32666]
process[scheduled_task_executor-3]: started with pid [32667]
[ INFO] [1410797679.469792160]: Writing scheduling problems to mongodb_store
[ INFO] [1410797679.480302725]: Ready to serve schedules
process[wait_node-4]: started with pid [32696]
[INFO] [WallTime: 1410797679.949624] Waiting for services...
[INFO] [WallTime: 1410797679.960500] Done
[INFO] [WallTime: 1410797679.961069] Waiting for services...
[INFO] [WallTime: 1410797679.970173] Done
[INFO] [WallTime: 1410797679.970509] Waiting for /mdp_plan_exec/get_expected_travel_time_to_node
[WARN] [WallTime: 1410797685.266191] No data for edge between waypoints ChargingPoint and WayPoint1. Assuming it to be 20 seconds. Expected time between nodes will not be correct.
[WARN] [WallTime: 1410797685.266453] No data for edge between waypoints WayPoint1 and ChargingPoint. Assuming it to be 20 seconds. Expected time between nodes will not be correct.
[WARN] [WallTime: 1410797685.266613] No data for edge between waypoints WayPoint1 and WayPoint2. Assuming it to be 20 seconds. Expected time between nodes will not be correct.
[WARN] [WallTime: 1410797685.266967] No data for edge between waypoints WayPoint2 and WayPoint1. Assuming it to be 20 seconds. Expected time between nodes will not be correct.
Exception in thread "main" java.lang.NullPointerException
at prism.PrismManager.main(PrismManager.java:222)
Traceback (most recent call last):
File "/opt/strands/strands_catkin_ws/src/strands_executive/mdp_plan_exec/scripts/mdp_planner.py", line 502, in
mdp_planner = MdpPlanner(sys.argv[1])
File "/opt/strands/strands_catkin_ws/src/strands_executive/mdp_plan_exec/scripts/mdp_planner.py", line 37, in init
self.policy_handler=PrismMdpManager(8086,'policy',top_map)
File "/opt/strands/strands_catkin_ws/src/strands_executive/mdp_plan_exec/src/mdp_plan_exec/prism_mdp_manager.py", line 20, in init
self.prism_client=PrismClient(port, self.directory)
File "/opt/strands/strands_catkin_ws/src/strands_executive/mdp_plan_exec/src/mdp_plan_exec/prism_client.py", line 30, in init
self.sock.connect((HOST, PORT))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(_args)
socket.error: [Errno 111] Connection refused
[mdp_planner-1] process has died [pid 32659, exit code 1, cmd /opt/strands/strands_catkin_ws/src/strands_executive/mdp_plan_exec/scripts/mdp_planner.py cs_lab_1 __name:=mdp_planner _log:=/home/strands/.ros/log/5947f234-3cd9-11e4-9889-843a4b7f0ffc/mdp_planner-1.log].
log file: /home/strands/.ros/log/5947f234-3cd9-11e4-9889-843a4b7f0ffc/mdp_planner-1
.log

mdp model initial estimates

The initial travel time estimates of the mdp model are really low. Is there a way of increasing them sensibly?

Inspection GUI for schedule

In general it would be nice to have a proper inspection GUI for the scheduler (Showing the scheduled tasks, etc.) and also a testing setup that allows to check a created routine easily.

Create release branch

This branch should be fully functional but not contain the mdp stuff as it is not ready for release.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.