From 6f4f47859a1de13e3dc591d82c269f72873e6779 Mon Sep 17 00:00:00 2001
From: "Takagi, Isamu" <43976882+isamu-takagi@users.noreply.github.com>
Date: Thu, 11 Jul 2024 15:14:49 +0900
Subject: [PATCH] feat(autoware_v2x_msgs): add virtual gate messages (#77)

Signed-off-by: Takagi, Isamu <isamu.takagi@tier4.jp>
---
 autoware_v2x_msgs/CMakeLists.txt              |  22 ++
 autoware_v2x_msgs/README.md                   |  27 +++
 .../doc/virtual-gate-nodes.drawio.svg         | 218 ++++++++++++++++++
 .../msg/VirtualGateAreaCommand.msg            |  12 +
 .../msg/VirtualGateAreaStatus.msg             |  14 ++
 autoware_v2x_msgs/msg/VirtualGateCommand.msg  |   2 +
 autoware_v2x_msgs/msg/VirtualGateStatus.msg   |   1 +
 autoware_v2x_msgs/package.xml                 |  29 +++
 8 files changed, 325 insertions(+)
 create mode 100644 autoware_v2x_msgs/CMakeLists.txt
 create mode 100644 autoware_v2x_msgs/README.md
 create mode 100644 autoware_v2x_msgs/doc/virtual-gate-nodes.drawio.svg
 create mode 100644 autoware_v2x_msgs/msg/VirtualGateAreaCommand.msg
 create mode 100644 autoware_v2x_msgs/msg/VirtualGateAreaStatus.msg
 create mode 100644 autoware_v2x_msgs/msg/VirtualGateCommand.msg
 create mode 100644 autoware_v2x_msgs/msg/VirtualGateStatus.msg
 create mode 100644 autoware_v2x_msgs/package.xml

diff --git a/autoware_v2x_msgs/CMakeLists.txt b/autoware_v2x_msgs/CMakeLists.txt
new file mode 100644
index 0000000..ef156d0
--- /dev/null
+++ b/autoware_v2x_msgs/CMakeLists.txt
@@ -0,0 +1,22 @@
+cmake_minimum_required(VERSION 3.14)
+project(autoware_v2x_msgs)
+
+find_package(ament_cmake_auto REQUIRED)
+ament_auto_find_build_dependencies()
+
+rosidl_generate_interfaces(${PROJECT_NAME}
+  "msg/VirtualGateAreaCommand.msg"
+  "msg/VirtualGateAreaStatus.msg"
+  "msg/VirtualGateCommand.msg"
+  "msg/VirtualGateStatus.msg"
+  DEPENDENCIES
+    builtin_interfaces
+    geometry_msgs
+)
+
+if(BUILD_TESTING)
+  find_package(ament_lint_auto REQUIRED)
+  ament_lint_auto_find_test_dependencies()
+endif()
+
+ament_auto_package()
diff --git a/autoware_v2x_msgs/README.md b/autoware_v2x_msgs/README.md
new file mode 100644
index 0000000..c3b6cce
--- /dev/null
+++ b/autoware_v2x_msgs/README.md
@@ -0,0 +1,27 @@
+# autoware_v2x_msgs
+
+## Virtual gate messages
+
+### Overview
+
+This message represents the status of the virtual gate for passing through the area managed by the facility.
+The virtual gate treats area entry permission as a shared resource and controls vehicles by acquiring and releasing locks.
+Each facility may support different protocols, but Autoware V2X component converts each protocol and this message.
+This allows Autoware to handle facilities with different protocols with a unified message.
+
+![virtual-gate-nodes](./doc/virtual-gate-nodes.drawio.svg)
+
+### Sequence
+
+Because there is a time lag before commands are reflected, the vehicle must wait until it receives the status of the same sequence as the command it sent.
+Until the vehicle receives the status, treat it as if it were unlocked.
+
+### Gates
+
+Specify the entrance and exit gate IDs. This is used to check if vehicles can pass simultaneously when multiple routes are possible within an area.
+If omitted, it is treated as a lock for the entire area.
+
+### Vehicle ID
+
+This message does not include the vehicle ID, so add it in the V2X component if required by the communication protocol.
+And if facilities publish multiple vehicle statuses, filter to only status for own vehicle.
diff --git a/autoware_v2x_msgs/doc/virtual-gate-nodes.drawio.svg b/autoware_v2x_msgs/doc/virtual-gate-nodes.drawio.svg
new file mode 100644
index 0000000..5da8bcd
--- /dev/null
+++ b/autoware_v2x_msgs/doc/virtual-gate-nodes.drawio.svg
@@ -0,0 +1,218 @@
+<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="921px" height="161px" viewBox="-0.5 -0.5 921 161" content="&lt;mxfile&gt;&lt;diagram id=&quot;webK_mMjbjblUMH9l2im&quot; name=&quot;Page-1&quot;&gt;1VnLcpswFP0azySLdAyyMV46r3bRznQmi6ZLBRRQRyAqRGz36ysZyTyEjTH4kZWly5WQzrn3cCWPwEO0+spgEv6gPiIje+yvRuBxZNv2eD4WP9Kyzi0zVxkChv3cZBWGF/wPKaN2y7CP0oojp5RwnFSNHo1j5PGKDTJGl1W3d0qqb01ggAzDiweJaf2FfR4qq+XMiwffEA5C9WrXnuUPIqid1U7SEPp0WTKBpxF4YJTyvBWtHhCR4Glc8nHPO55uF8ZQzA8ZABy1Dr7Wm0O+2KvqUsZDGtAYkqfCeh/yiIiHlmgymsU+kpONRS+fS06wcznKlNKMecprohiELEAasC0UIoYQjRBna+HCEIEcf1Rnh4rMYOunhi4Yg+uSQ0JxzNPSzD+lQTiouLRmipS1jrYadt38RSNfge6VtlKYNnw0c6Nw+YAkUztOCIxjHAcj2yECqfs3JlqBbHk0SmgsUa7TWWVoGWKOXhK4wX4psrNKp3ojYhyt9lNokqMGTKqg6O6ylCc6+MNSiljOeDedJUj3IuYYiH3Yq40ODIKOxAULFVgQHMTCxmkyFGatoIGTgTY9QgGqsBU+36mEZAPWH8T5Wkk3zDhtCrSuSgEapMIaN0N7Wq2YgFruO/u1osW/t1bMPg+Jrslhzuu5OQTzbnrf4t+bQ9dUL8x4BqVPADnKhSyCsW+STYiofdBZBN6uiZXboPBOg1hNBtCq+ecJc12rluP8ImG+rTUPlKoW/95hroHZE+cOjGTcxm+p/Ek55Fl6VTFvNZU1pwp6yzL23jumBaaML+RRSBg8AtMUe9r8jIl2E/Cw9Wu581u+84soGlT/caUWkffWurfC/LXUzodNVa8YJDt6zHF5pj995TzLdaJvohmZsT2mqiioV1/5stSgGr8dc8Qsyi5N+fUwDiyTcTBIFWgyXs97t0Z5vgaD8tbQMSYaLnZ0QpT0dcEQFBbLPDfepFmSiGBKJeyMcupROdfitiX+Ti+5bvuZ6GSK21CKKQjtMoQleJy/Gd2YKfMRuxMoUjYCi80c7Oburmy/3QCkR3w+JnTdex4q5gYVPhMJzRpi+Z2yqwNv6rRXy01H+yGwA2alZWI3bBAbFNxfHwWNxdvJOLB2SQk4t5RcARWGlDhnlBIArq6oml1PVdV0L3OiOnpuVaNgelgtZMzj1C9krMOqsyOKKuAasdP15qF71BxHZNMl6TBEdr15mNYvPVsu2Fr8e988gP7XR5ckcZgzTm8SW66PWvz7k2j+LSYo4rKoufDHbTJpLfXchk/btpzu8G0T3eI/4hzE4p928PQf&lt;/diagram&gt;&lt;/mxfile&gt;">
+    <defs/>
+    <g>
+        <path d="M 120 60 L 130 60 L 153.63 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 158.88 60 L 151.88 63.5 L 153.63 60 L 151.88 56.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <rect x="0" y="0" width="120" height="160" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 80px; margin-left: 1px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                planning
+                                <br/>
+                                component
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="60" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    planning...
+                </text>
+            </switch>
+        </g>
+        <rect x="360" y="0" width="320" height="160" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 7px; margin-left: 361px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                v2x component
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="520" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    v2x component
+                </text>
+            </switch>
+        </g>
+        <path d="M 400 120 L 390 120 L 326.37 120" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 321.12 120 L 328.12 116.5 L 326.37 120 L 328.12 123.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 320 60 L 350 60 L 393.63 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 398.88 60 L 391.88 63.5 L 393.63 60 L 391.88 56.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <ellipse cx="240" cy="60" rx="80" ry="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 60px; margin-left: 161px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                virtual gate command
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="240" y="64" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    virtual gate command
+                </text>
+            </switch>
+        </g>
+        <path d="M 160 120 L 126.37 120" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 121.12 120 L 128.12 116.5 L 126.37 120 L 128.12 123.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <ellipse cx="240" cy="120" rx="80" ry="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 120px; margin-left: 161px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                virtual gate status
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="240" y="124" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    virtual gate status
+                </text>
+            </switch>
+        </g>
+        <path d="M 753.82 21.54 L 646.18 48.46" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 758.92 20.27 L 752.97 25.36 L 753.82 21.54 L 751.28 18.57 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 641.08 49.73 L 647.03 44.64 L 646.18 48.46 L 648.72 51.43 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 753.72 138.95 L 646.28 121.05" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 758.9 139.82 L 751.42 142.12 L 753.72 138.95 L 752.57 135.21 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 641.1 120.18 L 648.58 117.88 L 646.28 121.05 L 647.43 124.79 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <rect x="760" y="0" width="160" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 20px; margin-left: 761px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                Area 1
+                                <br/>
+                                (supports protocol A)
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="840" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    Area 1...
+                </text>
+            </switch>
+        </g>
+        <rect x="760" y="60" width="160" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 80px; margin-left: 761px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                Area 2
+                                <br style="border-color: var(--border-color);"/>
+                                (supports protocol A)
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="840" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    Area 2...
+                </text>
+            </switch>
+        </g>
+        <rect x="520" y="40" width="120" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 60px; margin-left: 521px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                driver
+                                <br/>
+                                (for protocol A)
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="580" y="64" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    driver...
+                </text>
+            </switch>
+        </g>
+        <rect x="520" y="100" width="120" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 120px; margin-left: 521px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                driver
+                                <br style="border-color: var(--border-color);"/>
+                                (for protocol B)
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="580" y="124" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    driver...
+                </text>
+            </switch>
+        </g>
+        <rect x="760" y="120" width="160" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 140px; margin-left: 761px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                Area 3
+                                <br style="border-color: var(--border-color);"/>
+                                (supports protocol B)
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="840" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    Area 3...
+                </text>
+            </switch>
+        </g>
+        <path d="M 753.65 79.47 L 646.35 70.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 758.89 79.91 L 751.62 82.81 L 753.65 79.47 L 752.2 75.84 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 641.11 70.09 L 648.38 67.19 L 646.35 70.53 L 647.8 74.16 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 486.37 60 L 490 60 L 513.63 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 481.12 60 L 488.12 56.5 L 486.37 60 L 488.12 63.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 518.88 60 L 511.88 63.5 L 513.63 60 L 511.88 56.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 486.37 120 L 490 120 L 513.63 120" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
+        <path d="M 481.12 120 L 488.12 116.5 L 486.37 120 L 488.12 123.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <path d="M 518.88 120 L 511.88 123.5 L 513.63 120 L 511.88 116.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
+        <rect x="400" y="40" width="80" height="100" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
+        <g transform="translate(-0.5 -0.5)">
+            <switch>
+                <foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
+                    <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 90px; margin-left: 401px;">
+                        <div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
+                            <div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
+                                router
+                            </div>
+                        </div>
+                    </div>
+                </foreignObject>
+                <text x="440" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
+                    router
+                </text>
+            </switch>
+        </g>
+    </g>
+    <switch>
+        <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
+        <a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
+            <text text-anchor="middle" font-size="10px" x="50%" y="100%">
+                Text is not SVG - cannot display
+            </text>
+        </a>
+    </switch>
+</svg>
\ No newline at end of file
diff --git a/autoware_v2x_msgs/msg/VirtualGateAreaCommand.msg b/autoware_v2x_msgs/msg/VirtualGateAreaCommand.msg
new file mode 100644
index 0000000..7b16144
--- /dev/null
+++ b/autoware_v2x_msgs/msg/VirtualGateAreaCommand.msg
@@ -0,0 +1,12 @@
+# constants for command
+uint16 ACQUIRE = 1
+uint16 RELEASE = 2
+
+# variables for lock
+uint16   command
+uint16   sequence_id  # Used to check correspondence with status messages.
+string   area_id      # Target area ID.
+string[] gate_ids     # Entry and exit gate ID.
+
+# variables for scheduling
+builtin_interfaces/Time[<=1] expected_time_arrival
diff --git a/autoware_v2x_msgs/msg/VirtualGateAreaStatus.msg b/autoware_v2x_msgs/msg/VirtualGateAreaStatus.msg
new file mode 100644
index 0000000..4a75a1c
--- /dev/null
+++ b/autoware_v2x_msgs/msg/VirtualGateAreaStatus.msg
@@ -0,0 +1,14 @@
+# constants for status
+uint16 RESERVED = 1
+uint16 ACQUIRED = 2
+uint16 RELEASED = 3
+
+# variables for lock
+builtin_interfaces/Time stamp
+uint16   status
+uint16   sequence_id  # Used to check correspondence with commands.
+string   area_id      # Target area ID.
+string[] gate_ids     # Entry and exit gate ID.
+
+# variables for scheduling
+builtin_interfaces/Time[<=1] expected_time_arrival
diff --git a/autoware_v2x_msgs/msg/VirtualGateCommand.msg b/autoware_v2x_msgs/msg/VirtualGateCommand.msg
new file mode 100644
index 0000000..e497847
--- /dev/null
+++ b/autoware_v2x_msgs/msg/VirtualGateCommand.msg
@@ -0,0 +1,2 @@
+builtin_interfaces/Time stamp
+autoware_v2x_msgs/VirtualGateAreaCommand[] areas
diff --git a/autoware_v2x_msgs/msg/VirtualGateStatus.msg b/autoware_v2x_msgs/msg/VirtualGateStatus.msg
new file mode 100644
index 0000000..e20cf37
--- /dev/null
+++ b/autoware_v2x_msgs/msg/VirtualGateStatus.msg
@@ -0,0 +1 @@
+autoware_v2x_msgs/VirtualGateAreaStatus[] areas
diff --git a/autoware_v2x_msgs/package.xml b/autoware_v2x_msgs/package.xml
new file mode 100644
index 0000000..db58bf7
--- /dev/null
+++ b/autoware_v2x_msgs/package.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
+<package format="3">
+  <name>autoware_v2x_msgs</name>
+  <version>1.0.0</version>
+  <description>Autoware v2x messages package.</description>
+  <maintainer email="isamu.takagi@tier4.jp">Takagi, Isamu</maintainer>
+  <maintainer email="ryohsuke.mitsudome@tier4.jp">Ryohsuke Mitsudome</maintainer>
+  <maintainer email="yukihiro.saito@tier4.jp">Yukihiro Saito</maintainer>
+  <license>Apache License 2.0</license>
+
+  <buildtool_depend>ament_cmake_auto</buildtool_depend>
+
+  <build_depend>rosidl_default_generators</build_depend>
+
+  <depend>builtin_interfaces</depend>
+  <depend>geometry_msgs</depend>
+
+  <exec_depend>rosidl_default_runtime</exec_depend>
+
+  <test_depend>ament_lint_auto</test_depend>
+  <test_depend>ament_lint_common</test_depend>
+
+  <member_of_group>rosidl_interface_packages</member_of_group>
+
+  <export>
+    <build_type>ament_cmake</build_type>
+  </export>
+</package>