Edge Impulse Docs

Edge Impulse Documentation

Welcome to the Edge Impulse documentation. You'll find comprehensive guides and documentation to help you start working with Edge Impulse as quickly as possible, as well as support if you get stuck. Let's jump right in!

On your Zephyr-based Nordic Semiconductor development board

Impulses can be deployed as a C++ library. This packages all your signal processing blocks, configuration and learning blocks up into a single package. You can include this package in your own application to run the impulse locally. In this tutorial you'll export an impulse, and build a Zephyr RTOS application for the nRF52840 DK / nRF5340 DK / nRF9160DK development board to classify sensor data.


Knowledge required

This tutorial assumes that you're familiar with building applications for the nRF52840DK or other Zephyr RTOS supported board, and have your environment set up to compile applications for this platform. This tutorial was written using nRF Connect SDK v1.6.0.

Note: Are you looking for an example that has all sensors included? The Edge Impulse firmware for the Nordic Semiconductor nRF52840 DK, nRF5340 DK and nRF9160DK has all of the code you need. See edgeimpulse/firmware-nrf52840-5340-dk or edgeimpulse/firmware-nrf-91


Make sure you followed the Continuous motion recognition tutorial, and have a trained impulse. Also make sure you've installed the following software:

Cloning the base repository

We created an example repository which contains a small application, which takes the raw features as an argument, and prints out the final classification. You can either download the application or import this repository using Git:

git clone https://github.com/edgeimpulse/example-standalone-inferencing-zephyr.git

Deploying your impulse

Head over to your Edge Impulse project, and go to Deployment. From here you can create the full library which contains the impulse and all external required libraries. Select C++ library and click Build to create the library.

Download the .zip file and place the contents in the 'example-standalone-inferencing-zephyr' folder (which you downloaded above). Your final folder structure should look like this:

 ├── CMakeLists.txt
 ├── edge-impulse-sdk
 ├── model-parameters
 ├── prj.conf
 ├── README.md
 ├── sample.yaml
 ├── src
 ├── tflite-model
 └── utils

Running the impulse

With the project ready it's time to verify that the application works. Head back to the studio and click on Live classification. Then load a validation sample, and click on a row under 'Detailed result'.

Selecting the row with timestamp '320' under 'Detailed result'Selecting the row with timestamp '320' under 'Detailed result'

Selecting the row with timestamp '320' under 'Detailed result'

To verify that the local application classifies the same, we need the raw features for this timestamp. To do so click on the 'Copy to clipboard' button next to 'Raw features'. This will copy the raw values from this validation file, before any signal processing or inferencing happened.

Copying the raw featuresCopying the raw features

Copying the raw features

In the example directory open src/main.cpp and paste the raw features inside the static const float features[] definition, for example:

static const float features[] = {
    -19.8800, -0.6900, 8.2300, -17.6600, -1.1300, 5.9700, ...

Then build the application with west:

# nRF52840 DK
$ west build -b nrf52840dk_nrf52840

# nRF5340 DK
$ west build -b nrf5340dk_nrf5340_cpuapp

# nRF9160DK
$ west build -b nrf9160dk_nrf9160ns

To flash this application you can either run (if you've set up the Segger J-LINK tools):

$ west flash

Or find the build/zephyr/zephyr.bin file and drag it to the JLINK USB mass-storage device (like a USB flash drive).

For the nRF9160DK, make sure the board controller has been flashed once as well.

Seeing the output

To see the output of the impulse, connect to the development board over a serial port on baud rate 115,200 and reset the board. You can do this with your favourite serial monitor or with the Edge Impulse CLI:

$ edge-impulse-run-impulse --raw

This will run the signal processing pipeline, and then classify the output:

Edge Impulse standalone inferencing (Zephyr)
Running neural network...
Predictions (time: 1 ms.):
idle:   0.015319
snake:  0.000444
updown: 0.006182
wave:   0.978056
Anomaly score (time: 0 ms.): 0.133557
Predictions (DSP: 18 ms., Classification: 1 ms., Anomaly: 0 ms.): 
[0.01532, 0.00044, 0.00618, 0.97806, 0.134]

Which matches the values we just saw in the studio. You now have your impulse running on your Zephyr development board!

Connecting sensors?

A demonstration on how to plug sensor values into the classifier can be found here: Data forwarder - classifying data (Zephyr).


Building without the NRF Connect SDK

You can also build the application without the nRF Connect SDK. Navigate to the example-standalone-inferencing-zephyr folder and run:

$ west init
$ west update

And then read the 'Invalid choice: 'build'' section below.

Invalid choice: 'build'

If you try to build the application but it throws an 'invalid choice' error like:

$ west build -b nrf52840dk_nrf52840
usage: west [-h] [-z ZEPHYR_BASE] [-v] [-V] <command> ...
west: error: argument <command>: invalid choice: 'build' (choose from 'init', 'update', 'list', 'manifest', 'diff', 'status', 'forall', 'help', 'config', 'topdir', 'selfupdate')

You'll need to set up your environment variables correctly (more info). You can do so by opening a command prompt or terminal window and running:


$ zephyr\zephyr-env.cmd

macOS / Linux

$ source zephyr/zephyr-env.sh

Updated 15 days ago

On your Zephyr-based Nordic Semiconductor development board

Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.