Source code for irsim.world.object_group
from irsim.config import env_param
from irsim.lib.behavior.group_behavior import GroupBehavior
from irsim.world.object_base import ObjectBase
[docs]
class ObjectGroup:
def __init__(
self,
members: list[ObjectBase],
group_id: int,
):
"""
Define a group of objects with the same role and group id.
Args:
members: list[ObjectBase]
group_id: group id
Returns:
None
"""
self.members = members
self.group_id = group_id
self.role = (
self._delegate_member.role if self._delegate_member is not None else None
)
self.kinematics = (
self._delegate_member.kinematics
if self._delegate_member is not None
else None
)
self.number = len(members)
self.group_behavior = GroupBehavior(
members,
**self._delegate_member.group_behavior_dict
if self._delegate_member is not None
else {},
)
[docs]
def step(self, actions: list[any], sensor_step: bool = True):
"""
Step the group of objects.
Args:
actions: robot actions for each member in the group
sensor_step: whether to step the sensors of the members in the group
Returns:
None
"""
actions = actions + [None] * (self.number - len(actions))
[
member.step(action, sensor_step)
for member, action in zip(self.members, actions, strict=True)
]
[docs]
def gen_group_vel(self):
return self.group_behavior.gen_group_vel()
def __hash__(self) -> int:
return hash((self.role, self.group_id))
def __len__(self) -> int:
"""
Enable len(object_group) to return the number of members.
Returns:
int: number of members in the group
"""
return self.number
def __str__(self) -> str:
return f"ObjectGroup(role='{self.role}', group_id={self.group_id}, number={self.number})"
def __repr__(self) -> str:
return f"ObjectGroup(role={self.role!r}, group_id={self.group_id}, number={self.number})"
def __bool__(self) -> bool:
return self.number > 0
def __eq__(self, other) -> bool:
if not isinstance(other, ObjectGroup):
return NotImplemented
return (self.role, self.group_id) == (other.role, other.group_id)
def __iter__(self):
return iter(self.members)
def __getitem__(self, idx: int) -> ObjectBase:
return self.members[idx]
def __contains__(self, item) -> bool:
if isinstance(item, ObjectBase):
return item in self.members
# allow membership check by id
try:
return any(m.id == int(item) for m in self.members)
except (TypeError, ValueError):
return False
@property
def _delegate_member(self) -> ObjectBase:
if not self.members:
return None
return self.members[0]
@property
def logger(self):
return env_param.logger