Software
etsi_its_messages
By Institut für Kraftfahrzeuge, RWTH Aachen, ika, Germany (checked on github.com/ika-rwth-aachen (opens in a new tab)), from github.com/ika-rwth-aachen/etsi_its_messages (opens in a new tab)
- Cars
- Library
- MIT
A ROS 2 package stack providing message definitions for standardized ETSI ITS V2X messages, plus a node converting them to and from UDP payloads and RViz plugins for visualization.
Facts
- GitHub stars
- 83read on 6 Nov 2026
- Last update
- 28 Oct 2026Newest commit on main
- Maintenance
- Activea commit in the last 90 days
- Difficulty
- Advanced
- Hardware it needs, as the project states it
- ROS 2 (distributions humble, jazzy or kilted, as the badges show) and Docker for the container image or code generation; no specific hardware is stated.
Checked on GitHub on 6 Nov 2026.
Licenses
- Code
- MIT (opens in a new tab)
Read by Robotheca from LICENSE (opens in a new tab) (MIT) at commit c601f67 (opens in a new tab), on 30 Oct 2026.
- Commercial use
- Yes
Overview
What it does: Robotheca's summary
- Generates ROS message definitions and conversion functions automatically from the ETSI ITS ASN.1 definitions.
- Supports CAM, CPM, DENM, IVIM, MAPEM, MCM, SPATEM and VAM message types.
- The etsi_its_conversion node converts UPER-encoded UDP payloads to ROS messages and back, in both directions.
- Includes RViz plugins for visualizing the messages and sample nodes that publish example messages.
- Provides header-only access functions to set deeply nested message fields more easily, e.g. vehicle speed in a CAM.
- Installable as released ROS 2 packages or as a Docker image; code generation is optional and needs Python and Docker.
Written by Robotheca from the project's README (opens in a new tab) at commit 4e01c32, not by its creator.
The README
The creator's own README, copied as written: README.md by Institut für Kraftfahrzeuge, RWTH Aachen, ika, at commit c601f67, under MIT (opens in a new tab). The original on GitHub (opens in a new tab).
Read the README here
etsi_its_messages
ROS Support for ETSI ITS Messages for V2X Communication

The etsi_its_messages package stack allows to use standardized ETSI ITS messages for V2X communication in ROS 2 systems. Apart from the definition of ROS message equivalents to the ETSI ITS standards, this package stack also includes a conversion node for serializing the messages to and from a UDP payload, as well as RViz plugins for visualization.
All message definitions and conversion functions are automatically generated based on the ASN.1 definitions (opens in a new tab) of the standardized ETSI ITS messages.
[!IMPORTANT]
This repository is open-sourced and maintained by the Institute for Automotive Engineering (ika) at RWTH Aachen University (opens in a new tab).
V2X Communication is one of many research topics within our Vehicle Intelligence & Automated Driving (opens in a new tab) domain.
If you would like to learn more about how we can support your advanced driver assistance and automated driving efforts, feel free to reach out to us!
:email: opensource@ika.rwth-aachen.de (opens in a new tab)
- Concept
- Supported ETSI ITS Messages
- Packages
- Installation
- Conversion Node
- Sample Messages
- Access Functions
- Code Generation
- V2AIX Dataset / Citation
- Acknowledgements
- Notice
[!NOTE]
Instructions for using the etsi_its_messages as a ROS driver for common V2X OBU/RSU hardware such as the Cohda Wireless MK5 are found inDRIVERS.md(opens in a new tab).
Concept

