Source code for pomdp_py.problems.multi_object_search.models.components.grid_map
"""Optional grid map to assist collision avoidance during planning."""
from pomdp_py.problems.multi_object_search.models.transition_model import (
RobotTransitionModel,
)
from pomdp_py.problems.multi_object_search.domain.action import *
from pomdp_py.problems.multi_object_search.domain.state import *
[docs]
class GridMap:
"""This map assists the agent to avoid planning invalid
actions that will run into obstacles. Used if we assume
the agent has a map. This map does not contain information
about the object locations."""
def __init__(self, width, length, obstacles):
"""
Args:
obstacles (dict): Map from objid to (x,y); The object is
supposed to be an obstacle.
width (int): width of the grid map
length (int): length of the grid map
"""
self.width = width
self.length = length
self._obstacles = obstacles
# An MosOOState that only contains poses for obstacles;
# This is to allow calling RobotTransitionModel.if_move_by
# function.
self._obstacle_states = {
objid: ObjectState(objid, "obstacle", self._obstacles[objid])
for objid in self._obstacles
}
# set of obstacle poses
self.obstacle_poses = set({self._obstacles[objid] for objid in self._obstacles})
[docs]
def valid_motions(self, robot_id, robot_pose, all_motion_actions):
"""
Returns a set of MotionAction(s) that are valid to
be executed from robot pose (i.e. they will not bump
into obstacles). The validity is determined under
the assumption that the robot dynamics is deterministic.
"""
state = MosOOState(self._obstacle_states)
state.set_object_state(robot_id, RobotState(robot_id, robot_pose, None, None))
valid = set({})
for motion_action in all_motion_actions:
if not isinstance(motion_action, MotionAction):
raise ValueError(
"This (%s) is not a motion action" % str(motion_action)
)
next_pose = RobotTransitionModel.if_move_by(
robot_id, state, motion_action, (self.width, self.length)
)
if next_pose != robot_pose:
# robot moved --> valid motion
valid.add(motion_action)
return valid