Arm Virtual Hardware deployment

Run the safety island firmware on a simulated Cortex-R82 board hosted by Arm Virtual Hardware (AVH), connected over a VPN to an Autoware main-compute stack running on AWS EC2.

This guide assumes you have already built zephyr.elf per the Quickstart. If you only want to run the firmware locally on the FVP, stop after the quickstart — you do not need this page.

Note

All command examples on this page can be copied with the copy button in the HTML build. In the PDF build, wrapped lines include trailing line continuation characters — copy with care.

1. Launch the AVH instance

You can bring up the simulated board through the Corellium web UI or via the avh.py helper script included in this repository. The script is the recommended path because it drives the same API that the web UI does and is scriptable.

Configure credentials

Copy template.env to .env at the repository root and fill in:

  • AVH_API_ENDPOINT — leave as-is for staging, or change to https://app.avh.arm.com/api (or your production endpoint).

  • AVH_API_TOKEN — from the Corellium dashboard → profile / api.

  • AVH_PROJECT_NAME — the project name as it appears in the dashboard.

  • AVH_INSTANCE_NAME — any name; the script creates it if it does not exist.

  • AVH_INSTANCE_FLAVOR — leave as aem8r64-lan9c111. The firmware is specifically built for this flavor.

Deploy via the web UI

Follow the Arm Virtual Hardware User Guide to create an account, then create a Cortex®-R82 device with LAN91C111 networking. Upload zephyr.elf as the custom firmware and start the device. See Upload Firmware in Web UI for the detailed steps.

Boot output looks like this:

Running scene on AVH

2. Launch the Autoware main compute on EC2

If you do not already have an AWS account, follow the Create Your AWS Account tutorial. The Launch an instance using the new launch instance wizard page walks through creating the instance itself.

Launch an EC2 instance with:

  • Ubuntu Server 22.04 on 64-bit Arm (m7g.2xlarge, Graviton 3, 8 vCPU / 16 GiB RAM).

  • A key pair you can SSH with.

  • Auto-assign public IP enabled and SSH allowed from a sensible source range.

  • 32 GiB of gp3 storage.

SSH into the instance (see Connect to your Linux instance using an SSH client) and install Docker Engine using the official Install Docker Engine instructions.

Copy the repository onto the EC2 instance (SCP or git clone). The rest of this guide assumes it lives at ~/autoware-safety-island.

3. Connect the VPN

Autoware on EC2 and the safety island on AVH exchange DDS traffic over a VPN tunnel. Corellium provides an OpenVPN configuration file per device.

Using the script

From inside the devcontainer on EC2:

$ ./avh.py --vpn-connect

Verify the tunnel came up:

$ ip a

You should see a tap0 interface.

Manual setup

On the AVH website, open the Connect tab for your device and click Download OVPN File. SCP the file to the EC2 instance (see Transfer files to Linux instances using an SCP client). The snippet below assumes the file lives at ~/avh.ovpn:

$ sudo apt update
$ sudo apt install --no-install-recommends openvpn
$ sudo -b openvpn --config ~/avh.ovpn

The tail of the output should read:

[...] TUN/TAP device tap0 opened
[...] net_iface_mtu_set: mtu 1500 for tap0
[...] net_iface_up: set tap0 up
[...] net_addr_v4_add: X.X.X.X/X dev tap0
[...] Initialization Sequence Completed

Warning

If the interface name is not tap0, update demo/cyclonedds.xml to match. See Troubleshooting.

4. Start Autoware

From the EC2 instance:

$ cd ~/autoware-safety-island/demo
$ docker compose up

This brings up three services:

  • safety-island-autoware — Autoware Universe planning simulator (ROS domain 1).

  • safety-island-bridge — domain bridge that forwards the topics listed in DDS topics between domain 1 (Autoware) and domain 2 (safety island).

  • safety-island-visualizer — noVNC-wrapped RViz instance exposed on port 6080.

Traffic now flows: Autoware (EC2, domain 1) ↔ bridge ↔ VPN ↔ safety island (AVH, domain 2).

5. Drive the simulation

  1. Open the visualizer at http://<ec2-instance-public-ip>:6080/vnc.html?resize=scale&password=openadkit&autoconnect=true. (The same URL is printed in the container logs at startup.)

  2. Click 2D Pose Estimate to place the ego vehicle.

  3. Click 2D Goal Pose to set a destination.

  4. In the Operation Mode tab, click Auto.

The safety island receives the resulting trajectory, runs MPC + PID, and publishes control commands back to Autoware. The planning-simulator tutorial in the Autoware documentation covers more scenarios.

If anything misbehaves — discovery stalls, DDS drops, VPN interface name — see Troubleshooting.