Systems that can change their behaviour in response to unanticipated events during operation are called “autonomous”.  Unlike more traditional systems that have predefined purposes, autonomous systems are able to tailor their behaviour and operations in accordance with the circumstances they find. Engineering autonomous systems is a challenging task involving several theoretical foundations and application fields (e.g., self-adaptiveness, machine learning, sensor networks, control engineering, and artificial intelligence).

This course aims at introducing the fundamental concepts related to the development of autonomous systems from a software engineering perspective. Various methods and techniques currently applied in the design of autonomous systems are shown. Self-* attributes of autonomous systems, architectures, models, and languages are presented in order to show the technical viability of systems that can dynamically adapt their behaviour to varying operating conditions, delivering the appropriate application level response under these different conditions. Concrete examples of autonomous systems in the domains of Internet of Things, Cyber-Physical Systems, and unmanned vehicles are given.