Open AD Kit integration (release pins)
Open AD Kit consumes the Safety Island from a pinned GitHub release instead of
building it. In the planning-simulation CI cell, the FreeRTOS POSIX binary
runs on the same host as Autoware: Autoware on DDS domain 1, the Safety Island
on domain 2, and ros2/domain_bridge between them.
Release assets
Every release from v0.2.0 on carries these assets, each listed in
sha256sums.txt:
Asset |
Contents |
|---|---|
|
FreeRTOS POSIX runtime, linux/amd64. Domain 2, |
|
The Safety Island’s domain-bridge topic contract
( |
|
The DDS setting every domain-2 writer must use
( |
|
Zephyr images (not used by the Open AD Kit cell). |
|
SHA-256 of every asset above. |
Pin by release and checksum rather than copying the files:
$ TAG=v0.2.0
$ BASE=https://github.com/autowarefoundation/autoware-safety-island/releases/download/${TAG}
$ curl -fsSL -O "${BASE}/actuation_freertos" -O "${BASE}/bridge-config.yaml" \
-O "${BASE}/cyclonedds-domain2.xml" -O "${BASE}/sha256sums.txt"
$ sha256sum --check --ignore-missing sha256sums.txt
$ chmod +x actuation_freertos
The binary needs only glibc, libstdc++ and libgcc, which every Ubuntu
base image ships. CycloneDDS is linked statically.
Selecting the DDS interface
SI_DDS_INTERFACE overrides the compile-time
CONFIG_DDS_NETWORK_INTERFACE at runtime (POSIX build only), so one binary
serves loopback CI and a LAN:
|
Effect |
|---|---|
unset |
Use the compile-time value ( |
|
Select the interface by name. |
|
Select the interface that owns this IPv4 address. |
|
Let CycloneDDS pick an interface. |
The startup log records the choice and where it came from:
Network interface (by name): lo [SI_DDS_INTERFACE]
Actuation Safety Island is Live
Waiting for acceleration data
Waiting for ... data repeats until the bridged inputs arrive. An interface
that does not exist makes DDS domain creation fail and the process exit.
lo is not multicast-capable on Linux, so CycloneDDS disables multicast on
it and discovers peers by unicast. Pin the bridge’s domain 2 to the same
interface, for example with demo/cyclonedds.posix.xml and
SAFETY_ISLAND_DDS_INTERFACE=lo.
Domain-2 message size
The bridge, and anything else that writes to domain 2, must load
cyclonedds-domain2.xml.
The Safety Island receives UDP datagrams of at most 2048 bytes
(cfg.rmsg_chunk_size in actuation_module/include/common/dds/config.hpp),
and the sender decides the datagram size. CycloneDDS’s default
MaxMessageSize is 14720 B, so on loopback a whole Trajectory (about
15 KB) leaves in one datagram. The Safety Island logs
recvUC: ... truncated to 2048 and drops the datagram. The sample arrives
late, if at all, and the Safety Island latches SI_STOP on the trajectory
timeout. Capping domain 2 at 1400 B makes CycloneDDS fragment
large samples and also keeps each datagram inside a 1500-byte MTU.
The file sets nothing but domain 2’s MaxMessageSize, so it merges with your
own configuration. List it after your file in CYCLONEDDS_URI:
$ export CYCLONEDDS_URI="file:///path/to/your-cyclonedds.xml,file:///path/to/cyclonedds-domain2.xml"
Your file keeps the interface and discovery settings. The demo does the same:
demo/common.env lists demo/cyclonedds*.xml first and
demo/bridge/cyclonedds-domain2.xml second. CI rejects any change that adds
other settings to the file or raises the size above the Safety Island’s receive
limit.
The other runtime switches (SI_SUPERVISION_MODE, SI_TRAJECTORY_SOURCE,
SI_LEGACY_CONTROL_CMD, SI_OPERATION_MODE_DURABILITY) are described in
VisionPilot–Safety Island control contract and DDS topics.
$ SI_DDS_INTERFACE=lo ./actuation_freertos
Keeping Autoware’s own controller off
The Safety Island publishes /control/trajectory_follower/control_cmd and
the bridge forwards it to domain 1, so Autoware’s own trajectory follower must
not publish the same topic.
- Autoware with control module presets
Set the control module preset’s
trajectory_follower_modetonone. The option is declared inautoware_control_config/config/preset/default_preset.yaml:launch: - arg: name: trajectory_follower_mode default: none
Either mount the edited
default_preset.yamlover the installed one, or install it as a new preset and select it withcontrol_module_preset. The demo does the latter:demo/launch/safety_island_preset.yamlis mounted assafety_island_preset.yamland Autoware is launched withcontrol_module_preset:=safety_island. No launch file is replaced.- Remove the follower’s diagnostic from the graph
With the follower off,
controller_node_exenever publishes itscontrol_statediagnostic./autoware/control/performance_monitoring/control_statestays stale, andchange_to_autonomousfails with “The target mode is not available”. Whatever the launch method, remove that node from the diagnostic graph.With component launches (
autoware.launch.xml, as Open AD Kit does), pass an e2e-style graph asdiagnostic_graph_aggregator_graph_path. It follows the same pattern asautoware_launch’sautoware-main-e2e.yaml.demo/launch/autoware-safety-island.yamlis that file; install it next toautoware-main.yamlinautoware_launch/config/system/diagnostics/:files: - { path: $(dirname)/autoware-main.yaml } edits: - { type: remove, path: /autoware/control/performance_monitoring/control_state }
planning_simulator.launch.xmldoes not yet accept the argument: it hard-codesautoware-main.yaml. An autoware_launch PR, “feat(autoware_launch): expose diagnostic_graph_aggregator_graph_path in planning_simulator”, adds it. Until the demo image includes that change, the demo mountsdemo/launch/autoware-main.yamlover the image’sautoware-main.yaml. That file is the image’s file verbatim plus the sameremoveedit..github/workflows/demo-diag-graph.ymlchecks it against the pinned image. Both are marked with a TODO to delete once the argument is available.- Older Autoware images (
tier4_control_launch) Images that predate the control module presets, such as
universe-20250207, have nononemode. The demo no longer supports them. If you must run one, mount the stubdemo/launch/control.launch.xmlfrom release v0.1.0 overtier4_control_launch/launch/control.launch.xml. It keeps the follower node but remaps all its inputs and outputs to*_no_publishtopics. Such images also need the trajectory remap described in DDS topics.
Note
The Safety Island targets Autoware 2.0.0 and subscribes to
/planning/trajectory, the trajectory Autoware 2.0’s own follower reads.
Autoware’s main reads /control/trajectory after its trajectory
gate; with it, add a remap to planning/trajectory in your bridge
(DDS topics). The released contract stays 1:1.