Source code for state_space_control.cli

"""Design a controller for a saved plant from a YAML spec::

    ss_design plant.npz design.yaml [-o controller.npz]

where plant.npz comes from urdf_state_space (StateSpaceModel.save_npz or the
urdf2ss export) and design.yaml looks like::

    controller: lqr
    params:
      Q: [100, 100, 1, 1]     # scalar, diagonal list, or full matrix
      R: 0.1
"""

import argparse
import sys

import numpy as np
import yaml

from .base import Plant, available_controllers, make_controller


[docs] def main(argv=None) -> int: parser = argparse.ArgumentParser( prog='ss_design', description='Synthesize a controller for a state-space plant. ' f'Available controllers: {available_controllers()}') parser.add_argument('plant', help='.npz plant from urdf_state_space') parser.add_argument('design', help='YAML design spec') parser.add_argument('-o', '--out', default=None, help='save the result to a .npz file') args = parser.parse_args(argv) with open(args.design) as f: spec = yaml.safe_load(f) or {} if 'controller' not in spec: parser.error(f'{args.design}: missing required key "controller"') plant = Plant.from_npz(args.plant) design = make_controller(spec['controller'], **(spec.get('params') or {})) result = design.design(plant) np.set_printoptions(precision=5, suppress=True, linewidth=120) print(result.summary()) if args.out: result.save_npz(args.out) print(f'\nsaved {args.out}') return 0
if __name__ == '__main__': sys.exit(main())