Knowledge Base

Everything you need to know and understand to develop V2X applications.

denm-generator.py
msg = self.generate_denm()
future = self.send_request(msg)
future.add_done_callback(self.request_completed)

Initial Steps

Developing ROS 2 applications for cube:its is easiest and fastest when using VS Code Dev Containers. This is our recommended and supported workflow, because it gives you:

  • a fully configured ROS 2 development environment
  • the correct dependencies for cube:its and vanetza
  • reproducible builds across Linux/macOS/Windows
  • separation between your host system and your ROS 2 tooling
  • seamless connection to the cube:evk over the network

With dev containers, you don't have to install ROS 2, colcon, Python tools, or build dependencies on your laptop—VS Code handles everything automatically.


1. Clone the Example Repository (Host)

We provide a complete ROS 2 workspace with cube:its examples:

host:~$ git clone https://github.com/cubesys-GmbH/ros_v2x_apps
host:~$ cd ros_v2x_apps

Open this folder in VS Code (with the Dev Containers extension). When VS Code detects the .devcontainer/ folder, it will ask:

"Reopen in Container?"

Click Yes.

VS Code will now build the development container and open a full ROS 2 environment inside it.


2. Start cube:its in Remote Mode (On the cube:evk)

On the cube:evk, run:

cube:~$ start-its --remote

This launches cube:its in a mode where it exposes all ROS 2 nodes and topics over your network. Your dev container on the host can now discover and interact with these topics.


3. Build the Workspace (Host, inside Dev Container)

Open a terminal inside the dev container:

host:~$ cd dev_ws/
host:~$ colcon build

Example output:

Starting >>> v2x_apps
Finished <<< v2x_apps [3.72s]
Summary: 1 package finished [4.62s]

Source the workspace:

host:~$ source install/setup.bash

4. Configure ROS Discovery for Remote Communication

To interact with cube:its running on the cube:evk, set the discovery domain and range:

host:~$ export ROS_DOMAIN_ID=42
host:~$ export ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET

Domain Id

cube:its uses ROS_DOMAIN_ID=42 by default. Both the host and cube must use the same domain ID.


5. Verify the Connection

Now your dev container should see all ROS 2 topics exposed by cube:its:

host:~$ ros2 topic list

Example output:

/its/cam_ego_view
/its/cam_provided
/its/cam_received
/its/cam_transmitted
/its/denm_received
/its/cpm_provided
/its/cpm_received
/its/cpm_transmitted
/its/position_vector
/kinematics/body_motion
/kinematics/ground_motion
/kinematics/ground_motion_vehicle
/kinematics/position
/vanetza/btp_indication
...

If you see these topics, you are now fully connected to cube:its from your Dev Container.

You can now:

  • write ROS 2 nodes in Python or C++
  • subscribe to CAM, CPM, DENM, or position topics
  • publish your own DENMs
  • access kinematic data (GNSS, heading, motion, IMU fusion)
  • run tests and debug directly from your laptop

All without installing ROS 2 locally.


Why This Workflow?

This setup has become the standard because it offers:

✔ Isolation

Your laptop stays clean. ROS 2 stays inside the dev container.

✔ Reproducibility

Everyone developing on your team has the exact same environment.

✔ Seamless Integration

The cube runs the full V2X stack. Your laptop runs only your application code.

✔ Perfect for rapid experimentation

Write → build → run → test, all with full access to real V2X radio, GNSS, IMU, and facility layers.


Next Steps

You're now ready to develop and run ROS 2 applications that interact with the cube:evk.

  • Write a subscriber for /its/cam_received
  • Consume GNSS using /its/position_vector
  • Build higher-level ITS applications using CPM, DENM, VAM, etc.

For detailed examples, continue with ITS Facilities.