- Renamed 'Sensors' to 'Devices', to better reflect the abstraction (devices may have multiple sensors, ex: camera & IMU). Right now we are assuming a 1:1 relationship, but we want to future-proof.
- Extracted the state machine of the sensors (now devices) into a new abstraction
Lifecycleso it can be also shared with modules like recording, calibration, teleop. - Changed WebSocket communication to send messages to specific modules (by ID). This enables multiple instances of the same module (ex teleoperation)
- Now leader-follower teleoperation is a module on itself:
LeaderFollowerTeleop. It must be instantiated via config file (seeconfig_sample.yaml) - Now app state is handled per module to reduce CPU usage.
- Simplified Makefile for development (now
make frontandmake back) - Reorganized the backend folder structure: now all modules live inside the
modules/folder, all the devices insidedevices/folder. Renamed short-names to be more explicitsystem_info.cpp->system_info_module.cpp. - A total refactor of the frontend logic. Now there are hooks available to simplify and unify the usage. For example:
useModule,useDevice,useDevicesOfTypeanduseDevicePreview. Now modules are strongly typed and we provide hook factories to handle (new) modules. - A global state is used per embodiment to centralize the actual state of the application (see
useAlohaStateanduseEgoState). This, for example, determinates if you can actually start a recording (you have to check the devices are running, teleop is running, it is not calibrating, etc). Before, this logic was spread across multiple files. - Now we can pull device previews at a configurable polling rate, instead of being fixed by the application. For example, higher FPS during Ego calibration operation.
- Now the
RecorderModuleimplements the lifecycle, so we have better feedback. Before, when we stopped a recording it could take a couple of seconds before it actually finishes. Now the frontend has the information to show the user that it is actually finishing. Also, it has been refactored and now includes more information about the active recording. - Now the app will not generate an MCAP file when there are no sensors attached to it.
- Now alerts make a sound (requires a speaker). For example, when a recording is truncated.
- Created
WebSocketModule::on_http_request, where modules can return a file to be served by the server. Each module can be accessed using/modules/:module_id/<path>and skipping<path>will return the module's state (useful!). This is used to serve recording files, calibration files, meshes, etc, without coupling it to the web server. config.yaml: now cameras REQUIREfpsandresolution. We can define multiple cameras with different specs. This allows calibrations to reference a higher-resolution camera mode.- Centralizee copying to SSD/SMB as "Copy to Target", since we don't care about the underlying storage of the folder we are copying to. A new config field has been added for this:
copy_target_dir. - The automount script (for Ego) has been updated so that the mount is owned by the user (fixes permission issues).
- ZED support and RealSense support is now conditional. Support for those vendors will only be available if they are properly installed. Now the app print the vendor support it has beend compiled with.
- Renamed all references to
RStoAPPto avoid confusion between "Recording Studio" and "RealSense". - Now the app's version is set to
git describe --tags --always. If the build corresponds to a tagged commit, it will be the tag verbatim. Otherwise, it will be<closest tag>-<number of commits ahead>-g<commit hash>. This effectively drops the requirement for semver versioning and any string will do.
- Refactor logging to track systemd logs instead of capturing in the app. This allows tracking other services aswell (for example
zed_x_daemonandnvargus) - Config feeback / no crash