Source code for sierra.plugins.platform.ros1robot.generators.platform_generators
# Copyright 2021 John Harwell, All rights reserved.
#
# SPDX-License-Identifier: MIT
"""Classes for generating common XML modifications to :term:`ROS1` input files.
I.e., changes which are platform-specific, but applicable to all projects using
ROS with a real robot execution environment.
"""
# Core packages
import logging
import pathlib
# 3rd party packages
import yaml
# Project packages
from sierra.core.experiment import spec, xml, definition
from sierra.core import types, ros1, config, utils
[docs]class PlatformExpDefGenerator(ros1.generators.ROSExpDefGenerator):
"""
Init the object.
Attributes:
controller: The controller used for the experiment.
cmdopts: Dictionary of parsed cmdline parameters.
"""
[docs] def __init__(self,
exp_spec: spec.ExperimentSpec,
controller: str,
cmdopts: types.Cmdopts,
**kwargs) -> None:
super().__init__(exp_spec, controller, cmdopts, **kwargs)
self.logger = logging.getLogger(__name__)
[docs] def generate(self) -> definition.XMLExpDef:
exp_def = super().generate()
self.logger.debug("Writing separate <master> launch file")
exp_def.write_config.add({
'src_parent': '.',
'src_tag': 'master',
'opath_leaf': '_master' + config.kROS['launch_file_ext'],
'create_tags': None,
'rename_to': 'launch',
'dest_parent': None
})
# Add <robot> tag
if not exp_def.has_tag("./robot"):
exp_def.tag_add(".",
"robot",
{})
if not exp_def.has_tag("./robot/group/[@ns='sierra']"):
exp_def.tag_add("./robot",
"group",
{
'ns': 'sierra'
})
return exp_def
[docs]class PlatformExpRunDefUniqueGenerator(ros1.generators.ROSExpRunDefUniqueGenerator):
[docs] def __init__(self,
*args,
**kwargs) -> None:
ros1.generators.ROSExpRunDefUniqueGenerator.__init__(
self, *args, **kwargs)
[docs] def generate(self, exp_def: definition.XMLExpDef):
exp_def = super().generate(exp_def)
main_path = pathlib.Path(self.cmdopts['project_config_root'],
config.kYAML.main)
with utils.utf8open(main_path) as f:
main_config = yaml.load(f, yaml.FullLoader)
n_robots = utils.get_n_robots(main_config,
self.cmdopts,
self.launch_stem_path.parent,
exp_def)
for i in range(0, n_robots):
prefix = main_config['ros']['robots'][self.cmdopts['robot']]['prefix']
exp_def.write_config.add({
'src_parent': "./robot",
'src_tag': f"group/[@ns='{prefix}{i}']",
'opath_leaf': f'_robot{i}' + config.kROS['launch_file_ext'],
'create_tags': [xml.TagAdd.as_root('launch', {})],
'dest_parent': ".",
'rename_to': None,
'child_grafts': ["./robot/group/[@ns='sierra']"]
})
self.generate_random(exp_def)
self.generate_paramfile(exp_def)
return exp_def
__api__ = [
'PlatformExpDefGenerator',
'PlatformExpRunDefUniqueGenerator'
]