The application interface is made up of a combination of 3 files. A given application is specified by a .app file. The .app file will reference a .interface file and a .launch file.
When an application is launched on a platform, only the parts explicitly listed in the .interface file are made available off-board the robot.
An .app file is a yaml document which contains 4 top-level keys:
description: A short description of the application
platform: The platform key for where the application is intended to run, e.g. pr2 or turtlebot
interface: The file which specifies th interface for the application specified as package/file.interface
launch: the launch file that will be run when the application is brought up
description: This is an example application platform: turtlebot launch: app_manager/example.launch interface: app_manager/example.interface
The .interface file is a yaml document which contains 3 top-level keys: namespace, subcribed_topics, and published_topics. The value of namespace is a namespace under which all all the topics must be located. For subscribed and published topics, each key is a dictionary keyed on topic with a value of the appropropriate type.
namespace: application subscribed_topics: foo: std_msgs/String bar: std_msgs/Int32 published_topics: baz: std_msgs/Float32
The interpretation of these topics is that they are relative to a namespace: application in this case. When launching the nodes, the app manager will perform the global remap: application:=/unique/path. To use this interface, an interfacing node will need to know the namespace where the interface is located. The value of this namespace should not be relevant to the interfacing node, as it should only subscribe/publish to topics inside the namespace.
The launch file for the app is a standard ROS launch file.
Listing dependencies on 'capabilities' for both config matching, launching, and user confirmation (e.g. 'this app requests access to the teleop iterface.')