Skip to main content

v2n-m1-ros-perception

A ROS 2 perception node for V2N and V2N-M1, running on the A55 cluster under Yocto Linux.

Source: examples/v2n/v2n-m1-ros-perception/.

:::warning [UNTESTED] — paper-correct The SDK marks this example [UNTESTED]. It builds clean against a Yocto SDK that includes ROS 2 plus the Alp SDK runtime, and that is the whole of its verification today. Real bring-up — V2N-M1 silicon + the DEEPX runtime + the camera capture pipeline — gates on V2M HiL.

Unlike every other example on this page's siblings, it ships no testcase.yaml: there is no twister row at all, because a colcon/Yocto package isn't a Zephyr build. Nothing about it is exercised in CI. :::

What it shows

  • V2N (Renesas RZ/V2N quad-Cortex-A55 + Cortex-M33) acts as a ROS 2 compute node on Yocto Linux.
  • V2N-M1 adds a DEEPX DX-M1 NPU over PCIe. Object detection runs on DEEPX; on plain V2N (no DEEPX) the dispatcher falls back to the on-die DRP-AI3 automatically.
  • The same C++ source builds for both SKUs. Swap som.sku in board.yaml between E1M-V2N101 and E1M-V2M101 to retarget — the Alp SDK inference dispatcher resolves the right backend from the SoM's capabilities: block, and the C++ picks per-handle at runtime via alp_inference_open(.backend = DEEPX_DXM1 or DRPAI).

A vision model on DEEPX plus an optional audio model on DRP-AI3 is concurrent multi-NPU on one SoM.

The ROS 2 graph

+---- /alp/imu sensor_msgs/Imu (50 Hz)
+---- /alp/gnss sensor_msgs/NavSatFix ( 1 Hz)
+---- /alp/battery sensor_msgs/BatteryState ( 1 Hz)
+---- /alp/image sensor_msgs/Image (10 Hz)
alp_ +---- /alp/detections vision_msgs/Detection2DArray(10 Hz)
perception |
(this node)|
+--<-- /alp/cmd_vel geometry_msgs/Twist
(from your planning node)

launch/perception.launch.py shows how to remap /alp/* into a wider /robot/* namespace.

board.yaml — the Yocto slice

This is an A55 Yocto slice, and it carries the recipe: field that makes one work:

libraries:
- name: tflite-micro
cores: [a55_cluster]
- name: opus
cores: [a55_cluster]

som:
sku: E1M-V2M101 # V2N-M1: V2N + DEEPX DX-M1

preset: e1m-x-evk

cores:
a55_cluster:
app: ./src # the colcon workspace + ROS 2 recipes
recipe: alp-perception # meta-alp-sdk/recipes-ros/alp-perception packages `app:` above
peripherals:
- uart # GNSS (NEO-M9N)
- i2c # IMU (LSM6DSO) + battery (INA236)

chips:
- deepx_dxm1 # V2N-M1 only -- host driver / reset sequencer
- lsm6dso # IMU
- ublox_neo_m9n # GNSS
- ina236 # battery monitor (backs the diagnostics topic)
- da9292 # PMIC for the DEEPX 0.75 V rail
- pi3dbs12212 # PCIe mux between DEEPX + host
- optiga_trust_m # ROS 2 SROS2 (security) key store

diagnostics:
log_level: info

:::note Why recipe: matters An app-only Yocto slice — one with app: but no recipe: — emits command: null and a yocto-recipe-missing warning from the orchestrator, because a source path is never a valid bitbake target on its own. This example declares recipe: alp-perception, so the slice resolves to a real target. :::

ROS 2 itself is not brought in via libraries:. It comes from the Yocto image's meta-ros layer — the recipe pulls ros-rclcpp, ros-vision-msgs, and ros-sensor-msgs at image-build time. The libraries: field still drives the SDK's compile-time profile.

Build

A colcon package that lives inside the Alp SDK's Yocto SDK environment:

# Inside the Yocto SDK's environment-setup-* shell:
source /opt/poky/4.0/environment-setup-cortexa55-poky-linux

cd ~/ros_ws/src
ln -s /path/to/alp-sdk/examples/v2n/v2n-m1-ros-perception alp_perception
cd ~/ros_ws
colcon build --packages-select alp_perception

Binaries land in install/alp_perception/lib/.

Run

ros2 launch alp_perception perception.launch.py
ros2 topic list # confirm /alp/* topics
ros2 topic echo /alp/imu # 50 Hz Imu messages

Hardware needed

  • An E1M-V2N101 or E1M-V2M101 SoM.
  • An E1M-X-EVK with the camera connector populated.
  • Optionally, external Wi-Fi for remote ROS 2 graph access.

Yocto packaging

A skeleton recipe lives at recipes-ros/alp-perception_0.5.bb in meta-alp-sdk. It DEPENDS on alp-sdk, ros-rclcpp, ros-vision-msgs, ros-sensor-msgs, and — on V2N-M1 — dx-rt.

See also

Questions about this page? Discuss in Community Forum