The core concept of the etsi_its_messages is to automatically generate the ROS support code based on the ASN.1 definitions (opens in a new tab) of the standardized ETSI ITS messages (CodeGen). The ROS support then allows ROS applications to not only natively use corresponding ETSI ITS message types, but to also exchange encoded ETSI ITS message payloads with the world outside of ROS (Runtime).
A given ASN.1 definition is used to generate corresponding C-structures, ROS message definitions, as well as conversion functions between those two formats (see Code Generation).
During runtime, the etsi_its_conversion ROS node converts incoming UDP payloads into corresponding ROS messages and vice versa (see Conversion Node). The ROS equivalents of the ETSI ITS messages can be used in any downstream ROS applications or visualized using the provided RViz plugins.
Supported ETSI ITS Messages
[!NOTE] Message types that are standardized as European Norms (EN) are available as, e.g.,
etsi_its_cam_msgs. New message types or revisions of existing message types that are only specified in Technical Specifications (TS) are available as, e.g.,etsi_its_cpm_ts_msgs.
[!WARNING] Limitations
RegionalExtension(defined inISO-TS-19091-addgrp-C-2018.asn(opens in a new tab)) is not covered in ROS-equivalents of MAPEM, SPATEM, and RTCMEM messages
Packages
etsi_its_messages
├── etsi_its_coding
│ ├── etsi_its_coding # metapackage including all coding packages
│ ├── etsi_its_cam_coding
│ ├── etsi_its_cam_ts_coding
│ ├── etsi_its_cpm_ts_coding
│ ├── etsi_its_denm_coding
│ ├── etsi_its_denm_ts_coding
│ ├── etsi_its_ivim_ts_coding
│ ├── etsi_its_mapem_ts_coding
│ ├── etsi_its_mcm_uulm_coding
│ ├── etsi_its_rtcmem_ts_coding
│ ├── etsi_its_spatem_ts_coding
│ └── etsi_its_vam_ts_coding
├── etsi_its_conversion
│ ├── etsi_its_conversion # conversion node depending on all conversion packages
│ ├── etsi_its_cam_conversion
│ ├── etsi_its_cam_ts_conversion
│ ├── etsi_its_cpm_ts_conversion
│ ├── etsi_its_denm_conversion
│ ├── etsi_its_denm_ts_conversion
│ ├── etsi_its_ivim_ts_conversion
│ ├── etsi_its_mapem_ts_conversion
│ ├── etsi_its_mcm_uulm_conversion
│ ├── etsi_its_primitives_conversion
│ ├── etsi_its_rtcmem_ts_conversion
│ ├── etsi_its_spatem_ts_conversion
│ └── etsi_its_vam_ts_conversion
├── etsi_its_messages # metapackage including all others
├── etsi_its_msgs
│ ├── etsi_its_msgs # metapackage including all msg packages
│ ├── etsi_its_cam_msgs
│ ├── etsi_its_cam_ts_msgs
│ ├── etsi_its_cpm_ts_msgs
│ ├── etsi_its_denm_msgs
│ ├── etsi_its_denm_ts_msgs
│ ├── etsi_its_ivim_ts_msgs
│ ├── etsi_its_mapem_ts_msgs
│ ├── etsi_its_mcm_uulm_msgs
│ ├── etsi_its_rtcmem_ts_msgs
│ ├── etsi_its_spatem_ts_msgs
│ └── etsi_its_vam_ts_msgs
├── etsi_its_msgs_utils
└── etsi_its_rviz_plugins
Installation
All etsi_its_messages packages are released as official ROS 2 packages and can easily be installed via a package manager.
sudo apt update
sudo apt install ros-$ROS_DISTRO-etsi-its-messages
# or single packages, e.g.
sudo apt install ros-$ROS_DISTRO-etsi-its-cam-msgs
If you would like to install etsi_its_messages from source, simply clone this repository into your ROS workspace. All dependencies that are listed in the packages' package.xml can be installed using rosdep (opens in a new tab).
# workspace$
rosdep install -r --ignore-src --from-paths src
colcon build --packages-up-to etsi_its_messages --cmake-args -DCMAKE_BUILD_TYPE=Release
docker-ros
The etsi_its_messages package stack is also available as a Docker image, containerized through docker-ros (opens in a new tab). Note that launching these containers starts the etsi_its_conversion node by default.
docker run --rm ghcr.io/ika-rwth-aachen/etsi_its_messages:latest
Conversion Node
The etsi_its_conversion package provides a ROS 2 C++ component node for converting etsi_its_msgs ROS messages to and from UPER-encoded (opens in a new tab) udp_msgs/msg/UdpPacket (opens in a new tab) payloads. This way, ETSI ITS messages cannot only be used within the ROS ecosystem, but may also be received from or sent to outside applications.
The package depends on one dedicated package for each ETSI ITS message type, e.g., etsi_its_cam_conversion. These packages hold header-only libraries with recursive conversion functions for each nested message type.
Usage
The conversion node bridges all ETSI ITS message types at the same time in both directions.
ros2 launch etsi_its_conversion converter.launch.py
# or
ros2 run etsi_its_conversion etsi_its_conversion_node --ros-args -p etsi_types:=[cam,cpm_ts,denm,ivim_ts,mapem_ts,mcm_uulm,rtcmem_ts,spatem_ts,vam_ts] -p has_btp_destination_port:=true -p btp_destination_port_offset:=0 -p etsi_message_payload_offset:=4
Subscribed Topics
| Topic | Type | Description |
|---|---|---|
~/udp/in | udp_msgs/msg/UdpPacket | UDP payload for conversion to ROS |
~/cam/in | etsi_its_cam_msgs/msg/CAM | CAM for conversion to UDP |
~/cam_ts/in | etsi_its_cam_ts_msgs/msg/CAM | CAM (TS) for conversion to UDP |
~/cpm_ts/in | etsi_its_cpm_ts_msgs/msg/CollectivePerceptionMessage | CPM for conversion to UDP |
~/denm/in | etsi_its_denm_msgs/msg/DENM | DENM for conversion to UDP |
~/denm_ts/in | etsi_its_denm_ts_msgs/msg/DENM | DENM (TS) for conversion to UDP |
~/ivim_ts/in | etsi_its_ivim_ts_msgs/msg/IVIM | IVIM (TS) for conversion to UDP |
~/mapem_ts/in | etsi_its_mapem_ts_msgs/msg/MAPEM | MAPEM (TS) for conversion to UDP |
~/mcm_uulm/in | etsi_its_mcm_uulm_msgs/msg/MCM | MCM (UULM) for conversion to UDP |
~/rtcmem_ts/in | etsi_its_rtcmem_ts_msgs/msg/RTCMEM | RTCMEM (TS) for conversion to UDP |
~/spatem_ts/in | etsi_its_spatem_ts_msgs/msg/SPATEM | SPATEM (TS) for conversion to UDP |
~/vam_ts/in | etsi_its_vam_ts_msgs/msg/VAM | VAM (TS) for conversion to UDP |
Published Topics
| Topic | Type | Description |
|---|---|---|
~/udp/out | udp_msgs/msg/UdpPacket | UDP payload converted from ROS message |
~/cam/out | etsi_its_cam_msgs/msg/CAM | CAM converted from UDP payload |
~/cam_ts/out | etsi_its_cam_ts_msgs/msg/CAM | CAM (TS) converted from UDP payload |
~/cpm_ts/out | etsi_its_cpm_ts_msgs/msg/CollectivePerceptionMessage | CPM converted from UDP payload |
~/denm/out | etsi_its_denm_msgs/msg/DENM | DENM converted from UDP payload |
~/denm_ts/out | etsi_its_denm_ts_msgs/msg/DENM | DENM (TS) converted from UDP payload |
~/ivim_ts/out | etsi_its_ivim_ts_msgs/msg/IVIM | IVIM (TS) converted from UDP payload |
~/mapem_ts/out | etsi_its_mapem_ts_msgs/msg/MAPEM | MAPEM (TS) converted from UDP payload |
~/mcm_uulm/out | etsi_its_mcm_uulm_msgs/msg/MCM | MCM (UULM) converted from UDP payload |
~/rtcmem_ts/out | etsi_its_rtcmem_ts_msgs/msg/RTCMEM | RTCMEM (TS) converted from UDP payload |
~/spatem_ts/out | etsi_its_spatem_ts_msgs/msg/SPATEM | SPATEM (TS) converted from UDP payload |
~/vam_ts/out | etsi_its_vam_ts_msgs/msg/VAM | VAM (TS) converted from UDP payload |
Services
| Service | Type | Description |
|---|---|---|
~/cam/udp | etsi_its_conversion_srvs/srv/ConvertCamToUdp | Convert ROS CAM to UDP payload |
~/cam_ts/udp | etsi_its_conversion_srvs/srv/ConvertCamTsoUdp | Convert ROS CAM (TS) to UDP payload |
~/cpm_ts/udp | etsi_its_conversion_srvs/srv/ConvertCpmTsToUdp | Convert ROS CPM (TS) to UDP payload |
~/denm/udp | etsi_its_conversion_srvs/srv/ConvertDenmToUdp | Convert ROS DENM to UDP payload |
~/denm_ts/udp | etsi_its_conversion_srvs/srv/ConvertDenmTsToUdp | Convert ROS DENM (TS) to UDP payload |
~/ivim_ts/udp | etsi_its_conversion_srvs/srv/ConvertIvimTsToUdp | Convert ROS IVIM (TS) to UDP payload |
~/mapem_ts/udp | etsi_its_conversion_srvs/srv/ConvertMapemTsToUdp | Convert ROS MAPEM (TS) to UDP payload |
~/mcm_uulm/udp | etsi_its_conversion_srvs/srv/ConvertMcmUulmToUdp | Convert ROS MCM (UULM) to UDP payload |
~/rtcmem_ts/udp | etsi_its_conversion_srvs/srv/ConvertRtcmemTsToUdp | Convert ROS RTCMEM (TS) to UDP payload |
~/spatem_ts/udp | etsi_its_conversion_srvs/srv/ConvertSpatemTsToUdp | Convert ROS SPATEM (TS) to UDP payload |
~/vam_ts/udp | etsi_its_conversion_srvs/srv/ConvertVamTsoUdp | Convert ROS VAM (TS) to UDP payload |
~/udp/cam | etsi_its_conversion_srvs/srv/ConvertUdpToCam | Convert UDP payload to ROS CAM |
~/udp/cam_ts | etsi_its_conversion_srvs/srv/ConvertUdpToCamTs | Convert UDP payload to ROS CAM (TS) |
~/udp/cpm_ts | etsi_its_conversion_srvs/srv/ConvertUdpToCpmTs | Convert UDP payload to ROS CPM (TS) |
~/udp/denm | etsi_its_conversion_srvs/srv/ConvertUdpToDenm | Convert UDP payload to ROS DENM |
~/udp/denm_ts | etsi_its_conversion_srvs/srv/ConvertUdpToDenmTs | Convert UDP payload to ROS DENM (TS) |
~/udp/ivim_ts | etsi_its_conversion_srvs/srv/ConvertUdpToIvimTs | Convert UDP payload to ROS IVIM (TS) |
~/udp/mapem_ts | etsi_its_conversion_srvs/srv/ConvertUdpToMapemTs | Convert UDP payload to ROS MAPEM (TS) |
~/udp/mcm_uulm | etsi_its_conversion_srvs/srv/ConvertUdpToMcmUulm | Convert UDP payload to ROS MCM (UULM) |
~/udp/rtcmem_ts | etsi_its_conversion_srvs/srv/ConvertUdpToRtcmemTs | Convert UDP payload to ROS RTCMEM (TS) |
~/udp/spatem_ts | etsi_its_conversion_srvs/srv/ConvertUdpToSpatemTs | Convert UDP payload to ROS SPATEM (TS) |
~/udp/vam_ts | etsi_its_conversion_srvs/srv/ConvertUdpToVamTs | Convert UDP payload to ROS VAM (TS) |
Parameters
| Parameter | Type | Default | Options | Description |
|---|---|---|---|---|
has_btp_destination_port | bool | true | whether incoming/outgoing UDP messages include a 2-byte BTP destination port (opens in a new tab) in their payload; for incoming UDP payloads: if false, destination port is expected in src_port field with fallback of udp2ros_etsi_types[0] | |
btp_destination_port_offset | int | 0 | number of bytes before an optional 2-byte BTP destination port, see has_btp_destination_port (always 0 in outgoing UDP payload) | |
etsi_message_payload_offset | int | 4 | number of bytes before actual ETSI message payload (always 0 or 4 (if has_btp_destination_port) in outgoing UDP payload) | |
ros2udp_etsi_types | string[] | cam, cam_ts, cpm_ts, denm, denm_ts, ivim_ts, mapem_ts, mcm_uulm, rtcmem_ts, spatem_ts, vam_ts | cam, cam_ts, cpm_ts, denm, denm_ts, ivim_ts, mapem_ts, mcm_uulm, rtcmem_ts, spatem_ts, vam_ts | list of ETSI types to convert from etsi_its_msgs to udp_msgs |
udp2ros_etsi_types | string[] | cam, cpm_ts, denm, ivim_ts, mapem_ts, mcm_uulm, rtcmem_ts, spatem_ts, vam_ts | cam, cam_ts, cpm_ts, denm, denm_ts, ivim_ts, mapem_ts, mcm_uulm, rtcmem_ts, spatem_ts, vam_ts | list of ETSI types to convert from udp_msgs to etsi_its_msgs |
subscriber_queue_size | int | 10 | queue size for incoming ROS messages | |
publisher_queue_size | int | 10 | queue size for outgoing ROS messages |
Sample Messages
The etsi_its_msgs_utils package contains simple ROS 2 nodes for publishing sample ROS 2 messages of the supported ETSI ITS message types, see ./etsi_its_msgs_utils/samples/ (opens in a new tab). For example, publish a sample CPM by running the following.
ros2 run etsi_its_msgs_utils publish_cpm_ts.py
You can then visualize the CPM in RViz with the provided demo configuration.
ros2 launch etsi_its_rviz_plugins demo.launch.py
And finally, run the Conversion Node to convert ROS 2 messages to binary payloads.
ros2 run etsi_its_conversion etsi_its_conversion_node \
--ros-args \
-r __node:=etsi_its_conversion \
-r /etsi_its_conversion/udp/out:=/etsi_its_conversion/udp/in \
-p has_btp_destination_port:=true \
-p btp_destination_port_offset:=0 \
-p etsi_message_payload_offset:=4
Access Functions
The etsi_its_msgs_utils package contains header-only libraries providing helpful access functions for modifying the deeply nested ROS messages equivalents of the ETSI ITS messages. All access functions are documented here (opens in a new tab).
#include <etsi_its_cam_msgs/msg/cam.hpp>
#include <etsi_its_msgs_utils/cam_access.hpp> // access functions
// ...
double speed = 10.0; // vehicle speed in m/s
etsi_its_cam_msgs::msg::CAM cam;
etsi_its_cam_msgs::access::setSpeed(cam, speed);
// instead of
cam.cam.cam_parameters.high_frequency_container.basic_vehicle_container_high_frequency.speed.speed_value.value = (uint16_t)(speed * 1e2);
// ...
Code Generation
[!NOTE] This section is only relevant if you would like to (re-)run the code generation for ROS support based on ASN.1 definitions. If you only wish to use the supported message types in ROS, see Installation and Conversion Node.
A given ASN.1 definition is used to generate corresponding C-structures, ROS message definitions, as well as conversion functions between those two formats. The raw ASN.1 definitions of the supported message types are included as Git submodules in the asn1/raw subdirectory (opens in a new tab). Make sure to clone recursively or initialize the submodules after cloning (git submodule update --init --recursive). Note that some of these definitions need to be downloaded and patched before code generation by running ./asn1/external/download.sh (opens in a new tab) and ./asn1/patches/patch.sh (opens in a new tab).
If you would like to re-run the generation of supported message types, we recommend to use the VS Code debugging configurations (opens in a new tab) pre-configured in .vscode/launch.json (opens in a new tab). All script calls defined there can obviously also run outside of VS Code. Note that Python and Docker are required for code generation.
If you would like to run the generation for new message types or message type versions, call the scripts defined in .vscode/launch.json (opens in a new tab) on your custom ASN.1 definitions.
V2AIX Dataset / Citation
The etsi_its_messages package stack was created and used in order to record the V2AIX Dataset (opens in a new tab). Please consider citing our paper if you are also using the package stack in your own research.
If you want to replay ROS 2 bagfiles from the V2AIX Dataset using this package stack, please refer to the V2AIX Replay README (opens in a new tab).
V2AIX: A Multi-Modal Real-World Dataset of ETSI ITS V2X Messages in Public Road Traffic
(IEEE Xplore (opens in a new tab), arXiv (opens in a new tab), ResearchGate (opens in a new tab))Guido Küppers (opens in a new tab), Jean-Pierre Busch (opens in a new tab) and Lennart Reiher (opens in a new tab), Lutz Eckstein (opens in a new tab)
Institute for Automotive Engineering (ika), RWTH Aachen University (opens in a new tab)Abstract – Connectivity is a main driver for the ongoing megatrend of automated mobility: future Cooperative Intelligent Transport Systems (C-ITS) will connect road vehicles, traffic signals, roadside infrastructure, and even vulnerable road users, sharing data and compute for safer, more efficient, and more comfortable mobility. In terms of communication technology for realizing such vehicle-to-everything (V2X) communication, the WLAN-based peer-to-peer approach (IEEE 802.11p, ITS-G5 in Europe) competes with C-V2X based on cellular technologies (4G and beyond). Irrespective of the underlying communication standard, common message interfaces are crucial for a common understanding between vehicles, especially from different manufacturers. Targeting this issue, the European Telecommunications Standards Institute (ETSI) has been standardizing V2X message formats such as the Cooperative Awareness Message (CAM). In this work, we present V2AIX, a multi-modal real-world dataset of ETSI ITS messages gathered in public road traffic, the first of its kind. Collected in measurement drives and with stationary infrastructure, we have recorded more than 285 000 V2X messages from more than 2380 vehicles and roadside units in public road traffic. Alongside a first analysis of the dataset, we present a way of integrating ETSI ITS V2X messages into the Robot Operating System (ROS). This enables researchers to not only thoroughly analyze real-world V2X data, but to also study and implement standardized V2X messages in ROS-based automated driving applications. The full dataset is publicly available for non-commercial use at https://v2aix.ika.rwth-aachen.de (opens in a new tab).
Acknowledgements
This work is accomplished within the projects AIthena, 6GEM and AUTOtech.agil. We acknowledge the financial support for the projects by
- the European Union’s Horizon Europe Research and Innovation Programme :eu: under Grant Agreement No 101076754 for AIthena,
- and the Federal Ministry of Education and Research of Germany (BMBF) :de: for 6GEM (FKZ 16KISK036K) and AUTOtech.agil (FKZ 01IS22088A).
Notice
This repository is not endorsed by or otherwise affiliated with ETSI (opens in a new tab).
This repository uses the following software. For full license details, please refer to the specific license files of the respective software.
- asn1c (opens in a new tab)
BSD 2-Clause License Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info> and contributors. All rights reserved. - asn1tools (opens in a new tab)
MIT License Copyright (c) 2017-2019 Erik Moqvist - ETSI ITS ASN1 (opens in a new tab)
BSD 3-Clause License Copyright (c) ETSI - GeographicLib (opens in a new tab)
MIT License Copyright (c) 2008-2023, Charles Karney - rasn (opens in a new tab)
MIT License Copyright (c) 2016 Erin Power - ROS 2 (opens in a new tab)
Apache 2.0 License All rights reserved. - UULM MCM ASN.1 Definition (opens in a new tab)
Apache 2.0 License All rights reserved.
Files and versions
- Repository on GitHubgithub.com/ika-rwth-aachen/etsi_its_messages (opens in a new tab)
- The version Robotheca readc601f67 (opens in a new tab)
- Latest releasev3.5.0 (8 Jul 2026)
Robotheca read the repository at two versions: the summary at 4e01c32 and the facts and the README at c601f67 (read on 6 Nov 2026).
Robotheca never hosts the code: each link goes to the creator's own page.
Use it
How to install it, in the creator's words: The project's README (opens in a new tab)
Robotheca doesn't review code. Read it before running it.
Robotheca lists software as a reference: nothing is hosted or run here, and every fact links to where it was read.