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.skuinboard.yamlbetweenE1M-V2N101andE1M-V2M101to retarget — the Alp SDK inference dispatcher resolves the right backend from the SoM'scapabilities:block, and the C++ picks per-handle at runtime viaalp_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
v2n-m1-deepx-inference— the Zephyr-side DEEPX bring-up half<alp/inference.h>reference- Heterogeneous builds — how A-class Yocto and M-class Zephyr slices share one
board.yaml rpmsg-v2n— the A55 ↔ M33-SM messaging counterpartboard.yamlreference- Examples overview